From 7e167899234e4f7124e92fdfb13944b2fa3c6be8 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 9 Jan 2022 19:58:21 +0100 Subject: [PATCH 01/89] [P095] Add support for extra TFT displays (ILI934x/ILI948x) --- lib/Adafruit_ILI9341/.gitignore | 4 + lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp | 774 ++++++++++ lib/Adafruit_ILI9341/Adafruit_ILI9341.h | 192 +++ lib/Adafruit_ILI9341/README.md | 38 + .../breakouttouchpaint/.esp8266.test.skip | 0 .../breakouttouchpaint/breakouttouchpaint.ino | 145 ++ .../examples/graphicstest/graphicstest.ino | 365 +++++ .../graphicstest_featherwing.ino | 397 +++++ .../graphicstest_pyportal.ino | 360 +++++ .../examples/mandelbrot/mandelbrot.ino | 97 ++ .../examples/onoffbutton/onoffbutton.ino | 125 ++ .../onoffbutton_breakout/.esp8266.test.skip | 0 .../onoffbutton_breakout.ino | 133 ++ .../examples/pictureEmbed/.leonardo.test.skip | 0 .../examples/pictureEmbed/dragon.h | 860 +++++++++++ .../examples/pictureEmbed/pictureEmbed.ino | 69 + .../pyportal_boing/.pyportal.test.only | 0 .../examples/pyportal_boing/graphics.h | 1376 +++++++++++++++++ .../pyportal_boing/pyportal_boing.ino | 162 ++ .../examples/touchpaint/touchpaint.ino | 146 ++ .../touchpaint_featherwing.ino | 158 ++ .../touchpaint_pyportal/.pyportal.test.only | 0 .../touchpaint_pyportal.ino | 114 ++ lib/Adafruit_ILI9341/library.properties | 10 + platformio_esp32_envs.ini | 2 +- platformio_esp82xx_base.ini | 2 +- src/_P095_ILI9341.ino | 108 +- src/src/PluginStructs/P095_data_struct.cpp | 87 +- src/src/PluginStructs/P095_data_struct.h | 45 +- 29 files changed, 5717 insertions(+), 52 deletions(-) create mode 100644 lib/Adafruit_ILI9341/.gitignore create mode 100644 lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp create mode 100644 lib/Adafruit_ILI9341/Adafruit_ILI9341.h create mode 100644 lib/Adafruit_ILI9341/README.md create mode 100644 lib/Adafruit_ILI9341/examples/breakouttouchpaint/.esp8266.test.skip create mode 100644 lib/Adafruit_ILI9341/examples/breakouttouchpaint/breakouttouchpaint.ino create mode 100644 lib/Adafruit_ILI9341/examples/graphicstest/graphicstest.ino create mode 100644 lib/Adafruit_ILI9341/examples/graphicstest_featherwing/graphicstest_featherwing.ino create mode 100644 lib/Adafruit_ILI9341/examples/graphicstest_pyportal/graphicstest_pyportal.ino create mode 100644 lib/Adafruit_ILI9341/examples/mandelbrot/mandelbrot.ino create mode 100644 lib/Adafruit_ILI9341/examples/onoffbutton/onoffbutton.ino create mode 100644 lib/Adafruit_ILI9341/examples/onoffbutton_breakout/.esp8266.test.skip create mode 100644 lib/Adafruit_ILI9341/examples/onoffbutton_breakout/onoffbutton_breakout.ino create mode 100644 lib/Adafruit_ILI9341/examples/pictureEmbed/.leonardo.test.skip create mode 100644 lib/Adafruit_ILI9341/examples/pictureEmbed/dragon.h create mode 100644 lib/Adafruit_ILI9341/examples/pictureEmbed/pictureEmbed.ino create mode 100644 lib/Adafruit_ILI9341/examples/pyportal_boing/.pyportal.test.only create mode 100644 lib/Adafruit_ILI9341/examples/pyportal_boing/graphics.h create mode 100644 lib/Adafruit_ILI9341/examples/pyportal_boing/pyportal_boing.ino create mode 100644 lib/Adafruit_ILI9341/examples/touchpaint/touchpaint.ino create mode 100644 lib/Adafruit_ILI9341/examples/touchpaint_featherwing/touchpaint_featherwing.ino create mode 100644 lib/Adafruit_ILI9341/examples/touchpaint_pyportal/.pyportal.test.only create mode 100644 lib/Adafruit_ILI9341/examples/touchpaint_pyportal/touchpaint_pyportal.ino create mode 100644 lib/Adafruit_ILI9341/library.properties diff --git a/lib/Adafruit_ILI9341/.gitignore b/lib/Adafruit_ILI9341/.gitignore new file mode 100644 index 000000000..c2a26c038 --- /dev/null +++ b/lib/Adafruit_ILI9341/.gitignore @@ -0,0 +1,4 @@ +# Our handy .gitignore for automation ease +Doxyfile* +doxygen_sqlite3.db +html diff --git a/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp b/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp new file mode 100644 index 000000000..2cb82d93c --- /dev/null +++ b/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp @@ -0,0 +1,774 @@ +/*! + * @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 // ifndef RASPI +#endif // ifndef ARDUINO_STM32_FEATHER +#include + +#if defined(ARDUINO_ARCH_ARC32) || defined(ARDUINO_MAXIM) +# define SPI_DEFAULT_FREQ 16000000 + +// Teensy 3.0, 3.1/3.2, 3.5, 3.6 +#elif defined(__MK20DX128__) || defined(__MK20DX256__) || \ + defined(__MK64FX512__) || defined(__MK66FX1M0__) +# define SPI_DEFAULT_FREQ 40000000 +#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 // if defined(ARDUINO_ARCH_ARC32) || defined(ARDUINO_MAXIM) +# define SPI_DEFAULT_FREQ 24000000 ///< Default SPI data clock frequency +#endif // if defined(ARDUINO_ARCH_ARC32) || defined(ARDUINO_MAXIM) + +#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 +#define MADCTL_SS 0x02 ///< ?? ILI9481 mode +#define MADCTL_GS 0x01 ///< ?? ILI9481 mode + +/**************************************************************************/ + +/*! + @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 using the + default SPI peripheral. + @param cs Chip select pin # (OK to pass -1 if CS tied to GND). + @param dc Data/Command pin # (required). + @param rst Reset pin # (optional, pass -1 if unused). + */ + +/**************************************************************************/ +Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t rst, uint8_t model, uint16_t w, uint16_t h) + : Adafruit_SPITFT(w, h, cs, dc, rst) { + _model = model; + _w = w; + _h = h; +} + +#if !defined(ESP8266) + +/**************************************************************************/ + +/*! + @brief Instantiate Adafruit ILI9341 driver with hardware SPI using + a specific SPI peripheral (not necessarily default). + @param spiClass Pointer to SPI peripheral (e.g. &SPI or &SPI1). + @param dc Data/Command pin # (required). + @param cs Chip select pin # (optional, pass -1 if unused and + CS is tied to GND). + @param rst Reset pin # (optional, pass -1 if unused). + */ + +/**************************************************************************/ + +// Adafruit_ILI9341::Adafruit_ILI9341(SPIClass *spiClass, int8_t dc, int8_t cs, +// int8_t rst) +// : Adafruit_SPITFT(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT, spiClass, cs, dc, +// rst) {} +#endif // end !ESP8266 + +/**************************************************************************/ + +/*! + @brief Instantiate Adafruit ILI9341 driver using parallel interface. + @param busWidth If tft16 (enumeration in Adafruit_SPITFT.h), is a + 16-bit interface, else 8-bit. + @param d0 Data pin 0 (MUST be a byte- or word-aligned LSB of a + PORT register -- pins 1-n are extrapolated from this). + @param wr Write strobe pin # (required). + @param dc Data/Command pin # (required). + @param cs Chip select pin # (optional, pass -1 if unused and CS + is tied to GND). + @param rst Reset pin # (optional, pass -1 if unused). + @param rd Read strobe pin # (optional, pass -1 if unused). + */ + +/**************************************************************************/ + +// Adafruit_ILI9341::Adafruit_ILI9341(tftBusWidth busWidth, int8_t d0, int8_t wr, +// int8_t dc, int8_t cs, int8_t rst, int8_t rd) +// : Adafruit_SPITFT(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT, busWidth, d0, wr, dc, +// cs, rst, rd) {} + +// clang-format off +static const uint8_t PROGMEM initcmd[] = { // ILI9341 & ILI9340 + 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, (MADCTL_MX | MADCTL_BGR), // 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, + 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, + 0x09, 0x00, // Set Gamma + ILI9341_GMCTRN1, 15, 0x00, 0x0E, 0x14, 0x03, 0x11, + 0x07, + 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, + 0x36, 0x0F, // Set Gamma + ILI9341_SLPOUT, 0x80, // Exit Sleep + ILI9341_DISPON, 0x80, // Display on + 0x00 // End of list +}; + +// clang-format on + +// clang-format off +static const uint8_t PROGMEM initcmd_9342[] = { // ILI9342 + 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, (MADCTL_MY | MADCTL_MV | MADCTL_BGR), // 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, + 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, + 0x09, 0x00, // + // Set + // Gamma + ILI9341_GMCTRN1, 15, 0x00, 0x0E, 0x14, 0x03, 0x11, + 0x07, + 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, + 0x36, 0x0F, // Set Gamma + ILI9341_SLPOUT, 0x80, // Exit Sleep + ILI9341_DISPON, 0x80, // Display on + 0x00 // End of list +}; + +// clang-format on + +// clang-format off +static const uint8_t PROGMEM initcmd_9481[] = { // ILI9481 + ILI9341_SLPOUT, 0x80, // Exit Sleep + 0xD0, 3, 0x07, 0x42, 0x18, + 0xD1, 3, 0x00, 0x07, 0x10, + 0xD2, 2, 0x01, 0x02, + ILI9341_PWCTR1, 5, 0x10, 0x3B, 0x00, 0x02, 0x11, // Power control VRH[5:0] + ILI9341_VMCTR1, 1, 0x03, // VCM control + 0xC8, 12, 0x00, 0x32, 0x36, 0x45, 0x06, 0x16, 0x37, + 0x75, 0x77, 0x54, 0x0C, 0x00, + ILI9341_MADCTL, 1, 0x0A, // Memory Access Control + ILI9341_PIXFMT, 1, 0x55, // Pixel format + // 0x55=16bit, 0x66=18bit + ILI9341_INVON, 0, + ILI9341_CASET, 4, 0x00, 0x00, 0x01, 0x3F, + ILI9341_PASET, 0x84, 0x00, 0x00, 0x01, 0xDF, + ILI9341_DISPON, 0x80, // Display on + 0x00 // End of list +}; + +// clang-format on + +// clang-format off +static const uint8_t PROGMEM initcmd_9481_CPT29[] = { // ILI9481 CPT29 variation + ILI9341_SLPOUT, 0x80, // Exit Sleep + 0xD0, 3, 0x07, 0x41, 0x1D, + 0xD1, 3, 0x00, 0x2b, 0x1f, + 0xD2, 2, 0x01, 0x11, + ILI9341_PWCTR1, 5, 0x10, 0x3B, 0x00, 0x02, 0x11, // Power control VRH[5:0] + ILI9341_VMCTR1, 1, 0x03, // VCM control + 0xC8, 12, 0x00, 0x14, 0x33, 0x10, 0x00, 0x16, 0x44, + 0x36, 0x77, 0x00, 0x0F, 0x00, + 0xB0, 1, 0x00, + 0xE4, 1, 0xA0, + 0xF0, 1, 0x01, + 0xF3, 2, 0x02, 0x1A, + ILI9341_MADCTL, 1, 0x0A, // Memory Access Control + ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, + // 0x66=18bit + ILI9341_INVON, 0, + ILI9341_CASET, 4, 0x00, 0x00, 0x01, 0x3F, + ILI9341_PASET, 0x84, 0x00, 0x00, 0x01, 0xDF, + ILI9341_DISPON, 0x80, // Display on + 0x00 // End of list +}; + +// clang-format off +static const uint8_t PROGMEM initcmd_9481_PVI35[] = { // ILI9481 PVI35 variation + ILI9341_SLPOUT, 0x80, // Exit Sleep + 0xD0, 3, 0x07, 0x41, 0x1D, + 0xD1, 3, 0x00, 0x2b, 0x1f, + 0xD2, 2, 0x01, 0x11, + ILI9341_PWCTR1, 5, 0x10, 0x3B, 0x00, 0x02, 0x11, // Power control VRH[5:0] + ILI9341_VMCTR1, 1, 0x03, // VCM control + 0xC8, 12, 0x00, 0x14, 0x33, 0x10, 0x00, 0x16, 0x44, + 0x36, 0x77, 0x00, 0x0F, 0x00, + 0xB0, 1, 0x00, + 0xE4, 1, 0xA0, + 0xF0, 1, 0x01, + 0xF3, 2, 0x40, 0x0A, + ILI9341_MADCTL, 1, 0x0A, // Memory Access Control + ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, + // 0x66=18bit + ILI9341_INVON, 0, + ILI9341_CASET, 4, 0x00, 0x00, 0x01, 0x3F, + ILI9341_PASET, 0x84, 0x00, 0x00, 0x01, 0xDF, + ILI9341_DISPON, 0x80, // Display on + 0x00 // End of list +}; + +// clang-format off +static const uint8_t PROGMEM initcmd_9481_AUO317[] = { // ILI9481 AUO317 variation + ILI9341_SLPOUT, 0x80, // Exit Sleep + 0xD0, 3, 0x07, 0x40, 0x1D, + 0xD1, 3, 0x00, 0x18, 0x13, + 0xD2, 2, 0x01, 0x11, + ILI9341_PWCTR1, 5, 0x10, 0x3B, 0x00, 0x02, 0x11, // Power control VRH[5:0] + ILI9341_VMCTR1, 1, 0x03, // VCM control + 0xC8, 12, 0x00, 0x44, 0x06, 0x44, 0x0A, 0x08, 0x17, + 0x33, 0x77, 0x44, 0x08, 0x0C, + 0xB0, 1, 0x00, + 0xE4, 1, 0xA0, + 0xF0, 1, 0x01, + ILI9341_MADCTL, 1, 0x0A, // Memory Access Control + ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, + // 0x66=18bit + ILI9341_INVON, 0, + ILI9341_CASET, 4, 0x00, 0x00, 0x01, 0x3F, + ILI9341_PASET, 0x84, 0x00, 0x00, 0x01, 0xDF, + ILI9341_DISPON, 0x80, // Display on + 0x00 // End of list +}; + +// clang-format on + +// clang-format off +static const uint8_t PROGMEM initcmd_9481_CM35[] = { // ILI9481 CMO36 variation + ILI9341_SLPOUT, 0x80, // Exit Sleep + 0xD0, 3, 0x07, 0x41, 0x1D, + 0xD1, 3, 0x00, 0x1C, 0x1F, + 0xD2, 2, 0x01, 0x11, + ILI9341_PWCTR1, 5, 0x10, 0x3B, 0x00, 0x02, 0x11, // Power control VRH[5:0] + ILI9341_VMCTR1, 1, 0x03, // VCM control + 0xC6, 1, 0x83, + 0xC8, 12, 0x00, 0x26, 0x21, 0x00, 0x00, 0x1F, 0x65, + 0x23, 0x77, 0x00, 0x0F, 0x00, + 0xB0, 1, 0x00, + 0xE4, 1, 0xA0, + 0xF0, 1, 0x01, + ILI9341_MADCTL, 1, 0x0A, // Memory Access Control + ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, 0x66=18bit + ILI9341_INVON, 0, + ILI9341_CASET, 4, 0x00, 0x00, 0x01, 0x3F, + ILI9341_PASET, 0x84, 0x00, 0x00, 0x01, 0xDF, + ILI9341_DISPON, 0x80, // Display on + 0x00 // End of list +}; + +// clang-format on + +// clang-format off +static const uint8_t PROGMEM initcmd_9481_RGB[] = { // ILI9481 RGB variation + ILI9341_SLPOUT, 0x80, // Exit Sleep + 0xD0, 3, 0x07, 0x41, 0x1D, + 0xD1, 3, 0x00, 0x2B, 0x1F, + 0xD2, 2, 0x01, 0x11, + ILI9341_PWCTR1, 6, 0x10, 0x3B, 0x00, 0x02, 0x11, + 0x00, // Power control VRH[5:0] + ILI9341_VMCTR1, 1, 0x03, // VCM control + 0xC6, 1, 0x80, + 0xC8, 12, 0x00, 0x14, 0x33, 0x10, 0x00, + 0x16, + 0x44, + 0x36, 0x77, 0x00, 0x0F, 0x00, + 0xB0, 1, 0x00, + 0xE4, 1, 0xA0, + 0xF0, 1, 0x08, + 0xF3, 2, 0x40, 0x0A, + 0xF6, 1, 0x84, + 0xF7, 1, 0x80, + ILI9341_FRMCTR3, 4, 0x00, 0x01, 0x06, 0x30, + ILI9341_INVCTR, 1, 0x00, + ILI9341_RDPIXFMT, 2, 0x00, 0x55, + ILI9341_MADCTL, 1, 0x0A, // Memory Access Control + ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, 0x66=18bit + ILI9341_INVON, 0, + ILI9341_CASET, 4, 0x00, 0x00, 0x01, 0x3F, + ILI9341_PASET, 0x84, 0x00, 0x00, 0x01, 0xDF, + ILI9341_DISPON, 0x80, // Display on + 0x00 // End of list +}; + +// clang-format on + +// clang-format off +static const uint8_t PROGMEM initcmd_9486[] = { // ILI9486 + ILI9341_SLPOUT, 0x80, // Exit Sleep + ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, 0x66=18bit + ILI9341_PWCTR3, 1, 0x44, // Power control3 + ILI9341_VMCTR1, 4, 0x00, 0x00, 0x00, 0x00, // VCM control + ILI9341_GMCTRP1, 15, 0x0F, 0x1F, 0x1c, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00, + ILI9341_GMCTRN1, 15, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00, + ILI9341_INVOFF, 0, + ILI9341_MADCTL, 1, 0x48, // Memory Access Control + ILI9341_DISPON, 0x80, // Display on + 0x00 // End of list +}; + +// clang-format on + +// clang-format off +static const uint8_t PROGMEM initcmd_9488[] = { + // Set gamma + ILI9341_GMCTRP1, 15, 0x00, 0x03, 0x09, 0x08, 0x16, 0x0A, + 0x3F, 0x78, 0x4C, 0x09, 0x0A, 0x08, 0x16, 0x1A, + 0x0F, + + // Set gamma + ILI9341_GMCTRN1, 15, 0x00, 0x16, 0x19, 0x03, 0x0F, 0x05, + 0x32, 0x45, 0x46, 0x04, 0x0E, 0x0D, 0x35, 0x37, + 0x0F, + + // Power control VRH[5:0] + ILI9341_PWCTR1, 2, 0x17, 0x15, + + // Power control SAP[2:0];BT[3:0] + ILI9341_PWCTR2, 1, 0x41, + + // VCM control + ILI9341_VMCTR1, 3, 0x00, 0x12, 0x80, + + // Memory access Control + ILI9341_MADCTL, 1, 0x48, + + // Pixel format 0x55=16bit, 0x66=18bit + ILI9341_PIXFMT, 1, 0x55, + + // Interface control Mode + 0xB0, 1, 0x80, + + // Frame rate + ILI9341_FRMCTR1, 1, 0xA0, + + // Display onversion control + ILI9341_INVCTR, 1, 0x02, + + // Display function control + ILI9341_DFUNCTR, 2, 0x02, 0x02, + + // Disable 24 bit data + 0xE9, 1, 0x00, + + // Adjust control + 0xF7, 4, 0xA9, 0x51, 0x2C, 0x82, + + // Exit sleep + ILI9341_SLPOUT, 0x80, + + // Display on + ILI9341_DISPON, 0x80, + + // End of list + 0x00 +}; + +// clang-format on + +/**************************************************************************/ + +/*! + @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; + } + initSPI(freq); + + if (_rst < 0) { // If no hardware reset pin... + sendCommand(ILI9341_SWRESET); // Engage software reset + delay(150); + } + + uint8_t cmd, x, numArgs; + const uint8_t *addr; // = initcmd; + + switch (_model) { + case ILI_TYPE_9341: // ILI9341 + addr = initcmd; + break; + case ILI_TYPE_9342: // ILI9342 M5STACK + addr = initcmd_9342; + break; + case ILI_TYPE_9481: // ILI9481 + addr = initcmd_9481; + break; + case ILI_TYPE_9481_CPT29: // ILI9481 CPT29 + addr = initcmd_9481_CPT29; + break; + case ILI_TYPE_9481_PVI35: // ILI9481 PVI35 + addr = initcmd_9481_PVI35; + break; + case ILI_TYPE_9481_AUO317: // ILI9481 AUO317 + addr = initcmd_9481_AUO317; + break; + case ILI_TYPE_9481_CMO35: // ILI9481 CMO35 + addr = initcmd_9481_CM35; + break; + case ILI_TYPE_9481_RGB: // ILI9481 RGB + addr = initcmd_9481_RGB; + break; + case ILI_TYPE_9486: // ILI9486 + addr = initcmd_9486; + break; + case ILI_TYPE_9488: // ILI9488 + addr = initcmd_9488; + break; + default: + addr = initcmd; + break; + } + + while ((cmd = pgm_read_byte(addr++)) > 0) { + x = pgm_read_byte(addr++); + numArgs = x & 0x7F; + sendCommand(cmd, addr, numArgs); + addr += numArgs; + + if (x & 0x80) { + delay(150); + } + } + + _width = _w; + _height = _h; +} + +/**************************************************************************/ + +/*! + @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: + + switch (_model) { + case ILI_TYPE_9342: // ILI9342 M5STACK + m = (MADCTL_MY | MADCTL_MV | MADCTL_BGR); + break; + case ILI_TYPE_9481: // ILI9481 + case ILI_TYPE_9481_CPT29: // ILI9481 CPT29 + case ILI_TYPE_9481_PVI35: // ILI9481 PVI35 + case ILI_TYPE_9481_AUO317: // ILI9481 AUO317 + case ILI_TYPE_9481_CMO35: // ILI9481 CMO35 + case ILI_TYPE_9481_RGB: // ILI9481 RGB + m = (MADCTL_SS | MADCTL_BGR); + break; + case ILI_TYPE_9341: // ILI9341 + // m = (MADCTL_MX | MADCTL_BGR); + // break; + case ILI_TYPE_9486: // ILI9486 + // m = (MADCTL_MX | MADCTL_BGR); + // break; + case ILI_TYPE_9488: // ILI9488 + // m = (MADCTL_MX | MADCTL_BGR); + // break; + default: + m = (MADCTL_MX | MADCTL_BGR); + break; + } + _width = _w; + _height = _h; + break; + case 1: + + switch (_model) { + case ILI_TYPE_9342: // ILI9342 M5STACK + m = (MADCTL_BGR); + break; + case ILI_TYPE_9481: // ILI9481 + case ILI_TYPE_9481_CPT29: // ILI9481 CPT29 + case ILI_TYPE_9481_PVI35: // ILI9481 PVI35 + case ILI_TYPE_9481_AUO317: // ILI9481 AUO317 + case ILI_TYPE_9481_CMO35: // ILI9481 CMO35 + case ILI_TYPE_9481_RGB: // ILI9481 RGB + m = (MADCTL_MV | MADCTL_BGR); + break; + case ILI_TYPE_9341: // ILI9341 + // m = (MADCTL_MV | MADCTL_BGR); + // break; + case ILI_TYPE_9486: // ILI9486 + // m = (MADCTL_MV | MADCTL_BGR); + // break; + case ILI_TYPE_9488: // ILI9488 + // m = (MADCTL_MV | MADCTL_BGR); + // break; + default: + m = (MADCTL_MV | MADCTL_BGR); + break; + } + _width = _h; + _height = _w; + break; + case 2: + + switch (_model) { + case ILI_TYPE_9342: // ILI9342 M5STACK + m = (MADCTL_MV | MADCTL_MX | MADCTL_BGR); + break; + case ILI_TYPE_9481: // ILI9481 + case ILI_TYPE_9481_CPT29: // ILI9481 CPT29 + case ILI_TYPE_9481_PVI35: // ILI9481 PVI35 + case ILI_TYPE_9481_AUO317: // ILI9481 AUO317 + case ILI_TYPE_9481_CMO35: // ILI9481 CMO35 + case ILI_TYPE_9481_RGB: // ILI9481 RGB + m = (MADCTL_GS | MADCTL_BGR); + break; + case ILI_TYPE_9341: // ILI9341 + // m = (MADCTL_MY | MADCTL_BGR); + // break; + case ILI_TYPE_9486: // ILI9486 + // m = (MADCTL_MY | MADCTL_BGR); + // break; + case ILI_TYPE_9488: // ILI9488 + // m = (MADCTL_MY | MADCTL_BGR); + // break; + default: + m = (MADCTL_MY | MADCTL_BGR); + break; + } + _width = _w; + _height = _h; + break; + case 3: + + switch (_model) { + case ILI_TYPE_9342: // ILI9342 M5STACK + m = (MADCTL_MX | MADCTL_MY | MADCTL_BGR); + break; + case ILI_TYPE_9481: // ILI9481 + case ILI_TYPE_9481_CPT29: // ILI9481 CPT29 + case ILI_TYPE_9481_PVI35: // ILI9481 PVI35 + case ILI_TYPE_9481_AUO317: // ILI9481 AUO317 + case ILI_TYPE_9481_CMO35: // ILI9481 CMO35 + case ILI_TYPE_9481_RGB: // ILI9481 RGB + m = (MADCTL_SS | MADCTL_GS | MADCTL_MV | MADCTL_BGR); + break; + case ILI_TYPE_9341: // ILI9341 + // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); + // break; + case ILI_TYPE_9486: // ILI9486 + // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); + // break; + case ILI_TYPE_9488: // ILI9488 + // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); + // break; + default: + m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); + break; + } + _width = _h; + _height = _w; + break; + } + + sendCommand(ILI9341_MADCTL, &m, 1); +} + +/**************************************************************************/ + +/*! + @brief Enable/Disable display color inversion + @param invert True to invert, False to have normal color + */ + +/**************************************************************************/ +void Adafruit_ILI9341::invertDisplay(bool invert) { + sendCommand(invert ? ILI9341_INVON : ILI9341_INVOFF); +} + +/**************************************************************************/ + +/*! + @brief Scroll display memory + @param y How many pixels to scroll display by + */ + +/**************************************************************************/ +void Adafruit_ILI9341::scrollTo(uint16_t y) { + uint8_t data[2]; + + data[0] = y >> 8; + data[1] = y & 0xff; + sendCommand(ILI9341_VSCRSADD, (uint8_t *)data, 2); +} + +/**************************************************************************/ + +/*! + @brief Set the height of the Top and Bottom Scroll Margins + @param top The height of the Top scroll margin + @param bottom The height of the Bottom scroll margin + */ + +/**************************************************************************/ +void Adafruit_ILI9341::setScrollMargins(uint16_t top, uint16_t bottom) { + // TFA+VSA+BFA must equal 320 + if (top + bottom <= ILI9341_TFTHEIGHT) { + uint16_t middle = ILI9341_TFTHEIGHT - (top + bottom); + uint8_t data[6]; + data[0] = top >> 8; + data[1] = top & 0xff; + data[2] = middle >> 8; + data[3] = middle & 0xff; + data[4] = bottom >> 8; + data[5] = bottom & 0xff; + sendCommand(ILI9341_VSCRDEF, (uint8_t *)data, 6); + } +} + +/**************************************************************************/ + +/*! + @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 x1 TFT memory 'x' origin + @param y1 TFT memory 'y' origin + @param w Width of rectangle + @param h Height of rectangle + */ + +/**************************************************************************/ +void Adafruit_ILI9341::setAddrWindow(uint16_t x1, uint16_t y1, uint16_t w, + uint16_t h) { + uint16_t x2 = (x1 + w - 1), y2 = (y1 + h - 1); + + writeCommand(ILI9341_CASET); // Column address set + SPI_WRITE16(x1); + SPI_WRITE16(x2); + writeCommand(ILI9341_PASET); // Row address set + SPI_WRITE16(y1); + SPI_WRITE16(y2); + 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 commandByte 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 commandByte, uint8_t index) { + uint8_t data = 0x10 + index; + + sendCommand(0xD9, &data, 1); // Set Index Register + return Adafruit_SPITFT::readcommand8(commandByte); +} diff --git a/lib/Adafruit_ILI9341/Adafruit_ILI9341.h b/lib/Adafruit_ILI9341/Adafruit_ILI9341.h new file mode 100644 index 000000000..2546cb75d --- /dev/null +++ b/lib/Adafruit_ILI9341/Adafruit_ILI9341.h @@ -0,0 +1,192 @@ +/*! + * @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 "Adafruit_GFX.h" +#include "Arduino.h" +#include "Print.h" +#include +#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_VSCRDEF 0x33 ///< Vertical Scrolling Definition +#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 + + +#define ILI_TYPE_9341 0 // Must match with enum class ILI9xxx_type_e in P095_data_struct.h +#define ILI_TYPE_9342 1 +#define ILI_TYPE_9481 2 +#define ILI_TYPE_9481_CPT29 3 +#define ILI_TYPE_9481_PVI35 4 +#define ILI_TYPE_9481_AUO317 5 +#define ILI_TYPE_9481_CMO35 6 +#define ILI_TYPE_9481_RGB 7 +#define ILI_TYPE_9486 8 +#define ILI_TYPE_9488 9 + +/**************************************************************************/ + +/*! + @brief 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, + uint8_t _MODEL = ILI_TYPE_9341, + uint16_t w = ILI9341_TFTWIDTH, + uint16_t h = ILI9341_TFTHEIGHT); // Default to ILI9341, check ILI9xxx_type_e + virtual ~Adafruit_ILI9341() {}; // Virtual destructor + +#if !defined(ESP8266) + + // Adafruit_ILI9341(SPIClass *spiClass, int8_t dc, int8_t cs = -1, + // int8_t rst = -1); +#endif // end !ESP8266 + // Adafruit_ILI9341(tftBusWidth busWidth, int8_t d0, int8_t wr, int8_t dc, + // int8_t cs = -1, int8_t rst = -1, int8_t rd = -1); + void begin(uint32_t freq = 0); + void setRotation(uint8_t r); + void invertDisplay(bool 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); + +private: + + uint16_t _w; + uint16_t _h; + uint8_t _model; +}; + +#endif // _ADAFRUIT_ILI9341H_ diff --git a/lib/Adafruit_ILI9341/README.md b/lib/Adafruit_ILI9341/README.md new file mode 100644 index 000000000..2f62bcd11 --- /dev/null +++ b/lib/Adafruit_ILI9341/README.md @@ -0,0 +1,38 @@ +# Adafruit ILI9341 Arduino Library [![Build Status](https://github.com/adafruit/Adafruit_ILI9341/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit_ILI9341/actions)[![Documentation](https://github.com/adafruit/ci-arduino/blob/master/assets/doxygen_badge.svg)](http://adafruit.github.io/Adafruit_ILI9341/html/index.html) + +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). + +**BMP image-loading examples have been moved to the Adafruit_ImageReader library:** +https://github.com/adafruit/Adafruit_ImageReader + +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](https://github.com/adafruit/Adafruit-GFX-Library) library for Arduino. diff --git a/lib/Adafruit_ILI9341/examples/breakouttouchpaint/.esp8266.test.skip b/lib/Adafruit_ILI9341/examples/breakouttouchpaint/.esp8266.test.skip new file mode 100644 index 000000000..e69de29bb diff --git a/lib/Adafruit_ILI9341/examples/breakouttouchpaint/breakouttouchpaint.ino b/lib/Adafruit_ILI9341/examples/breakouttouchpaint/breakouttouchpaint.ino new file mode 100644 index 000000000..9022f2419 --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/breakouttouchpaint/breakouttouchpaint.ino @@ -0,0 +1,145 @@ +/*************************************************** + 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 9 // can be any digital pin +#define XP 8 // can be any 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/Adafruit_ILI9341/examples/graphicstest/graphicstest.ino b/lib/Adafruit_ILI9341/examples/graphicstest/graphicstest.ino new file mode 100644 index 000000000..3154d4095 --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/graphicstest/graphicstest.ino @@ -0,0 +1,365 @@ +/*************************************************** + 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/Adafruit_ILI9341/examples/graphicstest_featherwing/graphicstest_featherwing.ino b/lib/Adafruit_ILI9341/examples/graphicstest_featherwing/graphicstest_featherwing.ino new file mode 100644 index 000000000..190798772 --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/graphicstest_featherwing/graphicstest_featherwing.ino @@ -0,0 +1,397 @@ +/*************************************************** + 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 +#elif defined(ESP32) && !defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2) + #define STMPE_CS 32 + #define TFT_CS 15 + #define TFT_DC 33 + #define SD_CS 14 +#elif defined(TEENSYDUINO) + #define TFT_DC 10 + #define TFT_CS 4 + #define STMPE_CS 3 + #define SD_CS 8 +#elif defined(ARDUINO_STM32_FEATHER) + #define TFT_DC PB4 + #define TFT_CS PA15 + #define STMPE_CS PC7 + #define SD_CS PC5 +#elif defined(ARDUINO_NRF52832_FEATHER) /* BSP 0.6.5 and higher! */ + #define TFT_DC 11 + #define TFT_CS 31 + #define STMPE_CS 30 + #define SD_CS 27 +#elif 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 +#else + // Anything else, defaults! + #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; +} \ No newline at end of file diff --git a/lib/Adafruit_ILI9341/examples/graphicstest_pyportal/graphicstest_pyportal.ino b/lib/Adafruit_ILI9341/examples/graphicstest_pyportal/graphicstest_pyportal.ino new file mode 100644 index 000000000..faaddfdd5 --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/graphicstest_pyportal/graphicstest_pyportal.ino @@ -0,0 +1,360 @@ +/*************************************************** + GFX example for the Adafruit PyPortal. + https://www.adafruit.com/product/4116 + ****************************************************/ + +#include "Adafruit_GFX.h" +#include "Adafruit_ILI9341.h" + +#define TFT_D0 34 // Data bit 0 pin (MUST be on PORT byte boundary) +#define TFT_WR 26 // Write-strobe pin (CCL-inverted timer output) +#define TFT_DC 10 // Data/command pin +#define TFT_CS 11 // Chip-select pin +#define TFT_RST 24 // Reset pin +#define TFT_RD 9 // Read-strobe pin +#define TFT_BACKLIGHT 25 + +// ILI9341 with 8-bit parallel interface: +Adafruit_ILI9341 tft = Adafruit_ILI9341(tft8bitbus, TFT_D0, TFT_WR, TFT_DC, TFT_CS, TFT_RST, TFT_RD); + +void setup() { + Serial.begin(9600); + //while(!Serial); + Serial.println("ILI9341 Test!"); + + // Turn on backlight (required on PyPortal) + pinMode(TFT_BACKLIGHT, OUTPUT); + digitalWrite(TFT_BACKLIGHT, HIGH); + + 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(F("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(F("Groop")); + tft.setTextSize(2); + tft.println(F("I implore thee,")); + tft.setTextSize(1); + tft.println(F("my foonting turlingdromes.")); + tft.println(F("And hooptiously drangle me")); + tft.println(F("with crinkly bindlewurdles,")); + tft.println(F("Or I will rend thee")); + tft.println(F("in the gobberwarts")); + tft.println(F("with my blurglecruncheon,")); + tft.println(F("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/Adafruit_ILI9341/examples/mandelbrot/mandelbrot.ino b/lib/Adafruit_ILI9341/examples/mandelbrot/mandelbrot.ino new file mode 100644 index 000000000..f4164f23f --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/mandelbrot/mandelbrot.ino @@ -0,0 +1,97 @@ +#include + +#ifdef ADAFRUIT_PYPORTAL + #define TFT_D0 34 // Data bit 0 pin (MUST be on PORT byte boundary) + #define TFT_WR 26 // Write-strobe pin (CCL-inverted timer output) + #define TFT_DC 10 // Data/command pin + #define TFT_CS 11 // Chip-select pin + #define TFT_RST 24 // Reset pin + #define TFT_RD 9 // Read-strobe pin + #define TFT_BACKLIGHT 25 + // ILI9341 with 8-bit parallel interface: + Adafruit_ILI9341 tft = Adafruit_ILI9341(tft8bitbus, TFT_D0, TFT_WR, TFT_DC, TFT_CS, TFT_RST, TFT_RD); + #define USE_BUFFER // buffer all 155 KB of data for bliting - uses passive ram but looks nicer? +#else + // Use SPI + #define STMPE_CS 6 + #define TFT_CS 9 + #define TFT_DC 10 + #define SD_CS 5 + Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); +#endif + + +const int16_t + bits = 20, // Fractional resolution + pixelWidth = 320, // TFT dimensions + pixelHeight = 240, + iterations = 128; // Fractal iteration limit or 'dwell' +float + centerReal = -0.6, // Image center point in complex plane + centerImag = 0.0, + rangeReal = 3.0, // Image coverage in complex plane + rangeImag = 3.0; + +#if defined(USE_BUFFER) + uint16_t buffer[pixelWidth * pixelHeight]; +#endif + +void setup(void) { + Serial.begin(115200); + Serial.print("Mandelbrot drawer!"); + + tft.begin(); + tft.setRotation(1); + tft.fillScreen(ILI9341_BLACK); + + // Turn on backlight (required on PyPortal) +#if defined(TFT_BACKLIGHT) + pinMode(TFT_BACKLIGHT, OUTPUT); + digitalWrite(TFT_BACKLIGHT, HIGH); +#endif +} + +void loop() { + int64_t n, a, b, a2, b2, posReal, posImag; + uint32_t startTime,elapsedTime; + + + int32_t + startReal = (int64_t)((centerReal - rangeReal * 0.5) * (float)(1 << bits)), + startImag = (int64_t)((centerImag + rangeImag * 0.5) * (float)(1 << bits)), + incReal = (int64_t)((rangeReal / (float)pixelWidth) * (float)(1 << bits)), + incImag = (int64_t)((rangeImag / (float)pixelHeight) * (float)(1 << bits)); + + startTime = millis(); + posImag = startImag; + for (int y = 0; y < pixelHeight; y++) { + posReal = startReal; + for (int x = 0; x < pixelWidth; x++) { + a = posReal; + b = posImag; + for (n = iterations; n > 0 ; n--) { + a2 = (a * a) >> bits; + b2 = (b * b) >> bits; + if ((a2 + b2) >= (4 << bits)) + break; + b = posImag + ((a * b) >> (bits - 1)); + a = posReal + a2 - b2; + } + #if defined(USE_BUFFER) + buffer[y * pixelWidth + x] = (n * 29)<<8 | (n * 67); + #else + tft.drawPixel(x, y, (n * 29)<<8 | (n * 67)); // takes 500ms with individual pixel writes + #endif + posReal += incReal; + } + posImag -= incImag; + } + #if defined(USE_BUFFER) + tft.drawRGBBitmap(0, 0, buffer, pixelWidth, pixelHeight); // takes 169 ms + #endif + elapsedTime = millis()-startTime; + Serial.print("Took "); Serial.print(elapsedTime); Serial.println(" ms"); + + rangeReal *= 0.95; + rangeImag *= 0.95; +} diff --git a/lib/Adafruit_ILI9341/examples/onoffbutton/onoffbutton.ino b/lib/Adafruit_ILI9341/examples/onoffbutton/onoffbutton.ino new file mode 100644 index 000000000..3365d3385 --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/onoffbutton/onoffbutton.ino @@ -0,0 +1,125 @@ +//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/Adafruit_ILI9341/examples/onoffbutton_breakout/.esp8266.test.skip b/lib/Adafruit_ILI9341/examples/onoffbutton_breakout/.esp8266.test.skip new file mode 100644 index 000000000..e69de29bb diff --git a/lib/Adafruit_ILI9341/examples/onoffbutton_breakout/onoffbutton_breakout.ino b/lib/Adafruit_ILI9341/examples/onoffbutton_breakout/onoffbutton_breakout.ino new file mode 100644 index 000000000..aa8cb9992 --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/onoffbutton_breakout/onoffbutton_breakout.ino @@ -0,0 +1,133 @@ +//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/Adafruit_ILI9341/examples/pictureEmbed/.leonardo.test.skip b/lib/Adafruit_ILI9341/examples/pictureEmbed/.leonardo.test.skip new file mode 100644 index 000000000..e69de29bb diff --git a/lib/Adafruit_ILI9341/examples/pictureEmbed/dragon.h b/lib/Adafruit_ILI9341/examples/pictureEmbed/dragon.h new file mode 100644 index 000000000..2bd9050bb --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/pictureEmbed/dragon.h @@ -0,0 +1,860 @@ +#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/Adafruit_ILI9341/examples/pictureEmbed/pictureEmbed.ino b/lib/Adafruit_ILI9341/examples/pictureEmbed/pictureEmbed.ino new file mode 100644 index 000000000..5c5475756 --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/pictureEmbed/pictureEmbed.ino @@ -0,0 +1,69 @@ +// 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/Adafruit_ILI9341/examples/pyportal_boing/.pyportal.test.only b/lib/Adafruit_ILI9341/examples/pyportal_boing/.pyportal.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/lib/Adafruit_ILI9341/examples/pyportal_boing/graphics.h b/lib/Adafruit_ILI9341/examples/pyportal_boing/graphics.h new file mode 100644 index 000000000..8dc1da12f --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/pyportal_boing/graphics.h @@ -0,0 +1,1376 @@ +// Graphics arrays were generated from PNG images using Python and PIL. +// Each is bit-packed into bytes: background is 1bpp, ball is 4bpp. + +const uint8_t background[SCREENHEIGHT][SCREENWIDTH / 8] = { + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X08, 0X00, 0X08, 0X00, + 0X08, 0X00, 0X08, 0X00, 0X08, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X02, 0X00, 0X02, 0X00, 0X02, 0X00, 0X02, 0X00, + 0X02, 0X00, 0X03, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X40, 0X00, 0X20, 0X00, 0X20, 0X00, 0X10, 0X00, + 0X10, 0X00, 0X08, 0X00, 0X08, 0X00, 0X04, 0X00, 0X02, 0X00, 0X02, 0X00, + 0X01, 0X00, 0X01, 0X00, 0X00, 0X80, 0X00, 0X80, 0X00, 0X40, 0X00, 0X40, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X80, 0X00, 0X40, 0X00, + 0X20, 0X00, 0X20, 0X00, 0X10, 0X00, 0X08, 0X00, 0X08, 0X00, 0X04, 0X00, + 0X02, 0X00, 0X02, 0X00, 0X01, 0X00, 0X00, 0X80, 0X00, 0X80, 0X00, 0X40, + 0X00, 0X20, 0X00, 0X30, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X02, 0X00, 0X01, 0X00, 0X00, 0X80, 0X00, 0X40, 0X00, + 0X20, 0X00, 0X10, 0X00, 0X08, 0X00, 0X04, 0X00, 0X02, 0X00, 0X01, 0X00, + 0X00, 0X80, 0X00, 0X40, 0X00, 0X20, 0X00, 0X10, 0X00, 0X08, 0X00, 0X06, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0C, 0X00, 0X02, 0X00, 0X01, + 0X00, 0X00, 0X80, 0X00, 0X40, 0X00, 0X10, 0X00, 0X08, 0X00, 0X04, 0X00, + 0X02, 0X00, 0X01, 0X00, 0X00, 0X40, 0X00, 0X20, 0X00, 0X10, 0X00, 0X08, + 0X00, 0X06, 0X00, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X10, + 0X00, 0X04, 0X00, 0X02, 0X00, 0X01, 0X00, 0X00, 0X40, 0X00, 0X20, 0X00, + 0X08, 0X00, 0X04, 0X00, 0X02, 0X00, 0X00, 0X80, 0X00, 0X40, 0X00, 0X10, + 0X00, 0X08, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X80, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X40, 0X00, 0X10, 0X00, 0X08, + 0X00, 0X02, 0X00, 0X00, 0X80, 0X00, 0X20, 0X00, 0X10, 0X00, 0X04, 0X00, + 0X01, 0X00, 0X00, 0X80, 0X00, 0X20, 0X00, 0X08, 0X00, 0X02, 0X00, 0X01, + 0X00, 0X00, 0X40, 0X00, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X80, + 0X00, 0X20, 0X00, 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X40, 0X00, + 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X40, 0X00, 0X10, 0X00, 0X04, + 0X00, 0X01, 0X00, 0X00, 0X80, 0X00, 0X20, 0X00, 0X08, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X03, 0X00, 0X00, 0XC0, 0X00, 0X10, 0X00, 0X04, 0X00, 0X01, + 0X00, 0X00, 0X40, 0X00, 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X40, + 0X00, 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X60, 0X00, 0X18, 0X00, + 0X06, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X20, + 0X00, 0X08, 0X00, 0X02, 0X00, 0X00, 0X80, 0X00, 0X10, 0X00, 0X04, 0X00, + 0X01, 0X00, 0X00, 0X20, 0X00, 0X08, 0X00, 0X02, 0X00, 0X00, 0X80, 0X00, + 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X08, 0X00, + 0X02, 0X00, 0X00, 0X40, 0X00, 0X10, 0X00, 0X02, 0X00, 0X00, 0X80, 0X00, + 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X08, 0X00, 0X01, + 0X00, 0X00, 0X40, 0X00, 0X08, 0X00, 0X02, 0X00, 0X00, 0XC0, 0X00, 0X00, + 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X60, 0X00, 0X08, 0X00, 0X01, 0X00, + 0X00, 0X20, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, + 0X00, 0X80, 0X00, 0X10, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X10, 0X00, + 0X02, 0X00, 0X00, 0XC0, 0X00, 0X10, 0X00, 0X00, 0X00, 0X00, 0X80, 0X00, + 0X10, 0X00, 0X02, 0X00, 0X00, 0X40, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, + 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X10, 0X00, 0X02, 0X00, 0X00, + 0X40, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X0C, 0X00, 0X00, + 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X08, + 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X10, + 0X00, 0X02, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X10, + 0X00, 0X02, 0X00, 0X00, 0X00, 0X02, 0X00, 0X00, 0X40, 0X00, 0X08, 0X00, + 0X00, 0X80, 0X00, 0X10, 0X00, 0X02, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, + 0X00, 0X80, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X02, 0X00, + 0X00, 0X40, 0X00, 0X08, 0X00, 0X01, 0X80, 0X00, 0X00, 0X04, 0X00, 0X00, + 0X80, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, 0X10, 0X00, 0X02, 0X00, 0X00, + 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, + 0X10, 0X00, 0X02, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X40, 0X00, + 0X00, 0X18, 0X00, 0X01, 0X00, 0X00, 0X10, 0X00, 0X02, 0X00, 0X00, 0X20, + 0X00, 0X02, 0X00, 0X00, 0X40, 0X00, 0X04, 0X00, 0X00, 0X40, 0X00, 0X08, + 0X00, 0X00, 0X80, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, 0X10, 0X00, 0X03, + 0X00, 0X00, 0X20, 0X00, 0X00, 0X20, 0X00, 0X02, 0X00, 0X00, 0X20, 0X00, + 0X02, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X40, 0X00, 0X04, 0X00, + 0X00, 0X40, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X08, 0X00, 0X00, 0X80, + 0X00, 0X08, 0X00, 0X00, 0X80, 0X00, 0X18, 0X00, 0X00, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00}; + +#define BALLWIDTH 136 +#define BALLHEIGHT 100 + +const uint8_t ball[BALLHEIGHT][BALLWIDTH / 2] = { + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0XAA, 0XA6, 0X43, 0XDB, 0X00, 0X00, 0X00, 0X00, + 0X01, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0XAA, + 0X86, 0X43, 0X32, 0XED, 0X33, 0X33, 0X3D, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0XAA, 0XAA, 0X86, 0X54, 0X33, 0X32, 0XED, 0XCC, + 0XCB, 0X9A, 0XA3, 0X33, 0X33, 0X33, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0XAA, + 0X86, 0X55, 0X33, 0X32, 0XFE, 0XDD, 0XCC, 0XCB, 0XA9, 0X88, 0X76, 0XFF, + 0X55, 0X5A, 0X33, 0X33, 0X41, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0XAA, 0XAA, 0X86, 0X55, 0X43, 0X32, 0XFF, 0XED, + 0XDC, 0XCC, 0XCB, 0XA9, 0X88, 0X87, 0X65, 0X54, 0X33, 0XCB, 0XA9, 0X85, + 0X3C, 0X41, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0XFD, + 0X86, 0X55, 0X54, 0X32, 0XFF, 0XFF, 0XED, 0XDC, 0XCC, 0XBA, 0XA9, 0X88, + 0X87, 0X65, 0X55, 0X43, 0X32, 0X2F, 0XE6, 0X64, 0X32, 0XC9, 0X41, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X3F, 0XDC, 0XCA, 0X92, 0XFF, 0XFF, + 0XFE, 0XDD, 0XDC, 0XCB, 0XAA, 0XA9, 0X88, 0X87, 0X66, 0X55, 0X54, 0X33, + 0X22, 0XFE, 0XDD, 0XCB, 0X33, 0XFD, 0XA6, 0X41, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X3F, 0XED, 0XCC, 0XA9, 0X88, 0X87, 0XED, 0XDD, 0XCC, 0XCB, 0XAA, + 0XA9, 0X88, 0X88, 0X76, 0X65, 0X54, 0X43, 0X32, 0X2F, 0XEE, 0XDD, 0XCB, + 0XAA, 0X98, 0XDC, 0X96, 0X47, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X33, 0XFD, 0XCC, 0XBA, + 0X98, 0X88, 0X76, 0X65, 0X54, 0XBA, 0XAA, 0XA9, 0X88, 0X88, 0X76, 0X65, + 0X55, 0X44, 0X33, 0X22, 0XFF, 0XED, 0XDC, 0XBB, 0XAA, 0X98, 0X76, 0X5A, + 0X96, 0X48, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X03, 0XFE, 0XDC, 0XCA, 0X98, 0X88, 0X87, 0X66, 0X55, + 0X43, 0X33, 0X22, 0X88, 0X88, 0X76, 0X66, 0X55, 0X54, 0X33, 0X32, 0X2F, + 0XFE, 0XED, 0XDC, 0XBA, 0XAA, 0X98, 0X76, 0X54, 0X32, 0X76, 0X48, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X3F, + 0XED, 0XCB, 0XA9, 0X88, 0X87, 0X76, 0X65, 0X54, 0X33, 0X32, 0X2F, 0XFF, + 0XE6, 0X66, 0X65, 0X55, 0X43, 0X33, 0X22, 0XFF, 0XEE, 0XDD, 0XCC, 0XBA, + 0XA9, 0X98, 0X76, 0X55, 0X32, 0XFE, 0XDC, 0XF8, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X3F, 0XED, 0XCC, 0XBA, 0X98, 0X88, + 0X76, 0X66, 0X55, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XDD, 0XD5, 0X55, 0X44, + 0X33, 0X32, 0X2F, 0XFE, 0XEE, 0XDD, 0XCB, 0XBA, 0XA9, 0X98, 0X76, 0X65, + 0X43, 0X2F, 0XED, 0XC9, 0X88, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X3F, 0XEE, 0XDC, 0XCB, 0XA9, 0X88, 0X87, 0X66, 0X55, 0X44, 0X33, + 0X32, 0X2F, 0XFF, 0XED, 0XDD, 0XCC, 0XCB, 0XB3, 0X33, 0X22, 0XFF, 0XFE, + 0XED, 0XDC, 0XCB, 0XBA, 0XA9, 0X98, 0X76, 0X65, 0X43, 0X2F, 0XED, 0XCB, + 0X98, 0X4F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X33, 0XFE, 0XED, 0XCB, + 0XA9, 0X88, 0X88, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, + 0XDC, 0XCC, 0XBB, 0XAA, 0XA9, 0X9F, 0XFF, 0XEE, 0XED, 0XDC, 0XCB, 0XBA, + 0XA9, 0X88, 0X76, 0X65, 0X43, 0X32, 0XFE, 0XDC, 0XA9, 0X74, 0XF1, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X03, 0XFE, 0XED, 0XCC, 0XBA, 0X98, 0X88, 0X77, 0X66, + 0X55, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, + 0X99, 0X98, 0X87, 0XEE, 0XDD, 0XCC, 0XCB, 0XBA, 0XA9, 0X88, 0X77, 0X65, + 0X54, 0X32, 0XFE, 0XDC, 0XC9, 0X86, 0X4F, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X3F, + 0XEE, 0XDC, 0XBB, 0XA9, 0X88, 0X87, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, + 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBA, 0XAA, 0X99, 0X88, 0X77, 0X77, + 0X66, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X65, 0X54, 0X33, 0X2F, 0XED, + 0XCB, 0X98, 0X64, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XA8, 0XEE, 0XED, 0XCB, 0XBA, 0X98, + 0X88, 0X77, 0X66, 0X55, 0X44, 0X33, 0X33, 0X22, 0XFF, 0XEE, 0XDD, 0XDC, + 0XCC, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X77, 0X76, 0X66, 0X55, 0XBB, 0XAA, + 0X99, 0X88, 0X77, 0X65, 0X54, 0X33, 0X2F, 0XEE, 0XCC, 0XA9, 0X85, 0X2E, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X0A, 0X87, 0X76, 0X5B, 0XBA, 0X98, 0X88, 0X87, 0X66, 0X65, 0X54, + 0X43, 0X33, 0X32, 0X2F, 0XFF, 0XED, 0XDD, 0XCC, 0XCC, 0XBB, 0XAA, 0XA9, + 0X98, 0X87, 0X77, 0X76, 0X65, 0X55, 0X44, 0X33, 0X99, 0X88, 0X77, 0X66, + 0X54, 0X43, 0X22, 0XFE, 0XDC, 0XCA, 0X97, 0X52, 0XE1, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0A, 0X87, 0X65, + 0X44, 0X32, 0X88, 0X87, 0X76, 0X65, 0X54, 0X44, 0X33, 0X33, 0X22, 0XFF, + 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBA, 0XAA, 0X99, 0X98, 0X87, 0X77, 0X66, + 0X65, 0X54, 0X44, 0X33, 0X22, 0XFF, 0X77, 0X66, 0X55, 0X43, 0X32, 0XFE, + 0XED, 0XCB, 0XA9, 0X75, 0X2E, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0XA8, 0X77, 0X65, 0X43, 0X2F, 0XFF, 0XEE, + 0X66, 0X55, 0X44, 0X43, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, + 0XBB, 0XAA, 0XAA, 0X99, 0X88, 0X77, 0X77, 0X66, 0X55, 0X54, 0X43, 0X32, + 0X22, 0XFF, 0XEE, 0X66, 0X55, 0X43, 0X32, 0X2F, 0XEE, 0XCC, 0XB9, 0X86, + 0X52, 0XE1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0XA8, 0X76, 0X54, 0X43, 0X2F, 0XFE, 0XED, 0XDC, 0XC4, 0X44, 0X33, + 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, + 0X88, 0X77, 0X76, 0X66, 0X55, 0X54, 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XDD, + 0XCC, 0X44, 0X33, 0X2F, 0XEE, 0XDC, 0XBA, 0X98, 0X64, 0XF1, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0A, 0X87, 0X65, 0X54, + 0X32, 0XFF, 0XFE, 0XED, 0XCC, 0XBB, 0XBA, 0X33, 0X32, 0X2F, 0XFF, 0XEE, + 0XDD, 0XDC, 0XCC, 0XCB, 0XBA, 0XAA, 0X99, 0X98, 0X87, 0X77, 0X76, 0X66, + 0X55, 0X44, 0X43, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XCC, 0XBB, 0XAA, 0X22, + 0XFE, 0XEC, 0XCB, 0XA9, 0X76, 0X4F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0XA8, 0X77, 0X65, 0X43, 0X22, 0XFF, 0XEE, 0XDD, + 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, + 0XBA, 0XAA, 0X99, 0X98, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X32, + 0X2F, 0XFE, 0XEE, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, 0XFE, 0XED, 0XCC, 0XBA, + 0X97, 0X64, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0XA8, 0X76, 0X54, 0X43, 0X2F, 0XFE, 0XEE, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, + 0X98, 0X88, 0XEE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, + 0X77, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, + 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0XCC, 0XBA, 0X98, 0X75, 0X4F, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0A, 0X87, 0X76, 0X54, 0X32, + 0X2F, 0XFE, 0XED, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X66, + 0X65, 0XCC, 0XCB, 0XBA, 0XAA, 0XA9, 0X99, 0X88, 0X77, 0X76, 0X66, 0X55, + 0X54, 0X44, 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, + 0X88, 0X77, 0X65, 0X54, 0XA9, 0X86, 0X52, 0XE1, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X0A, 0X87, 0X65, 0X44, 0X32, 0XFF, 0XEE, 0XDD, 0XCC, + 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0XBB, 0XBA, + 0XAA, 0X99, 0X98, 0X87, 0X77, 0X76, 0X66, 0X55, 0X54, 0X43, 0X33, 0X22, + 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X65, 0X54, + 0X33, 0X27, 0X65, 0X2E, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XA8, + 0X76, 0X55, 0X43, 0X22, 0XFF, 0XEE, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, + 0X88, 0X87, 0X76, 0X66, 0X55, 0X55, 0X44, 0X3A, 0XAA, 0X99, 0X98, 0X87, + 0X77, 0X66, 0X66, 0X55, 0X54, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, + 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X65, 0X54, 0X33, 0X2F, 0XED, 0XC2, + 0XE1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0XA8, 0X76, 0X54, 0X32, 0X2F, + 0XFE, 0XED, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X76, 0X66, + 0X55, 0X54, 0X44, 0X33, 0X32, 0X99, 0X88, 0X77, 0X77, 0X66, 0X65, 0X55, + 0X44, 0X43, 0X32, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, + 0X88, 0X77, 0X66, 0X55, 0X43, 0X2F, 0XED, 0XCB, 0X97, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, + 0X00, 0X00, 0X0A, 0X87, 0X65, 0X54, 0X32, 0X2F, 0XEE, 0XED, 0XDC, 0XCB, + 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X54, 0X43, 0X33, + 0X32, 0X22, 0XFF, 0XE7, 0X76, 0X66, 0X65, 0X55, 0X44, 0X33, 0X32, 0X22, + 0XFF, 0XFE, 0XED, 0XDC, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X76, 0X55, + 0X43, 0X32, 0XFE, 0XDC, 0X97, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0XA8, 0X76, + 0X55, 0X43, 0X22, 0XFF, 0XEE, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X88, + 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0X22, 0XFF, 0XEE, + 0XED, 0X66, 0X55, 0X55, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XED, 0XDC, + 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X76, 0X55, 0X43, 0X32, 0XFE, 0XDC, + 0XB9, 0X71, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0XA8, 0X76, 0X54, 0X32, 0X22, 0XFE, + 0XEE, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, + 0X55, 0X44, 0X33, 0X33, 0X22, 0X2F, 0XFE, 0XEE, 0XED, 0XDD, 0XC5, 0X54, + 0X44, 0X33, 0X32, 0X22, 0XFF, 0XEE, 0XED, 0XDC, 0XCC, 0XBB, 0XAA, 0XA9, + 0X88, 0X77, 0X76, 0X55, 0X43, 0X32, 0XFE, 0XDC, 0XB9, 0X71, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, + 0X00, 0X0A, 0X87, 0X65, 0X54, 0X32, 0X2F, 0XEE, 0XED, 0XDC, 0XCB, 0XBB, + 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X76, 0X66, 0X55, 0X54, 0X44, 0X33, 0X32, + 0X22, 0X2F, 0XFE, 0XEE, 0XDD, 0XDD, 0XCC, 0XC4, 0X43, 0X33, 0X22, 0X2F, + 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, 0XA9, 0X98, 0X87, 0X76, 0X55, + 0X44, 0X32, 0XFE, 0XDD, 0XCA, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X0A, 0X87, 0X65, + 0X43, 0X22, 0X2F, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, + 0X77, 0X66, 0X65, 0X55, 0X54, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XEE, 0XEE, + 0XDD, 0XDC, 0XCC, 0XCB, 0XBA, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, + 0XCC, 0XBB, 0XAA, 0XA9, 0X98, 0X87, 0X76, 0X55, 0X44, 0X33, 0X2F, 0XED, + 0XCB, 0X97, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X10, 0X00, 0X00, 0X3F, 0XED, 0X55, 0X43, 0X22, 0XFE, 0XEE, + 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, + 0X44, 0X43, 0X33, 0X32, 0X22, 0XFF, 0XEE, 0XED, 0XDD, 0XDC, 0XCC, 0XBB, + 0XBA, 0XAA, 0X99, 0X98, 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, 0XA9, + 0X98, 0X87, 0X76, 0X65, 0X54, 0X33, 0X2F, 0XED, 0XCB, 0X97, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, + 0X00, 0X3F, 0XED, 0XCB, 0XA2, 0X22, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XBA, + 0XAA, 0X99, 0X88, 0X87, 0X76, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, + 0X2F, 0XFF, 0XEE, 0XED, 0XDD, 0XCC, 0XCC, 0XBB, 0XAA, 0XAA, 0X99, 0X98, + 0X88, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, 0XA9, 0X98, 0X87, 0X76, 0X65, + 0X54, 0X33, 0X2F, 0XED, 0XDC, 0XA8, 0X51, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X3F, 0XED, 0XCB, + 0XA9, 0X98, 0XEE, 0XED, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, + 0X76, 0X66, 0X55, 0X54, 0X44, 0X33, 0X33, 0X22, 0X2F, 0XFE, 0XEE, 0XED, + 0XDD, 0XCC, 0XCC, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X88, 0X77, 0X6D, 0XDC, + 0XCC, 0XBB, 0XAA, 0XA9, 0X98, 0X87, 0X76, 0X65, 0X54, 0X33, 0X2F, 0XFE, + 0XDC, 0XB9, 0X71, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X3F, 0XED, 0XCB, 0XA9, 0X98, 0X77, 0XDD, + 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X66, 0X66, 0X55, 0X54, + 0X44, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDD, 0XCC, 0XCB, 0XBB, + 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X77, 0X66, 0X65, 0XCC, 0XBB, 0XAA, 0XA9, + 0X98, 0X87, 0X77, 0X65, 0X54, 0X43, 0X3F, 0XFE, 0XDC, 0XBA, 0X81, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, + 0X00, 0X3F, 0XDC, 0XBB, 0XA9, 0X98, 0X77, 0X66, 0X55, 0X4B, 0XBA, 0XAA, + 0X99, 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X32, 0X22, + 0XFF, 0XEE, 0XEE, 0XDD, 0XDC, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, + 0X87, 0X76, 0X66, 0X65, 0X55, 0X44, 0X3A, 0XA9, 0X98, 0X87, 0X77, 0X65, + 0X54, 0X43, 0X32, 0XFE, 0XDD, 0XBA, 0X85, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X03, 0XFE, 0XDC, 0XBA, + 0XA9, 0X98, 0X77, 0X66, 0X55, 0X44, 0X4A, 0XAA, 0X99, 0X88, 0X87, 0X76, + 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XED, 0XDD, + 0XDC, 0XCC, 0XCB, 0XBA, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, + 0X55, 0X44, 0X33, 0X39, 0X98, 0X87, 0X77, 0X65, 0X54, 0X43, 0X32, 0XFF, + 0XDD, 0XCB, 0X95, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X03, 0XFE, 0XDC, 0XBA, 0X99, 0X88, 0X77, 0X66, + 0X55, 0X44, 0X43, 0X32, 0X2F, 0X88, 0X77, 0X76, 0X66, 0X55, 0X54, 0X44, + 0X43, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XED, 0XDD, 0XCC, 0XCC, 0XBB, 0XBA, + 0XAA, 0X99, 0X98, 0X88, 0X87, 0X76, 0X66, 0X55, 0X54, 0X44, 0X33, 0X32, + 0X2F, 0XFE, 0X77, 0X66, 0X55, 0X43, 0X32, 0XFF, 0XED, 0XCB, 0XA8, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X03, 0XFE, 0XDC, 0XBA, 0X99, 0X87, 0X76, 0X65, 0X55, 0X44, 0X43, 0X32, + 0X2F, 0XFF, 0X77, 0X66, 0X66, 0X55, 0X54, 0X44, 0X33, 0X33, 0X22, 0XFF, + 0XFE, 0XEE, 0XED, 0XDD, 0XCC, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, + 0X77, 0X76, 0X66, 0X55, 0X54, 0X43, 0X33, 0X32, 0X2F, 0XFE, 0XEE, 0X66, + 0X55, 0X44, 0X33, 0XFF, 0XED, 0XDB, 0XA8, 0X51, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X03, 0XFE, 0XDC, 0XBA, + 0X99, 0X87, 0X76, 0X65, 0X54, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XD6, + 0X65, 0X55, 0X44, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDD, + 0XCC, 0XCB, 0XBB, 0XAA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X66, 0X66, 0X55, + 0X54, 0X43, 0X33, 0X22, 0X2F, 0XFE, 0XEE, 0XDD, 0XCC, 0X44, 0X33, 0X2F, + 0XED, 0XDC, 0XB9, 0X51, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X03, 0XFE, 0XDC, 0XBA, 0X99, 0X87, 0X76, 0X65, + 0X54, 0X44, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XB4, 0X43, + 0X33, 0X32, 0X2F, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, 0XCC, 0XCB, 0XBB, 0XAA, + 0XA9, 0X99, 0X88, 0X88, 0X77, 0X66, 0X65, 0X55, 0X54, 0X43, 0X33, 0X22, + 0XFF, 0XFE, 0XEE, 0XDD, 0XCC, 0XBB, 0XAA, 0X2F, 0XFD, 0XDC, 0XBA, 0X85, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X03, 0XFD, 0XCB, 0XBA, 0X99, 0X87, 0X76, 0X65, 0X54, 0X44, 0X33, 0X22, + 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0X33, 0X22, 0X2F, 0XFF, + 0XEE, 0XEE, 0XDD, 0XDC, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, + 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0XFF, 0XEE, 0XED, 0XDD, + 0XCC, 0XBB, 0XAA, 0X98, 0X8E, 0XDD, 0XBA, 0X85, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X03, 0XFD, 0XCB, 0XAA, + 0X99, 0X87, 0X76, 0X65, 0X54, 0X44, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, + 0XDC, 0XCB, 0XBB, 0XBA, 0XAA, 0X22, 0XFF, 0XFF, 0XEE, 0XED, 0XDD, 0XDC, + 0XCC, 0XBB, 0XBA, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X76, 0X66, 0X65, 0X55, + 0X44, 0X33, 0X33, 0X22, 0XFF, 0XEE, 0XED, 0XDC, 0XCC, 0XBB, 0XAA, 0X98, + 0X87, 0X66, 0XCB, 0XA8, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X03, 0XFD, 0XCB, 0XAA, 0X98, 0X87, 0X76, 0X65, + 0X54, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, + 0XAA, 0X99, 0X8F, 0XFE, 0XEE, 0XED, 0XDD, 0XCC, 0XCC, 0XBB, 0XBA, 0XAA, + 0X99, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, 0X55, 0X44, 0X33, 0X32, 0X22, + 0XFF, 0XEE, 0XED, 0XDC, 0XCB, 0XBA, 0XAA, 0X98, 0X87, 0X66, 0X54, 0X3F, + 0X51, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X03, 0XFD, 0XCB, 0XAA, 0X98, 0X87, 0X66, 0X55, 0X54, 0X43, 0X32, 0X22, + 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, + 0XEE, 0XDD, 0XDD, 0XCC, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X87, + 0X76, 0X66, 0X55, 0X54, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XED, 0XDC, + 0XCB, 0XBA, 0XA9, 0X98, 0X87, 0X66, 0X54, 0X3F, 0XC1, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X32, 0XFD, 0XCB, 0XAA, + 0X98, 0X87, 0X66, 0X55, 0X44, 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XED, 0XDD, + 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X87, 0X77, 0X6D, 0XDC, 0XCC, + 0XCB, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X76, 0X66, 0X55, 0X54, + 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCB, 0XBA, 0XA9, 0X98, + 0X77, 0X66, 0X54, 0X3F, 0XC1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X3F, 0XED, 0XCB, 0XAA, 0X98, 0X87, 0X66, 0X55, + 0X44, 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XDD, 0XDD, 0XCC, 0XBB, 0XBB, 0XAA, + 0XA9, 0X98, 0X88, 0X77, 0X77, 0X66, 0X65, 0X55, 0X54, 0XBB, 0XAA, 0XAA, + 0X99, 0X98, 0X88, 0X77, 0X66, 0X66, 0X55, 0X54, 0X44, 0X33, 0X32, 0X2F, + 0XFF, 0XEE, 0XDD, 0XCC, 0XCB, 0XBA, 0XA9, 0X88, 0X77, 0X65, 0X44, 0X3F, + 0XC1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, + 0X3F, 0XDC, 0XBB, 0XA9, 0X98, 0X87, 0X66, 0X55, 0X44, 0X43, 0X32, 0X2F, + 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0XAA, 0XA9, 0X98, 0X88, 0X77, + 0X76, 0X66, 0X65, 0X55, 0X54, 0X44, 0X3A, 0XA9, 0X99, 0X98, 0X88, 0X77, + 0X66, 0X65, 0X55, 0X54, 0X43, 0X33, 0X32, 0X2F, 0XFE, 0XEE, 0XDD, 0XCC, + 0XCB, 0XBA, 0XA9, 0X88, 0X76, 0X65, 0X43, 0X2F, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X3F, 0XDC, 0XBA, 0XA9, + 0X98, 0X77, 0X66, 0X55, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, + 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X76, 0X66, 0X55, 0X55, + 0X44, 0X44, 0X33, 0X32, 0X99, 0X88, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, + 0X43, 0X33, 0X22, 0X2F, 0XFE, 0XEE, 0XDD, 0XCC, 0XCB, 0XBA, 0XA9, 0X88, + 0X76, 0X65, 0X43, 0XFE, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0XAF, 0XDC, 0XBA, 0XA9, 0X88, 0X77, 0X66, 0X55, + 0X44, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XBA, 0XAA, + 0X99, 0X88, 0X88, 0X77, 0X76, 0X66, 0X55, 0X55, 0X44, 0X43, 0X33, 0X32, + 0X22, 0XF8, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0XFF, + 0XFE, 0XEE, 0XDD, 0XCC, 0XBB, 0XAA, 0XA9, 0X88, 0X76, 0X65, 0X43, 0XFC, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, + 0XA8, 0X65, 0XBA, 0XA9, 0X88, 0X76, 0X65, 0X55, 0X44, 0X33, 0X22, 0X2F, + 0XFE, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XAA, 0XAA, 0X99, 0X88, 0X87, 0X77, + 0X76, 0X66, 0X55, 0X54, 0X44, 0X43, 0X33, 0X22, 0X22, 0XFF, 0XF7, 0X76, + 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, + 0XBB, 0XAA, 0X99, 0X88, 0X76, 0X65, 0X43, 0XFC, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X9A, 0X65, 0X43, 0X39, + 0X88, 0X76, 0X65, 0X54, 0X44, 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XDC, + 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X77, 0X66, 0X66, 0X55, 0X54, + 0X44, 0X33, 0X33, 0X22, 0X2F, 0XFF, 0XFE, 0XED, 0X66, 0X55, 0X55, 0X44, + 0X33, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDC, 0XCC, 0XBB, 0XAA, 0X99, 0X87, + 0X76, 0X65, 0X43, 0XFC, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X0A, 0X86, 0X53, 0X32, 0XFF, 0X76, 0X65, 0X54, + 0X43, 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, + 0X98, 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0X54, 0X44, 0X33, 0X32, 0X22, + 0X2F, 0XFF, 0XEE, 0XED, 0XDD, 0XC5, 0X54, 0X44, 0X33, 0X32, 0X22, 0XFF, + 0XFE, 0XED, 0XDC, 0XCC, 0XBB, 0XAA, 0X99, 0X87, 0X76, 0X54, 0X43, 0XFC, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, + 0X0A, 0X86, 0X54, 0X33, 0XFF, 0XED, 0XD5, 0X54, 0X43, 0X32, 0X22, 0XFF, + 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X77, + 0X66, 0X65, 0X55, 0X44, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XFF, 0XEE, 0XDD, + 0XDD, 0XCC, 0XCB, 0XBB, 0XA3, 0X32, 0X2F, 0XFF, 0XEE, 0XED, 0XDC, 0XCC, + 0XBB, 0XAA, 0X99, 0X87, 0X76, 0X54, 0X32, 0XF1, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0XA6, 0X54, 0X33, + 0X2F, 0XED, 0XDC, 0XCB, 0XB3, 0X32, 0X22, 0XFF, 0XEE, 0XED, 0XDD, 0XCC, + 0XBB, 0XBA, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X76, 0X66, 0X65, 0X55, 0X44, + 0X43, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, 0XCC, 0XCB, 0XBB, + 0XAA, 0XA2, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, 0X99, 0X87, + 0X76, 0X54, 0X32, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0XA8, 0X65, 0X33, 0X2F, 0XFD, 0XDC, 0XCB, + 0XBA, 0XA9, 0X22, 0XFF, 0XEE, 0XDD, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, + 0X98, 0X88, 0X77, 0X76, 0X66, 0X55, 0X54, 0X44, 0X43, 0X33, 0X22, 0X22, + 0XFF, 0XFE, 0XED, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0XAA, 0XA9, 0X98, 0XFF, + 0XEE, 0XDD, 0XCC, 0XCB, 0XBA, 0XAA, 0X99, 0X87, 0X76, 0X54, 0X32, 0XF1, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, + 0X00, 0XA8, 0X65, 0X43, 0X2F, 0XFE, 0XDD, 0XCB, 0XBA, 0XA9, 0X99, 0X88, + 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X88, 0X77, 0X76, + 0X66, 0X55, 0X54, 0X44, 0X33, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XED, 0XDD, + 0XCC, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0XDD, 0XCC, 0XCB, + 0XBA, 0XA9, 0X98, 0X87, 0X66, 0X54, 0X32, 0XF1, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X0A, 0X65, 0X43, + 0X3F, 0XFE, 0XDD, 0XCC, 0XBB, 0XA9, 0X99, 0X88, 0X77, 0X6D, 0XDC, 0XCB, + 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X87, 0X77, 0X66, 0X66, 0X55, 0X54, 0X44, + 0X33, 0X32, 0X22, 0X2F, 0XFF, 0XEE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, + 0XAA, 0X99, 0X88, 0X87, 0X76, 0X66, 0X5C, 0XCB, 0XBA, 0XA9, 0X98, 0X77, + 0X66, 0X54, 0X32, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X0A, 0X86, 0X53, 0X32, 0XFE, 0XDD, 0XCC, + 0XBB, 0XA9, 0X99, 0X88, 0X77, 0X66, 0X65, 0X54, 0XBB, 0XAA, 0XAA, 0X99, + 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X44, 0X33, 0X32, 0X22, 0XFF, + 0XFE, 0XEE, 0XDD, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, + 0X76, 0X66, 0X55, 0X54, 0X4A, 0XA9, 0X98, 0X77, 0X65, 0X44, 0X3F, 0XC1, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, + 0X00, 0X0A, 0X96, 0X54, 0X32, 0XFF, 0XDD, 0XCC, 0XBB, 0XA9, 0X99, 0X88, + 0X77, 0X66, 0X65, 0X54, 0X44, 0X3A, 0XA9, 0X99, 0X88, 0X87, 0X77, 0X66, + 0X65, 0X55, 0X44, 0X43, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, + 0XCC, 0XBB, 0XBA, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, + 0X33, 0X39, 0X98, 0X77, 0X65, 0X43, 0X2F, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X0A, 0X96, 0X54, + 0X33, 0XFF, 0XED, 0XDC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X66, 0X65, 0X54, + 0X44, 0X33, 0X39, 0X98, 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, + 0X33, 0X22, 0X22, 0XFF, 0XEE, 0XED, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0XAA, + 0X99, 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X22, 0X2F, 0XEE, + 0X65, 0X43, 0X2F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0XA8, 0X64, 0X33, 0X2F, 0XED, 0XDC, + 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X66, 0X65, 0X54, 0X44, 0X33, 0X32, 0X2F, + 0X88, 0X77, 0X76, 0X66, 0X65, 0X54, 0X44, 0X43, 0X33, 0X22, 0X2F, 0XFF, + 0XEE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XAA, 0X99, 0X88, 0X87, 0X76, + 0X66, 0X55, 0X54, 0X43, 0X33, 0X22, 0XFE, 0XED, 0XDC, 0X43, 0X2F, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, + 0X00, 0X00, 0XA9, 0X65, 0X43, 0X2F, 0XED, 0XDC, 0XBB, 0XAA, 0X99, 0X88, + 0X77, 0X66, 0X65, 0X54, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XED, 0X66, + 0X55, 0X54, 0X44, 0X33, 0X33, 0X22, 0X2F, 0XFE, 0XEE, 0XDD, 0XDD, 0XCC, + 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, 0X54, 0X43, + 0X32, 0X22, 0XFE, 0XED, 0XCB, 0XBA, 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0XA9, 0X65, + 0X43, 0X2F, 0XED, 0XDC, 0XCB, 0XBA, 0X99, 0X88, 0X77, 0X66, 0X65, 0X54, + 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XED, 0XDD, 0X55, 0X44, 0X44, 0X33, + 0X32, 0X22, 0X2F, 0XFE, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XBB, 0XAA, 0XA9, + 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X32, 0X2F, 0XEE, 0XDD, + 0XCB, 0XA9, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X0A, 0X86, 0X43, 0X32, 0XFE, 0XDC, + 0XCB, 0XBA, 0X99, 0X98, 0X77, 0X66, 0X65, 0X54, 0X44, 0X33, 0X22, 0X2F, + 0XFF, 0XEE, 0XDD, 0XDD, 0XCC, 0XB4, 0X43, 0X33, 0X32, 0X22, 0XFF, 0XEE, + 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X66, + 0X65, 0X55, 0X44, 0X33, 0X22, 0XFF, 0XEE, 0XDC, 0XBB, 0XA9, 0X81, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, + 0X00, 0X00, 0X0A, 0X96, 0X54, 0X32, 0XFE, 0XDD, 0XCB, 0XBA, 0X99, 0X98, + 0X87, 0X66, 0X65, 0X54, 0X44, 0X33, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, + 0XCC, 0XBB, 0XBA, 0X33, 0X22, 0X22, 0XFF, 0XEE, 0XED, 0XDD, 0XDC, 0XCB, + 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, 0X54, 0X43, 0X32, + 0X22, 0XFE, 0XED, 0XCC, 0XBA, 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X0A, 0X96, + 0X54, 0X32, 0XFE, 0XDD, 0XCB, 0XBA, 0X99, 0X98, 0X87, 0X76, 0X65, 0X54, + 0X44, 0X33, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XBA, 0XAA, + 0X92, 0X2F, 0XFE, 0XEE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, + 0X88, 0X87, 0X76, 0X66, 0X55, 0X54, 0X43, 0X32, 0X2F, 0XFE, 0XDD, 0XCB, + 0XA9, 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0XA9, 0X64, 0X32, 0XFE, 0XDD, + 0XCB, 0XBA, 0X99, 0X98, 0X87, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, 0XFF, + 0XFE, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X98, 0X87, 0XEE, + 0XDD, 0XDD, 0XCC, 0XBB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X66, 0X65, + 0X55, 0X44, 0X33, 0X22, 0X2F, 0XEE, 0XDC, 0XBB, 0XA9, 0X81, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X32, 0XD5, 0X43, 0X2F, 0XED, 0XCB, 0XBA, 0XA9, 0X98, + 0X87, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, + 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X77, 0X6D, 0XDC, 0XCC, 0XBB, + 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X22, + 0XFF, 0XED, 0XDC, 0XBA, 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, + 0X2D, 0XBA, 0X9F, 0XED, 0XDC, 0XBB, 0XA9, 0X98, 0X87, 0X76, 0X65, 0X54, + 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, + 0X99, 0X88, 0X77, 0X76, 0X66, 0X6C, 0XCB, 0XBB, 0XBA, 0XAA, 0X99, 0X88, + 0X87, 0X76, 0X66, 0X55, 0X54, 0X43, 0X32, 0X2F, 0XFE, 0XED, 0XCB, 0XBA, + 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X32, 0XDB, 0XA9, 0X7D, + 0XDC, 0XBB, 0XA9, 0X98, 0X87, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, 0XFF, + 0XEE, 0XED, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X76, + 0X66, 0X55, 0X54, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, + 0X54, 0X43, 0X32, 0X2F, 0XFE, 0XDC, 0XCB, 0XA9, 0X81, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X03, 0X2D, 0XBA, 0X87, 0X65, 0X44, 0XA9, 0X98, + 0X87, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, 0XFF, 0XEE, 0XED, 0XDC, 0XCC, + 0XBB, 0XBA, 0XA9, 0X99, 0X98, 0X87, 0X77, 0X66, 0X66, 0X55, 0X44, 0X44, + 0X33, 0X39, 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X22, 0XFF, + 0XEE, 0XDC, 0XBA, 0X99, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X3F, 0XCB, 0X98, 0X76, 0X54, 0X42, 0X28, 0X87, 0X76, 0X65, 0X54, + 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, + 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0X28, 0X88, + 0X77, 0X66, 0X65, 0X55, 0X44, 0X32, 0X2F, 0XFF, 0XED, 0XCC, 0XBA, 0X98, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0XFC, 0XA9, + 0X76, 0X54, 0X43, 0X22, 0XF7, 0X76, 0X65, 0X54, 0X43, 0X32, 0X2F, 0XFF, + 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XAA, 0X99, 0X99, 0X88, 0X77, 0X76, 0X66, + 0X55, 0X54, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XED, 0X66, 0X55, 0X54, + 0X43, 0X32, 0X2F, 0XFE, 0XDC, 0XCB, 0XA9, 0X98, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X3F, 0XCA, 0X97, 0X65, 0X44, 0X22, + 0XFE, 0XED, 0XD5, 0X54, 0X43, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XCC, 0XCB, + 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X76, 0X66, 0X55, 0X44, 0X44, 0X33, + 0X22, 0X2F, 0XFF, 0XEE, 0XDD, 0XDD, 0X55, 0X54, 0X43, 0X22, 0XFF, 0XFE, + 0XDC, 0XBA, 0X99, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X03, 0XFC, 0XA8, 0X76, 0X54, 0X32, 0X2F, 0XED, 0XDC, 0XCB, + 0XB3, 0X32, 0X2F, 0XFE, 0XEE, 0XDD, 0XCC, 0XBB, 0XBA, 0XA9, 0X99, 0X98, + 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, + 0XDD, 0XDC, 0XCC, 0XBB, 0X33, 0X22, 0XFF, 0XED, 0XCC, 0XBA, 0X98, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X2D, + 0XCA, 0X87, 0X54, 0X42, 0X2F, 0XEE, 0XDD, 0XCB, 0XBA, 0XA2, 0X2F, 0XFE, + 0XED, 0XDD, 0XCC, 0XBB, 0XBA, 0XA9, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, + 0X54, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XEE, 0XDD, 0XDD, 0XCC, 0XCB, 0XBA, + 0XA9, 0X9F, 0XFF, 0XED, 0XCB, 0XA9, 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X32, 0XDB, 0X98, 0X75, 0X43, + 0X22, 0XFE, 0XDD, 0XCC, 0XBA, 0XA9, 0X98, 0X8E, 0XED, 0XDC, 0XCC, 0XBB, + 0XAA, 0X99, 0X99, 0X88, 0X77, 0X76, 0X66, 0X55, 0X44, 0X43, 0X33, 0X22, + 0X2F, 0XFE, 0XED, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X87, 0X6C, + 0XCB, 0XA9, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X03, 0X2D, 0XB9, 0X76, 0X54, 0X32, 0XFE, 0XED, 0XCC, + 0XBB, 0XA9, 0X98, 0X87, 0X76, 0X6C, 0XCB, 0XBB, 0XAA, 0X99, 0X98, 0X88, + 0X77, 0X66, 0X65, 0X54, 0X44, 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XDD, 0XDD, + 0XCC, 0XCB, 0XBA, 0XA9, 0X98, 0X88, 0X76, 0X55, 0X43, 0X99, 0X81, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X32, 0XDB, 0X87, 0X64, 0X42, 0X2F, 0XED, 0XDC, 0XBB, 0XA9, 0X98, 0X87, + 0X76, 0X65, 0X5B, 0XBA, 0XA9, 0X99, 0X98, 0X87, 0X77, 0X66, 0X65, 0X54, + 0X44, 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XDC, 0XCB, 0XBA, 0XAA, 0X98, + 0X88, 0X87, 0X65, 0X54, 0X32, 0X2F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0XFC, 0XA8, 0X75, + 0X43, 0X2F, 0XEE, 0XDC, 0XBB, 0XA9, 0X98, 0X87, 0X76, 0X65, 0X54, 0X43, + 0X32, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, 0X44, 0X43, 0X32, 0X22, 0XFF, + 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X87, 0X65, 0X54, 0X43, + 0X22, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X3F, 0XCA, 0X87, 0X44, 0X32, 0XFE, 0XDC, + 0XCB, 0XA9, 0X98, 0X87, 0X66, 0X55, 0X44, 0X43, 0X22, 0X22, 0X88, 0X77, + 0X76, 0X65, 0X54, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCB, + 0XBA, 0XA9, 0X98, 0X88, 0X76, 0X55, 0X43, 0X22, 0XF1, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X03, 0XFC, 0X97, 0X64, 0X32, 0XFE, 0XDD, 0XCB, 0XAA, 0X98, 0X87, + 0X66, 0X55, 0X44, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0X66, 0X65, 0X54, 0X44, + 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X87, + 0X65, 0X44, 0X32, 0X2F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0X78, + 0X75, 0X43, 0X2F, 0XED, 0XCB, 0XAA, 0X98, 0X77, 0X66, 0X55, 0X44, 0X32, + 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0X44, 0X43, 0X32, 0X22, 0XFF, 0XEE, + 0XDD, 0XDC, 0XCB, 0XBA, 0XA9, 0X88, 0X88, 0X76, 0X54, 0X43, 0X2F, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0X7E, 0X43, 0X2F, 0XED, + 0XCB, 0XBA, 0X98, 0X77, 0X66, 0X54, 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XDD, + 0XDC, 0XCB, 0XBB, 0XAA, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, + 0X98, 0X88, 0X76, 0X55, 0X43, 0X22, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0XAA, 0X7E, 0XA9, 0XFE, 0XDC, 0XBA, 0X98, 0X77, + 0X66, 0X54, 0X43, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XBA, 0XA9, + 0X99, 0XFF, 0XEE, 0XDD, 0XDC, 0XBB, 0XAA, 0XA9, 0X88, 0X87, 0X65, 0X44, + 0X32, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0XAA, 0X7E, 0XA9, 0X6C, 0XBA, 0X98, 0X76, 0X66, 0X54, 0X33, 0X22, + 0XFF, 0XEE, 0XDD, 0XDC, 0XBB, 0XBA, 0XA9, 0X99, 0X98, 0X87, 0X7D, 0XDD, + 0XCB, 0XBA, 0XA9, 0X98, 0X88, 0X76, 0X54, 0X43, 0XF1, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0X7E, + 0XA7, 0X53, 0X98, 0X76, 0X65, 0X54, 0X32, 0X2F, 0XFE, 0XED, 0XDD, 0XCB, + 0XBB, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X66, 0X65, 0X44, 0XAA, 0X98, 0X88, + 0X87, 0X64, 0X43, 0X2F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0X7B, 0X96, 0X3F, 0XE6, + 0X65, 0X43, 0X32, 0X2F, 0XEE, 0XDD, 0XCC, 0XBB, 0XBA, 0X99, 0X98, 0X88, + 0X77, 0X66, 0X65, 0X44, 0X33, 0X32, 0X88, 0X87, 0X65, 0X44, 0X3F, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0XAA, 0X7B, 0X93, 0XFE, 0XDC, 0XB3, 0X22, 0XFE, + 0XED, 0XDC, 0XCB, 0XBA, 0XA9, 0X98, 0X88, 0X77, 0X66, 0X65, 0X44, 0X33, + 0X32, 0XFF, 0XFF, 0XED, 0X44, 0X43, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0XAA, 0X7B, 0X5F, 0XDC, 0XAA, 0X98, 0XEE, 0XDD, 0XCB, 0XBB, 0XA9, + 0X98, 0X88, 0X77, 0X66, 0X54, 0X43, 0X33, 0X2F, 0XFF, 0XFF, 0XED, 0XBB, + 0XBA, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0X7B, + 0XEB, 0XA9, 0X77, 0X76, 0X65, 0XBB, 0XBA, 0X98, 0X88, 0X77, 0X65, 0X44, + 0X43, 0X32, 0XFF, 0XFF, 0XED, 0XDB, 0XBB, 0XBA, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0XB9, 0X77, 0X64, 0X44, + 0X44, 0X43, 0X28, 0X88, 0X77, 0X65, 0X44, 0X43, 0X32, 0XFF, 0XED, 0XDC, + 0XBB, 0XBA, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAB, 0XBF, 0XFF, 0XFF, 0XFF, 0XEC, + 0X54, 0X44, 0X33, 0X2F, 0XED, 0XDD, 0XBB, 0XBA, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X66, 0XAB, 0XBB, 0XBA, 0X97, 0XED, 0XDD, + 0XDB, 0XBA, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X66, 0X66, 0X53, 0XBA, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X01, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00}; diff --git a/lib/Adafruit_ILI9341/examples/pyportal_boing/pyportal_boing.ino b/lib/Adafruit_ILI9341/examples/pyportal_boing/pyportal_boing.ino new file mode 100644 index 000000000..4c7689589 --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/pyportal_boing/pyportal_boing.ino @@ -0,0 +1,162 @@ +// 'Boing' ball demo for PyPortal. +// Requires Adafruit_GFX 1.4.5 or later and Adafruit_DMA + +#include "Adafruit_GFX.h" +#include "Adafruit_ILI9341.h" +#define SCREENWIDTH ILI9341_TFTHEIGHT // Native display orientation is +#define SCREENHEIGHT ILI9341_TFTWIDTH // vertical, so swap width/height +#include "graphics.h" + +#define TFT_D0 34 // Data bit 0 pin (MUST be on PORT byte boundary) +#define TFT_WR 26 // Write-strobe pin (CCL-inverted timer output) +#define TFT_DC 10 // Data/command pin +#define TFT_CS 11 // Chip-select pin +#define TFT_RST 24 // Reset pin +#define TFT_RD 9 // Read-strobe pin +#define TFT_BACKLIGHT 25 + +// ILI9341 with 8-bit parallel interface: +Adafruit_ILI9341 tft(tft8bitbus, TFT_D0, TFT_WR, TFT_DC, TFT_CS, TFT_RST, TFT_RD); + +#define BGCOLOR 0xAD75 +#define GRIDCOLOR 0xA815 +#define BGSHADOW 0x5285 +#define GRIDSHADOW 0x600C +#define RED 0xF800 +#define WHITE 0xFFFF + +#define YBOTTOM 123 // Ball Y coord at bottom + #define YBOUNCE -3.5 // Upward velocity on ball bounce + +// Ball coordinates are stored floating-point because screen refresh +// is so quick, whole-pixel movements are just too fast! +float ballx = 20.0, bally = YBOTTOM, // Current ball position + ballvx = 0.8, ballvy = YBOUNCE, // Ball velocity + ballframe = 3; // Ball animation frame # +int balloldx = ballx, balloldy = bally; // Prior ball position + +// Working buffer for ball rendering...2 scanlines that alternate, +// one is rendered while the other is transferred via DMA. +uint16_t renderbuf[2][SCREENWIDTH]; + +uint16_t palette[16]; // Color table for ball rotation effect + +uint32_t startTime, frame = 0; // For frames-per-second estimate + +void setup() { + Serial.begin(9600); +// while(!Serial); + + // Turn on backlight (required on PyPortal) + pinMode(TFT_BACKLIGHT, OUTPUT); + digitalWrite(TFT_BACKLIGHT, HIGH); + + tft.begin(); + tft.setRotation(3); // Landscape orientation, USB at bottom right + + // Draw initial framebuffer contents: + tft.drawBitmap(0, 0, (uint8_t *)background, + SCREENWIDTH, SCREENHEIGHT, GRIDCOLOR, BGCOLOR); + + startTime = millis(); +} + +void loop() { + + balloldx = (int16_t)ballx; // Save prior position + balloldy = (int16_t)bally; + ballx += ballvx; // Update position + bally += ballvy; + ballvy += 0.06; // Update Y velocity + if((ballx <= 15) || (ballx >= SCREENWIDTH - BALLWIDTH)) + ballvx *= -1; // Left/right bounce + if(bally >= YBOTTOM) { // Hit ground? + bally = YBOTTOM; // Clip and + ballvy = YBOUNCE; // bounce up + } + + // Determine screen area to update. This is the bounds of the ball's + // prior and current positions, so the old ball is fully erased and new + // ball is fully drawn. + int16_t minx, miny, maxx, maxy, width, height; + // Determine bounds of prior and new positions + minx = ballx; + if(balloldx < minx) minx = balloldx; + miny = bally; + if(balloldy < miny) miny = balloldy; + maxx = ballx + BALLWIDTH - 1; + if((balloldx + BALLWIDTH - 1) > maxx) maxx = balloldx + BALLWIDTH - 1; + maxy = bally + BALLHEIGHT - 1; + if((balloldy + BALLHEIGHT - 1) > maxy) maxy = balloldy + BALLHEIGHT - 1; + + width = maxx - minx + 1; + height = maxy - miny + 1; + + // Ball animation frame # is incremented opposite the ball's X velocity + ballframe -= ballvx * 0.5; + if(ballframe < 0) ballframe += 14; // Constrain from 0 to 13 + else if(ballframe >= 14) ballframe -= 14; + + // Set 7 palette entries to white, 7 to red, based on frame number. + // This makes the ball spin + for(uint8_t i=0; i<14; i++) { + palette[i+2] = ((((int)ballframe + i) % 14) < 7) ? WHITE : RED; + // Palette entries 0 and 1 aren't used (clear and shadow, respectively) + } + + // Only the changed rectangle is drawn into the 'renderbuf' array... + uint16_t c, *destPtr; + int16_t bx = minx - (int)ballx, // X relative to ball bitmap (can be negative) + by = miny - (int)bally, // Y relative to ball bitmap (can be negative) + bgx = minx, // X relative to background bitmap (>= 0) + bgy = miny, // Y relative to background bitmap (>= 0) + x, y, bx1, bgx1; // Loop counters and working vars + uint8_t p; // 'packed' value of 2 ball pixels + int8_t bufIdx = 0; + + tft.dmaWait(); // Wait for last line from prior call to complete + tft.endWrite(); + + tft.startWrite(); + tft.setAddrWindow(minx, miny, width, height); + + for(y=0; y= 0) && (bx1 < BALLWIDTH) && // Is current pixel row/column + (by >= 0) && (by < BALLHEIGHT)) { // inside the ball bitmap area? + // Yes, do ball compositing math... + p = ball[by][bx1 / 2]; // Get packed value (2 pixels) + c = (bx1 & 1) ? (p & 0xF) : (p >> 4); // Unpack high or low nybble + if(c == 0) { // Outside ball - just draw grid + c = background[bgy][bgx1 / 8] & (0x80 >> (bgx1 & 7)) ? GRIDCOLOR : BGCOLOR; + } else if(c > 1) { // In ball area... + c = palette[c]; + } else { // In shadow area... + c = background[bgy][bgx1 / 8] & (0x80 >> (bgx1 & 7)) ? GRIDSHADOW : BGSHADOW; + } + } else { // Outside ball bitmap, just draw background bitmap... + c = background[bgy][bgx1 / 8] & (0x80 >> (bgx1 & 7)) ? GRIDCOLOR : BGCOLOR; + } + *destPtr++ = c; // Store pixel color + bx1++; // Increment bitmap position counters (X axis) + bgx1++; + } + tft.dmaWait(); // Wait for prior line to complete + tft.writePixels(&renderbuf[bufIdx][0], width, false); // Non-blocking write + bufIdx = 1 - bufIdx; + by++; // Increment bitmap position counters (Y axis) + bgy++; + } + + // Show approximate frame rate + if(!(++frame & 255)) { // Every 256 frames... + uint32_t elapsed = (millis() - startTime) / 1000; // Seconds + if(elapsed) { + Serial.print(frame / elapsed); + Serial.println(" fps"); + } + } +} diff --git a/lib/Adafruit_ILI9341/examples/touchpaint/touchpaint.ino b/lib/Adafruit_ILI9341/examples/touchpaint/touchpaint.ino new file mode 100644 index 000000000..227abdc84 --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/touchpaint/touchpaint.ino @@ -0,0 +1,146 @@ +/*************************************************** + 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/Adafruit_ILI9341/examples/touchpaint_featherwing/touchpaint_featherwing.ino b/lib/Adafruit_ILI9341/examples/touchpaint_featherwing/touchpaint_featherwing.ino new file mode 100644 index 000000000..e641f090b --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/touchpaint_featherwing/touchpaint_featherwing.ino @@ -0,0 +1,158 @@ +/*************************************************** + 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 +#elif defined(ESP32) && !defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2) + #define STMPE_CS 32 + #define TFT_CS 15 + #define TFT_DC 33 + #define SD_CS 14 +#elif defined(TEENSYDUINO) + #define TFT_DC 10 + #define TFT_CS 4 + #define STMPE_CS 3 + #define SD_CS 8 +#elif defined(ARDUINO_STM32_FEATHER) + #define TFT_DC PB4 + #define TFT_CS PA15 + #define STMPE_CS PC7 + #define SD_CS PC5 +#elif defined(ARDUINO_NRF52832_FEATHER) /* BSP 0.6.5 and higher! */ + #define TFT_DC 11 + #define TFT_CS 31 + #define STMPE_CS 30 + #define SD_CS 27 +#elif 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 +#else + // Anything else, defaults! + #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/Adafruit_ILI9341/examples/touchpaint_pyportal/.pyportal.test.only b/lib/Adafruit_ILI9341/examples/touchpaint_pyportal/.pyportal.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/lib/Adafruit_ILI9341/examples/touchpaint_pyportal/touchpaint_pyportal.ino b/lib/Adafruit_ILI9341/examples/touchpaint_pyportal/touchpaint_pyportal.ino new file mode 100644 index 000000000..d25f77fe0 --- /dev/null +++ b/lib/Adafruit_ILI9341/examples/touchpaint_pyportal/touchpaint_pyportal.ino @@ -0,0 +1,114 @@ +#include "Adafruit_ILI9341.h" +#include "TouchScreen.h" + +#define YP A4 +#define XM A7 +#define YM A6 +#define XP A5 +TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); +#define X_MIN 325 +#define X_MAX 750 +#define Y_MIN 840 +#define Y_MAX 240 + +// Pin settings for PyPortal +#define TFT_D0 34 // Data bit 0 pin (MUST be on PORT byte boundary) +#define TFT_WR 26 // Write-strobe pin (CCL-inverted timer output) +#define TFT_DC 10 // Data/command pin +#define TFT_CS 11 // Chip-select pin +#define TFT_RST 24 // Reset pin +#define TFT_RD 9 // Read-strobe pin +#define TFT_BACKLIGHT 25 +// ILI9341 with 8-bit parallel interface: +Adafruit_ILI9341 tft = Adafruit_ILI9341(tft8bitbus, TFT_D0, TFT_WR, TFT_DC, TFT_CS, TFT_RST, TFT_RD); + +// 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 + + delay(100); + 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; + + pinMode(TFT_BACKLIGHT, OUTPUT); + digitalWrite(TFT_BACKLIGHT, HIGH); + +} + + +void loop() +{ + TSPoint p = ts.getPoint(); + // we have some minimum pressure we consider 'valid' + // pressure of 0 means no pressing! + if ((p.z < 100) || (p.z > 1000)) { + return; + } + Serial.print("X = "); Serial.print(p.x); + Serial.print("\tY = "); Serial.print(p.y); + Serial.print("\tPressure = "); Serial.println(p.z); + p.x = map(p.x, X_MIN, X_MAX, 0, 240); + p.y = map(p.y, Y_MIN, Y_MAX, 0, 320); + + 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/Adafruit_ILI9341/library.properties b/lib/Adafruit_ILI9341/library.properties new file mode 100644 index 000000000..fe8a31f5b --- /dev/null +++ b/lib/Adafruit_ILI9341/library.properties @@ -0,0 +1,10 @@ +name=Adafruit ILI9341 +version=1.5.10 +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=* +depends=Adafruit GFX Library, Adafruit STMPE610, Adafruit TouchScreen diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index 87d78bf85..6ab1f7b24 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -10,7 +10,7 @@ lib_ignore = ESP8266WiFi, ESP8266Ping, ESP8266WebServer, ESP8266H [esp32_common] extends = common, core_esp32_3_3_0 -lib_deps = td-er/ESPeasySerial @ 2.0.8, adafruit/Adafruit ILI9341 @ ^1.5.6, Adafruit GFX Library, LOLIN_EPD, Adafruit BusIO, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ArduinoOTA, ESP32HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library +lib_deps = td-er/ESPeasySerial @ 2.0.8, Adafruit ILI9341, Adafruit GFX Library, LOLIN_EPD, Adafruit BusIO, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ArduinoOTA, ESP32HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library lib_ignore = ${esp32_always.lib_ignore}, ESP32_ping, IRremoteESP8266, HeatpumpIR board_build.f_flash = 80000000L board_build.flash_mode = dout diff --git a/platformio_esp82xx_base.ini b/platformio_esp82xx_base.ini index 77f8c46bd..8255f578d 100644 --- a/platformio_esp82xx_base.ini +++ b/platformio_esp82xx_base.ini @@ -52,7 +52,7 @@ extends = common board_build.f_cpu = 80000000L build_flags = ${debug_flags.build_flags} ${mqtt_flags.build_flags} -DHTTPCLIENT_1_1_COMPATIBLE=0 build_unflags = -DDEBUG_ESP_PORT -lib_deps = td-er/ESPeasySerial @ 2.0.8, adafruit/Adafruit ILI9341 @ ^1.5.6, Adafruit GFX Library, LOLIN_EPD, Adafruit BusIO, bblanchon/ArduinoJson @ ^6.17.2, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/RABurton ESP8266 Mutex @ ^1.0.2, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ESP8266HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library +lib_deps = td-er/ESPeasySerial @ 2.0.8, Adafruit ILI9341, Adafruit GFX Library, LOLIN_EPD, Adafruit BusIO, bblanchon/ArduinoJson @ ^6.17.2, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/RABurton ESP8266 Mutex @ ^1.0.2, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ESP8266HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library lib_ignore = ${esp82xx_defaults.lib_ignore}, IRremoteESP8266, HeatpumpIR, LittleFS(esp8266), ServoESP32, TinyWireM board = esp12e monitor_filters = esp8266_exception_decoder diff --git a/src/_P095_ILI9341.ino b/src/_P095_ILI9341.ino index f808dcee4..70c35c4d6 100644 --- a/src/_P095_ILI9341.ino +++ b/src/_P095_ILI9341.ino @@ -4,18 +4,19 @@ #include "src/PluginStructs/P095_data_struct.h" //####################################################################################################### -//#################################### Plugin 095: ILI9341 TFT 2.4inches display ################################# +//################################# Plugin 095: ILI934x/ILI948x TFT display ############################# //####################################################################################################### #define PLUGIN_095 #define PLUGIN_ID_095 95 -#define PLUGIN_NAME_095 "Display - TFT 2.4 inches ILI9341 [TESTING]" +#define PLUGIN_NAME_095 "Display - TFT ILI934x/ILI948x [TESTING]" #define PLUGIN_VALUENAME1_095 "TFT" #define PLUGIN_095_MAX_DISPLAY 1 /** * Changelog: + * 2022-01-09 tonhuisman: Add support for ILI9342 (M5Stack, 240x320), ILI9481, ILI9486 and ILI9488 (320x480) displays * 2020-08-29 tonhuisman: Removed TS (Touchscreen) related stuff, XPT2046 will be a separate plugin * Changed initial text from '--cdt--' to 'ESPEasy' * 2020-08 tonhuisman: SPI improvements @@ -213,6 +214,39 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) { uint8_t init = PCONFIG(0); + { + const __FlashStringHelper *hardwareTypes[] = { + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9341_240x320), + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9342_240x320), + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_320x480), + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_CPT29_320x480), + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_PVI35_320x480), + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_AUO317_320x480), + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_CMO35_320x480), + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_RGB_320x480), + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9486_320x480), + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9488_320x480), + }; + const int hardwareOptions[] = { + static_cast(ILI9xxx_type_e::ILI9341_240x320), + static_cast(ILI9xxx_type_e::ILI9342_240x320), + static_cast(ILI9xxx_type_e::ILI9481_320x480), + static_cast(ILI9xxx_type_e::ILI9481_CPT29_320x480), + static_cast(ILI9xxx_type_e::ILI9481_PVI35_320x480), + static_cast(ILI9xxx_type_e::ILI9481_AUO317_320x480), + static_cast(ILI9xxx_type_e::ILI9481_CMO35_320x480), + static_cast(ILI9xxx_type_e::ILI9481_RGB_320x480), + static_cast(ILI9xxx_type_e::ILI9486_320x480), + static_cast(ILI9xxx_type_e::ILI9488_320x480), + }; + addFormSelector(F("TFT display model"), + F("p095_type"), + static_cast(ILI9xxx_type_e::ILI9xxx_MAX), + hardwareTypes, + hardwareOptions, + P095_CONFIG_FLAG_GET_TYPE); + } + //if already configured take it from settings, else use default values (only for pin values) if(init == 1) { @@ -235,6 +269,11 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) PCONFIG(0) = 1; //mark config as already saved (next time, will not use default values) // PIN(0)..(2) are already set PCONFIG(1) = getFormItemInt(F("p095_rotate")); + + uint32_t lSettings = 0; + set4BitToUL(lSettings, P095_CONFIG_FLAG_TYPE, getFormItemInt(F("p095_type"))); // Bit 20..24 Hardwaretype + P095_CONFIG_FLAGS = lSettings; + success = true; break; } @@ -249,6 +288,7 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) initPluginTaskData(event->TaskIndex, new (std::nothrow) P095_data_struct( + static_cast(P095_CONFIG_FLAG_GET_TYPE), TFT_Settings.address_tft_cs, TFT_Settings.address_tft_dc, TFT_Settings.address_tft_rst)); @@ -256,8 +296,8 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) static_cast(getPluginTaskData(event->TaskIndex)); if (nullptr != P095_data) { - P095_data->tft.setRotation(TFT_Settings.rotation); - P095_data->tft.fillScreen(ILI9341_WHITE); + P095_data->tft->setRotation(TFT_Settings.rotation); + P095_data->tft->fillScreen(ILI9341_WHITE); P095_data->printText(F("ESPEasy"), 1, 1); success = true; } @@ -300,28 +340,28 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) { if(subcommand.equalsIgnoreCase(F("ON"))) { - P095_data->tft.sendCommand(ILI9341_DISPON); + P095_data->tft->sendCommand(ILI9341_DISPON); } else if(subcommand.equalsIgnoreCase(F("OFF"))) { - P095_data->tft.sendCommand(ILI9341_DISPOFF); + P095_data->tft->sendCommand(ILI9341_DISPOFF); } else if(subcommand.equalsIgnoreCase(F("CLEAR"))) { arguments = arguments.substring(argIndex + 1); - P095_data->tft.fillScreen(P095_data->ParseColor(arguments)); + P095_data->tft->fillScreen(P095_data->ParseColor(arguments)); } else if(subcommand.equalsIgnoreCase(F("INV"))) { arguments = arguments.substring(argIndex + 1); - P095_data->tft.invertDisplay(arguments.toInt() == 1); + P095_data->tft->invertDisplay(arguments.toInt() == 1); } else if(subcommand.equalsIgnoreCase(F("ROT"))) { ///control?cmd=tftcmd,rot,0 //not working to verify arguments = arguments.substring(argIndex + 1); - P095_data->tft.setRotation(arguments.toInt() % 4); + P095_data->tft->setRotation(arguments.toInt() % 4); } else { @@ -346,33 +386,33 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) if(subcommand.equalsIgnoreCase(F("txt"))) { - P095_data->tft.println(arguments); //write all pending cars + P095_data->tft->println(arguments); //write all pending cars } else if(subcommand.equalsIgnoreCase(F("txp")) && argCount == 2) { - P095_data->tft.setCursor(sParams[0].toInt(), sParams[1].toInt()); + P095_data->tft->setCursor(sParams[0].toInt(), sParams[1].toInt()); } else if(subcommand.equalsIgnoreCase(F("txc")) && (argCount == 1 || argCount == 2) ) { if(argCount == 1) - P095_data->tft.setTextColor(P095_data->ParseColor(sParams[0])); + P095_data->tft->setTextColor(P095_data->ParseColor(sParams[0])); else //argCount=2 - P095_data->tft.setTextColor(P095_data->ParseColor(sParams[0]), P095_data->ParseColor(sParams[1])); + P095_data->tft->setTextColor(P095_data->ParseColor(sParams[0]), P095_data->ParseColor(sParams[1])); } else if(subcommand.equalsIgnoreCase(F("txs")) && argCount == 1) { - P095_data->tft.setTextSize(sParams[0].toInt()); + P095_data->tft->setTextSize(sParams[0].toInt()); } #ifdef PLUGIN_095_FONT_INCLUDED else if(subcommand.equalsIgnoreCase(F("font")) && argCount == 1) { if (sParams[0].equalsIgnoreCase(F("SEVENSEG24"))) { - P095_data->tft.setFont(&Seven_Segment24pt7b); + P095_data->tft->setFont(&Seven_Segment24pt7b); } else if (sParams[0].equalsIgnoreCase(F("SEVENSEG18"))) { - P095_data->tft.setFont(&Seven_Segment18pt7b); + P095_data->tft->setFont(&Seven_Segment18pt7b); } else if (sParams[0].equalsIgnoreCase(F("FREESANS"))) { - P095_data->tft.setFont(&FreeSans9pt7b); + P095_data->tft->setFont(&FreeSans9pt7b); } else if (sParams[0].equalsIgnoreCase(F("DEFAULT"))) { - P095_data->tft.setFont(); + P095_data->tft->setFont(); } else { success = false; } @@ -404,55 +444,55 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) } else if(subcommand.equalsIgnoreCase(F("l")) && argCount == 5) { - P095_data->tft.drawLine(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[4])); + P095_data->tft->drawLine(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[4])); } else if(subcommand.equalsIgnoreCase(F("lh")) && argCount == 3) { - P095_data->tft.drawFastHLine(0, sParams[0].toInt(), sParams[1].toInt(), P095_data->ParseColor(sParams[2])); + P095_data->tft->drawFastHLine(0, sParams[0].toInt(), sParams[1].toInt(), P095_data->ParseColor(sParams[2])); } else if(subcommand.equalsIgnoreCase(F("lv")) && argCount == 3) { - P095_data->tft.drawFastVLine(sParams[0].toInt(), 0, sParams[1].toInt(), P095_data->ParseColor(sParams[2])); + P095_data->tft->drawFastVLine(sParams[0].toInt(), 0, sParams[1].toInt(), P095_data->ParseColor(sParams[2])); } else if(subcommand.equalsIgnoreCase(F("r")) && argCount == 5) { - P095_data->tft.drawRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[4])); + P095_data->tft->drawRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[4])); } else if(subcommand.equalsIgnoreCase(F("rf")) && argCount == 6) { - P095_data->tft.fillRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[5])); - P095_data->tft.drawRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[4])); + P095_data->tft->fillRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[5])); + P095_data->tft->drawRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[4])); } else if(subcommand.equalsIgnoreCase(F("c")) && argCount == 4) { - P095_data->tft.drawCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[3])); + P095_data->tft->drawCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[3])); } else if(subcommand.equalsIgnoreCase(F("cf")) && argCount == 5) { - P095_data->tft.fillCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[4])); - P095_data->tft.drawCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[3])); + P095_data->tft->fillCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[4])); + P095_data->tft->drawCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[3])); } else if(subcommand.equalsIgnoreCase(F("t")) && argCount == 7) { - P095_data->tft.drawTriangle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), sParams[5].toInt(), P095_data->ParseColor(sParams[6])); + P095_data->tft->drawTriangle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), sParams[5].toInt(), P095_data->ParseColor(sParams[6])); } else if(subcommand.equalsIgnoreCase(F("tf")) && argCount == 8) { - P095_data->tft.fillTriangle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), sParams[5].toInt(), P095_data->ParseColor(sParams[7])); - P095_data->tft.drawTriangle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), sParams[5].toInt(), P095_data->ParseColor(sParams[6])); + P095_data->tft->fillTriangle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), sParams[5].toInt(), P095_data->ParseColor(sParams[7])); + P095_data->tft->drawTriangle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), sParams[5].toInt(), P095_data->ParseColor(sParams[6])); } else if(subcommand.equalsIgnoreCase(F("rr")) && argCount == 6) { - P095_data->tft.drawRoundRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), P095_data->ParseColor(sParams[5])); + P095_data->tft->drawRoundRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), P095_data->ParseColor(sParams[5])); } else if(subcommand.equalsIgnoreCase(F("rrf")) && argCount == 7) { - P095_data->tft.fillRoundRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), P095_data->ParseColor(sParams[6])); - P095_data->tft.drawRoundRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), P095_data->ParseColor(sParams[5])); + P095_data->tft->fillRoundRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), P095_data->ParseColor(sParams[6])); + P095_data->tft->drawRoundRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), P095_data->ParseColor(sParams[5])); } else if(subcommand.equalsIgnoreCase(F("px")) && argCount == 3) { - P095_data->tft.drawPixel(sParams[0].toInt(), sParams[1].toInt(), P095_data->ParseColor(sParams[2])); + P095_data->tft->drawPixel(sParams[0].toInt(), sParams[1].toInt(), P095_data->ParseColor(sParams[2])); } else { diff --git a/src/src/PluginStructs/P095_data_struct.cpp b/src/src/PluginStructs/P095_data_struct.cpp index b3d898c77..fe1f4c9e1 100644 --- a/src/src/PluginStructs/P095_data_struct.cpp +++ b/src/src/PluginStructs/P095_data_struct.cpp @@ -2,12 +2,79 @@ #ifdef USES_P095 - -P095_data_struct::P095_data_struct(int8_t _CS, int8_t _DC, int8_t _RST) - : tft(_CS, _DC, _RST) - { - tft.begin(); +/**************************************************************************** + * ILI9xxx_type_toString: Display-value for the device selected + ***************************************************************************/ +const __FlashStringHelper* ILI9xxx_type_toString(ILI9xxx_type_e device) { + switch (device) { + case ILI9xxx_type_e::ILI9341_240x320: return F("ILI9341 240 x 320px"); + case ILI9xxx_type_e::ILI9342_240x320: return F("ILI9342 240 x 320px (M5Stack)"); + case ILI9xxx_type_e::ILI9481_320x480: return F("ILI9481 320 x 480px"); + case ILI9xxx_type_e::ILI9481_CPT29_320x480: return F("ILI9481 320 x 480px (CPT29)"); + case ILI9xxx_type_e::ILI9481_PVI35_320x480: return F("ILI9481 320 x 480px (PVI35)"); + case ILI9xxx_type_e::ILI9481_AUO317_320x480: return F("ILI9481 320 x 480px (AUO317)"); + case ILI9xxx_type_e::ILI9481_CMO35_320x480: return F("ILI9481 320 x 480px (CMO35)"); + case ILI9xxx_type_e::ILI9481_RGB_320x480: return F("ILI9481 320 x 480px (RGB)"); + case ILI9xxx_type_e::ILI9486_320x480: return F("ILI9486 320 x 480px"); + case ILI9xxx_type_e::ILI9488_320x480: return F("ILI9488 320 x 480px"); + case ILI9xxx_type_e::ILI9xxx_MAX: break; } + return F("Unsupported type!"); +} + +/**************************************************************************** + * ILI9xxx_type_toResolution: X and Y resolution for the selected type + ***************************************************************************/ +void ILI9xxx_type_toResolution(ILI9xxx_type_e device, uint16_t& x, uint16_t& y) { + switch (device) { + case ILI9xxx_type_e::ILI9341_240x320: + case ILI9xxx_type_e::ILI9342_240x320: + x = 240; + y = 320; + break; + case ILI9xxx_type_e::ILI9481_320x480: + case ILI9xxx_type_e::ILI9481_CPT29_320x480: + case ILI9xxx_type_e::ILI9481_PVI35_320x480: + case ILI9xxx_type_e::ILI9481_AUO317_320x480: + case ILI9xxx_type_e::ILI9481_CMO35_320x480: + case ILI9xxx_type_e::ILI9481_RGB_320x480: + case ILI9xxx_type_e::ILI9486_320x480: + case ILI9xxx_type_e::ILI9488_320x480: + x = 320; + y = 480; + break; + case ILI9xxx_type_e::ILI9xxx_MAX: + break; + } +} + + +/**************************************************************************** + * Constructor + ***************************************************************************/ +P095_data_struct::P095_data_struct(ILI9xxx_type_e displayType, + int8_t _CS, int8_t _DC, int8_t _RST) + : _displayType(displayType)//, tft(_CS, _DC, _RST) + { + _xpix = 240; + _ypix = 320; + ILI9xxx_type_toResolution(_displayType, _xpix, _ypix); + + tft = new (std::nothrow) Adafruit_ILI9341(_CS, _DC, _RST, static_cast(_displayType), _xpix, _ypix); + if (nullptr != tft) { + tft->begin(); + } + } + +/**************************************************************************** + * Destructor + ***************************************************************************/ +P095_data_struct::~P095_data_struct() { + if (nullptr != tft) { + delete tft; + tft = nullptr; + } +} //Print some text //param [in] string : The text to display @@ -18,10 +85,10 @@ P095_data_struct::P095_data_struct(int8_t _CS, int8_t _DC, int8_t _RST) //param [in] bkcolor : The background color (default ILI9341_BLACK) void P095_data_struct::printText(const String& string, int X, int Y, unsigned int textSize, unsigned short color, unsigned short bkcolor) { - tft.setCursor(X, Y); - tft.setTextColor(color, bkcolor); - tft.setTextSize(textSize); - tft.println(string); + tft->setCursor(X, Y); + tft->setTextColor(color, bkcolor); + tft->setTextSize(textSize); + tft->println(string); } @@ -77,7 +144,7 @@ unsigned short P095_data_struct::ParseColor(String & s) //long long g = number >> 8 & 0xFF; //long long b = number & 0xFF; //convert to color565 (used by adafruit lib) - return tft.color565(number >> 16, number >> 8 & 0xFF, number & 0xFF); + return tft->color565(number >> 16, number >> 8 & 0xFF, number & 0xFF); } return ILI9341_WHITE; //fallback value } diff --git a/src/src/PluginStructs/P095_data_struct.h b/src/src/PluginStructs/P095_data_struct.h index 679e4919a..91abaaba3 100644 --- a/src/src/PluginStructs/P095_data_struct.h +++ b/src/src/PluginStructs/P095_data_struct.h @@ -15,16 +15,43 @@ # ifdef PLUGIN_095_FONT_INCLUDED # include "../Static/Fonts/Seven_Segment24pt7b.h" # include "../Static/Fonts/Seven_Segment18pt7b.h" -# include // included in Adafruit-GFX-Library +# include // included in Adafruit-GFX-Library # endif // ifdef PLUGIN_095_FONT_INCLUDED +# define P095_CONFIG_FLAGS PCONFIG_LONG(0) // All flags +# define P095_CONFIG_FLAG_TYPE 20 // Flag-offset to store 4 bits for Display type, uses bits 20..24 + +// // Getters +# define P095_CONFIG_FLAG_GET_TYPE (get4BitFromUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_TYPE)) + +enum class ILI9xxx_type_e : uint8_t { + ILI9341_240x320 = 0u, + ILI9342_240x320, + ILI9481_320x480, + ILI9481_CPT29_320x480, + ILI9481_PVI35_320x480, + ILI9481_AUO317_320x480, + ILI9481_CMO35_320x480, + ILI9481_RGB_320x480, + ILI9486_320x480, + ILI9488_320x480, + ILI9xxx_MAX // last value = count +}; + +const __FlashStringHelper* ILI9xxx_type_toString(ILI9xxx_type_e device); + +void ILI9xxx_type_toResolution(ILI9xxx_type_e device, + uint16_t & x, + uint16_t & y); + struct P095_data_struct : public PluginTaskData_base { public: - P095_data_struct(int8_t _CS, - int8_t _DC, - int8_t _RST = -1); - + P095_data_struct(ILI9xxx_type_e displayType, + int8_t _CS, + int8_t _DC, + int8_t _RST = -1); + ~P095_data_struct(); // Print some text // param [in] string : The text to display @@ -58,7 +85,13 @@ public: String op[], int limit); - Adafruit_ILI9341 tft; + Adafruit_ILI9341 *tft = nullptr; + +private: + + ILI9xxx_type_e _displayType; + uint16_t _xpix; + uint16_t _ypix; }; #endif // ifdef USES_P095 #endif // ifndef PLUGINSTRUCTS_P095_DATA_STRUCT_H From 79ce8d9fc7475047ea4c66fda88fa90a1d7bc5e1 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 9 Jan 2022 21:54:50 +0100 Subject: [PATCH 02/89] [P095] Reformat sources using Uncrustify --- lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp | 68 +- lib/Adafruit_ILI9341/Adafruit_ILI9341.h | 4 +- src/_P095_ILI9341.ino | 810 +++++++++++---------- src/src/PluginStructs/P095_data_struct.cpp | 189 +++-- 4 files changed, 576 insertions(+), 495 deletions(-) diff --git a/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp b/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp index 2cb82d93c..73c1cf790 100644 --- a/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp +++ b/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp @@ -393,17 +393,17 @@ static const uint8_t PROGMEM initcmd_9481_RGB[] = { // ILI9481 RGB variation // clang-format on // clang-format off -static const uint8_t PROGMEM initcmd_9486[] = { // ILI9486 - ILI9341_SLPOUT, 0x80, // Exit Sleep - ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, 0x66=18bit - ILI9341_PWCTR3, 1, 0x44, // Power control3 - ILI9341_VMCTR1, 4, 0x00, 0x00, 0x00, 0x00, // VCM control - ILI9341_GMCTRP1, 15, 0x0F, 0x1F, 0x1c, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00, - ILI9341_GMCTRN1, 15, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00, +static const uint8_t PROGMEM initcmd_9486[] = { // ILI9486 + ILI9341_SLPOUT, 0x80, // Exit Sleep + ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, 0x66=18bit + ILI9341_PWCTR3, 1, 0x44, // Power control3 + ILI9341_VMCTR1, 4, 0x00, 0x00, 0x00, 0x00, // VCM control + ILI9341_GMCTRP1, 15, 0x0F, 0x1F, 0x1c, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00, + ILI9341_GMCTRN1, 15, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00, ILI9341_INVOFF, 0, - ILI9341_MADCTL, 1, 0x48, // Memory Access Control - ILI9341_DISPON, 0x80, // Display on - 0x00 // End of list + ILI9341_MADCTL, 1, 0x48, // Memory Access Control + ILI9341_DISPON, 0x80, // Display on + 0x00 // End of list }; // clang-format on @@ -566,14 +566,14 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { m = (MADCTL_SS | MADCTL_BGR); break; case ILI_TYPE_9341: // ILI9341 - // m = (MADCTL_MX | MADCTL_BGR); - // break; + // m = (MADCTL_MX | MADCTL_BGR); + // break; case ILI_TYPE_9486: // ILI9486 - // m = (MADCTL_MX | MADCTL_BGR); - // break; + // m = (MADCTL_MX | MADCTL_BGR); + // break; case ILI_TYPE_9488: // ILI9488 - // m = (MADCTL_MX | MADCTL_BGR); - // break; + // m = (MADCTL_MX | MADCTL_BGR); + // break; default: m = (MADCTL_MX | MADCTL_BGR); break; @@ -596,14 +596,14 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { m = (MADCTL_MV | MADCTL_BGR); break; case ILI_TYPE_9341: // ILI9341 - // m = (MADCTL_MV | MADCTL_BGR); - // break; + // m = (MADCTL_MV | MADCTL_BGR); + // break; case ILI_TYPE_9486: // ILI9486 - // m = (MADCTL_MV | MADCTL_BGR); - // break; + // m = (MADCTL_MV | MADCTL_BGR); + // break; case ILI_TYPE_9488: // ILI9488 - // m = (MADCTL_MV | MADCTL_BGR); - // break; + // m = (MADCTL_MV | MADCTL_BGR); + // break; default: m = (MADCTL_MV | MADCTL_BGR); break; @@ -626,14 +626,14 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { m = (MADCTL_GS | MADCTL_BGR); break; case ILI_TYPE_9341: // ILI9341 - // m = (MADCTL_MY | MADCTL_BGR); - // break; + // m = (MADCTL_MY | MADCTL_BGR); + // break; case ILI_TYPE_9486: // ILI9486 - // m = (MADCTL_MY | MADCTL_BGR); - // break; + // m = (MADCTL_MY | MADCTL_BGR); + // break; case ILI_TYPE_9488: // ILI9488 - // m = (MADCTL_MY | MADCTL_BGR); - // break; + // m = (MADCTL_MY | MADCTL_BGR); + // break; default: m = (MADCTL_MY | MADCTL_BGR); break; @@ -656,14 +656,14 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { m = (MADCTL_SS | MADCTL_GS | MADCTL_MV | MADCTL_BGR); break; case ILI_TYPE_9341: // ILI9341 - // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); - // break; + // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); + // break; case ILI_TYPE_9486: // ILI9486 - // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); - // break; + // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); + // break; case ILI_TYPE_9488: // ILI9488 - // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); - // break; + // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); + // break; default: m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); break; diff --git a/lib/Adafruit_ILI9341/Adafruit_ILI9341.h b/lib/Adafruit_ILI9341/Adafruit_ILI9341.h index 2546cb75d..d95c8f3f5 100644 --- a/lib/Adafruit_ILI9341/Adafruit_ILI9341.h +++ b/lib/Adafruit_ILI9341/Adafruit_ILI9341.h @@ -126,7 +126,7 @@ #define ILI9341_PINK 0xFC18 ///< 255, 130, 198 -#define ILI_TYPE_9341 0 // Must match with enum class ILI9xxx_type_e in P095_data_struct.h +#define ILI_TYPE_9341 0 // Must match with enum class ILI9xxx_type_e in P095_data_struct.h #define ILI_TYPE_9342 1 #define ILI_TYPE_9481 2 #define ILI_TYPE_9481_CPT29 3 @@ -157,7 +157,7 @@ public: uint8_t _MODEL = ILI_TYPE_9341, uint16_t w = ILI9341_TFTWIDTH, uint16_t h = ILI9341_TFTHEIGHT); // Default to ILI9341, check ILI9xxx_type_e - virtual ~Adafruit_ILI9341() {}; // Virtual destructor + virtual ~Adafruit_ILI9341() {} // Virtual destructor #if !defined(ESP8266) diff --git a/src/_P095_ILI9341.ino b/src/_P095_ILI9341.ino index 70c35c4d6..359c193e0 100644 --- a/src/_P095_ILI9341.ino +++ b/src/_P095_ILI9341.ino @@ -1,17 +1,17 @@ #include "_Plugin_Helper.h" #ifdef USES_P095 -#include "src/PluginStructs/P095_data_struct.h" +# include "src/PluginStructs/P095_data_struct.h" -//####################################################################################################### -//################################# Plugin 095: ILI934x/ILI948x TFT display ############################# -//####################################################################################################### +// ####################################################################################################### +// ################################# Plugin 095: ILI934x/ILI948x TFT display ############################# +// ####################################################################################################### -#define PLUGIN_095 -#define PLUGIN_ID_095 95 -#define PLUGIN_NAME_095 "Display - TFT ILI934x/ILI948x [TESTING]" -#define PLUGIN_VALUENAME1_095 "TFT" -#define PLUGIN_095_MAX_DISPLAY 1 +# define PLUGIN_095 +# define PLUGIN_ID_095 95 +# define PLUGIN_NAME_095 "Display - TFT ILI934x/ILI948x [TESTING]" +# define PLUGIN_VALUENAME1_095 "TFT" +# define PLUGIN_095_MAX_DISPLAY 1 /** @@ -25,120 +25,123 @@ */ /* README.MD -## INTRO + ## INTRO -This plugin allow to control a TFT screen (ILI9341) through HTTP API + This plugin allow to control a TFT screen (ILI9341) through HTTP API -## Environment -Tested with WEMOS D1 Mini Pro and Wemos TDFT 2.4 -Tested with ESPEasy 2.4.2 -tag mega-201902225) + ## Environment + Tested with WEMOS D1 Mini Pro and Wemos TDFT 2.4 + Tested with ESPEasy 2.4.2 -tag mega-201902225) -TFT Shield : https://docs.wemos.cc/en/latest/d1_mini_shiled/tft_2_4.html -Price : ~ 5.40€/$ (https://fr.aliexpress.com/item/32919729730.html) + TFT Shield : https://docs.wemos.cc/en/latest/d1_mini_shiled/tft_2_4.html + Price : ~ 5.40€/$ (https://fr.aliexpress.com/item/32919729730.html) -## Dependencies -Plugin lib_deps = Adafruit GFX, Adafruit ILI9341 + ## Dependencies + Plugin lib_deps = Adafruit GFX, Adafruit ILI9341 -## API Documentation + ## API Documentation -This plugin is controlled by HTTP API, ie : http:///control?cmd=tft,tx,HelloWorld + This plugin is controlled by HTTP API, ie : http:///control?cmd=tft,tx,HelloWorld -| command | details | description | -|-----|-----|-----| -| tft | `TFT,,....` | Draw line, rect, circle, triangle and text | -|tftcmd | `TFTCMD,` | Control the screen (on, off, clear,..) | + | command | details | description | + |-----|-----|-----| + | tft | `TFT,,....` | Draw line, rect, circle, triangle and text | + |tftcmd | `TFTCMD,` | Control the screen (on, off, clear,..) | -TFT Subcommands: + TFT Subcommands: -| TFT Subcommands | details | description | -|-----|-----|-----| -| txt | txt, | Write simple text (use last position, color and size) | -| txp | txp,, | Set text position (move the cursor) | -| txc | txc,, | Set text color (background is transparent if not provided | -| txs | txs, | Set text size | -| txtfull | txtfull,,,,,, | Write text with all options | -| l | l,,,<2>,, | Draw a simple line | -| lh | lh,,, | Draw an horizontal line (width = Line width in pixels (positive = right of first point, negative = point of first corner). | -| lv | lv,,, | Draw a vertical line (height= Line height in pixels (positive = below first point, negative = above first point).| -| r | r,,,,, | Draw a rectangle | -| rf | rf,,,,,, | Draw a filled rectangle | -| c | c,,,, | Draw a circle | -| cf | cf,,,,, | Draw a filled circle | -| t | t,,,,,,,| Draw a triangle | -| tf | tf,,,,,,,, | Draw a filled triangle | -| rr | rr,,,,,, | Draw a round rectangle | -| rrf | rrf,,,,,,, | Draw a filled round rectangle | -| px | px,,, | Print a single pixel | -| font| font, | Switch to font - SEVENSEG24, SEVENSEG18, FREESANS, DEFAULT | + | TFT Subcommands | details | description | + |-----|-----|-----| + | txt | txt, | Write simple text (use last position, color and size) | + | txp | txp,, | Set text position (move the cursor) | + | txc | txc,, | Set text color (background is transparent if not provided | + | txs | txs, | Set text size | + | txtfull | txtfull,,,,,, | Write text with all options | + | l | l,,,<2>,, | Draw a simple line | + | lh | lh,,, | Draw an horizontal line (width = Line width in pixels (positive = right of first point, negative = point of + |first corner). | + | lv | lv,,, | Draw a vertical line (height= Line height in pixels (positive = below first point, negative = above first + |point).| + | r | r,,,,, | Draw a rectangle | + | rf | rf,,,,,, | Draw a filled rectangle | + | c | c,,,, | Draw a circle | + | cf | cf,,,,, | Draw a filled circle | + | t | t,,,,,,,| Draw a triangle | + | tf | tf,,,,,,,, | Draw a filled triangle | + | rr | rr,,,,,, | Draw a round rectangle | + | rrf | rrf,,,,,,, | Draw a filled round rectangle | + | px | px,,, | Print a single pixel | + | font| font, | Switch to font - SEVENSEG24, SEVENSEG18, FREESANS, DEFAULT | -TFTCMD Subcommands: + TFTCMD Subcommands: -| TFT Subcommands | details | description | -|-----|-----|-----| -| on | on | Display ON | -| off | off | Display OFF | -| clear | clear, | Clear display | -| inv | inv, | Invert the dispaly (value:0 normal display, 1 inverted display) | -| rot | rot, | Rotate display (value from 0 to 3 inclusive) | + | TFT Subcommands | details | description | + |-----|-----|-----| + | on | on | Display ON | + | off | off | Display OFF | + | clear | clear, | Clear display | + | inv | inv, | Invert the dispaly (value:0 normal display, 1 inverted display) | + | rot | rot, | Rotate display (value from 0 to 3 inclusive) | -Examples: + Examples: - Write Text : - http:///control?cmd=tft,txtfull,0,0,HelloWorld + Write Text : + http:///control?cmd=tft,txtfull,0,0,HelloWorld - Write Text another place: - http:///control?cmd=tft,txtfull,100,40,HelloWorld + Write Text another place: + http:///control?cmd=tft,txtfull,100,40,HelloWorld - Write bigger Text : - http:///control?cmd=tft,txtfull,0,0,3,HelloWorld + Write bigger Text : + http:///control?cmd=tft,txtfull,0,0,3,HelloWorld - Write RED Text : - http:///control?cmd=tft,txtfull,0,0,3,HelloWorld + Write RED Text : + http:///control?cmd=tft,txtfull,0,0,3,HelloWorld - Write RED Text (size is 1): - http:///control?cmd=tft,txtfull,0,0,1,RED,HelloWorld + Write RED Text (size is 1): + http:///control?cmd=tft,txtfull,0,0,1,RED,HelloWorld - Write RED Text on YELLOW background (size is 1): - http:///control?cmd=tft,txtfull,0,0,1,RED,YELLOW,HelloWorld + Write RED Text on YELLOW background (size is 1): + http:///control?cmd=tft,txtfull,0,0,1,RED,YELLOW,HelloWorld - Switch display ON - http:///control?cmd=tftcmd,on + Switch display ON + http:///control?cmd=tftcmd,on - Switch display OFF - http:///control?cmd=tftcmd,off + Switch display OFF + http:///control?cmd=tftcmd,off - Clear whole display - http:///control?cmd=tftcmd,clear + Clear whole display + http:///control?cmd=tftcmd,clear - Clear GREEN whole display - http:///control?cmd=tftcmd,clear,green -*/ + Clear GREEN whole display + http:///control?cmd=tftcmd,clear,green + */ -//Define the default values for both ESP32/lolin32 and D1 Mini -#ifdef ESP32 -//for D32 Pro with TFT connector - #define TFT_CS 14 - #define TFT_CS_HSPI 26 // when connected to Hardware-SPI GPIO-14 is already used - #define TFT_DC 27 - #define TFT_RST 33 -#else - //for D1 Mini with shield connection - #define TFT_CS 16 // D0 - #define TFT_DC 15 // D8 - #define TFT_RST -1 -#endif +// Define the default values for both ESP32/lolin32 and D1 Mini +# ifdef ESP32 -//The setting structure +// for D32 Pro with TFT connector + # define TFT_CS 14 + # define TFT_CS_HSPI 26 // when connected to Hardware-SPI GPIO-14 is already used + # define TFT_DC 27 + # define TFT_RST 33 +# else // ifdef ESP32 + +// for D1 Mini with shield connection + # define TFT_CS 16 // D0 + # define TFT_DC 15 // D8 + # define TFT_RST -1 +# endif // ifdef ESP32 + +// The setting structure struct Plugin_095_TFT_SettingStruct { Plugin_095_TFT_SettingStruct() - : address_tft_cs(TFT_CS), address_tft_dc(TFT_DC), address_tft_rst(TFT_RST), rotation(0) - { + : address_tft_cs(TFT_CS), address_tft_dc(TFT_DC), address_tft_rst(TFT_RST), rotation(0) + {} - } uint8_t address_tft_cs; uint8_t address_tft_dc; uint8_t address_tft_rst; @@ -152,67 +155,67 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) switch (function) { - case PLUGIN_DEVICE_ADD: - { - Device[++deviceCount].Number = PLUGIN_ID_095; - Device[deviceCount].Type = DEVICE_TYPE_SPI3; - Device[deviceCount].VType = Sensor_VType::SENSOR_TYPE_NONE; - Device[deviceCount].Ports = 0; - Device[deviceCount].PullUpOption = false; - Device[deviceCount].InverseLogicOption = false; - Device[deviceCount].FormulaOption = false; - Device[deviceCount].ValueCount = 0; - Device[deviceCount].SendDataOption = false; - Device[deviceCount].TimerOption = false; - success = true; - break; - } + { + Device[++deviceCount].Number = PLUGIN_ID_095; + Device[deviceCount].Type = DEVICE_TYPE_SPI3; + Device[deviceCount].VType = Sensor_VType::SENSOR_TYPE_NONE; + Device[deviceCount].Ports = 0; + Device[deviceCount].PullUpOption = false; + Device[deviceCount].InverseLogicOption = false; + Device[deviceCount].FormulaOption = false; + Device[deviceCount].ValueCount = 0; + Device[deviceCount].SendDataOption = false; + Device[deviceCount].TimerOption = false; + success = true; + break; + } case PLUGIN_GET_DEVICENAME: - { - string = F(PLUGIN_NAME_095); - success = true; - break; - } + { + string = F(PLUGIN_NAME_095); + success = true; + break; + } case PLUGIN_GET_DEVICEVALUENAMES: - { - strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_095)); - success = true; - break; - } + { + strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_095)); + success = true; + break; + } case PLUGIN_GET_DEVICEGPIONAMES: - { - event->String1 = formatGpioName_output(F("TFT CS")); - event->String2 = formatGpioName_output(F("TFT DC")); - event->String3 = formatGpioName_output(F("TFT RST")); - break; - } + { + event->String1 = formatGpioName_output(F("TFT CS")); + event->String2 = formatGpioName_output(F("TFT DC")); + event->String3 = formatGpioName_output(F("TFT RST")); + break; + } case PLUGIN_SET_DEFAULTS: - { - uint8_t init = PCONFIG(0); + { + uint8_t init = PCONFIG(0); - //if already configured take it from settings, else use default values (only for pin values) - if(init != 1) - { - #ifdef ESP32 - if (Settings.InitSPI == 2) { // When using ESP32 H(ardware-)SPI - TFT_Settings.address_tft_cs = TFT_CS_HSPI; - } - #endif - PIN(0) = TFT_Settings.address_tft_cs; - PIN(1) = TFT_Settings.address_tft_dc; - PIN(2) = TFT_Settings.address_tft_rst; + // if already configured take it from settings, else use default values (only for pin values) + if (init != 1) + { + # ifdef ESP32 + + if (Settings.InitSPI == 2) { // When using ESP32 H(ardware-)SPI + TFT_Settings.address_tft_cs = TFT_CS_HSPI; } - break; + # endif // ifdef ESP32 + PIN(0) = TFT_Settings.address_tft_cs; + PIN(1) = TFT_Settings.address_tft_dc; + PIN(2) = TFT_Settings.address_tft_rst; } + break; + } case PLUGIN_WEBFORM_LOAD: - { - uint8_t init = PCONFIG(0); + { + uint8_t init = PCONFIG(0); { const __FlashStringHelper *hardwareTypes[] = { @@ -247,294 +250,333 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) P095_CONFIG_FLAG_GET_TYPE); } - //if already configured take it from settings, else use default values (only for pin values) - if(init == 1) - { - TFT_Settings.address_tft_cs = PIN(0); - TFT_Settings.address_tft_dc = PIN(1); - TFT_Settings.address_tft_rst = PIN(2); - } - - uint8_t choice2 = PCONFIG(1); - const __FlashStringHelper * options2[4] = { F("Normal"), F("+90°"), F("+180°"), F("+270°") }; - int optionValues2[4] = { 0, 1, 2, 3 }; - addFormSelector(F("Rotation"), F("p095_rotate"), 4, options2, optionValues2, choice2); - - success = true; - break; + // if already configured take it from settings, else use default values (only for pin values) + if (init == 1) + { + TFT_Settings.address_tft_cs = PIN(0); + TFT_Settings.address_tft_dc = PIN(1); + TFT_Settings.address_tft_rst = PIN(2); } + uint8_t choice2 = PCONFIG(1); + const __FlashStringHelper *options2[4] = { F("Normal"), F("+90°"), F("+180°"), F("+270°") }; + int optionValues2[4] = { 0, 1, 2, 3 }; + addFormSelector(F("Rotation"), F("p095_rotate"), 4, options2, optionValues2, choice2); + + success = true; + break; + } + case PLUGIN_WEBFORM_SAVE: - { - PCONFIG(0) = 1; //mark config as already saved (next time, will not use default values) - // PIN(0)..(2) are already set - PCONFIG(1) = getFormItemInt(F("p095_rotate")); + { + PCONFIG(0) = 1; // mark config as already saved (next time, will not use default values) + // PIN(0)..(2) are already set + PCONFIG(1) = getFormItemInt(F("p095_rotate")); - uint32_t lSettings = 0; - set4BitToUL(lSettings, P095_CONFIG_FLAG_TYPE, getFormItemInt(F("p095_type"))); // Bit 20..24 Hardwaretype - P095_CONFIG_FLAGS = lSettings; + uint32_t lSettings = 0; + set4BitToUL(lSettings, P095_CONFIG_FLAG_TYPE, getFormItemInt(F("p095_type"))); // Bit 20..24 Hardwaretype + P095_CONFIG_FLAGS = lSettings; - success = true; - break; - } + success = true; + break; + } case PLUGIN_INIT: + { + TFT_Settings.address_tft_cs = PIN(0); + TFT_Settings.address_tft_dc = PIN(1); + TFT_Settings.address_tft_rst = PIN(2); + TFT_Settings.rotation = PCONFIG(1); + + initPluginTaskData(event->TaskIndex, + new (std::nothrow) P095_data_struct( + static_cast(P095_CONFIG_FLAG_GET_TYPE), + TFT_Settings.address_tft_cs, + TFT_Settings.address_tft_dc, + TFT_Settings.address_tft_rst)); + P095_data_struct *P095_data = + static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P095_data) { + P095_data->tft->setRotation(TFT_Settings.rotation); + P095_data->tft->fillScreen(ILI9341_WHITE); + P095_data->printText(F("ESPEasy"), 1, 1); + success = true; + } + break; + } + + case PLUGIN_WRITE: + { + String tmpString = String(string); + String arguments = String(string); + + String command; + String subcommand; + + int argIndex = arguments.indexOf(','); + + if (argIndex) { - - TFT_Settings.address_tft_cs = PIN(0); - TFT_Settings.address_tft_dc = PIN(1); - TFT_Settings.address_tft_rst = PIN(2); - TFT_Settings.rotation = PCONFIG(1); - - initPluginTaskData(event->TaskIndex, - new (std::nothrow) P095_data_struct( - static_cast(P095_CONFIG_FLAG_GET_TYPE), - TFT_Settings.address_tft_cs, - TFT_Settings.address_tft_dc, - TFT_Settings.address_tft_rst)); P095_data_struct *P095_data = static_cast(getPluginTaskData(event->TaskIndex)); if (nullptr != P095_data) { - P095_data->tft->setRotation(TFT_Settings.rotation); - P095_data->tft->fillScreen(ILI9341_WHITE); - P095_data->printText(F("ESPEasy"), 1, 1); - success = true; - } - break; - } + command = arguments.substring(0, argIndex); + arguments = arguments.substring(argIndex + 1); + argIndex = arguments.indexOf(','); + subcommand = arguments.substring(0, argIndex); + success = true; - case PLUGIN_WRITE: - { - String tmpString = String(string); - String arguments = String(string); - - String command; - String subcommand; - - int argIndex = arguments.indexOf(','); - if (argIndex) - { - P095_data_struct *P095_data = - static_cast(getPluginTaskData(event->TaskIndex)); - - if (nullptr != P095_data) { - - command = arguments.substring(0, argIndex); - arguments = arguments.substring(argIndex+1); - argIndex = arguments.indexOf(','); - subcommand = arguments.substring(0, argIndex); - success = true; - - tmpString += F("
command= "); - tmpString += command; - tmpString += F("
arguments= "); - tmpString += arguments; - tmpString += F("
argIndex= "); - tmpString += String(argIndex); - tmpString += F("
subcommand= "); - tmpString += subcommand; + tmpString += F("
command= "); + tmpString += command; + tmpString += F("
arguments= "); + tmpString += arguments; + tmpString += F("
argIndex= "); + tmpString += String(argIndex); + tmpString += F("
subcommand= "); + tmpString += subcommand; - if (command.equalsIgnoreCase(F("TFTCMD"))) + if (command.equalsIgnoreCase(F("TFTCMD"))) + { + if (subcommand.equalsIgnoreCase(F("ON"))) { - if(subcommand.equalsIgnoreCase(F("ON"))) - { - P095_data->tft->sendCommand(ILI9341_DISPON); + P095_data->tft->sendCommand(ILI9341_DISPON); + } + else if (subcommand.equalsIgnoreCase(F("OFF"))) + { + P095_data->tft->sendCommand(ILI9341_DISPOFF); + } + else if (subcommand.equalsIgnoreCase(F("CLEAR"))) + { + arguments = arguments.substring(argIndex + 1); + P095_data->tft->fillScreen(P095_data->ParseColor(arguments)); + } + else if (subcommand.equalsIgnoreCase(F("INV"))) + { + arguments = arguments.substring(argIndex + 1); + P095_data->tft->invertDisplay(arguments.toInt() == 1); + } + else if (subcommand.equalsIgnoreCase(F("ROT"))) + { + ///control?cmd=tftcmd,rot,0 + // not working to verify + arguments = arguments.substring(argIndex + 1); + P095_data->tft->setRotation(arguments.toInt() % 4); + } + else + { + success = false; + } + } + else if (command.equalsIgnoreCase(F("TFT"))) + { + tmpString += F("
TFT "); + + arguments = arguments.substring(argIndex + 1); + String sParams[8]; + int argCount = P095_data->StringSplit(arguments, ',', sParams, 8); + + for (int a = 0; a < argCount && a < 8; a++) + { + tmpString += F("
ARGS["); + tmpString += a; + tmpString += F("]="); + tmpString += sParams[a]; + } + + if (subcommand.equalsIgnoreCase(F("txt"))) + { + P095_data->tft->println(arguments); // write all pending cars + } + else if (subcommand.equalsIgnoreCase(F("txp")) && (argCount == 2)) + { + P095_data->tft->setCursor(sParams[0].toInt(), sParams[1].toInt()); + } + else if (subcommand.equalsIgnoreCase(F("txc")) && ((argCount == 1) || (argCount == 2))) + { + if (argCount == 1) { + P095_data->tft->setTextColor(P095_data->ParseColor(sParams[0])); } - else if(subcommand.equalsIgnoreCase(F("OFF"))) - { - P095_data->tft->sendCommand(ILI9341_DISPOFF); + else { // argCount=2 + P095_data->tft->setTextColor(P095_data->ParseColor(sParams[0]), P095_data->ParseColor(sParams[1])); } - else if(subcommand.equalsIgnoreCase(F("CLEAR"))) - { - arguments = arguments.substring(argIndex + 1); - P095_data->tft->fillScreen(P095_data->ParseColor(arguments)); - } - else if(subcommand.equalsIgnoreCase(F("INV"))) - { - arguments = arguments.substring(argIndex + 1); - P095_data->tft->invertDisplay(arguments.toInt() == 1); - } - else if(subcommand.equalsIgnoreCase(F("ROT"))) - { - ///control?cmd=tftcmd,rot,0 - //not working to verify - arguments = arguments.substring(argIndex + 1); - P095_data->tft->setRotation(arguments.toInt() % 4); - } - else - { + } + else if (subcommand.equalsIgnoreCase(F("txs")) && (argCount == 1)) + { + P095_data->tft->setTextSize(sParams[0].toInt()); + } + # ifdef PLUGIN_095_FONT_INCLUDED + else if (subcommand.equalsIgnoreCase(F("font")) && (argCount == 1)) { + if (sParams[0].equalsIgnoreCase(F("SEVENSEG24"))) { + P095_data->tft->setFont(&Seven_Segment24pt7b); + } else if (sParams[0].equalsIgnoreCase(F("SEVENSEG18"))) { + P095_data->tft->setFont(&Seven_Segment18pt7b); + } else if (sParams[0].equalsIgnoreCase(F("FREESANS"))) { + P095_data->tft->setFont(&FreeSans9pt7b); + } else if (sParams[0].equalsIgnoreCase(F("DEFAULT"))) { + P095_data->tft->setFont(); + } else { success = false; } } - else if (command.equalsIgnoreCase(F("TFT"))) + # endif // ifdef PLUGIN_095_FONT_INCLUDED + else if (subcommand.equalsIgnoreCase(F("txtfull")) && (argCount >= 3) && (argCount <= 6)) { - tmpString += F("
TFT "); - - arguments = arguments.substring(argIndex + 1); - String sParams[8]; - int argCount = P095_data->StringSplit(arguments, ',', sParams, 8); - - for(int a=0; a < argCount && a < 8; a++) + switch (argCount) { - tmpString += F("
ARGS["); - tmpString += a; - tmpString += F("]="); - tmpString += sParams[a]; - } - - if(subcommand.equalsIgnoreCase(F("txt"))) - { - P095_data->tft->println(arguments); //write all pending cars - } - else if(subcommand.equalsIgnoreCase(F("txp")) && argCount == 2) - { - P095_data->tft->setCursor(sParams[0].toInt(), sParams[1].toInt()); - } - else if(subcommand.equalsIgnoreCase(F("txc")) && (argCount == 1 || argCount == 2) ) - { - if(argCount == 1) - P095_data->tft->setTextColor(P095_data->ParseColor(sParams[0])); - else //argCount=2 - P095_data->tft->setTextColor(P095_data->ParseColor(sParams[0]), P095_data->ParseColor(sParams[1])); - } - else if(subcommand.equalsIgnoreCase(F("txs")) && argCount == 1) - { - P095_data->tft->setTextSize(sParams[0].toInt()); - } - #ifdef PLUGIN_095_FONT_INCLUDED - else if(subcommand.equalsIgnoreCase(F("font")) && argCount == 1) { - if (sParams[0].equalsIgnoreCase(F("SEVENSEG24"))) { - P095_data->tft->setFont(&Seven_Segment24pt7b); - } else if (sParams[0].equalsIgnoreCase(F("SEVENSEG18"))) { - P095_data->tft->setFont(&Seven_Segment18pt7b); - } else if (sParams[0].equalsIgnoreCase(F("FREESANS"))) { - P095_data->tft->setFont(&FreeSans9pt7b); - } else if (sParams[0].equalsIgnoreCase(F("DEFAULT"))) { - P095_data->tft->setFont(); - } else { - success = false; - } - } - #endif - else if(subcommand.equalsIgnoreCase(F("txtfull")) && argCount >= 3 && argCount <= 6) - { - switch (argCount) - { - case 3: //single text - P095_data->printText(sParams[2], sParams[0].toInt() - 1,sParams[1].toInt() - 1); + case 3: // single text + P095_data->printText(sParams[2], sParams[0].toInt() - 1, sParams[1].toInt() - 1); break; - case 4: //text + size + case 4: // text + size P095_data->printText(sParams[3], sParams[0].toInt() - 1, sParams[1].toInt() - 1, sParams[2].toInt()); break; - case 5: //text + size + color - P095_data->printText(sParams[4], sParams[0].toInt() - 1, sParams[1].toInt() - 1, sParams[2].toInt(), P095_data->ParseColor(sParams[3])); + case 5: // text + size + color + P095_data->printText(sParams[4], sParams[0].toInt() - 1, sParams[1].toInt() - 1, sParams[2].toInt(), + P095_data->ParseColor(sParams[3])); break; - case 6: //text + size + color - P095_data->printText(sParams[5], sParams[0].toInt() - 1, sParams[1].toInt() - 1, sParams[2].toInt(), P095_data->ParseColor(sParams[3]), P095_data->ParseColor(sParams[4])); + case 6: // text + size + color + P095_data->printText(sParams[5], sParams[0].toInt() - 1, sParams[1].toInt() - 1, sParams[2].toInt(), + P095_data->ParseColor(sParams[3]), P095_data->ParseColor(sParams[4])); break; default: success = false; break; - } - } - else if(subcommand.equalsIgnoreCase(F("l")) && argCount == 5) - { - P095_data->tft->drawLine(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[4])); - } - else if(subcommand.equalsIgnoreCase(F("lh")) && argCount == 3) - { - P095_data->tft->drawFastHLine(0, sParams[0].toInt(), sParams[1].toInt(), P095_data->ParseColor(sParams[2])); - } - else if(subcommand.equalsIgnoreCase(F("lv")) && argCount == 3) - { - P095_data->tft->drawFastVLine(sParams[0].toInt(), 0, sParams[1].toInt(), P095_data->ParseColor(sParams[2])); - } - else if(subcommand.equalsIgnoreCase(F("r")) && argCount == 5) - { - P095_data->tft->drawRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[4])); - } - else if(subcommand.equalsIgnoreCase(F("rf")) && argCount == 6) - { - P095_data->tft->fillRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[5])); - P095_data->tft->drawRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), P095_data->ParseColor(sParams[4])); - } - else if(subcommand.equalsIgnoreCase(F("c")) && argCount == 4) - { - P095_data->tft->drawCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[3])); - } - else if(subcommand.equalsIgnoreCase(F("cf")) && argCount == 5) - { - P095_data->tft->fillCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[4])); - P095_data->tft->drawCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[3])); - } - else if(subcommand.equalsIgnoreCase(F("t")) && argCount == 7) - { - P095_data->tft->drawTriangle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), sParams[5].toInt(), P095_data->ParseColor(sParams[6])); - } - else if(subcommand.equalsIgnoreCase(F("tf")) && argCount == 8) - { - P095_data->tft->fillTriangle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), sParams[5].toInt(), P095_data->ParseColor(sParams[7])); - P095_data->tft->drawTriangle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), sParams[5].toInt(), P095_data->ParseColor(sParams[6])); - } - else if(subcommand.equalsIgnoreCase(F("rr")) && argCount == 6) - { - P095_data->tft->drawRoundRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), P095_data->ParseColor(sParams[5])); - } - else if(subcommand.equalsIgnoreCase(F("rrf")) && argCount == 7) - { - P095_data->tft->fillRoundRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), P095_data->ParseColor(sParams[6])); - P095_data->tft->drawRoundRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), sParams[4].toInt(), P095_data->ParseColor(sParams[5])); - } - else if(subcommand.equalsIgnoreCase(F("px")) && argCount == 3) - { - P095_data->tft->drawPixel(sParams[0].toInt(), sParams[1].toInt(), P095_data->ParseColor(sParams[2])); - } - else - { - success = false; } } - else { + else if (subcommand.equalsIgnoreCase(F("l")) && (argCount == 5)) + { + P095_data->tft->drawLine(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), + P095_data->ParseColor(sParams[4])); + } + else if (subcommand.equalsIgnoreCase(F("lh")) && (argCount == 3)) + { + P095_data->tft->drawFastHLine(0, sParams[0].toInt(), sParams[1].toInt(), P095_data->ParseColor(sParams[2])); + } + else if (subcommand.equalsIgnoreCase(F("lv")) && (argCount == 3)) + { + P095_data->tft->drawFastVLine(sParams[0].toInt(), 0, sParams[1].toInt(), P095_data->ParseColor(sParams[2])); + } + else if (subcommand.equalsIgnoreCase(F("r")) && (argCount == 5)) + { + P095_data->tft->drawRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), + P095_data->ParseColor(sParams[4])); + } + else if (subcommand.equalsIgnoreCase(F("rf")) && (argCount == 6)) + { + P095_data->tft->fillRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), + P095_data->ParseColor(sParams[5])); + P095_data->tft->drawRect(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), sParams[3].toInt(), + P095_data->ParseColor(sParams[4])); + } + else if (subcommand.equalsIgnoreCase(F("c")) && (argCount == 4)) + { + P095_data->tft->drawCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[3])); + } + else if (subcommand.equalsIgnoreCase(F("cf")) && (argCount == 5)) + { + P095_data->tft->fillCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[4])); + P095_data->tft->drawCircle(sParams[0].toInt(), sParams[1].toInt(), sParams[2].toInt(), P095_data->ParseColor(sParams[3])); + } + else if (subcommand.equalsIgnoreCase(F("t")) && (argCount == 7)) + { + P095_data->tft->drawTriangle(sParams[0].toInt(), + sParams[1].toInt(), + sParams[2].toInt(), + sParams[3].toInt(), + sParams[4].toInt(), + sParams[5].toInt(), + P095_data->ParseColor(sParams[6])); + } + else if (subcommand.equalsIgnoreCase(F("tf")) && (argCount == 8)) + { + P095_data->tft->fillTriangle(sParams[0].toInt(), + sParams[1].toInt(), + sParams[2].toInt(), + sParams[3].toInt(), + sParams[4].toInt(), + sParams[5].toInt(), + P095_data->ParseColor(sParams[7])); + P095_data->tft->drawTriangle(sParams[0].toInt(), + sParams[1].toInt(), + sParams[2].toInt(), + sParams[3].toInt(), + sParams[4].toInt(), + sParams[5].toInt(), + P095_data->ParseColor(sParams[6])); + } + else if (subcommand.equalsIgnoreCase(F("rr")) && (argCount == 6)) + { + P095_data->tft->drawRoundRect(sParams[0].toInt(), + sParams[1].toInt(), + sParams[2].toInt(), + sParams[3].toInt(), + sParams[4].toInt(), + P095_data->ParseColor(sParams[5])); + } + else if (subcommand.equalsIgnoreCase(F("rrf")) && (argCount == 7)) + { + P095_data->tft->fillRoundRect(sParams[0].toInt(), + sParams[1].toInt(), + sParams[2].toInt(), + sParams[3].toInt(), + sParams[4].toInt(), + P095_data->ParseColor(sParams[6])); + P095_data->tft->drawRoundRect(sParams[0].toInt(), + sParams[1].toInt(), + sParams[2].toInt(), + sParams[3].toInt(), + sParams[4].toInt(), + P095_data->ParseColor(sParams[5])); + } + else if (subcommand.equalsIgnoreCase(F("px")) && (argCount == 3)) + { + P095_data->tft->drawPixel(sParams[0].toInt(), sParams[1].toInt(), P095_data->ParseColor(sParams[2])); + } + else + { success = false; - } + } + } + else { + success = false; } } - else - { - //invalid arguments - success = false; - } - - if(!success) - { - if (loglevelActiveFor(LOG_LEVEL_INFO)) { - addLog(LOG_LEVEL_INFO, F("Fail to parse command correctly; please check API documentation")); - String log2 = F("Parsed command = \""); - log2 += string; - log2 += F("\""); - addLog(LOG_LEVEL_INFO, log2); - } - } - else - { - String log; - log.reserve(110); // Prevent re-allocation - log = F("P095-ILI9341 : WRITE = "); - log += tmpString; - SendStatus(event, log); // Reply (echo) to sender. This will print message on browser. - } - break; } - } + else + { + // invalid arguments + success = false; + } + if (!success) + { + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLog(LOG_LEVEL_INFO, F("Fail to parse command correctly; please check API documentation")); + String log2 = F("Parsed command = \""); + log2 += string; + log2 += F("\""); + addLog(LOG_LEVEL_INFO, log2); + } + } + else + { + String log; + log.reserve(110); // Prevent re-allocation + log = F("P095-ILI9341 : WRITE = "); + log += tmpString; + SendStatus(event, log); // Reply (echo) to sender. This will print message on browser. + } + break; + } + } return success; } -#endif // USES_P095 \ No newline at end of file +#endif // USES_P095 diff --git a/src/src/PluginStructs/P095_data_struct.cpp b/src/src/PluginStructs/P095_data_struct.cpp index fe1f4c9e1..18b878850 100644 --- a/src/src/PluginStructs/P095_data_struct.cpp +++ b/src/src/PluginStructs/P095_data_struct.cpp @@ -48,23 +48,23 @@ void ILI9xxx_type_toResolution(ILI9xxx_type_e device, uint16_t& x, uint16_t& y) } } - /**************************************************************************** * Constructor ***************************************************************************/ -P095_data_struct::P095_data_struct(ILI9xxx_type_e displayType, +P095_data_struct::P095_data_struct(ILI9xxx_type_e displayType, int8_t _CS, int8_t _DC, int8_t _RST) - : _displayType(displayType)//, tft(_CS, _DC, _RST) - { + : _displayType(displayType) // , tft(_CS, _DC, _RST) +{ _xpix = 240; _ypix = 320; ILI9xxx_type_toResolution(_displayType, _xpix, _ypix); - tft = new (std::nothrow) Adafruit_ILI9341(_CS, _DC, _RST, static_cast(_displayType), _xpix, _ypix); - if (nullptr != tft) { - tft->begin(); - } + tft = new (std::nothrow) Adafruit_ILI9341(_CS, _DC, _RST, static_cast(_displayType), _xpix, _ypix); + + if (nullptr != tft) { + tft->begin(); } +} /**************************************************************************** * Destructor @@ -76,13 +76,13 @@ P095_data_struct::~P095_data_struct() { } } -//Print some text -//param [in] string : The text to display -//param [in] X : The left position (X) -//param [in] Y : The top position (Y) -//param [in] textSize : The text size (default 1) -//param [in] color : The fore color (default ILI9341_WHITE) -//param [in] bkcolor : The background color (default ILI9341_BLACK) +// Print some text +// param [in] string : The text to display +// param [in] X : The left position (X) +// param [in] Y : The top position (Y) +// param [in] textSize : The text size (default 1) +// param [in] color : The fore color (default ILI9341_WHITE) +// param [in] bkcolor : The background color (default ILI9341_BLACK) void P095_data_struct::printText(const String& string, int X, int Y, unsigned int textSize, unsigned short color, unsigned short bkcolor) { tft->setCursor(X, Y); @@ -91,81 +91,120 @@ void P095_data_struct::printText(const String& string, int X, int Y, unsigned in tft->println(string); } - -//Parse color string to ILI9341 color -//param [in] s : The color string (white, red, ...) -//return : color (default ILI9341_WHITE) -unsigned short P095_data_struct::ParseColor(String & s) +// Parse color string to ILI9341 color +// param [in] s : The color string (white, red, ...) +// return : color (default ILI9341_WHITE) +unsigned short P095_data_struct::ParseColor(String& s) { - if (s.equalsIgnoreCase(F("BLACK"))) + if (s.equalsIgnoreCase(F("BLACK"))) { return ILI9341_BLACK; - if (s.equalsIgnoreCase(F("NAVY"))) - return ILI9341_NAVY; - if (s.equalsIgnoreCase(F("DARKGREEN"))) - return ILI9341_DARKGREEN; - if (s.equalsIgnoreCase(F("DARKCYAN"))) - return ILI9341_DARKCYAN; - if (s.equalsIgnoreCase(F("MAROON"))) - return ILI9341_MAROON; - if (s.equalsIgnoreCase(F("PURPLE"))) - return ILI9341_PURPLE; - if (s.equalsIgnoreCase(F("OLIVE"))) - return ILI9341_OLIVE; - if (s.equalsIgnoreCase(F("LIGHTGREY"))) - return ILI9341_LIGHTGREY; - if (s.equalsIgnoreCase(F("DARKGREY"))) - return ILI9341_DARKGREY; - if (s.equalsIgnoreCase(F("BLUE"))) - return ILI9341_BLUE; - if (s.equalsIgnoreCase(F("GREEN"))) - return ILI9341_GREEN; - if (s.equalsIgnoreCase(F("CYAN"))) - return ILI9341_CYAN; - if (s.equalsIgnoreCase(F("RED"))) - return ILI9341_RED; - if (s.equalsIgnoreCase(F("MAGENTA"))) - return ILI9341_MAGENTA; - if (s.equalsIgnoreCase(F("YELLOW"))) - return ILI9341_YELLOW; - if (s.equalsIgnoreCase(F("WHITE"))) - return ILI9341_WHITE; - if (s.equalsIgnoreCase(F("ORANGE"))) - return ILI9341_ORANGE; - if (s.equalsIgnoreCase(F("GREENYELLOW"))) - return ILI9341_GREENYELLOW; - if (s.equalsIgnoreCase(F("PINK"))) - return ILI9341_PINK; + } - if(s.length() == 7 && s[0] == '#') + if (s.equalsIgnoreCase(F("NAVY"))) { + return ILI9341_NAVY; + } + + if (s.equalsIgnoreCase(F("DARKGREEN"))) { + return ILI9341_DARKGREEN; + } + + if (s.equalsIgnoreCase(F("DARKCYAN"))) { + return ILI9341_DARKCYAN; + } + + if (s.equalsIgnoreCase(F("MAROON"))) { + return ILI9341_MAROON; + } + + if (s.equalsIgnoreCase(F("PURPLE"))) { + return ILI9341_PURPLE; + } + + if (s.equalsIgnoreCase(F("OLIVE"))) { + return ILI9341_OLIVE; + } + + if (s.equalsIgnoreCase(F("LIGHTGREY"))) { + return ILI9341_LIGHTGREY; + } + + if (s.equalsIgnoreCase(F("DARKGREY"))) { + return ILI9341_DARKGREY; + } + + if (s.equalsIgnoreCase(F("BLUE"))) { + return ILI9341_BLUE; + } + + if (s.equalsIgnoreCase(F("GREEN"))) { + return ILI9341_GREEN; + } + + if (s.equalsIgnoreCase(F("CYAN"))) { + return ILI9341_CYAN; + } + + if (s.equalsIgnoreCase(F("RED"))) { + return ILI9341_RED; + } + + if (s.equalsIgnoreCase(F("MAGENTA"))) { + return ILI9341_MAGENTA; + } + + if (s.equalsIgnoreCase(F("YELLOW"))) { + return ILI9341_YELLOW; + } + + if (s.equalsIgnoreCase(F("WHITE"))) { + return ILI9341_WHITE; + } + + if (s.equalsIgnoreCase(F("ORANGE"))) { + return ILI9341_ORANGE; + } + + if (s.equalsIgnoreCase(F("GREENYELLOW"))) { + return ILI9341_GREENYELLOW; + } + + if (s.equalsIgnoreCase(F("PINK"))) { + return ILI9341_PINK; + } + + if ((s.length() == 7) && (s[0] == '#')) { // convrt to long value in base16, then split up into r, g, b values - long long number = strtoll( &s[1], NULL, 16); - //long long r = number >> 16; - //long long g = number >> 8 & 0xFF; - //long long b = number & 0xFF; - //convert to color565 (used by adafruit lib) + long long number = strtoll(&s[1], NULL, 16); + + // long long r = number >> 16; + // long long g = number >> 8 & 0xFF; + // long long b = number & 0xFF; + // convert to color565 (used by adafruit lib) return tft->color565(number >> 16, number >> 8 & 0xFF, number & 0xFF); } - return ILI9341_WHITE; //fallback value + return ILI9341_WHITE; // fallback value } -//Split a string by delimiter -//param [in] s : The input string -//param [in] c : The delimiter -//param [out] op : The resulting string array -//param [in] limit : The maximum strings to find -//return : The string count -int P095_data_struct::StringSplit(String &s, char c, String op[], int limit) +// Split a string by delimiter +// param [in] s : The input string +// param [in] c : The delimiter +// param [out] op : The resulting string array +// param [in] limit : The maximum strings to find +// return : The string count +int P095_data_struct::StringSplit(String& s, char c, String op[], int limit) { - int count = 0; - char * pch; + int count = 0; + char *pch; String d = String(c); - pch = strtok ((char*)(s.c_str()),d.c_str()); + + pch = strtok((char *)(s.c_str()), d.c_str()); + while (pch != NULL && count < limit) { op[count] = String(pch); count++; - pch = strtok (NULL, ","); + pch = strtok(NULL, ","); } return count; } From e586074d0830e727f3b2785324ca36a44410d7da Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 11 Feb 2022 15:15:24 +0100 Subject: [PATCH 03/89] [P095] String allocation improvements --- src/_P095_ILI9341.ino | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/_P095_ILI9341.ino b/src/_P095_ILI9341.ino index 028ce46fd..6769e6ad3 100644 --- a/src/_P095_ILI9341.ino +++ b/src/_P095_ILI9341.ino @@ -557,19 +557,21 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) { if (loglevelActiveFor(LOG_LEVEL_INFO)) { addLog(LOG_LEVEL_INFO, F("Fail to parse command correctly; please check API documentation")); - String log2 = F("Parsed command = \""); - log2 += string; - log2 += '"'; - addLog(LOG_LEVEL_INFO, log2); + String log; + log.reserve(string.length() + 20); // Prevent re-allocation + log += F("Parsed command = \""); + log += string; + log += '"'; + addLog(LOG_LEVEL_INFO, log); } } else { String log; - log.reserve(110); // Prevent re-allocation - log = F("P095-ILI9341 : WRITE = "); + log.reserve(tmpString.length() + 23); // Prevent re-allocation + log += F("P095-ILI9341 : WRITE = "); log += tmpString; - SendStatus(event, log); // Reply (echo) to sender. This will print message on browser. + SendStatus(event, log); // Reply (echo) to sender. This will print message on browser. } break; } From 9cbcb1f377e88659f2a08f54d3991465ceb0c90a Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 11 Feb 2022 19:11:04 +0100 Subject: [PATCH 04/89] [P095] Restore accidently lost addLogMove --- src/_P095_ILI9341.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_P095_ILI9341.ino b/src/_P095_ILI9341.ino index 6769e6ad3..e7f4fb270 100644 --- a/src/_P095_ILI9341.ino +++ b/src/_P095_ILI9341.ino @@ -562,7 +562,7 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) log += F("Parsed command = \""); log += string; log += '"'; - addLog(LOG_LEVEL_INFO, log); + addLogMove(LOG_LEVEL_INFO, log); } } else From 1dc3f944889f12b75d82eb618deefc085eeffd07 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 19 Feb 2022 17:20:12 +0100 Subject: [PATCH 05/89] [P095] Fix merge issue --- platformio_esp82xx_base.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_esp82xx_base.ini b/platformio_esp82xx_base.ini index 4f16afbf7..0a8a5e132 100644 --- a/platformio_esp82xx_base.ini +++ b/platformio_esp82xx_base.ini @@ -49,7 +49,7 @@ board_build.f_cpu = 80000000L build_flags = ${debug_flags.build_flags} ${mqtt_flags.build_flags} -DHTTPCLIENT_1_1_COMPATIBLE=0 build_unflags = -DDEBUG_ESP_PORT -fexceptions -lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, ESP8266WebServer, Adafruit, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, bblanchon/ArduinoJson @ ^6.17.2, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/RABurton ESP8266 Mutex @ ^1.0.2, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ESP8266HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205 +lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, ESP8266WebServer, Adafruit ILI9341, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, bblanchon/ArduinoJson @ ^6.17.2, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/RABurton ESP8266 Mutex @ ^1.0.2, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ESP8266HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205 lib_ignore = ${esp82xx_defaults.lib_ignore}, IRremoteESP8266, HeatpumpIR, LittleFS(esp8266), ServoESP32, TinyWireM board = esp12e monitor_filters = esp8266_exception_decoder From 6f3f18adc6ee39049b824134d65ed11c6929f28f Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 20 Feb 2022 14:48:19 +0100 Subject: [PATCH 06/89] [P095] Make enum values explicit --- src/src/PluginStructs/P095_data_struct.h | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/src/PluginStructs/P095_data_struct.h b/src/src/PluginStructs/P095_data_struct.h index 91abaaba3..c00a6fb89 100644 --- a/src/src/PluginStructs/P095_data_struct.h +++ b/src/src/PluginStructs/P095_data_struct.h @@ -9,7 +9,6 @@ # define PLUGIN_095_FONT_INCLUDED // enable to use fonts in this plugin # endif // if !defined(LIMIT_BUILD_SIZE) && !defined(PLUGIN_095_FONT_INCLUDED) - # include # ifdef PLUGIN_095_FONT_INCLUDED @@ -25,17 +24,17 @@ # define P095_CONFIG_FLAG_GET_TYPE (get4BitFromUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_TYPE)) enum class ILI9xxx_type_e : uint8_t { - ILI9341_240x320 = 0u, - ILI9342_240x320, - ILI9481_320x480, - ILI9481_CPT29_320x480, - ILI9481_PVI35_320x480, - ILI9481_AUO317_320x480, - ILI9481_CMO35_320x480, - ILI9481_RGB_320x480, - ILI9486_320x480, - ILI9488_320x480, - ILI9xxx_MAX // last value = count + ILI9341_240x320 = 0u, + ILI9342_240x320 = 1u, + ILI9481_320x480 = 2u, + ILI9481_CPT29_320x480 = 3u, + ILI9481_PVI35_320x480 = 4u, + ILI9481_AUO317_320x480 = 5u, + ILI9481_CMO35_320x480 = 6u, + ILI9481_RGB_320x480 = 7u, + ILI9486_320x480 = 8u, + ILI9488_320x480 = 9u, + ILI9xxx_MAX = 10u // last value = count }; const __FlashStringHelper* ILI9xxx_type_toString(ILI9xxx_type_e device); From d1d2d11c9127d0479bf98873d8bff9b12d0f5b96 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Wed, 23 Feb 2022 23:04:28 +0100 Subject: [PATCH 07/89] [P129] Add 74HC165 input shiftregisters plugin --- src/Custom-sample.h | 1 + src/_P129_74HC165.ino | 442 +++++++++++++++++++++ src/src/CustomBuild/define_plugin_sets.h | 3 +- src/src/PluginStructs/P129_data_struct.cpp | 240 +++++++++++ src/src/PluginStructs/P129_data_struct.h | 107 +++++ 5 files changed, 792 insertions(+), 1 deletion(-) create mode 100644 src/_P129_74HC165.ino create mode 100644 src/src/PluginStructs/P129_data_struct.cpp create mode 100644 src/src/PluginStructs/P129_data_struct.h diff --git a/src/Custom-sample.h b/src/Custom-sample.h index 6022ef704..afb196ffb 100644 --- a/src/Custom-sample.h +++ b/src/Custom-sample.h @@ -382,6 +382,7 @@ static const char DATA_ESPEASY_DEFAULT_MIN_CSS[] PROGMEM = { // #define USES_P120 // ADXL345 I2C Acceleration / Gravity // #define USES_P124 // I2C MultiRelay // #define USES_P125 // ADXL345 SPI Acceleration / Gravity +// #define USES_P129 // 74HC165 Input shiftregisters // Special plugins needing IR library diff --git a/src/_P129_74HC165.ino b/src/_P129_74HC165.ino new file mode 100644 index 000000000..0aa869015 --- /dev/null +++ b/src/_P129_74HC165.ino @@ -0,0 +1,442 @@ +#include "_Plugin_Helper.h" + +#ifdef USES_P129 + +// ####################################################################################################### +// ################################ Plugin 129 74HC165 Shiftregisters ############################### +// ####################################################################################################### + +/** Changelog: + * 2022-02-23 tonhuisman: Add command handling. + * 2022-02-22 tonhuisman: Compare results and generate events. + * 2022-02-21 tonhuisman: Add output selection dec + hex/bin, dec or hex/bin. + * 2022-02-20 tonhuisman: Initial plugin development. + * Based on a Forum request: https://www.letscontrolit.com/forum/viewtopic.php?p=57072&hilit=74hc165#p57072 + */ + +/** Commands: + * These commands only change configuration settings, but do not save them. They can be saved using the 'save' command. + * + * 74hc165pinevent,,<0|1> : Set the event enable state for pin (1..128), max. up to configured chips * 8. + * 74hc165chipevent,,<0|1> : Set the event enable state for an entire chip (1..16), max. up to configured chips. + * 74hc165setchipcount, : Set the number of chips, up to 16 (P129_MAX_CHIP_COUNT). + * 74hc165samplefrequency,<0|1> : Set the sample frequency, 0 = 10x/sec, 1 = 50x/sec + * 74hc165eventperpin,<0|1> : Set events per pin off or on. + */ + +# define PLUGIN_129 +# define PLUGIN_ID_129 129 +# define PLUGIN_NAME_129 "Input - 74HC165 Shiftregisters [TESTING]" +# define PLUGIN_VALUENAME1_129 "State_A" +# define PLUGIN_VALUENAME2_129 "State_B" +# define PLUGIN_VALUENAME3_129 "State_C" +# define PLUGIN_VALUENAME4_129 "State_D" + +# include "./src/PluginStructs/P129_data_struct.h" + +// TODO tonhuisman: ? Move to StringConverter ? though it is a bit specific, can also be used by P126 +String P129_ul2stringFixed(uint32_t value, uint8_t base) { + uint64_t val = static_cast(value); + + val &= 0x0ffffffff; // Keep 32 bits + val |= 0x100000000; // Set bit just left of 32 bits so we will see the leading zeroes + String valStr = ull2String(val, base); + + valStr.remove(0, 1); // Delete leading 1 we added + valStr.toUpperCase(); // uppercase hex for readability + return valStr; +} + +boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) +{ + boolean success = false; + + switch (function) + { + case PLUGIN_DEVICE_ADD: + { + Device[++deviceCount].Number = PLUGIN_ID_129; + Device[deviceCount].Type = DEVICE_TYPE_TRIPLE; + Device[deviceCount].VType = Sensor_VType::SENSOR_TYPE_QUAD; + Device[deviceCount].Ports = 0; + Device[deviceCount].PullUpOption = false; + Device[deviceCount].InverseLogicOption = false; + Device[deviceCount].FormulaOption = false; + Device[deviceCount].DecimalsOnly = false; + Device[deviceCount].ValueCount = + # if P129_MAX_CHIP_COUNT <= 4 + 1 + # elif P129_MAX_CHIP_COUNT <= 8 + 2 + # elif P129_MAX_CHIP_COUNT <= 12 + 3 + # else // if P129_MAX_CHIP_COUNT > 12 + 4 + # endif // if P129_MAX_CHIP_COUNT <= 4 + ; + Device[deviceCount].SendDataOption = false; // No use in sending the Values to a controller + Device[deviceCount].TimerOption = true; // Used to update the Devices page + Device[deviceCount].TimerOptional = true; + + break; + } + + case PLUGIN_GET_DEVICENAME: + { + string = F(PLUGIN_NAME_129); + break; + } + + case PLUGIN_GET_DEVICEVALUENAMES: + { + strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_129)); + strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[1], PSTR(PLUGIN_VALUENAME2_129)); + strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[2], PSTR(PLUGIN_VALUENAME3_129)); + strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[3], PSTR(PLUGIN_VALUENAME4_129)); + break; + } + + case PLUGIN_SET_DEFAULTS: + { + P129_CONFIG_CHIP_COUNT = 1; // Minimum is 1 chip + P129_CONFIG_DATA_PIN = -1; + P129_CONFIG_CLOCK_PIN = -1; + P129_CONFIG_ENABLE_PIN = -1; + P129_CONFIG_LOAD_PIN = -1; + ExtraTaskSettings.TaskDeviceValueDecimals[0] = 0; // No decimals needed + ExtraTaskSettings.TaskDeviceValueDecimals[1] = 0; // No decimals needed + ExtraTaskSettings.TaskDeviceValueDecimals[2] = 0; // No decimals needed + ExtraTaskSettings.TaskDeviceValueDecimals[3] = 0; // No decimals needed + break; + } + + case PLUGIN_GET_DEVICEGPIONAMES: + { + event->String1 = formatGpioName_input(F("Data pin (Q7)")); + event->String2 = formatGpioName_output(F("Clock pin (CP)")); + event->String3 = formatGpioName_output(F("Enable pin (EN)")); + break; + } + + case PLUGIN_WEBFORM_LOAD: + { + addFormPinSelect(formatGpioName_output(F("Load pin (PL)")), + F("p129_load_pin"), + P129_CONFIG_LOAD_PIN); + addFormNote(F("All GPIO pins must be configured to correctly initialize the plugin.")); + + addFormSubHeader(F("Device configuration")); + + { + String chipCount[P129_MAX_CHIP_COUNT]; + int chipOption[P129_MAX_CHIP_COUNT]; + + for (uint8_t i = 0; i < P129_MAX_CHIP_COUNT; i++) { + chipCount[i] = String(i + 1); + chipOption[i] = i + 1; + } + addFormSelector(F("Number of chips (Q7 → DS)"), + F("p129_chips"), + P129_MAX_CHIP_COUNT, + chipCount, + chipOption, + P129_CONFIG_CHIP_COUNT, + true); + + String unit = F("Daisychained 1.."); + unit += P129_MAX_CHIP_COUNT; + addUnit(unit); + + addFormNote(F("Changing the number of chips will reload the page and update the Event configuration.")); + } + + const __FlashStringHelper *frequencyOptions[] = { + F("10/sec (100 msec)"), + F("50/sec (20 msec)") }; + int frequencyValues[] = { P129_FREQUENCY_10, P129_FREQUENCY_50 }; + addFormSelector(F("Sample frequency"), F("p129_frequency"), 2, frequencyOptions, frequencyValues, P129_CONFIG_FLAGS_GET_READ_FREQUENCY); + + addFormSubHeader(F("Display and output")); + + # ifdef P129_SHOW_VALUES + addFormCheckBox(F("Values display (Off=Hex/On=Bin)"), F("p129_valuesdisplay"), P129_CONFIG_FLAGS_GET_VALUES_DISPLAY == 1); + # endif // ifdef P129_SHOW_VALUES + + const __FlashStringHelper *outputOptions[] = { + F("Decimal & hex/bin"), + F("Decimal only"), + F("Hex/bin only") }; + int outputValues[] = { P129_OUTPUT_BOTH, P129_OUTPUT_DEC_ONLY, P129_OUTPUT_HEXBIN }; + addFormSelector(F("Output selection"), F("p129_output"), 3, outputOptions, outputValues, P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION); + + addFormCheckBox(F("Separate events per pin"), F("p129_separate_events"), P129_CONFIG_FLAGS_GET_SEPARATE_EVENTS == 1); + + addFormSubHeader(F("Event configuration")); + + { + addRowLabel(F("Enable change-event for")); + html_table(EMPTY_STRING); // Sub-table + html_table_header(F("Chip # ")); + html_table_header(F("Port:")); + html_table_header(F("D7")); + html_table_header(F("D6")); + html_table_header(F("D5")); + html_table_header(F("D4")); + html_table_header(F("D3")); + html_table_header(F("D2")); + html_table_header(F("D1")); + html_table_header(F("D0")); + + uint64_t bits = 0; + uint8_t off = 0; + + for (uint8_t i = 0; i < P129_CONFIG_CHIP_COUNT; i++) { + if (i % 4 == 0) { + bits = PCONFIG_LONG(i / 4) & 0x0ffffffff; + off = 0; + # ifndef P129_DEBUG_LOG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + String log = F("74HC165 Reading from: "); + log += (i / 4); + log += F(", bits: "); + log += P129_ul2stringFixed(bits, BIN); + addLog(LOG_LEVEL_INFO, log); + } + # endif // ifndef P129_DEBUG_LOG + } + html_TR(); + addHtml(F("")); + addHtmlInt(i + 1); + html_TD(); + + for (uint8_t j = 0; j < 8; j++) { + html_TD(); + # ifdef ENABLE_TOOLTIPS + String toolTip = F("Chip "); + toolTip += (i + 1); + toolTip += F(" port D"); + toolTip += (7 - j); + toolTip += F(", pin "); + toolTip += i * 8 + (8 - j); + # endif // ifdef ENABLE_TOOLTIPS + addCheckBox(getPluginCustomArgName((i * 8 + (7 - j)) + 1), bitRead(bits, off * 8 + (7 - j)) + # ifdef ENABLE_TOOLTIPS + , false // = not Disabled + , toolTip + # endif // ifdef ENABLE_TOOLTIPS + ); + } + off++; + } + html_end_table(); + } + + success = true; + break; + } + + case PLUGIN_WEBFORM_SAVE: + { + P129_CONFIG_LOAD_PIN = getFormItemInt(F("p129_load_pin")); + P129_CONFIG_CHIP_COUNT = getFormItemInt(F("p129_chips")); + + uint32_t lSettings = 0u; + + # ifdef P129_SHOW_VALUES + + if (isFormItemChecked(F("p129_valuesdisplay"))) { bitSet(lSettings, P129_FLAGS_VALUES_DISPLAY); } + + if (isFormItemChecked(F("p129_separate_events"))) { bitSet(lSettings, P129_FLAGS_SEPARATE_EVENTS); } + # endif // ifdef P129_SHOW_VALUES + + if (getFormItemInt(F("p129_frequency"))) { bitSet(lSettings, P129_FLAGS_READ_FREQUENCY); } + set4BitToUL(lSettings, P129_FLAGS_OUTPUT_SELECTION, getFormItemInt(F("p129_output"))); + + P129_CONFIG_FLAGS = lSettings & 0xFFFF; + + uint64_t bits = 0; + uint8_t off = 0; + + for (uint8_t i = 0; i < P129_CONFIG_CHIP_COUNT; i++) { + if (i % 4 == 0) { + bits = 0; + off = 0; + } + + for (uint8_t j = 0; j < 8; j++) { + bitWrite(bits, off * 8 + (7 - j), isFormItemChecked(getPluginCustomArgName((i * 8 + (7 - j)) + 1))); + } + PCONFIG_LONG(i / 4) = bits; + + # ifndef P129_DEBUG_LOG + + if (loglevelActiveFor(LOG_LEVEL_INFO) && ((i % 4 == 3) || (i == P129_CONFIG_CHIP_COUNT))) { + String log = F("74HC165 Writing to: "); + log += (i / 4); + log += F(", offset: "); + log += (off * 8); + log += F(", bits: "); + log += P129_ul2stringFixed(bits, BIN); + addLog(LOG_LEVEL_INFO, log); + } + # endif // ifndef P129_DEBUG_LOG + off++; + } + success = true; + break; + } + + case PLUGIN_INIT: + { + initPluginTaskData(event->TaskIndex, new (std::nothrow) P129_data_struct(P129_CONFIG_DATA_PIN, + P129_CONFIG_CLOCK_PIN, + P129_CONFIG_ENABLE_PIN, + P129_CONFIG_LOAD_PIN, + P129_CONFIG_CHIP_COUNT)); + P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr == P129_data) { + return success; + } + + if (P129_data->isInitialized()) { + success = P129_data->plugin_init(event); + } + + if (!success) { + addLog(LOG_LEVEL_ERROR, F("74HC165: Initialization error!")); + # ifdef P129_DEBUG_LOG + } else { + addLog(LOG_LEVEL_INFO, F("74HC165: Initialized.")); + # endif // ifdef P129_DEBUG_LOG + } + + break; + } + + case PLUGIN_EXIT: + { + success = true; + break; + } + + case PLUGIN_READ: + { + P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr == P129_data) { + return success; + } + + success = P129_data->plugin_read(event); // Get state + + break; + } + + case PLUGIN_TEN_PER_SECOND: + case PLUGIN_FIFTY_PER_SECOND: + { + if (((function == PLUGIN_TEN_PER_SECOND) && (P129_CONFIG_FLAGS_GET_READ_FREQUENCY == P129_FREQUENCY_10)) || + ((function == PLUGIN_FIFTY_PER_SECOND) && (P129_CONFIG_FLAGS_GET_READ_FREQUENCY == P129_FREQUENCY_50))) { + P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P129_data) { + success = P129_data->plugin_readData(event); + } + } + + break; + } + case PLUGIN_FORMAT_USERVAR: + { + P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if ((nullptr != P129_data) && P129_data->isInitialized()) { // Only fill if plugin is active + string.clear(); + + if ((P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_BOTH) || + (P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_DEC_ONLY)) { + string += String(UserVar.getUint32(event->TaskIndex, event->idx)); + } + + if (P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_BOTH) { + string += ','; + } + + if ((P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_BOTH) || + (P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_HEXBIN)) { + string += '0'; + string += (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? 'b' : 'x'); + string += P129_ul2stringFixed(UserVar.getUint32(event->TaskIndex, event->idx), (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? BIN : HEX)); + } + success = true; + } + break; + } + + # ifdef P129_SHOW_VALUES + case PLUGIN_WEBFORM_SHOW_VALUES: + { + // P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); + + // if ((nullptr != P129_data) && P129_data->isInitialized()) { // Only show if plugin is active + String state, label; + state.reserve(40); + String abcd = F("ABCDEFGH"); // In case anyone dares to extend VARS_PER_TASK to 8... + const uint16_t endCheck = P129_CONFIG_CHIP_COUNT + 4; // 4(.0) = nr of bytes in an uint32_t. + const uint16_t maxVar = min(static_cast(VARS_PER_TASK), static_cast(ceil(P129_CONFIG_CHIP_COUNT / 4.0))); + uint8_t dotInsert; + uint8_t dotOffset; + + for (uint16_t varNr = 0; varNr < maxVar; varNr++) { + if (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY) { + label = F("Bin"); + state = F("0b"); + dotInsert = 10; + dotOffset = 9; + } else { + label = F("Hex"); + state = F("0x"); + dotInsert = 4; + dotOffset = 3; + } + label += F(" State_"); + label += abcd.substring(varNr, varNr + 1); + label += ' '; + + label += min(255, P129_CONFIG_SHOW_OFFSET + (4 * varNr) + 4); // Limited to max 255 chips + label += '_'; + label += (P129_CONFIG_SHOW_OFFSET + (4 * varNr) + 1); // 4 = nr of bytes in an uint32_t. + + if ((P129_CONFIG_SHOW_OFFSET + (4 * varNr) + 4) <= endCheck) { // Only show if still in range + state += P129_ul2stringFixed(UserVar.getUint32(event->TaskIndex, varNr), P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? BIN : HEX); + + for (uint8_t i = 0; i < 3; i++, dotInsert += dotOffset) { // Insert readability separators + state = state.substring(0, dotInsert) + '.' + state.substring(dotInsert); + } + pluginWebformShowValue(event->TaskIndex, VARS_PER_TASK + varNr, label, state, true); + } + } + success = true; // Don't show the default value data + // } + break; + } + # endif // ifdef P129_SHOW_VALUES + case PLUGIN_WRITE: + { + P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr == P129_data) { + return success; + } + + success = P129_data->plugin_write(event, string); + + break; + } + } + return success; +} + +#endif // ifdef USES_P129 diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index 64017e0cf..1c539c711 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -1190,6 +1190,7 @@ To create/register a plugin, you have to : #define USES_P120 // ADXL345 I2C #define USES_P121 // HMC5883L #define USES_P125 // ADXL345 SPI + #define USES_P129 // 74HC165 Input shiftregisters #endif @@ -1508,7 +1509,7 @@ To create/register a plugin, you have to : // #define USES_P128 // #endif #ifndef USES_P129 -// #define USES_P129 // + #define USES_P129 // 74HC165 Input shiftregisters #endif #ifndef USES_P130 // #define USES_P130 // diff --git a/src/src/PluginStructs/P129_data_struct.cpp b/src/src/PluginStructs/P129_data_struct.cpp new file mode 100644 index 000000000..d4ef3e5eb --- /dev/null +++ b/src/src/PluginStructs/P129_data_struct.cpp @@ -0,0 +1,240 @@ +#include "../PluginStructs/P129_data_struct.h" + +#ifdef USES_P129 + +// **************************************************************************/ +// Constructor +// **************************************************************************/ +P129_data_struct::P129_data_struct(int8_t dataPin, + int8_t clockPin, + int8_t enablePin, + int8_t loadPin, + uint8_t chipCount) + : _dataPin(dataPin), _clockPin(clockPin), _enablePin(enablePin), _loadPin(loadPin), _chipCount(chipCount) {} + +// **************************************************************************/ +// Destructor +// **************************************************************************/ +P129_data_struct::~P129_data_struct() {} + +bool P129_data_struct::plugin_init(struct EventStruct *event) { + if (isInitialized()) { + for (uint8_t i = 0; i < P129_MAX_CHIP_COUNT; i++) { // Clear entire buffer + readBuffer[i] = 0xFF; // FIXME temporary set all bits ON for testing... was: 0; + } + + // Prepare all used GPIO pins + pinMode(_enablePin, OUTPUT); + pinMode(_loadPin, OUTPUT); + pinMode(_clockPin, OUTPUT); + pinMode(_dataPin, INPUT); + digitalWrite(_loadPin, HIGH); + digitalWrite(_enablePin, HIGH); + + return true; + } + return false; +} + +const uint32_t P129_data_struct::getChannelState(uint8_t offset, uint8_t size) const { + uint32_t result = 0u; + uint16_t sft = 0u; + const uint8_t last = offset + size; + + for (uint8_t ofs = offset; ofs < last; ofs++, sft++) { + result += (readBuffer[ofs] << (8 * sft)); + } + + # ifdef P129_DEBUG_LOG + + if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { + String log = F("74hc165: getChannelState offset: "); + log += offset; + log += F(", size: "); + log += size; + log += F(", result: "); + log += result; + log += F("/0x"); + log += String(result, HEX); + addLogMove(LOG_LEVEL_DEBUG, log); + } + # endif // ifdef P129_DEBUG_LOG + + return result; +} + +bool P129_data_struct::plugin_read(struct EventStruct *event) { + const uint16_t last = P129_CONFIG_SHOW_OFFSET + (VARS_PER_TASK * 4); + uint8_t varNr = 0; + + for (uint16_t index = P129_CONFIG_SHOW_OFFSET; index < _chipCount && index < last && varNr < VARS_PER_TASK; index += 4, varNr++) { + uint32_t result = getChannelState(index, min(VARS_PER_TASK, _chipCount - index)); + UserVar.setUint32(event->TaskIndex, varNr, result); + } + return true; +} + +bool P129_data_struct::plugin_write(struct EventStruct *event, + const String & string) { + bool success = false; + + String command = parseString(string, 1); + + if (command.startsWith(F("74hc165"))) { + if (command.equals(F("74hc165pinevent"))) { // 74hc165pinevent,,<0|1> + const uint8_t pin = event->Par1 - 1; + const uint8_t value = event->Par2; + + if (validChannel(pin + 1) && ((value == 0) || (value == 1))) { + const uint8_t ulong = pin / 32; + const uint8_t bit = pin % 32; + uint32_t lSettings = PCONFIG_LONG(ulong); + + bitWrite(lSettings, bit, value); + PCONFIG_LONG(ulong) = lSettings; + success = true; + # ifdef P129_DEBUG_LOG + + if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { + String log = command; + log += F(", pin: "); + log += event->Par1; + log += F(", value: "); + log += value; + log += F(", config: "); + log += ulong; + log += F(", bit: "); + log += bit; + addLogMove(LOG_LEVEL_DEBUG, log); + } + # endif // ifdef P129_DEBUG_LOG + } + } else if (command.equals(F("74hc165chipevent"))) { // 74hc165chipevent,,<0|1> + const uint8_t chip = event->Par1 - 1; + const uint8_t value = event->Par2; + + if ((chip >= 0) && (chip < P129_CONFIG_CHIP_COUNT) && ((value == 0) || (value == 1))) { + const uint8_t ulong = chip / 4; + const uint8_t bit = (chip % 4) * 8; + uint32_t lSettings = PCONFIG_LONG(ulong); + + set8BitToUL(lSettings, bit, value == 1 ? 0xFF : 0x00); + PCONFIG_LONG(ulong) = lSettings; + success = true; + # ifdef P129_DEBUG_LOG + + if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { + String log = command; + log += F(", chip: "); + log += event->Par1; + log += F(", value: "); + log += value; + log += F(", config: "); + log += ulong; + log += F(", bit: "); + log += bit; + addLogMove(LOG_LEVEL_DEBUG, log); + } + # endif // ifdef P129_DEBUG_LOG + } + } else if (command.equals(F("74hc165setchipcount"))) { // 74hc165setchipcount, + if ((event->Par1 >= 1) && (event->Par1 <= P129_MAX_CHIP_COUNT)) { + P129_CONFIG_CHIP_COUNT = event->Par1; + _chipCount = event->Par1; + success = true; + } + } else if (command.equals(F("74hc165samplefrequency"))) { // 74hc165samplefrequency,<0|1> + if ((event->Par1 == 0) || (event->Par1 == 1)) { + uint32_t lSettings = P129_CONFIG_FLAGS; + bitWrite(lSettings, P129_FLAGS_READ_FREQUENCY, event->Par1 == 1); + P129_CONFIG_FLAGS = lSettings; + success = true; + } + } else if (command.equals(F("74hc165eventperpin"))) { // 74hc165eventperpin,<0|1> + if ((event->Par1 == 0) || (event->Par1 == 1)) { + uint32_t lSettings = P129_CONFIG_FLAGS; + bitWrite(lSettings, P129_FLAGS_SEPARATE_EVENTS, event->Par1 == 1); + P129_CONFIG_FLAGS = lSettings; + success = true; + } + } + # ifdef P129_DEBUG_LOG + + if (success) { + addLog(LOG_LEVEL_DEBUG, string); + } + # endif // ifdef P129_DEBUG_LOG + } + return success; +} + +bool P129_data_struct::plugin_readData(struct EventStruct *event) { + if (isInitialized()) { + digitalWrite(_loadPin, LOW); + delayMicroseconds(5); + digitalWrite(_loadPin, HIGH); + delayMicroseconds(5); + + digitalWrite(_clockPin, HIGH); + digitalWrite(_enablePin, LOW); + + for (uint8_t i = 0; i < P129_CONFIG_CHIP_COUNT; i++) { + prevBuffer[i] = readBuffer[i]; + readBuffer[i] = shiftIn(static_cast(_dataPin), static_cast(_clockPin), MSBFIRST); + } + digitalWrite(_enablePin, HIGH); + delay(0); + + checkDiff(event); + + return true; + } + return false; +} + +void P129_data_struct::checkDiff(struct EventStruct *event) { + for (uint8_t i = 0; i < P129_CONFIG_CHIP_COUNT; i += 4) { + const uint32_t bits = PCONFIG_LONG(i / 4); + + if (bits != 0) { + const uint32_t read = readBuffer[i + 3] << 24 | readBuffer[i + 2] << 16 | readBuffer[i + 1] << 8 | readBuffer[i + 0]; + const uint32_t prev = prevBuffer[i + 3] << 24 | prevBuffer[i + 2] << 16 | prevBuffer[i + 1] << 8 | prevBuffer[i + 0]; + + for (uint8_t j = 0; j < 32; j++) { // Check all 32 bits + if (bitRead(bits, j) && (bitRead(read, j) != bitRead(prev, j))) { // Event enabled and bit changed? + sendInputEvent(event, i, j, bitRead(read, j)); // Send out new state + } + } + } + delay(0); + } +} + +void P129_data_struct::sendInputEvent(struct EventStruct *event, + uint8_t i, + uint8_t j, + uint8_t state) { + String send; + uint8_t pin = (i * 8) + j + 1; // 1..128 + uint8_t chip = i + (j / 8) + 1; // 1..16 + uint8_t port = (j % 8); // 0..7 + + send.reserve(40); + send += getTaskDeviceName(event->TaskIndex); + + if (P129_CONFIG_FLAGS_GET_SEPARATE_EVENTS) { + send += '#'; + send += pin; + } + send += '='; + send += state; + send += ','; + send += chip; + send += ','; + send += port; + send += ','; + send += pin; + eventQueue.addMove(std::move(send)); +} + +#endif // ifdef USES_P129 diff --git a/src/src/PluginStructs/P129_data_struct.h b/src/src/PluginStructs/P129_data_struct.h new file mode 100644 index 000000000..68c8caaab --- /dev/null +++ b/src/src/PluginStructs/P129_data_struct.h @@ -0,0 +1,107 @@ +#ifndef PLUGINSTRUCTS_P129_DATA_STRUCT_H +#define PLUGINSTRUCTS_P129_DATA_STRUCT_H + +#include "../../_Plugin_Helper.h" +#ifdef USES_P129 + +# ifndef LIMIT_BUILD_SIZE +# define P129_DEBUG_LOG // Enable for some (extra) logging +# endif // ifndef LIMIT_BUILD_SIZE + +# define P129_CONFIG_CHIP_COUNT PCONFIG(0) +# define P129_CONFIG_DATA_PIN PIN(0) +# define P129_CONFIG_CLOCK_PIN PIN(1) +# define P129_CONFIG_ENABLE_PIN PIN(2) +# define P129_CONFIG_LOAD_PIN PCONFIG(1) +# define P129_CONFIG_FLAGS PCONFIG(7) // MAX 16 bits!!! + +# define P129_FLAGS_VALUES_DISPLAY 0 // 0/off = HEX, 1/on = BIN +# define P129_FLAGS_READ_FREQUENCY 1 // 0 = 10x/sec, 1 = 50x/sec +# define P129_FLAGS_SEPARATE_EVENTS 2 // Enable/disable separate events per pin [#]=state,chip,port,pin +# define P129_FLAGS_OUTPUT_SELECTION 4 // 0 = decimal & hex/bin, 1 = Decimal, 2= hex/bin + +# define P129_CONFIG_SHOW_OFFSET 0 // Fixed setting + +# define P129_CONFIG_FLAGS_GET_VALUES_DISPLAY (bitRead(P129_CONFIG_FLAGS, P129_FLAGS_VALUES_DISPLAY)) +# define P129_CONFIG_FLAGS_GET_READ_FREQUENCY (bitRead(P129_CONFIG_FLAGS, P129_FLAGS_READ_FREQUENCY)) +# define P129_CONFIG_FLAGS_GET_SEPARATE_EVENTS (bitRead(P129_CONFIG_FLAGS, P129_FLAGS_SEPARATE_EVENTS)) +# define P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION (get4BitFromUL(P129_CONFIG_FLAGS, P129_FLAGS_OUTPUT_SELECTION)) + +# define P129_FREQUENCY_10 0 // 10x per second +# define P129_FREQUENCY_50 1 // 50x per second + +# define P129_OUTPUT_BOTH 0 // Decimal + hex/bin +# define P129_OUTPUT_DEC_ONLY 1 // Decimal +# define P129_OUTPUT_HEXBIN 2 // Hex/bin + +// Number of chips to support undefined = 1, range 1..16 = 8..128 pins +# define P129_MAX_CHIP_COUNT 16 + +# if !defined(P129_MAX_CHIP_COUNT) +# define P129_MAX_CHIP_COUNT 1 // Fallback value +# endif // if !defined(P129_MAX_CHIP_COUNT) +# if P129_MAX_CHIP_COUNT > 16 // Check for max. supported no. of chips +# undef P129_MAX_CHIP_COUNT +# define P129_MAX_CHIP_COUNT 16 +# endif // if P129_MAX_CHIP_COUNT > 16 + +# define P129_SHOW_VALUES // When defined, will show the selected inputs in either Hex or Bin format on the Devices + // page. Disabled when LIMIT_BUILD_SIZE is set +# if defined(LIMIT_BUILD_SIZE) && defined(P129_SHOW_VALUES) +# undef P129_SHOW_VALUES +# endif // if defined(LIMIT_BUILD_SIZE) && defined(P129_SHOW_VALUES) + +struct P129_data_struct : public PluginTaskData_base { +public: + + P129_data_struct(int8_t dataPin, + int8_t clockPin, + int8_t enablePin, + int8_t loadPin, + uint8_t chipCount); + + P129_data_struct() = delete; + ~P129_data_struct(); + + const bool isInitialized() const { // All GPIO's defined + return _dataPin != -1 && + _clockPin != -1 && + _enablePin != -1 && + _loadPin != -1; + } + + bool plugin_init(struct EventStruct *event); + bool plugin_read(struct EventStruct *event); + bool plugin_write(struct EventStruct *event, + const String & string); + bool plugin_readData(struct EventStruct *event); + +private: + + const uint32_t getChannelState(uint8_t offset, + uint8_t size) const; + + const bool validChannel(uint channel) const { + return channel > 0 && channel <= (_chipCount * 8); + } + + void checkDiff(struct EventStruct *event); + void sendInputEvent(struct EventStruct *event, + uint8_t i, + uint8_t j, + uint8_t state); + + + int8_t _dataPin; + int8_t _clockPin; + int8_t _enablePin; + int8_t _loadPin; + uint8_t _chipCount; + + uint8_t readBuffer[P129_MAX_CHIP_COUNT] = { 0 }; + uint8_t prevBuffer[P129_MAX_CHIP_COUNT]; // To compare to +}; + +#endif // ifdef USES_P129 + +#endif // ifndef PLUGINSTRUCTS_P129_DATA_STRUCT_H From 06203b024d7c0d9057a67c1980e995c7f8e47051 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 25 Feb 2022 16:50:21 +0100 Subject: [PATCH 08/89] [P129] Rename command to ShiftIn, and promote rest of command to second argument --- src/_P129_74HC165.ino | 24 +++++++------ src/src/PluginStructs/P129_data_struct.cpp | 42 +++++++++++----------- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/src/_P129_74HC165.ino b/src/_P129_74HC165.ino index 0aa869015..c91e8dc3e 100644 --- a/src/_P129_74HC165.ino +++ b/src/_P129_74HC165.ino @@ -7,6 +7,7 @@ // ####################################################################################################### /** Changelog: + * 2022-02-25 tonhuisman: Rename command to ShiftIn,,... * 2022-02-23 tonhuisman: Add command handling. * 2022-02-22 tonhuisman: Compare results and generate events. * 2022-02-21 tonhuisman: Add output selection dec + hex/bin, dec or hex/bin. @@ -16,12 +17,12 @@ /** Commands: * These commands only change configuration settings, but do not save them. They can be saved using the 'save' command. - * - * 74hc165pinevent,,<0|1> : Set the event enable state for pin (1..128), max. up to configured chips * 8. - * 74hc165chipevent,,<0|1> : Set the event enable state for an entire chip (1..16), max. up to configured chips. - * 74hc165setchipcount, : Set the number of chips, up to 16 (P129_MAX_CHIP_COUNT). - * 74hc165samplefrequency,<0|1> : Set the sample frequency, 0 = 10x/sec, 1 = 50x/sec - * 74hc165eventperpin,<0|1> : Set events per pin off or on. + * + * ShiftIn,PinEvent,,<0|1> : Set the event enable state for pin (1..128), max. up to configured chips * 8. + * ShiftIn,ChipEvent,,<0|1> : Set the event enable state for an entire chip (1..16), max. up to configured chips. + * ShiftIn,SetChipCount, : Set the number of chips, up to 16 (P129_MAX_CHIP_COUNT). + * ShiftIn,SampleFrequency,<0|1> : Set the sample frequency, 0 = 10x/sec, 1 = 50x/sec. + * ShiftIn,EventPerPin,<0|1> : Set events per pin off or on. */ # define PLUGIN_129 @@ -38,12 +39,15 @@ String P129_ul2stringFixed(uint32_t value, uint8_t base) { uint64_t val = static_cast(value); - val &= 0x0ffffffff; // Keep 32 bits - val |= 0x100000000; // Set bit just left of 32 bits so we will see the leading zeroes + val &= 0x0ffffffff; // Keep 32 bits + val |= 0x100000000; // Set bit just left of 32 bits so we will see the leading zeroes String valStr = ull2String(val, base); - valStr.remove(0, 1); // Delete leading 1 we added - valStr.toUpperCase(); // uppercase hex for readability + valStr.remove(0, 1); // Delete leading 1 we added + + if (base == HEX) { + valStr.toUpperCase(); // uppercase hex for readability + } return valStr; } diff --git a/src/src/PluginStructs/P129_data_struct.cpp b/src/src/PluginStructs/P129_data_struct.cpp index d4ef3e5eb..76918377b 100644 --- a/src/src/PluginStructs/P129_data_struct.cpp +++ b/src/src/PluginStructs/P129_data_struct.cpp @@ -48,7 +48,7 @@ const uint32_t P129_data_struct::getChannelState(uint8_t offset, uint8_t size) c # ifdef P129_DEBUG_LOG if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { - String log = F("74hc165: getChannelState offset: "); + String log = F("SHIFTIN: getChannelState offset: "); log += offset; log += F(", size: "); log += size; @@ -80,10 +80,12 @@ bool P129_data_struct::plugin_write(struct EventStruct *event, String command = parseString(string, 1); - if (command.startsWith(F("74hc165"))) { - if (command.equals(F("74hc165pinevent"))) { // 74hc165pinevent,,<0|1> - const uint8_t pin = event->Par1 - 1; - const uint8_t value = event->Par2; + if (command.equals(F("shiftin"))) { + const String subcommand = parseString(string, 2); + + if (subcommand.equals(F("pinevent"))) { // ShiftIn,pinevent,,<0|1> + const uint8_t pin = event->Par2 - 1; + const uint8_t value = event->Par3; if (validChannel(pin + 1) && ((value == 0) || (value == 1))) { const uint8_t ulong = pin / 32; @@ -98,7 +100,7 @@ bool P129_data_struct::plugin_write(struct EventStruct *event, if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { String log = command; log += F(", pin: "); - log += event->Par1; + log += event->Par2; log += F(", value: "); log += value; log += F(", config: "); @@ -109,9 +111,9 @@ bool P129_data_struct::plugin_write(struct EventStruct *event, } # endif // ifdef P129_DEBUG_LOG } - } else if (command.equals(F("74hc165chipevent"))) { // 74hc165chipevent,,<0|1> - const uint8_t chip = event->Par1 - 1; - const uint8_t value = event->Par2; + } else if (subcommand.equals(F("chipevent"))) { // ShiftIn,chipevent,,<0|1> + const uint8_t chip = event->Par2 - 1; + const uint8_t value = event->Par3; if ((chip >= 0) && (chip < P129_CONFIG_CHIP_COUNT) && ((value == 0) || (value == 1))) { const uint8_t ulong = chip / 4; @@ -126,7 +128,7 @@ bool P129_data_struct::plugin_write(struct EventStruct *event, if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { String log = command; log += F(", chip: "); - log += event->Par1; + log += event->Par2; log += F(", value: "); log += value; log += F(", config: "); @@ -137,23 +139,23 @@ bool P129_data_struct::plugin_write(struct EventStruct *event, } # endif // ifdef P129_DEBUG_LOG } - } else if (command.equals(F("74hc165setchipcount"))) { // 74hc165setchipcount, - if ((event->Par1 >= 1) && (event->Par1 <= P129_MAX_CHIP_COUNT)) { - P129_CONFIG_CHIP_COUNT = event->Par1; - _chipCount = event->Par1; + } else if (subcommand.equals(F("setchipcount"))) { // ShiftIn,setchipcount, + if ((event->Par2 >= 1) && (event->Par2 <= P129_MAX_CHIP_COUNT)) { + P129_CONFIG_CHIP_COUNT = event->Par2; + _chipCount = event->Par2; success = true; } - } else if (command.equals(F("74hc165samplefrequency"))) { // 74hc165samplefrequency,<0|1> - if ((event->Par1 == 0) || (event->Par1 == 1)) { + } else if (subcommand.equals(F("samplefrequency"))) { // ShiftIn,samplefrequency,<0|1> + if ((event->Par2 == 0) || (event->Par2 == 1)) { uint32_t lSettings = P129_CONFIG_FLAGS; - bitWrite(lSettings, P129_FLAGS_READ_FREQUENCY, event->Par1 == 1); + bitWrite(lSettings, P129_FLAGS_READ_FREQUENCY, event->Par2 == 1); P129_CONFIG_FLAGS = lSettings; success = true; } - } else if (command.equals(F("74hc165eventperpin"))) { // 74hc165eventperpin,<0|1> - if ((event->Par1 == 0) || (event->Par1 == 1)) { + } else if (subcommand.equals(F("eventperpin"))) { // ShiftIn,eventperpin,<0|1> + if ((event->Par2 == 0) || (event->Par2 == 1)) { uint32_t lSettings = P129_CONFIG_FLAGS; - bitWrite(lSettings, P129_FLAGS_SEPARATE_EVENTS, event->Par1 == 1); + bitWrite(lSettings, P129_FLAGS_SEPARATE_EVENTS, event->Par2 == 1); P129_CONFIG_FLAGS = lSettings; success = true; } From c456dced603d0038a56ebdaa8cc45aeca6cc658b Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 25 Feb 2022 22:31:45 +0100 Subject: [PATCH 09/89] [P129] Rename plugin, some minor corrections --- src/_P129_74HC165.ino | 108 +++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 50 deletions(-) diff --git a/src/_P129_74HC165.ino b/src/_P129_74HC165.ino index c91e8dc3e..76b03f320 100644 --- a/src/_P129_74HC165.ino +++ b/src/_P129_74HC165.ino @@ -27,7 +27,7 @@ # define PLUGIN_129 # define PLUGIN_ID_129 129 -# define PLUGIN_NAME_129 "Input - 74HC165 Shiftregisters [TESTING]" +# define PLUGIN_NAME_129 "Input - Shift registers (74HC165) [TESTING]" # define PLUGIN_VALUENAME1_129 "State_A" # define PLUGIN_VALUENAME2_129 "State_B" # define PLUGIN_VALUENAME3_129 "State_C" @@ -78,8 +78,8 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) 4 # endif // if P129_MAX_CHIP_COUNT <= 4 ; - Device[deviceCount].SendDataOption = false; // No use in sending the Values to a controller - Device[deviceCount].TimerOption = true; // Used to update the Devices page + Device[deviceCount].SendDataOption = true; // No use in sending the Values to a controller + Device[deviceCount].TimerOption = true; // Used to update the Devices page Device[deviceCount].TimerOptional = true; break; @@ -372,7 +372,15 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) (P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_HEXBIN)) { string += '0'; string += (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? 'b' : 'x'); - string += P129_ul2stringFixed(UserVar.getUint32(event->TaskIndex, event->idx), (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? BIN : HEX)); + string += P129_ul2stringFixed(UserVar.getUint32(event->TaskIndex, event->idx), + # ifdef P129_SHOW_VALUES + (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? BIN : + # endif // ifdef P129_SHOW_VALUES + HEX + # ifdef P129_SHOW_VALUES + ) + # endif // ifdef P129_SHOW_VALUES + ); } success = true; } @@ -381,64 +389,64 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) # ifdef P129_SHOW_VALUES case PLUGIN_WEBFORM_SHOW_VALUES: - { - // P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); + { + // P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); - // if ((nullptr != P129_data) && P129_data->isInitialized()) { // Only show if plugin is active - String state, label; - state.reserve(40); - String abcd = F("ABCDEFGH"); // In case anyone dares to extend VARS_PER_TASK to 8... - const uint16_t endCheck = P129_CONFIG_CHIP_COUNT + 4; // 4(.0) = nr of bytes in an uint32_t. - const uint16_t maxVar = min(static_cast(VARS_PER_TASK), static_cast(ceil(P129_CONFIG_CHIP_COUNT / 4.0))); - uint8_t dotInsert; - uint8_t dotOffset; + // if ((nullptr != P129_data) && P129_data->isInitialized()) { // Only show if plugin is active + String state, label; + state.reserve(40); + String abcd = F("ABCDEFGH"); // In case anyone dares to extend VARS_PER_TASK to 8... + const uint16_t endCheck = P129_CONFIG_CHIP_COUNT + 4; // 4(.0) = nr of bytes in an uint32_t. + const uint16_t maxVar = min(static_cast(VARS_PER_TASK), static_cast(ceil(P129_CONFIG_CHIP_COUNT / 4.0))); + uint8_t dotInsert; + uint8_t dotOffset; - for (uint16_t varNr = 0; varNr < maxVar; varNr++) { - if (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY) { - label = F("Bin"); - state = F("0b"); - dotInsert = 10; - dotOffset = 9; - } else { - label = F("Hex"); - state = F("0x"); - dotInsert = 4; - dotOffset = 3; - } - label += F(" State_"); - label += abcd.substring(varNr, varNr + 1); - label += ' '; + for (uint16_t varNr = 0; varNr < maxVar; varNr++) { + if (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY) { + label = F("Bin"); + state = F("0b"); + dotInsert = 10; + dotOffset = 9; + } else { + label = F("Hex"); + state = F("0x"); + dotInsert = 4; + dotOffset = 3; + } + label += F(" State_"); + label += abcd.substring(varNr, varNr + 1); + label += ' '; - label += min(255, P129_CONFIG_SHOW_OFFSET + (4 * varNr) + 4); // Limited to max 255 chips - label += '_'; - label += (P129_CONFIG_SHOW_OFFSET + (4 * varNr) + 1); // 4 = nr of bytes in an uint32_t. + label += min(255, P129_CONFIG_SHOW_OFFSET + (4 * varNr) + 4); // Limited to max 255 chips + label += '_'; + label += (P129_CONFIG_SHOW_OFFSET + (4 * varNr) + 1); // 4 = nr of bytes in an uint32_t. - if ((P129_CONFIG_SHOW_OFFSET + (4 * varNr) + 4) <= endCheck) { // Only show if still in range - state += P129_ul2stringFixed(UserVar.getUint32(event->TaskIndex, varNr), P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? BIN : HEX); + if ((P129_CONFIG_SHOW_OFFSET + (4 * varNr) + 4) <= endCheck) { // Only show if still in range + state += P129_ul2stringFixed(UserVar.getUint32(event->TaskIndex, varNr), P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? BIN : HEX); - for (uint8_t i = 0; i < 3; i++, dotInsert += dotOffset) { // Insert readability separators - state = state.substring(0, dotInsert) + '.' + state.substring(dotInsert); + for (uint8_t i = 0; i < 3; i++, dotInsert += dotOffset) { // Insert readability separators + state = state.substring(0, dotInsert) + '.' + state.substring(dotInsert); + } + pluginWebformShowValue(event->TaskIndex, VARS_PER_TASK + varNr, label, state, true); } - pluginWebformShowValue(event->TaskIndex, VARS_PER_TASK + varNr, label, state, true); } + success = true; // Don't show the default value data + // } + break; } - success = true; // Don't show the default value data - // } - break; - } # endif // ifdef P129_SHOW_VALUES case PLUGIN_WRITE: - { - P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); + { + P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); - if (nullptr == P129_data) { - return success; + if (nullptr == P129_data) { + return success; + } + + success = P129_data->plugin_write(event, string); + + break; } - - success = P129_data->plugin_write(event, string); - - break; - } } return success; } From 05f88d5dbf177e83f268e08969b9f950f55f507d Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 25 Feb 2022 22:32:12 +0100 Subject: [PATCH 10/89] [P129] Add documentation --- docs/source/Plugin/P129.rst | 132 ++++++++++++++++++ .../Plugin/P129_DeviceConfiguration.png | Bin 0 -> 67216 bytes .../source/Plugin/P129_EventConfiguration.png | Bin 0 -> 19999 bytes docs/source/Plugin/P129_OutputOptions.png | Bin 0 -> 18384 bytes .../Plugin/P129_SampleFrequencyOptions.png | Bin 0 -> 12036 bytes docs/source/Plugin/P129_ValuesBin.png | Bin 0 -> 8171 bytes docs/source/Plugin/P129_ValuesBinChip.png | Bin 0 -> 21827 bytes docs/source/Plugin/P129_ValuesHex.png | Bin 0 -> 5665 bytes docs/source/Plugin/P129_commands.repl | 31 ++++ docs/source/Plugin/_Plugin.rst | 6 + docs/source/Plugin/_plugin_categories.repl | 1 + .../Plugin/_plugin_substitutions_p12x.repl | 13 ++ 12 files changed, 183 insertions(+) create mode 100644 docs/source/Plugin/P129.rst create mode 100644 docs/source/Plugin/P129_DeviceConfiguration.png create mode 100644 docs/source/Plugin/P129_EventConfiguration.png create mode 100644 docs/source/Plugin/P129_OutputOptions.png create mode 100644 docs/source/Plugin/P129_SampleFrequencyOptions.png create mode 100644 docs/source/Plugin/P129_ValuesBin.png create mode 100644 docs/source/Plugin/P129_ValuesBinChip.png create mode 100644 docs/source/Plugin/P129_ValuesHex.png create mode 100644 docs/source/Plugin/P129_commands.repl diff --git a/docs/source/Plugin/P129.rst b/docs/source/Plugin/P129.rst new file mode 100644 index 000000000..9494ea543 --- /dev/null +++ b/docs/source/Plugin/P129.rst @@ -0,0 +1,132 @@ +.. include:: ../Plugin/_plugin_substitutions_p12x.repl +.. _P129_page: + +|P129_typename| +================================================== + +|P129_shortinfo| + +Plugin details +-------------- + +Type: |P129_type| + +Name: |P129_name| + +Status: |P129_status| + +GitHub: |P129_github|_ + +Maintainer: |P129_maintainer| + +Used libraries: |P129_usedlibraries| + +Description +----------- + +The 74HC165 Shift registers can be used to connect many input pins to an ESP using only 4 GPIO pins, as these shift registers can easily be daisy chained. + +When connecting many shift registers daisy-chained, it is important to ensure that not *too* many are connected to a single GPIO output pin, as that could overload that pin. It is advised to use a buffer chip for all used GPIOs for every 4 to 5 shift registers. When using a Schmitt-trigger buffer, it will also clean up the signal further down the line. Any buffer will introduce a small delay in the signal, possibly reducing the number of shift registers that can be controlled. A few useful answers are in this `Stack Exchange question`_ (issue is similar for input and output shift registers) + +The input pins can be used to read f.e. switches, like contacts along a model-train track, or reed contacts. Any debouncing should be done in hardware by adding a capacitor at the switch. + +Configuration +------------- + +.. image:: P129_DeviceConfiguration.png + :alt: Device configuration + +* **Name** A unique name should be entered here. + +* **Enabled** The device can be disabled or enabled. When not enabled the device should not use any resources. + +Actuator +^^^^^^^^ + +* **GPIO -> Data pin (Q7)**: Select the GPIO pin that is connected to the Data out pin of the (first) shift register. Any daisy chained register has its ``DS`` pin connected to the ``Q7`` pin of the previous shift register. + +* **GPIO -> Clock pin (CP)**: Select the Clock pin of all shift registers. + +* **GPIO -> Enable pin (EN)**: Select the Enable pin of all shift registers. + +* **GPIO -> Load pin (PL)**: Select the Load pin of all shift registers. + +NB: All 4 pins need to be configured or the plugin will not start. + +Device configuration +^^^^^^^^^^^^^^^^^^^^ + +* **Number of chips (Q7 -> DS)**: The number of chips daisy-chained to each other. Default: 1, max. 16 (compile-time defined, technically limited to 16), allowing for max. 128 input pins. When changing the number of chips, the page will be submitted and reloaded to update the Event configuration. + +* **Sample frequency**: The interval of reading the inputs from the shift registers, 10 times per second or 50 times per second. + +.. image:: P129_SampleFrequencyOptions.png + :alt: Sample frequency options + +Display and output +^^^^^^^^^^^^^^^^^^ + +* **Values display (Off=Hex/On=Bin)**: The display on the Devices page is custom formatted to show the state of the inputs of the shift registers in either Hex (default) or Bin format, having a separator per chip (8 bits) for readability. + +All zeroes, Hex display (default) + +.. image:: P129_ValuesHex.png + :alt: Devices page, hexadecimal Values example + +All zeroes, Bin display + +.. image:: P129_ValuesBin.png + :alt: Devices page, binary Values example + +NB: The State values are grouped per 4 chips. To be read from right to left in chip-order, see below. If less chips are configured, only available states are shown. + +.. image:: P129_ValuesBinChip.png + :alt: Devices page, binary Values pointing out chip numbers + +* **Output selection**: Choose the values that are sent out to any controllers configured, or when getting the value from processing ``[#]``. + +These are the available options: + +.. image:: P129_OutputOptions.png + :alt: Output selection options + +If ``Decimal & hex/bin`` is selected, the value is output twice, formatted as decimal and as hexadecimal or binary, separated by a comma. + +If either of the Hex/bin options is selected, but no ``Values display (Off=Hex/On=Bin)`` option is available, then the output will be formatted as hexadecimal. + +* **Separate events per pin**: When enabled, sends separate events per pin, including the pin number, to be processed via rules. F.e. ``#=,,,``. When disabled, all pins can be handled by a single rule, as it's generated like: ``=,,,``. + +Event configuration +^^^^^^^^^^^^^^^^^^^ + +To select for which input an event should be generated, a matrix is shown, listing the pins per chip that can be separately enabled. + +When all 16 chips are configured, the configuration looks like this: + +.. image:: P129_EventConfiguration.png + :alt: Event configuration + +The Data Acquisition, Send to Controller and Interval settings are standard available configuration items. Send to Controller only when one or more Controllers are configured. + +* **Interval** By default, Interval will be set to 0 sec. as this is optional. Every Interval setting, the current output states will be read from the runtime object (*not* from the shift registers!) and stored in the Values fields, so they can be restored on a warm boot of the ESP. + +Values +^^^^^^ + +The Values ``State_A`` to ``State_D`` are used to show the state of up to 16 shift registers. (Custom formatted) + +Commands +~~~~~~~~ + +.. include:: P129_commands.repl + + + +Change log +---------- + +.. versionchanged:: 2.0 + + |added| 2022-02-23 Added to ESPEasy as a new plugin. + +.. _Stack Exchange question: https://electronics.stackexchange.com/questions/40242/what-problems-could-occur-when-chaining-40-shift-registers \ No newline at end of file diff --git a/docs/source/Plugin/P129_DeviceConfiguration.png b/docs/source/Plugin/P129_DeviceConfiguration.png new file mode 100644 index 0000000000000000000000000000000000000000..ad7fd38c96145094bede9f079e11d475db6daa8e GIT binary patch literal 67216 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

u*~vYsqex0qc@0o_r* zJltA$P>RePEFB@L;5>BJxR(YT>GdHjzUsMQH+H~2Fkm1_r%Cpj-I0v7(huw!cNvMY z9tkaYbr=}DvEG))${~-Y^m+`T&y}G!?;h<7C`hc|s zWW?dS{7oTI*07w9j?V*Yduxr4oSOa0}|3%xL zR5MGcYYwCI+uGX7;ir+j5PfXRJv+c@^(oTy%oFV>83PnBcUp212o}RHA5uwTrVtZg`8e8fm>-(hu!NIw1YkDAttY$GoA!Rxl)UvkMKz3>8-2^TG{Ltd^`EE%Q2SN1$gIzlZ`#B1{^1Le^gANOrn$LSV3JAW@%;X`hKZz^f zgu(^@ZLy&0crLYc$V=x{qwWz}gsBDNgT$+E0K_YqGaCj8EH>K$18MQKWu>RAWFhCm zSmfY&Nq^wD;xVUAmZzjx8}vE@^|lvY!v>y7a!W-419dn8Gt56g=x6bNfDn8q=wK|r zo(_lzm|q}Gkicuqg+s5f&*|Bi>(TC;TDY$3{|=(di}of%i)Gu zNVa>neLk!o`FjnFu5UJ@&=^5e2MbNx&$?>M@Un|_ME;XH2C&2qFdQf@F~;HmNsT`# z4fRb;UO)~gKVS=4HX^QdyD+o%FHagor=XH}NYX@t;BBtgh~Pu+j^<0fS_S0Chc2v;{VQ|Zpe>un~7|qVw1kS-c)MFv%xv{!yN6| zU!HH#`)Oan+_m$+1g-APP_jK&IsWcym-X%wPSNr4)G>yMU48_1Fe|gJCU9i}fB8&{ zoqu6rejZF$Fr*zs&6#quqUS&)r#L%n1=-k?cy_WZ%4}@uQFmGU!^Wn6@f@^6;FbUC z7<3|lr!+BQJuL_aDG+7JvHvt&VH!+}PJuBqBj^v121wd6b)n4-pBdgwmBFJLVcDat znD^=$`nKhztih;$13L>en(3b=f7`D-PhW80D&-x(bAqkm{ypYFXjNGJ8Pv}WL zahl2!Abs7unk6W5iNphaeIv`e{@6N4^X6c5Fd}5M6?ZQ@BK^>q1@zs!@cMXaf$dw*I29uEszNDaV1as5On@Ve7>iIBof}!yQ|uAWd@O^3G*j?=#e(IMANfq9oPQa1R zFrB}DqUoH^dis0;cLb)jkeNi~o~w1#_CRw;2g2i@j^s!73BPL6S5Cs!JwwffZQ`J` z0YF2dT4Qf_CRv}$u66G-So!t39QLPi7?=lAeQo;3e0%Bm)~y)z#=%Za;maKdmA_mHr3-oa9S}VDwlghE zD(?+S!EI?F`4hDMEz9TG!>x76sIaOxl3IFg%{Z=PoWP1#U*)k}YQ?YU>yunaH*Wzc zr3K$q%mFwOn(}Sxnk2iij;A6zxuJkFlQzmBnzrG-uZ#EGEzX)1o=@2n-Up!>2@*e3 z8iQf8`2p%Rp~s1;TIV_$)fR?dl#f7kO!IlN{3<;2eCfh9!ECkDYavtAs<$rbe~>0o zOl#78?V7r;6?i)Z!biYuv5)Q!9*7g@5s`ij-r8A2{8iN`K4cc$@`DTXW(oZeaBiBk z7Jaq`Ke=}chWO9h9#l&;h-N_|*tdndgQXEn#lY`%zC0u6KX^5@e#&^mDJu^3KWe-B za3=WfucD$m>Q2aeMK_715?fwUiKxVggjEa8(lB|OSy8zQLzH(bG*PzPnU}Ij(h4J# zX~S+|!z{5k+svLl&-MKNd#>k?-|zbU|2^ki=X|g8`JD5;uJ1XYDF054GrHBQ%OdxL zZU5~=IA*n{y#}I~SQr8%tqr@MWWtsgiNjRg$XsakFRHUiP9FMSCP! z-m|jMKdI)je*txi%l{X!|0kZ9;r3&%mw6EJKXt`YQqss+fNK{mX&?QT_o;E<}>VEVK^aiwK&V(C` zT0u&E^KbZp!~u`Cos}tme9K`dZ{$X~4leTPWXb$UeONSMz;U|Ie&de6rBU~|R`1P3 zEe)hB8rQW5hu}Du2`M7x*@PrOuP*mdtq_)7Po!5{f}h1m#0g_=|dTPA#D$n zSu?=zW#@6dTM6H*krKU_L##nzw`C)sdofu;XrI>dTZC+LIkEL^v$szTUox3n@^8+En#nb*N?RW(^%c= zL2i|)|B5wcv188~m1u*h^xC*Ll$mq_?s(30XSDH!Cb%llZa46LKZ!dW%i#I%!9=Ut z;1{Z#Dhz_;FpZ@4`51?f#>9L9HWMfuq194l_a7ri_o1zEk6Ba@jtj}`zt2Qb-Pu16 zOwOky8(I4pZNt?VBhtr4M&Zn=Nk*CV0ElV?Nx*XuIbz+o=<)Hg`qilQAw!0Ug9;R-vbpk0s9$n9)t~CIlN;!|H*weeZ4IdR`MvwV$_yN>{Baysg+O#iU9OP5;!@p^ zcehS`%bGG9(60lr-i^G^ODTQpp0`D?U|{$XTw3$7Kcsg@{aY;|)T~3u@vvkV(}pfl zd1t~aLNU?vqE|;UrikiYMO=EWAsk6&tf;k>&iD|!(**e^Mv*PpUQ4G1B zL@Q=Ad+-TM$vygr^_zSzj{iP;&&eWOg8uYT!`JocRqV4TepVijf^F*pqEES1T_Skg zTt%l$+wE)6X%3D#rQs_VS@!~6&bvmEjp1}K4}|L#E@pq0Bu2H7=rxi$?m$Yw(TD9c zvZ8dUgx)@24rzZN6ACa)ZXYo~5x+*oAuq)uyA#h5C1Rg-WLvW@UQBE4KK%MvfUQl| zuJ7W~pLXWr?8bmukZT-&Sd|spdpRea)Qmsuf;cj`KdRsMFai)!%HChB{96xBJKR%| zA+i=YR;@gzIkbIr{Lu8s_G8Wq;^mXuxic*XBIP8}X#2h?MrodR!{=V}2 z-E!*$gNr(eO`~z^D7qDM_On5w zo?Ul^dyeSVFw|;CO|V4D&p{>oV(L$CvhD~FognU?G?Z-K%l`nbaM4W|Zc1ruA4UhS zCI@p#I-CQI;fk9wp%n7ninY)!3~cQK--a!CQyBoYzKN9qWx*4Pk}x14S}M1;6>AY_ zBSYz0Z`^(kno^f0Ak?Yil<_B5g7t13&CSnm9Lp$v(Ur~LIz$qT3;~5L0Oh>nveN6= z1ps3&@=ny5xx6&DoBO|_qMf1LWA*)%p{ z<5nTZAE8}FqzUi2Y*&r6AEDej_wt!q`h{Nw`O_7Nk=xrq$ZYNEI`6f-NvT>b`Q6pZ zk|Rfab3I#^4*9GI@~j2bd}Aw*?WjYIY^Zj18n)S5omJa(@yqSw_!h>R-Vzvs5+1-p83_NxJK z7eV!=kFH&=3yO}^4j0&0-+OR;0O4z-j36=U8m&9+==Mo|{ znLx2$NlrNg$q_C* zqZ6q%EcSJJ!oUWVclS$7u0-J!TTIXnp+f=(eGX^%Z~|y^DnTD}!|O#BeKK=1#kje` zD8N9kH;MyHUF|3-w|j3}=YVUW;Sl@7Z0&_NPm?yvj}}@dvmGW6vFvB zna3CL8Mdxx>uEG-e+2v$vIdWJbVrq}#6@8gEl`=4Eu__xVneIzr`wR>7s*)*w; z#&4C@JncP$;M=1r4X(k4*7`3SoRa|)Wm%uyd|V zl{MC9Nt0V&0Q4d_jMA$i&3LRjBXg$LR;oYRa$s1SMfu?D_NAFRqAx7t56=w6q-wH4 zPol7B_w;xc`{VbfLqp?Db|Xo?;0(g{kLL*eu-M6)We73QePq#<8Ee7yV1hp2yo6{akgho(I&5`Fd;-z+9mZaB%IqsWIyYv6BzIQ_rPs!Zm zyVRUVnD(2gbFy5o@@_|(7T!7TPZ6A8+*35rnpUQ7fA~S{tp$7a-Ehqq_=yIy^}J+F z3R?a3=)-R_@Yj6&9+yHFz~@bLO{v%eT)>O(+X@P;Dk(&zK(=-Ss=xlz05z^(71xIA z6myf7Mdm@suM9D;u|dO4=3^NVXv{rQ;ze%*)3UtH~{ zvuo`4Xc!4jx1#SK+u)Sc0na*?;iTT7+~SzACY{aANb}pNSijxdePZ=PJ6E}>qCzL( zxZYjO65})TB%+(=r45?-yeSl_4Vpi-G1Off^qbxxh>JpN Y%iHq)$ literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P129_EventConfiguration.png b/docs/source/Plugin/P129_EventConfiguration.png new file mode 100644 index 0000000000000000000000000000000000000000..32d3de0d1ea2122370b9b83e2806d4f11be272f2 GIT binary patch literal 19999 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P129_SampleFrequencyOptions.png b/docs/source/Plugin/P129_SampleFrequencyOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..5b94ce7fafd9c5ec1c55c43854e8488763b1a8db GIT binary patch literal 12036 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P129_ValuesBin.png b/docs/source/Plugin/P129_ValuesBin.png new file mode 100644 index 0000000000000000000000000000000000000000..e022307d68aa6f9c1c0ef7067d8848ffac4881e9 GIT binary patch literal 8171 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 CRqJa2 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P129_ValuesBinChip.png b/docs/source/Plugin/P129_ValuesBinChip.png new file mode 100644 index 0000000000000000000000000000000000000000..b4750d851a0181aff98dfe4532b2aa527863853f GIT binary patch literal 21827 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 Zn@my2#`3HbQZ&PbdJ<`dc%tt>_z#Bvo2LK( literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P129_ValuesHex.png b/docs/source/Plugin/P129_ValuesHex.png new file mode 100644 index 0000000000000000000000000000000000000000..95d7e1ea7a254da191b589a674e1ceb7f0d49307 GIT binary patch literal 5665 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 i;P2Z>^T;3jhemV1CJe28ZUl,<0|1>`` + "," + | Enables or disables an event to be generated for the pin. Is updated in the configuration, but not saved. + " + " + | ``ShiftIn,ChipEvent,,<0|1>`` + "," + | Enables or disables an event to be generated for all pins of the selected chip. Is updated in the configuration, but not saved. + " + " + | ``ShiftIn,SetChipCount,`` + "," + | Set the number of chips connected together. Is updated in the configuration, but not saved. + " + " + | ``ShiftIn,SampleFrequency,<0}1>`` + "," + | Select the sample frequency, 0 = 10/sec, 1 = 50/sec. + " + " + | ``ShiftIn,EventPerPin,<0|1>`` + "," + | Set or reset the ``Separate event per pin`` option. Is updated in the configuration, but not saved. + " diff --git a/docs/source/Plugin/_Plugin.rst b/docs/source/Plugin/_Plugin.rst index e845c5dbf..aa1834de1 100644 --- a/docs/source/Plugin/_Plugin.rst +++ b/docs/source/Plugin/_Plugin.rst @@ -146,6 +146,7 @@ There are different released versions of ESP Easy: ":ref:`P120_page`","|P120_status|","P120" ":ref:`P124_page`","|P124_status|","P124" ":ref:`P125_page`","|P125_status|","P125" + ":ref:`P129_page`","|P129_status|","P129" Internal GPIO handling @@ -243,6 +244,11 @@ Plugins: |Plugin_Hardware| Hardware: |P046_usedby| +Input +----- + +Plugins: |Plugin_Input| + Keypad ------ diff --git a/docs/source/Plugin/_plugin_categories.repl b/docs/source/Plugin/_plugin_categories.repl index 7a7da0699..dde655387 100644 --- a/docs/source/Plugin/_plugin_categories.repl +++ b/docs/source/Plugin/_plugin_categories.repl @@ -14,6 +14,7 @@ .. |Plugin_Gesture| replace:: :ref:`P064_page` .. |Plugin_Gyro| replace:: :ref:`P045_page`, :ref:`P119_page` .. |Plugin_Hardware| replace:: :ref:`P046_page` +.. |Plugin_Input| replace:: :ref:`P129_page` .. |Plugin_Keypad| replace:: :ref:`P058_page`, :ref:`P061_page`, :ref:`P062_page`, :ref:`P063_page` .. |Plugin_Light_Color| replace:: :ref:`P050_page`, :ref:`P066_page` .. |Plugin_Light_UV| replace:: :ref:`P084_page`, :ref:`P107_page`, :ref:`P114_page` diff --git a/docs/source/Plugin/_plugin_substitutions_p12x.repl b/docs/source/Plugin/_plugin_substitutions_p12x.repl index 809291cbd..b0dc96cb8 100644 --- a/docs/source/Plugin/_plugin_substitutions_p12x.repl +++ b/docs/source/Plugin/_plugin_substitutions_p12x.repl @@ -50,3 +50,16 @@ .. |P125_compileinfo| replace:: `.` .. |P125_usedlibraries| replace:: `https://github.com/sparkfun/SparkFun_ADXL345_Arduino_Library (local copy)` +.. |P129_name| replace:: :cyan:`Shift registers (74HC165)` +.. |P129_type| replace:: :cyan:`Input` +.. |P129_typename| replace:: :cyan:`Input - Shift registers (74HC165)` +.. |P129_porttype| replace:: `.` +.. |P129_status| replace:: :yellow:`TESTING E` +.. |P129_github| replace:: P129_74HC165.ino +.. _P129_github: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P129_74HC165.ino +.. |P129_usedby| replace:: `.` +.. |P129_shortinfo| replace:: `Parallel - serial input shift registers` +.. |P129_maintainer| replace:: `tonhuisman` +.. |P129_compileinfo| replace:: `.` +.. |P129_usedlibraries| replace:: `.` + From 90a13497685343696efce4682ea7ee6d5e3b80fa Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Mon, 28 Feb 2022 21:07:43 +0100 Subject: [PATCH 11/89] [P129] Always show formatted output, even when plugin is not active. Rename some arguments --- src/_P129_74HC165.ino | 56 ++++++++++------------ src/src/PluginStructs/P129_data_struct.cpp | 14 +++--- src/src/PluginStructs/P129_data_struct.h | 4 +- 3 files changed, 33 insertions(+), 41 deletions(-) diff --git a/src/_P129_74HC165.ino b/src/_P129_74HC165.ino index 76b03f320..28cf5d01a 100644 --- a/src/_P129_74HC165.ino +++ b/src/_P129_74HC165.ino @@ -354,45 +354,38 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) } case PLUGIN_FORMAT_USERVAR: { - P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); + string.clear(); - if ((nullptr != P129_data) && P129_data->isInitialized()) { // Only fill if plugin is active - string.clear(); - - if ((P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_BOTH) || - (P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_DEC_ONLY)) { - string += String(UserVar.getUint32(event->TaskIndex, event->idx)); - } - - if (P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_BOTH) { - string += ','; - } - - if ((P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_BOTH) || - (P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_HEXBIN)) { - string += '0'; - string += (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? 'b' : 'x'); - string += P129_ul2stringFixed(UserVar.getUint32(event->TaskIndex, event->idx), - # ifdef P129_SHOW_VALUES - (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? BIN : - # endif // ifdef P129_SHOW_VALUES - HEX - # ifdef P129_SHOW_VALUES - ) - # endif // ifdef P129_SHOW_VALUES - ); - } - success = true; + if ((P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_BOTH) || + (P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_DEC_ONLY)) { + string += String(UserVar.getUint32(event->TaskIndex, event->idx)); } + + if (P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_BOTH) { + string += ','; + } + + if ((P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_BOTH) || + (P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION == P129_OUTPUT_HEXBIN)) { + string += '0'; + string += (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? 'b' : 'x'); + string += P129_ul2stringFixed(UserVar.getUint32(event->TaskIndex, event->idx), + # ifdef P129_SHOW_VALUES + (P129_CONFIG_FLAGS_GET_VALUES_DISPLAY ? BIN : + # endif // ifdef P129_SHOW_VALUES + HEX + # ifdef P129_SHOW_VALUES + ) + # endif // ifdef P129_SHOW_VALUES + ); + } + success = true; break; } # ifdef P129_SHOW_VALUES case PLUGIN_WEBFORM_SHOW_VALUES: { - // P129_data_struct *P129_data = static_cast(getPluginTaskData(event->TaskIndex)); - - // if ((nullptr != P129_data) && P129_data->isInitialized()) { // Only show if plugin is active String state, label; state.reserve(40); String abcd = F("ABCDEFGH"); // In case anyone dares to extend VARS_PER_TASK to 8... @@ -431,7 +424,6 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) } } success = true; // Don't show the default value data - // } break; } # endif // ifdef P129_SHOW_VALUES diff --git a/src/src/PluginStructs/P129_data_struct.cpp b/src/src/PluginStructs/P129_data_struct.cpp index 76918377b..552ffae18 100644 --- a/src/src/PluginStructs/P129_data_struct.cpp +++ b/src/src/PluginStructs/P129_data_struct.cpp @@ -20,7 +20,7 @@ P129_data_struct::~P129_data_struct() {} bool P129_data_struct::plugin_init(struct EventStruct *event) { if (isInitialized()) { for (uint8_t i = 0; i < P129_MAX_CHIP_COUNT; i++) { // Clear entire buffer - readBuffer[i] = 0xFF; // FIXME temporary set all bits ON for testing... was: 0; + readBuffer[i] = 0; } // Prepare all used GPIO pins @@ -198,7 +198,7 @@ void P129_data_struct::checkDiff(struct EventStruct *event) { for (uint8_t i = 0; i < P129_CONFIG_CHIP_COUNT; i += 4) { const uint32_t bits = PCONFIG_LONG(i / 4); - if (bits != 0) { + if (bits != 0) { // Any input event enabled? const uint32_t read = readBuffer[i + 3] << 24 | readBuffer[i + 2] << 16 | readBuffer[i + 1] << 8 | readBuffer[i + 0]; const uint32_t prev = prevBuffer[i + 3] << 24 | prevBuffer[i + 2] << 16 | prevBuffer[i + 1] << 8 | prevBuffer[i + 0]; @@ -213,13 +213,13 @@ void P129_data_struct::checkDiff(struct EventStruct *event) { } void P129_data_struct::sendInputEvent(struct EventStruct *event, - uint8_t i, - uint8_t j, + uint8_t group, + uint8_t bit, uint8_t state) { String send; - uint8_t pin = (i * 8) + j + 1; // 1..128 - uint8_t chip = i + (j / 8) + 1; // 1..16 - uint8_t port = (j % 8); // 0..7 + uint8_t pin = (group * 8) + bit + 1; // 1..128 + uint8_t chip = group + (bit / 8) + 1; // 1..16 + uint8_t port = (bit % 8); // 0..7 send.reserve(40); send += getTaskDeviceName(event->TaskIndex); diff --git a/src/src/PluginStructs/P129_data_struct.h b/src/src/PluginStructs/P129_data_struct.h index 68c8caaab..cfebc68b4 100644 --- a/src/src/PluginStructs/P129_data_struct.h +++ b/src/src/PluginStructs/P129_data_struct.h @@ -87,8 +87,8 @@ private: void checkDiff(struct EventStruct *event); void sendInputEvent(struct EventStruct *event, - uint8_t i, - uint8_t j, + uint8_t group, + uint8_t bit, uint8_t state); From 210c5df6d37ac1596ab2c68c40913ede29b58221 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 1 Apr 2022 22:18:04 +0200 Subject: [PATCH 12/89] [P131] Add plugin Display - NeoPixel Matrix --- platformio_esp32_envs.ini | 2 +- platformio_esp82xx_base.ini | 2 +- src/Custom-sample.h | 1 + src/_P131_NeoPixelMatrix.ino | 456 +++++++++++++++++++++ src/src/CustomBuild/define_plugin_sets.h | 5 +- src/src/PluginStructs/P131_data_struct.cpp | 341 +++++++++++++++ src/src/PluginStructs/P131_data_struct.h | 162 ++++++++ tools/pio/copy_files.py | 2 +- 8 files changed, 967 insertions(+), 4 deletions(-) create mode 100644 src/_P131_NeoPixelMatrix.ino create mode 100644 src/src/PluginStructs/P131_data_struct.cpp create mode 100644 src/src/PluginStructs/P131_data_struct.h diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index a6fe33ec8..ab3dd4952 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -11,7 +11,7 @@ lib_ignore = ESP8266WiFi, ESP8266Ping, ESP8266WebServer, ESP8266H [esp32_common] extends = common, core_esp32_3_3_2 platform = ${core_esp32_3_3_2.platform} -lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, adafruit/Adafruit ILI9341 @ ^1.5.6, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ArduinoOTA, ESP32HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate +lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, adafruit/Adafruit ILI9341 @ ^1.5.6, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ArduinoOTA, ESP32HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate, Adafruit NeoMatrix lib_ignore = ${esp32_always.lib_ignore}, ESP32_ping, IRremoteESP8266, HeatpumpIR board_build.f_flash = 80000000L board_build.flash_mode = dout diff --git a/platformio_esp82xx_base.ini b/platformio_esp82xx_base.ini index 7c16053ce..ac0cb56be 100644 --- a/platformio_esp82xx_base.ini +++ b/platformio_esp82xx_base.ini @@ -49,7 +49,7 @@ board_build.f_cpu = 80000000L build_flags = ${debug_flags.build_flags} ${mqtt_flags.build_flags} -DHTTPCLIENT_1_1_COMPATIBLE=0 build_unflags = -DDEBUG_ESP_PORT -fexceptions -lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, ESP8266WebServer, adafruit/Adafruit ILI9341 @ ^1.5.6, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, bblanchon/ArduinoJson @ ^6.17.2, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/RABurton ESP8266 Mutex @ ^1.0.2, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ESP8266HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate +lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, ESP8266WebServer, adafruit/Adafruit ILI9341 @ ^1.5.6, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, bblanchon/ArduinoJson @ ^6.17.2, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/RABurton ESP8266 Mutex @ ^1.0.2, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ESP8266HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate, Adafruit NeoMatrix lib_ignore = ${esp82xx_defaults.lib_ignore}, IRremoteESP8266, HeatpumpIR, LittleFS(esp8266), ServoESP32, TinyWireM board = esp12e monitor_filters = esp8266_exception_decoder diff --git a/src/Custom-sample.h b/src/Custom-sample.h index 4a8f2b1ba..e2c27c861 100644 --- a/src/Custom-sample.h +++ b/src/Custom-sample.h @@ -389,6 +389,7 @@ static const char DATA_ESPEASY_DEFAULT_MIN_CSS[] PROGMEM = { // #define USES_P125 // ADXL345 SPI Acceleration / Gravity // #define USES_P126 // 74HC595 Shift register // #define USES_P127 // CDM7160 +// #define USES_P131 // NeoMatrix // Special plugins needing IR library diff --git a/src/_P131_NeoPixelMatrix.ino b/src/_P131_NeoPixelMatrix.ino new file mode 100644 index 000000000..17b150f40 --- /dev/null +++ b/src/_P131_NeoPixelMatrix.ino @@ -0,0 +1,456 @@ +#include "_Plugin_Helper.h" + +#ifdef USES_P131 + +// ####################################################################################################### +// ########################### Plugin 131 NeoPixel Matrix display ######################################## +// ####################################################################################################### + +/** Changelog: + * 2022-03-16 tonhuisman: Add textmode option, start scrolling implementation + * 2022-03-12 tonhuisman: Add Max. Brightness setting. Bugfixing. + * 2022-03-11 tonhuisman: Add Initial Brightness setting + * 2022-03-05 tonhuisman: Initial plugin development. + * Forum request: https://www.letscontrolit.com/forum/viewtopic.php?p=38095&hilit=matrix#p38095 + */ + +# define PLUGIN_131 +# define PLUGIN_ID_131 131 +# define PLUGIN_NAME_131 "Display - NeoPixel Matrix [TESTING]" + +# include "./src/PluginStructs/P131_data_struct.h" + +/****************************************** + * enquoteString wrap in ", ' or ` unless all 3 quote types are used + *****************************************/ +String P131enquoteString(const String& input) { + char quoteChar = '"'; + + if (input.indexOf(quoteChar) > -1) { + quoteChar = '\''; + + if (input.indexOf(quoteChar) > -1) { + quoteChar = '`'; + + if (input.indexOf(quoteChar) > -1) { + return input; // All types of supported quotes used, return original string + } + } + } + String result; + + result.reserve(input.length() + 2); + result = quoteChar; + result += input; + result += quoteChar; + + return result; +} + +boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) +{ + boolean success = false; + + switch (function) + { + case PLUGIN_DEVICE_ADD: + { + Device[++deviceCount].Number = PLUGIN_ID_131; + Device[deviceCount].Type = DEVICE_TYPE_SINGLE; + Device[deviceCount].VType = Sensor_VType::SENSOR_TYPE_NONE; + Device[deviceCount].Ports = 0; + Device[deviceCount].PullUpOption = false; + Device[deviceCount].InverseLogicOption = false; + Device[deviceCount].FormulaOption = false; + Device[deviceCount].ValueCount = 0; + Device[deviceCount].SendDataOption = false; + Device[deviceCount].TimerOption = true; + Device[deviceCount].TimerOptional = true; + + break; + } + + case PLUGIN_GET_DEVICENAME: + { + string = F(PLUGIN_NAME_131); + break; + } + + case PLUGIN_SET_DEFAULTS: + { + P131_CONFIG_MATRIX_WIDTH = 8; // Default matrix width + P131_CONFIG_MATRIX_HEIGHT = 8; // Default matrix height + P131_CONFIG_TILE_WIDTH = 1; // Default tile width + P131_CONFIG_TILE_HEIGHT = 1; // Default tile height + + uint32_t lSettings = 0; + set8BitToUL(lSettings, P131_FLAGS_MATRIX_TYPE, NEO_MATRIX_TOP | NEO_MATRIX_LEFT | NEO_MATRIX_ROWS | NEO_MATRIX_PROGRESSIVE); + set8BitToUL(lSettings, P131_FLAGS_TILE_TYPE, NEO_TILE_TOP | NEO_TILE_LEFT | NEO_TILE_ROWS | NEO_TILE_PROGRESSIVE); + P131_CONFIG_FLAGS = lSettings; + + lSettings = 0; + set8BitToUL(lSettings, P131_CONFIG_FLAG_B_BRIGHTNESS, 40); // Default brightness + set8BitToUL(lSettings, P131_CONFIG_FLAG_B_MAXBRIGHT, 255); // Default max brightness + P131_CONFIG_FLAGS_B = lSettings; + + P131_CONFIG_COLORS = ADAGFX_WHITE | (ADAGFX_BLACK << 16); + + break; + } + + case PLUGIN_GET_DEVICEGPIONAMES: { + event->String1 = formatGpioName_output(F("DIN")); + break; + } + + case PLUGIN_WEBFORM_LOAD: + { + { + const __FlashStringHelper *stripOptions[] = { F("GRB"), F("GRBW") }; // Selection copied from P038 + int stripIndices[] = { 0, 1 }; + addFormSelector(F("Strip Type"), F("p131_strip"), 2, stripOptions, stripIndices, P131_CONFIG_FLAGS_GET_STRIP_TYPE); + } + + { + const __FlashStringHelper *optionsTop[] = { + F("Top/Left"), + F("Top/Right"), + F("Bottom/Left"), + F("Bottom/Right") }; + int optionValuesTop[] { 0, 2, 1, 3 }; + + const __FlashStringHelper *optionsRowCol[] = { + F("Rows"), + F("Columns") }; + int optionValuesRowCol[] { 0, 1 }; + + const __FlashStringHelper *optionsProZig[] = { + F("Progressive"), + F("Zigzag") }; + int optionValuesProZig[] { 0, 1 }; + + addFormSubHeader(F("Matrix")); + + addFormNumericBox(F("Matrix width"), F("p131_matrixwidth"), + P131_CONFIG_MATRIX_WIDTH, 1, 100); + addFormNumericBox(F("Matrix height"), F("p131_matrixheight"), + P131_CONFIG_MATRIX_HEIGHT, 1, 100); + + addFormSelector(F("Matrix start-pixel"), F("p131_matrixstart"), 4, optionsTop, optionValuesTop, + get2BitFromUL(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE_TOP)); + + addFormSelector(F("Matrix Rows/Columns mode"), F("p131_matrixrowcol"), 2, optionsRowCol, optionValuesRowCol, + bitRead(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE_RC)); + + addFormSelector(F("Matrix flow direction"), F("p131_matrixprozig"), 2, optionsProZig, optionValuesProZig, + bitRead(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE_PZ)); + + addFormSubHeader(F("Multiple matrices: Tiles")); + + addFormNumericBox(F("Tile matrix width"), F("p131_tilewidth"), + P131_CONFIG_TILE_WIDTH, 1, 32); + addFormNumericBox(F("Tile matrix height"), F("p131_tileheight"), + P131_CONFIG_TILE_HEIGHT, 1, P131_Nlines); + + addFormSelector(F("Tile start-matrix"), F("p131_tilestart"), 4, optionsTop, optionValuesTop, + get2BitFromUL(P131_CONFIG_FLAGS, P131_FLAGS_TILE_TYPE_TOP)); + + addFormSelector(F("Tile Rows/Columns mode"), F("p131_tilerowcol"), 2, optionsRowCol, optionValuesRowCol, + bitRead(P131_CONFIG_FLAGS, P131_FLAGS_TILE_TYPE_RC)); + + addFormSelector(F("Tile flow direction"), F("p131_tileprozig"), 2, optionsProZig, optionValuesProZig, + bitRead(P131_CONFIG_FLAGS, P131_FLAGS_TILE_TYPE_PZ)); + } + + addFormSubHeader(F("Display")); + + AdaGFXFormRotation(F("p131_rotate"), P131_CONFIG_FLAG_GET_ROTATION); + + AdaGFXFormTextPrintMode(F("p131_mode"), P131_CONFIG_FLAG_GET_MODE); + + if ((P131_CONFIG_FLAG_GET_MAXBRIGHT == 0) && (P131_CONFIG_FLAG_GET_BRIGHTNESS == 0)) { // TODO TO BE REMOVED! + uint32_t lSettings = 0; + set8BitToUL(lSettings, P131_CONFIG_FLAG_B_BRIGHTNESS, P131_CONFIG_BRIGHTNESS_OLD); + set8BitToUL(lSettings, P131_CONFIG_FLAG_B_MAXBRIGHT, 255); + P131_CONFIG_FLAGS_B = lSettings; + } + addFormNumericBox(F("Initial brightness"), F("p131_brightness"), P131_CONFIG_FLAG_GET_BRIGHTNESS, 0, 255); + addUnit(F("0..255")); + addFormNumericBox(F("Maximum allowed brightness"), F("p131_maxbright"), P131_CONFIG_FLAG_GET_MAXBRIGHT, 1, 255); + addUnit(F("1..255")); + + AdaGFXFormFontScaling(F("p131_fontscale"), P131_CONFIG_FLAG_GET_FONTSCALE, 4); + + addFormCheckBox(F("Clear display on exit"), F("p131_clearOnExit"), bitRead(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_CLEAR_ON_EXIT)); + + { + const __FlashStringHelper *commandTriggers[] = { // Be sure to use all options available in the enum (except MAX)! + P131_CommandTrigger_toString(P131_CommandTrigger::neomatrix), + P131_CommandTrigger_toString(P131_CommandTrigger::neo) + }; + const int commandTriggerOptions[] = { + static_cast(P131_CommandTrigger::neomatrix), + static_cast(P131_CommandTrigger::neo) + }; + addFormSelector(F("Write Command trigger"), + F("p131_commandtrigger"), + static_cast(P131_CommandTrigger::MAX), + commandTriggers, + commandTriggerOptions, + P131_CONFIG_FLAG_GET_CMD_TRIGGER); + addFormNote(F("Select the command that is used to handle commands for this display.")); + } + + addFormSubHeader(F("Content")); + + AdaGFXFormForeAndBackColors(F("p131_foregroundcolor"), + P131_CONFIG_GET_COLOR_FOREGROUND, + F("p131_backgroundcolor"), + P131_CONFIG_GET_COLOR_BACKGROUND); + + { + String strings[P131_Nlines]; + LoadCustomTaskSettings(event->TaskIndex, strings, P131_Nlines, 0); + + String line; // Default reserved length is plenty + uint16_t remain = DAT_TASKS_CUSTOM_SIZE; + + addFormSubHeader(F("Lines")); + addRowLabel(F("Lines")); + + html_table(EMPTY_STRING); // Sub-table + html_table_header(F("Line # ")); + html_table_header(F("Text")); + html_table_header(F("Scroll")); + html_table_header(F("Right")); + html_table_header(F("/Pixel")); + html_table_header(F("Speed")); + + for (uint8_t varNr = 0; varNr < P131_CONFIG_TILE_HEIGHT; varNr++) { + html_TR_TD(); // All columns use max. width available + addHtml(F(" ")); + addHtmlInt(varNr + 1); + + // line = F("Line "); + // line += (varNr + 1); + html_TD(); // Text + addTextBox(getPluginCustomArgName(varNr), + parseStringKeepCase(strings[varNr], 1), + P131_Nchars, + false, + false, + EMPTY_STRING, + EMPTY_STRING); + + String opts = parseString(strings[varNr], 2); + int optBits = 0; + validIntFromString(opts, optBits); + + html_TD(); // Scroll + addCheckBox(getPluginCustomArgName(varNr + 100), bitRead(optBits, P131_OPTBITS_SCROLL) == 1, false + # ifdef ENABLE_TOOLTIPS + , F("Scroll text if length > display-width") + # endif // ifdef ENABLE_TOOLTIPS + ); + html_TD(); // Scroll from right + addCheckBox(getPluginCustomArgName(varNr + 200), bitRead(optBits, P131_OPTBITS_RIGHTSCROLL) == 1, false + # ifdef ENABLE_TOOLTIPS + , F("Scroll in from right") + # endif // ifdef ENABLE_TOOLTIPS + ); + html_TD(); // Scroll per character or per pixel + addCheckBox(getPluginCustomArgName(varNr + 300), bitRead(optBits, P131_OPTBITS_PIXELSCROLL) == 1, false + # ifdef ENABLE_TOOLTIPS + , F("Scroll per pixel") + # endif // ifdef ENABLE_TOOLTIPS + ); + + opts = parseString(strings[varNr], 3); + int scrollSpeed = 0; + validIntFromString(opts, scrollSpeed); + + if (scrollSpeed == 0) { scrollSpeed = 10; } + html_TD(); // Speed 0.1 steps per second + addNumericBox(getPluginCustomArgName(varNr + 400), scrollSpeed, 1, 600 + # ifdef ENABLE_TOOLTIPS + , F(""), F("Scroll-speed in 0.1 steps / second.") + # endif // ifdef ENABLE_TOOLTIPS + ); + + remain -= (strings[varNr].length() + 1); + + if ((P131_CONFIG_TILE_HEIGHT > 1) && (varNr == P131_CONFIG_TILE_HEIGHT - 1)) { + String remainStr; + remainStr.reserve(15); + remainStr = F("Remaining: "); + remainStr += remain; + html_TD(); + addUnit(remainStr); + } + } + html_end_table(); + } + + success = true; + break; + } + + case PLUGIN_WEBFORM_SAVE: + { + const uint8_t prevLines = P131_CONFIG_TILE_HEIGHT; + P131_CONFIG_MATRIX_WIDTH = getFormItemInt(F("p131_matrixwidth")); + P131_CONFIG_MATRIX_HEIGHT = getFormItemInt(F("p131_matrixheight")); + P131_CONFIG_TILE_WIDTH = getFormItemInt(F("p131_tilewidth")); + P131_CONFIG_TILE_HEIGHT = getFormItemInt(F("p131_tileheight")); + + uint32_t lSettings = 0; + + // Bits are already in the correct order/configuration to be passed on to the constructor + // Matrix bits + set2BitToUL(lSettings, P131_FLAGS_MATRIX_TYPE_TOP, getFormItemInt(F("p131_matrixstart")) & 0x03); + bitWrite(lSettings, P131_FLAGS_MATRIX_TYPE_RC, getFormItemInt(F("p131_matrixrowcol"))); + bitWrite(lSettings, P131_FLAGS_MATRIX_TYPE_PZ, getFormItemInt(F("p131_matrixprozig"))); + + // Tile bits + set2BitToUL(lSettings, P131_FLAGS_TILE_TYPE_TOP, getFormItemInt(F("p131_tilestart")) & 0x03); + bitWrite(lSettings, P131_FLAGS_TILE_TYPE_RC, getFormItemInt(F("p131_tilerowcol"))); + bitWrite(lSettings, P131_FLAGS_TILE_TYPE_PZ, getFormItemInt(F("p131_tileprozig"))); + + // Other settings + set4BitToUL(lSettings, P131_CONFIG_FLAG_MODE, getFormItemInt(F("p131_mode"))); + set4BitToUL(lSettings, P131_CONFIG_FLAG_ROTATION, getFormItemInt(F("p131_rotate"))); + set4BitToUL(lSettings, P131_CONFIG_FLAG_FONTSCALE, getFormItemInt(F("p131_fontscale"))); + set4BitToUL(lSettings, P131_CONFIG_FLAG_CMD_TRIGGER, getFormItemInt(F("p131_commandtrigger"))); + + bitWrite(lSettings, P131_CONFIG_FLAG_CLEAR_ON_EXIT, isFormItemChecked(F("p131_clearOnExit"))); + bitWrite(lSettings, P131_CONFIG_FLAG_STRIP_TYPE, getFormItemInt(F("p131_strip")) == 1); + + P131_CONFIG_FLAGS = lSettings; + + lSettings = 0; + set8BitToUL(lSettings, P131_CONFIG_FLAG_B_BRIGHTNESS, getFormItemInt(F("p131_brightness"))); + set8BitToUL(lSettings, P131_CONFIG_FLAG_B_MAXBRIGHT, getFormItemInt(F("p131_maxbright"))); + P131_CONFIG_FLAGS_B = lSettings; + + String color = web_server.arg(F("p131_foregroundcolor")); + uint16_t fgcolor = ADAGFX_WHITE; // Default to white when empty + + if (!color.isEmpty()) { + fgcolor = AdaGFXparseColor(color); // Reduce to rgb565 + } + color = web_server.arg(F("p131_backgroundcolor")); + const uint16_t bgcolor = AdaGFXparseColor(color); + + P131_CONFIG_COLORS = fgcolor | (bgcolor << 16); // Store as a single setting + + String strings[P131_Nlines]; + String error; + error.reserve(70); + + for (uint8_t varNr = 0; varNr < prevLines; varNr++) { + error.clear(); + error += P131enquoteString(web_server.arg(getPluginCustomArgName(varNr))); + error += ','; + uint32_t optBits = 0; + bitWrite(optBits, P131_OPTBITS_SCROLL, isFormItemChecked(getPluginCustomArgName(varNr + 100))); + bitWrite(optBits, P131_OPTBITS_RIGHTSCROLL, isFormItemChecked(getPluginCustomArgName(varNr + 200))); + bitWrite(optBits, P131_OPTBITS_PIXELSCROLL, isFormItemChecked(getPluginCustomArgName(varNr + 300))); + error += optBits; + error += ','; + error += getFormItemInt(getPluginCustomArgName(varNr + 400)); + strings[varNr] = error; + } + error.clear(); + + error += SaveCustomTaskSettings(event->TaskIndex, strings, P131_Nlines, 0); + + if (error.length() > 0) { + addHtmlError(error); + } + + success = true; + break; + } + + case PLUGIN_INIT: + { + if (PIN(0) != -1) { + String log = F("neomatrix: INIT, matrixType: 0b"); + log += String(P131_CONFIG_FLAGS_GET_MATRIX_TYPE, BIN); + addLogMove(LOG_LEVEL_INFO, log); + initPluginTaskData(event->TaskIndex, new (std::nothrow) P131_data_struct(P131_CONFIG_MATRIX_WIDTH, + P131_CONFIG_MATRIX_HEIGHT, + P131_CONFIG_TILE_WIDTH, + P131_CONFIG_TILE_HEIGHT, + PIN(0), + P131_CONFIG_FLAGS_GET_MATRIX_TYPE, + P131_CONFIG_FLAGS_GET_STRIP_TYPE + ? NEO_GRBW + NEO_KHZ800 + : NEO_GRB + NEO_KHZ800, + P131_CONFIG_FLAG_GET_ROTATION, + P131_CONFIG_FLAG_GET_FONTSCALE, + static_cast(P131_CONFIG_FLAG_GET_MODE), + P131_CommandTrigger_toString(static_cast( + P131_CONFIG_FLAG_GET_CMD_TRIGGER)), + P131_CONFIG_FLAG_GET_BRIGHTNESS, + P131_CONFIG_FLAG_GET_MAXBRIGHT, + P131_CONFIG_GET_COLOR_FOREGROUND, + P131_CONFIG_GET_COLOR_BACKGROUND)); + P131_data_struct *P131_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P131_data) { + success = P131_data->plugin_init(event); // Start the display + } + } else { + addLog(LOG_LEVEL_ERROR, F("NEOMATRIX: No GPIO pin configured, init cancelled.")); + } + + break; + } + + case PLUGIN_EXIT: + { + P131_data_struct *P131_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P131_data) { + success = P131_data->plugin_exit(event); + } + break; + } + + case PLUGIN_READ: + { + P131_data_struct *P131_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P131_data) { + success = P131_data->plugin_read(event); // Read operation, redisplay the configured content + } + break; + } + + case PLUGIN_WRITE: + { + P131_data_struct *P131_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P131_data) { + success = P131_data->plugin_write(event, string); // Write operation, handle commands, mostly delegated to AdafruitGFX_helper + } + + break; + } + + case PLUGIN_TEN_PER_SECOND: + { + P131_data_struct *P131_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P131_data) { + success = P131_data->plugin_ten_per_second(event); // 10 per second operation, update scrolling + } + + break; + } + } + return success; +} + +#endif // ifdef USES_P131 diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index d53ebe693..3a11ad605 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -1283,6 +1283,9 @@ To create/register a plugin, you have to : #ifndef USES_P116 #define USES_P116 // ST77xx #endif + #ifndef USES_P131 + #define USES_P131 // NeoMatrix + #endif #endif @@ -1594,7 +1597,7 @@ To create/register a plugin, you have to : #define DISABLE_SOFTWARE_SERIAL #endif -#if defined(USES_P095) || defined(USES_P096) || defined(USES_P116) +#if defined(USES_P095) || defined(USES_P096) || defined(USES_P116) || defined(USES_P131) // Add any plugin that uses AdafruitGFX_Helper #ifndef PLUGIN_USES_ADAFRUITGFX #define PLUGIN_USES_ADAFRUITGFX // Ensure AdafruitGFX_helper is available for graphics displays (only) #endif diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp new file mode 100644 index 000000000..9168fcb30 --- /dev/null +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -0,0 +1,341 @@ +#include "../PluginStructs/P131_data_struct.h" + +#ifdef USES_P131 +# include "../Helpers/AdafruitGFX_helper.h" // Use Adafruit graphics helper object + +/**************************************************************************** + * P131_CommandTrigger_toString: return the command string selected + ***************************************************************************/ +const __FlashStringHelper* P131_CommandTrigger_toString(P131_CommandTrigger cmd) { + switch (cmd) { + case P131_CommandTrigger::neomatrix: return F("neomatrix"); + case P131_CommandTrigger::neo: return F("neo"); + case P131_CommandTrigger::MAX: break; + } + return F("None"); +} + +// **************************************************************************/ +// Constructor +// **************************************************************************/ +P131_data_struct::P131_data_struct(uint8_t matrixWidth, + uint8_t matrixHeight, + uint8_t tileWidth, + uint8_t tileHeight, + int8_t pin, + uint8_t matrixType, + neoPixelType ledType, + uint8_t rotation, + uint8_t fontscaling, + AdaGFXTextPrintMode textmode, + String commandTrigger, + uint8_t brightness, + uint8_t maxbright, + uint16_t fgcolor, + uint16_t bgcolor) + : _matrixWidth(matrixWidth), _matrixHeight(matrixHeight), _tileWidth(tileWidth), _tileHeight(tileHeight), + _pin(pin), _matrixType(matrixType), _ledType(ledType), _rotation(rotation), _fontscaling(fontscaling), _textmode(textmode), + _commandTrigger(commandTrigger), _brightness(brightness), _maxbright(maxbright), _fgcolor(fgcolor), _bgcolor(bgcolor) { + updateFontMetrics(); + + _commandTrigger.toLowerCase(); + _commandTriggerCmd = _commandTrigger; + _commandTriggerCmd += F("cmd"); +} + +// **************************************************************************/ +// Destructor +// **************************************************************************/ +P131_data_struct::~P131_data_struct() { + if (isInitialized()) { + delete matrix; + matrix = nullptr; + } +} + +/**************************************************************************** + * plugin_init: Initialize display + ***************************************************************************/ +bool P131_data_struct::plugin_init(struct EventStruct *event) { + bool success = false; + + if (!isInitialized()) { + addLog(LOG_LEVEL_INFO, F("NEOMATRIX: Init start.")); + matrix = new (std::nothrow) Adafruit_NeoMatrix(_matrixWidth, + _matrixHeight, + _tileWidth, + _tileHeight, + _pin, + _matrixType, + _ledType); + + if (isInitialized()) { + _xpix = matrix->width(); + _ypix = matrix->height(); + } + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + String log; + log.reserve(90); + log += F("NEOMATRIX: Init done, address: 0x"); + log += String(reinterpret_cast(matrix), HEX); + log += ' '; + + if (!isInitialized()) { + log += F("in"); + } + log += F("valid, commands: "); + log += _commandTrigger; + log += '/'; + log += _commandTriggerCmd; + log += F(", size: w:"); + log += _xpix; + log += F(", h:"); + log += _ypix; + addLogMove(LOG_LEVEL_INFO, log); + } + # endif // ifndef BUILD_NO_DEBUG + } else { + addLog(LOG_LEVEL_INFO, F("NEOMATRIX: No init?")); + } + + if (isInitialized()) { + gfxHelper = new (std::nothrow) AdafruitGFX_helper(matrix, + _commandTrigger, + _xpix, + _ypix, + AdaGFXColorDepth::FullColor, + _textmode, + _fontscaling, + _fgcolor, + _bgcolor, + true, + _textBackFill); + + gfxHelper->setRotation(_rotation); + matrix->setBrightness(std::min(_maxbright, _brightness)); // Set brightness, so we don't get blinded by the light + matrix->fillScreen(_bgcolor); // fill screen with black color + + # ifdef P131_SHOW_SPLASH + uint16_t yPos = 0; + gfxHelper->printText(String(F("ESPEasy")).c_str(), 0, yPos, 1, ADAGFX_WHITE, ADAGFX_BLACK); + matrix->show(); + delay(100); // Splash + # endif // ifdef P131_SHOW_SPLASH + + matrix->setTextColor(_fgcolor, _bgcolor); // set text color to white and black background + gfxHelper->setColumnRowMode(false); // Pixel-mode + matrix->setTextSize(_fontscaling); // Handles 0 properly, text size, default 1 = very small + matrix->setCursor(0, 0); // move cursor to position (0, 0) pixel + updateFontMetrics(); + + success = true; + } + return success; +} + +/**************************************************************************** + * plugin_exit: De-initialize before destruction + ***************************************************************************/ +bool P131_data_struct::plugin_exit(struct EventStruct *event) { + addLog(LOG_LEVEL_INFO, F("NEOMATRIX: Exit.")); + + if ((nullptr != matrix) && bitRead(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_CLEAR_ON_EXIT)) { + matrix->setTextColor(ADAGFX_WHITE, ADAGFX_BLACK); + matrix->fillScreen(ADAGFX_BLACK); // fill screen with black color + } + cleanup(); + return true; +} + +/**************************************************************************** + * cleanup: De-initialize pointers + ***************************************************************************/ +void P131_data_struct::cleanup() { + if (nullptr != gfxHelper) { delete gfxHelper; } + gfxHelper = nullptr; + + if (nullptr != matrix) { delete matrix; } + matrix = nullptr; +} + +/**************************************************************************** + * plugin_read: Re-draw the default content + ***************************************************************************/ +bool P131_data_struct::plugin_read(struct EventStruct *event) { + if (isInitialized()) { + if (!stringsInitialized) { + LoadCustomTaskSettings(event->TaskIndex, strings, P131_Nlines, 0); + stringsInitialized = true; + } + + if (!contentInitialized && stringsInitialized) { + content.clear(); + content.reserve(P131_CONFIG_TILE_HEIGHT); + + for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { + content[x] = P131_content_struct(); + String opts = parseString(strings[x], 2); + int optBits = 0; + validIntFromString(opts, optBits); + content[x].active = bitRead(optBits, P131_OPTBITS_SCROLL); + content[x].rightScroll = bitRead(optBits, P131_OPTBITS_RIGHTSCROLL); + content[x].pixelMode = bitRead(optBits, P131_OPTBITS_PIXELSCROLL); + opts = parseString(strings[x], 3); + int speed = 0; + validIntFromString(opts, speed); + content[x].speed = speed; + } + contentInitialized = true; + } + + bool hasContent = false; + + for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT && !hasContent; x++) { + hasContent = !parseStringKeepCase(strings[x], 1).isEmpty(); + } + + if (hasContent) { + display_content(event); + } + } + return false; // Always return false, so no attempt to send to + // Controllers or generate events is started +} + +/**************************************************************************** + * display_content: Re-display the text, and apply any scrolling offset + ***************************************************************************/ +void P131_data_struct::display_content(struct EventStruct *event, + bool scrollOnly) { + int16_t yPos = 0; + + for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { + String tmpString = parseStringKeepCase(strings[x], 1); + + if (!scrollOnly || + (scrollOnly && content[x].active)) { + String newString = AdaGFXparseTemplate(tmpString, _textcols, gfxHelper); + + # if ADAGFX_PARSE_SUBCOMMAND + updateFontMetrics(); + # endif // if ADAGFX_PARSE_SUBCOMMAND + + // TODO apply scrolling offset + if (yPos < _ypix) { + gfxHelper->printText(newString.c_str(), 0, yPos, _fontscaling, _fgcolor, _bgcolor); + } + } + delay(0); + yPos += (_fontheight * _fontscaling); + } + matrix->show(); +} + +/**************************************************************************** + * plugin_write: Handle commands + ***************************************************************************/ +bool P131_data_struct::plugin_write(struct EventStruct *event, const String& string) { + bool success = false; + String cmd = parseString(string, 1); + + if ((nullptr != matrix) && cmd.equals(_commandTriggerCmd)) { + String sub = parseString(string, 2); + success = true; + + if (sub.equals(F("clear"))) { + matrix->fillScreen(_bgcolor); + } + else if (sub.startsWith(F("bright")) && (event->Par2 >= 0) && (event->Par2 <= 255)) { + if (parseString(string, 3).isEmpty()) { // No argument, then + matrix->setBrightness(std::min(_maxbright, _brightness)); // use initial brightness + } else { + matrix->setBrightness(std::min(_maxbright, static_cast(event->Par2))); + } + } else { + success = false; + } + } + else if (matrix && (cmd.equals(_commandTrigger) || + (gfxHelper && gfxHelper->isAdaGFXTrigger(cmd)))) { + success = true; + + if (nullptr != gfxHelper) { + String tmp(string); + + // Hand it over after replacing variables + success = gfxHelper->processCommand(AdaGFXparseTemplate(tmp, _textcols, gfxHelper)); + + updateFontMetrics(); // Font or color may have changed + } + } + + if (success) { + matrix->show(); + } + return success; +} + +/**************************************************************************** + * plugin_ten_per_second: Re-draw the default content that should be scrolled + ***************************************************************************/ +bool P131_data_struct::plugin_ten_per_second(struct EventStruct *event) { + bool success = false; + + if (isInitialized()) { + success = true; + + for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { + if (content[x].active) { + if (content[x].loop == -1) { content[x].loop = content[x].speed; } // Initialize + + if (!content[x].loop--) { + if (content[x].pixelMode) { + if (content[x].pixelPos > 0) { + // TODO + } + } + + // TODO + // display_content(event, true); + } + } + } + } + return success; +} + +/**************************************************************************** + * updateFontMetrics: recalculate x and y columns, based on font size and font scale + ***************************************************************************/ +void P131_data_struct::updateFontMetrics() { + if (nullptr != gfxHelper) { + gfxHelper->getTextMetrics(_textcols, _textrows, _fontwidth, _fontheight, _fontscaling, _heightOffset, _xpix, _ypix); + gfxHelper->getColors(_fgcolor, _bgcolor); + } else { + _textcols = _xpix / (_fontwidth * _fontscaling); + _textrows = _ypix / (_fontheight * _fontscaling); + } + # ifdef P131_DEBUG_LOG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + String log = F("updateFontMetrics: size: "); + log += _fontscaling; + log += F(", fg: "); + log += String(_fgcolor, HEX); // AdaGFXcolorToString(_fgcolor); + log += F(", bg: "); + log += String(_bgcolor, HEX); // AdaGFXcolorToString(_bgcolor); + + if (nullptr != matrix) { + log += F(", xp: "); + log += matrix->getCursorX(); + log += F(", yp: "); + log += matrix->getCursorY(); + } + addLog(LOG_LEVEL_INFO, log); + } + # endif // ifdef P131_DEBUG_LOG +} + +#endif // ifdef USES_P131 diff --git a/src/src/PluginStructs/P131_data_struct.h b/src/src/PluginStructs/P131_data_struct.h new file mode 100644 index 000000000..bb2e195c3 --- /dev/null +++ b/src/src/PluginStructs/P131_data_struct.h @@ -0,0 +1,162 @@ +#ifndef PLUGINSTRUCTS_P131_DATA_STRUCT_H +#define PLUGINSTRUCTS_P131_DATA_STRUCT_H + +#include "../../_Plugin_Helper.h" +#ifdef USES_P131 + +# include +# include "../Helpers/AdafruitGFX_helper.h" // Use Adafruit graphics helper object +# include "../src/src/CustomBuild/StorageLayout.h" // Available custom storage + +# include + +# define P131_DEBUG_LOG // Enable for some (extra) logging + +# define P131_Nlines 16 // The number of different lines which can be displayed +# define P131_Nchars 50 + +# define P116_SHOW_SPLASH // Enable to show splash (text) + +# define P131_CONFIG_MATRIX_WIDTH PCONFIG(0) +# define P131_CONFIG_MATRIX_HEIGHT PCONFIG(1) +# define P131_CONFIG_TILE_WIDTH PCONFIG(2) +# define P131_CONFIG_TILE_HEIGHT PCONFIG(3) +# define P131_CONFIG_BRIGHTNESS_OLD PCONFIG(4) // TODO TO BE REMOVED! + +# define P131_CONFIG_FLAGS PCONFIG_LONG(0) +# define P131_CONFIG_FLAGS_B PCONFIG_LONG(1) +# define P131_CONFIG_COLORS PCONFIG_LONG(3) // 2 Colors fit in 1 long + +# define P131_FLAGS_MATRIX_TYPE 0 // MatrixType flags +# define P131_FLAGS_MATRIX_TYPE_TOP 0 // MatrixType flags Top/Bottom/Left/Right +# define P131_FLAGS_MATRIX_TYPE_RC 2 // MatrixType Row/Col +# define P131_FLAGS_MATRIX_TYPE_PZ 3 // MatrixType Progressive/Zigzag +# define P131_FLAGS_TILE_TYPE 4 // TileType flags +# define P131_FLAGS_TILE_TYPE_TOP 4 // TileType Top/Bottom/Left/Right +# define P131_FLAGS_TILE_TYPE_RC 6 // TileType RowCol +# define P131_FLAGS_TILE_TYPE_PZ 7 // TileType Progressive/Zigzag +# define P131_CONFIG_FLAG_ROTATION 8 // Flag-offset to store 4 bits for Rotation, uses bits 8, 9, 10, 11 +# define P131_CONFIG_FLAG_MODE 12 // Flag-offset to store 4 bits for Mode, uses bits 12, 13, 14 and 15 +# define P131_CONFIG_FLAG_FONTSCALE 20 // Flag-offset to store 4 bits for Font scaling, uses bits 20, 21, 22, 23 +# define P131_CONFIG_FLAG_CMD_TRIGGER 24 // Flag-offset to store 4 bits for Command trigger, uses bits 24, 25, 26, 27 +# define P131_CONFIG_FLAG_CLEAR_ON_EXIT 28 // Flag: Clear display on exit +# define P131_CONFIG_FLAG_STRIP_TYPE 29 // Flag: Strip type + +# define P131_CONFIG_FLAG_B_BRIGHTNESS 0 // Brightness, 8 bits +# define P131_CONFIG_FLAG_B_MAXBRIGHT 8 // Maximum Brightness, 8 bits + +# define P131_CONFIG_FLAGS_GET_MATRIX_TYPE (get8BitFromUL(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE)) +# define P131_CONFIG_FLAG_GET_ROTATION (get4BitFromUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_ROTATION)) +# define P131_CONFIG_FLAG_GET_FONTSCALE (get4BitFromUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_FONTSCALE)) +# define P131_CONFIG_FLAG_GET_CMD_TRIGGER (get4BitFromUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_CMD_TRIGGER)) +# define P131_CONFIG_FLAGS_GET_STRIP_TYPE (bitRead(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_STRIP_TYPE)) + +# define P131_CONFIG_FLAG_GET_MODE (get4BitFromUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_MODE)) +# define P131_CONFIG_FLAG_GET_BRIGHTNESS (get8BitFromUL(P131_CONFIG_FLAGS_B, P131_CONFIG_FLAG_B_BRIGHTNESS)) +# define P131_CONFIG_FLAG_GET_MAXBRIGHT (get8BitFromUL(P131_CONFIG_FLAGS_B, P131_CONFIG_FLAG_B_MAXBRIGHT)) + +# define P131_CONFIG_GET_COLOR_FOREGROUND (P131_CONFIG_COLORS & 0xFFFF) +# define P131_CONFIG_GET_COLOR_BACKGROUND ((P131_CONFIG_COLORS >> 16) & 0xFFFF) + +// Line options +# define P131_OPTBITS_SCROLL 0 // Scrolling enabled +# define P131_OPTBITS_RIGHTSCROLL 1 // Scroll in from right +# define P131_OPTBITS_PIXELSCROLL 2 // Scroll per character (0) or per pixel (1) + +enum class P131_CommandTrigger : uint8_t { + neomatrix = 0u, + neo, + MAX // Keep as last item! +}; + +const __FlashStringHelper* P131_CommandTrigger_toString(P131_CommandTrigger cmd); + +struct P131_content_struct { + int16_t start = 0; // + int16_t length = 0; // + int16_t position = 0; // position within the string to display (characters) + int16_t pixelPos = 0; // current left-offset on display + int16_t speed = 0; // 0.1 sec. steps + int16_t loop = -1; // steps before we go, -1 = restart from speed + bool active = false; + bool rightScroll = false; + bool pixelMode = false; +}; + +struct P131_data_struct : public PluginTaskData_base { +public: + + P131_data_struct(uint8_t matrixWidth, + uint8_t matrixHeight, + uint8_t tileWidth, + uint8_t tileHeight, + int8_t pin, + uint8_t matrixType, + neoPixelType ledType, + uint8_t rotation, + uint8_t fontscaling, + AdaGFXTextPrintMode textmode, + String commandTrigger, + uint8_t brightness, + uint8_t maxbright, + uint16_t fgcolor = ADAGFX_WHITE, + uint16_t bgcolor = ADAGFX_BLACK); + + P131_data_struct() = delete; + ~P131_data_struct(); + + bool plugin_init(struct EventStruct *event); + bool plugin_exit(struct EventStruct *event); + bool plugin_read(struct EventStruct *event); + bool plugin_write(struct EventStruct *event, + const String & string); + bool plugin_ten_per_second(struct EventStruct *event); + + bool isInitialized() { + return matrix != nullptr; + } + +private: + + void updateFontMetrics(); + void cleanup(); + void display_content(struct EventStruct *event, + bool scrollOnly = false); + + Adafruit_NeoMatrix *matrix = nullptr; + AdafruitGFX_helper *gfxHelper = nullptr; + + uint8_t _matrixWidth; + uint8_t _matrixHeight; + uint8_t _tileWidth; + uint8_t _tileHeight; + int8_t _pin; + uint8_t _matrixType; + uint8_t _ledType; + uint8_t _rotation; + uint8_t _fontscaling; + AdaGFXTextPrintMode _textmode; + String _commandTrigger; + uint8_t _brightness; + uint8_t _maxbright; + uint16_t _fgcolor; + uint16_t _bgcolor; + + uint16_t _textcols; + uint16_t _textrows; + uint16_t _xpix = 0u; + uint16_t _ypix = 0u; + uint8_t _fontwidth = 6; // Default font characteristics + uint8_t _fontheight = 10; + uint8_t _heightOffset = 0; + bool _textBackFill = false; + String _commandTriggerCmd; + + String strings[P131_Nlines]; // Read once + bool stringsInitialized = false; + + std::vectorcontent; + bool contentInitialized = false; +}; +#endif // ifdef USES_P131 +#endif // ifndef PLUGINSTRUCTS_P131_DATA_STRUCT_H diff --git a/tools/pio/copy_files.py b/tools/pio/copy_files.py index d0458fe41..22f2e10ca 100644 --- a/tools/pio/copy_files.py +++ b/tools/pio/copy_files.py @@ -18,7 +18,7 @@ def get_max_bin_size(env_name, file_suffix): if "_1M_OTA" in env_name: # max 600 kiB - 16 bytes max_bin_size = 614384 - if "4M316k" in env_name: + if "4M316k" in env_name or "_ESP32_4M2M" in env_name: # ESP32 with 1800k of sketch space. max_bin_size = 1900544 if "factory" in file_suffix: From 9d4821735de082a8a04cf9a9ad91e3c6c796d5c9 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 1 Apr 2022 22:18:48 +0200 Subject: [PATCH 13/89] [Build] Add ESP32 4M2M NO_OTA configuration --- esp32_partition_app1810k_spiffs2172k.csv | 7 +++++++ platformio_esp32_envs.ini | 11 +++++++++++ 2 files changed, 18 insertions(+) create mode 100644 esp32_partition_app1810k_spiffs2172k.csv diff --git a/esp32_partition_app1810k_spiffs2172k.csv b/esp32_partition_app1810k_spiffs2172k.csv new file mode 100644 index 000000000..7857763f1 --- /dev/null +++ b/esp32_partition_app1810k_spiffs2172k.csv @@ -0,0 +1,7 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +# otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x1D0000, +# app1, app, ota_1, 0x1E0000,0x1000, +eeprom, data, 0x99, ,0x1000, +spiffs, data, spiffs, ,0x21F000, diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index ab3dd4952..5df7dbd6a 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -37,6 +37,17 @@ board = esp32dev extra_scripts = ${esp32_common.extra_scripts} pre:tools/pio/pre_custom_esp32.py +[env:custom_ESP32_4M2M_NO_OTA_LittleFS] +extends = esp32_common +build_flags = ${esp32_common.build_flags} -DPLUGIN_BUILD_CUSTOM + -DNO_HTTP_UPDATER +board = esp32dev +board_build.partitions = esp32_partition_app1810k_spiffs2172k.csv +board_build.filesystem = littlefs +lib_deps = ${esp32_common.lib_deps}, https://github.com/lorol/LITTLEFS.git +extra_scripts = ${esp32_common.extra_scripts} + pre:tools/pio/pre_custom_esp32.py + ; ESP32-S2 [env:custom_ESP32s2_4M316k] From 1157ce914ab3e2084bcb11e60a23c84baa42c941 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 2 Apr 2022 11:24:38 +0200 Subject: [PATCH 14/89] [P131] Fix IR build issue, initialization of class variables --- platformio_esp82xx_envs.ini | 4 +-- src/src/CustomBuild/define_plugin_sets.h | 2 +- src/src/PluginStructs/P131_data_struct.h | 46 ++++++++++++------------ 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/platformio_esp82xx_envs.ini b/platformio_esp82xx_envs.ini index 4a649ccfc..259037192 100644 --- a/platformio_esp82xx_envs.ini +++ b/platformio_esp82xx_envs.ini @@ -55,7 +55,7 @@ build_flags = ${regular_platform.build_flags} ${esp8266_4M1M.build_flags} -DPLUGIN_BUILD_CUSTOM -DPLUGIN_BUILD_IR -lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx +lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx, Adafruit NeoMatrix extra_scripts = ${esp8266_custom_common.extra_scripts} @@ -100,7 +100,7 @@ platform_packages = ${beta_platform.platform_packages} build_flags = ${beta_platform.build_flags} ${esp8266_4M1M.build_flags} -DPLUGIN_BUILD_CUSTOM -lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx +lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx, Adafruit NeoMatrix extra_scripts = ${esp8266_custom_common.extra_scripts} diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index 3a11ad605..a17d81ee5 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -1525,7 +1525,7 @@ To create/register a plugin, you have to : // #define USES_P130 // #endif #ifndef USES_P131 -// #define USES_P131 // + #define USES_P131 // NeoMatrix #endif #ifndef USES_P132 // #define USES_P132 // diff --git a/src/src/PluginStructs/P131_data_struct.h b/src/src/PluginStructs/P131_data_struct.h index bb2e195c3..e2ca9ddd6 100644 --- a/src/src/PluginStructs/P131_data_struct.h +++ b/src/src/PluginStructs/P131_data_struct.h @@ -72,12 +72,12 @@ enum class P131_CommandTrigger : uint8_t { const __FlashStringHelper* P131_CommandTrigger_toString(P131_CommandTrigger cmd); struct P131_content_struct { - int16_t start = 0; // - int16_t length = 0; // - int16_t position = 0; // position within the string to display (characters) - int16_t pixelPos = 0; // current left-offset on display - int16_t speed = 0; // 0.1 sec. steps - int16_t loop = -1; // steps before we go, -1 = restart from speed + int16_t start = 0; // + int16_t length = 0; // + int16_t position = 0; // position within the string to display (characters) + int16_t pixelPos = 0; // current left-offset on display + int16_t speed = 0; // 0.1 sec. steps + int16_t loop = -1; // steps before we go, -1 = restart from speed bool active = false; bool rightScroll = false; bool pixelMode = false; @@ -126,24 +126,24 @@ private: Adafruit_NeoMatrix *matrix = nullptr; AdafruitGFX_helper *gfxHelper = nullptr; - uint8_t _matrixWidth; - uint8_t _matrixHeight; - uint8_t _tileWidth; - uint8_t _tileHeight; - int8_t _pin; - uint8_t _matrixType; - uint8_t _ledType; - uint8_t _rotation; - uint8_t _fontscaling; - AdaGFXTextPrintMode _textmode; - String _commandTrigger; - uint8_t _brightness; - uint8_t _maxbright; - uint16_t _fgcolor; - uint16_t _bgcolor; + uint8_t _matrixWidth = 8; + uint8_t _matrixHeight = 8; + uint8_t _tileWidth = 1; + uint8_t _tileHeight = 1; + int8_t _pin = -1; + uint8_t _matrixType = NEO_MATRIX_TOP | NEO_MATRIX_LEFT | NEO_MATRIX_ROWS | NEO_MATRIX_PROGRESSIVE; + uint8_t _ledType = NEO_TILE_TOP | NEO_TILE_LEFT | NEO_TILE_ROWS | NEO_TILE_PROGRESSIVE; + uint8_t _rotation = 0; + uint8_t _fontscaling = 1; + AdaGFXTextPrintMode _textmode = AdaGFXTextPrintMode::ContinueToNextLine; + String _commandTrigger = F("neomatrix"); + uint8_t _brightness = 40; + uint8_t _maxbright = 255; + uint16_t _fgcolor = ADAGFX_WHITE; + uint16_t _bgcolor = ADAGFX_BLACK; - uint16_t _textcols; - uint16_t _textrows; + uint16_t _textcols = 0; + uint16_t _textrows = 0; uint16_t _xpix = 0u; uint16_t _ypix = 0u; uint8_t _fontwidth = 6; // Default font characteristics From 7da9efd6c94091059ec81b00c274392bf3da391c Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 2 Apr 2022 13:05:29 +0200 Subject: [PATCH 15/89] [P095] Rename local copy of Adafruit ILI9341 library, initializations --- lib/Adafruit_ILI9341/library.properties | 6 ++--- platformio_esp32_envs.ini | 2 +- platformio_esp82xx_base.ini | 2 +- platformio_esp82xx_envs.ini | 4 ++-- src/src/PluginStructs/P095_data_struct.h | 30 ++++++++++++------------ 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/Adafruit_ILI9341/library.properties b/lib/Adafruit_ILI9341/library.properties index fe8a31f5b..f8f048ee1 100644 --- a/lib/Adafruit_ILI9341/library.properties +++ b/lib/Adafruit_ILI9341/library.properties @@ -1,9 +1,9 @@ -name=Adafruit ILI9341 +name=Adafruit ILI9341 ESPEasy version=1.5.10 author=Adafruit maintainer=Adafruit -sentence=Library for Adafruit ILI9341 displays -paragraph=Library for Adafruit ILI9341 displays +sentence=Library for Adafruit ILI9341 displays, with ESPEasy specific modifications (added device support for ILI9342/ILI948x) +paragraph=Library for Adafruit ILI9341 displays, with ESPEasy specific modifications (added device support for ILI9342/ILI948x) category=Display url=https://github.com/adafruit/Adafruit_ILI9341 architectures=* diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index 17c2d60e9..cf35a8638 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -11,7 +11,7 @@ lib_ignore = ESP8266WiFi, ESP8266Ping, ESP8266WebServer, ESP8266H [esp32_common] extends = common, core_esp32_3_3_2 platform = ${core_esp32_3_3_2.platform} -lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, Adafruit ILI9341, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ArduinoOTA, ESP32HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate +lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, Adafruit ILI9341 ESPEasy, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ArduinoOTA, ESP32HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate lib_ignore = ${esp32_always.lib_ignore}, ESP32_ping, IRremoteESP8266, HeatpumpIR board_build.f_flash = 80000000L board_build.flash_mode = dout diff --git a/platformio_esp82xx_base.ini b/platformio_esp82xx_base.ini index 8f9e7b524..195be7163 100644 --- a/platformio_esp82xx_base.ini +++ b/platformio_esp82xx_base.ini @@ -49,7 +49,7 @@ board_build.f_cpu = 80000000L build_flags = ${debug_flags.build_flags} ${mqtt_flags.build_flags} -DHTTPCLIENT_1_1_COMPATIBLE=0 build_unflags = -DDEBUG_ESP_PORT -fexceptions -lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, ESP8266WebServer, Adafruit ILI9341, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, bblanchon/ArduinoJson @ ^6.17.2, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/RABurton ESP8266 Mutex @ ^1.0.2, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ESP8266HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate +lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, ESP8266WebServer, Adafruit ILI9341 ESPEasy, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, bblanchon/ArduinoJson @ ^6.17.2, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/RABurton ESP8266 Mutex @ ^1.0.2, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ESP8266HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate lib_ignore = ${esp82xx_defaults.lib_ignore}, IRremoteESP8266, HeatpumpIR, LittleFS(esp8266), ServoESP32, TinyWireM board = esp12e monitor_filters = esp8266_exception_decoder diff --git a/platformio_esp82xx_envs.ini b/platformio_esp82xx_envs.ini index 4a649ccfc..99272b9f1 100644 --- a/platformio_esp82xx_envs.ini +++ b/platformio_esp82xx_envs.ini @@ -55,7 +55,7 @@ build_flags = ${regular_platform.build_flags} ${esp8266_4M1M.build_flags} -DPLUGIN_BUILD_CUSTOM -DPLUGIN_BUILD_IR -lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx +lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341 ESPEasy, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx extra_scripts = ${esp8266_custom_common.extra_scripts} @@ -100,7 +100,7 @@ platform_packages = ${beta_platform.platform_packages} build_flags = ${beta_platform.build_flags} ${esp8266_4M1M.build_flags} -DPLUGIN_BUILD_CUSTOM -lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx +lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341 ESPEasy, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx extra_scripts = ${esp8266_custom_common.extra_scripts} diff --git a/src/src/PluginStructs/P095_data_struct.h b/src/src/PluginStructs/P095_data_struct.h index b408def1d..0634d9b51 100644 --- a/src/src/PluginStructs/P095_data_struct.h +++ b/src/src/PluginStructs/P095_data_struct.h @@ -131,26 +131,26 @@ private: AdafruitGFX_helper *gfxHelper = nullptr; - ILI9xxx_type_e _displayType; - uint16_t _xpix; - uint16_t _ypix; - uint16_t _textcols; - uint16_t _textrows; + ILI9xxx_type_e _displayType = ILI9xxx_type_e::ILI9341_240x320; + uint16_t _xpix = 240; + uint16_t _ypix = 320; + uint16_t _textcols = 0; + uint16_t _textrows = 0; uint8_t _fontwidth = 6; // Default font characteristics uint8_t _fontheight = 10; uint8_t _heightOffset = 0; - uint8_t _rotation; - uint8_t _fontscaling; - AdaGFXTextPrintMode _textmode; - int8_t _backlightPin; - uint8_t _backlightPercentage; - uint32_t _displayTimer; - uint32_t _displayTimeout; + uint8_t _rotation = 0; + uint8_t _fontscaling = 1; + AdaGFXTextPrintMode _textmode = AdaGFXTextPrintMode::ClearThenTruncate; + int8_t _backlightPin = -1; + uint8_t _backlightPercentage = 100; + uint32_t _displayTimer = 0; + uint32_t _displayTimeout = 0; String _commandTrigger; - uint16_t _fgcolor; - uint16_t _bgcolor; - bool _textBackFill; + uint16_t _fgcolor = ADAGFX_WHITE; + uint16_t _bgcolor = ADAGFX_BLACK; + bool _textBackFill = false; String _commandTriggerCmd; From b6f938d489e4b0abf95b4f877843b9b7c8b589b6 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 2 Apr 2022 13:10:05 +0200 Subject: [PATCH 16/89] [P131] Correct invalid initialization in struct --- src/src/PluginStructs/P131_data_struct.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/PluginStructs/P131_data_struct.h b/src/src/PluginStructs/P131_data_struct.h index e2ca9ddd6..02d04f9c4 100644 --- a/src/src/PluginStructs/P131_data_struct.h +++ b/src/src/PluginStructs/P131_data_struct.h @@ -136,7 +136,7 @@ private: uint8_t _rotation = 0; uint8_t _fontscaling = 1; AdaGFXTextPrintMode _textmode = AdaGFXTextPrintMode::ContinueToNextLine; - String _commandTrigger = F("neomatrix"); + String _commandTrigger; uint8_t _brightness = 40; uint8_t _maxbright = 255; uint16_t _fgcolor = ADAGFX_WHITE; From 1bc68fb97af09179377e01039709ce9da725be8f Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 16 Apr 2022 14:51:49 +0200 Subject: [PATCH 17/89] [P131] Add documentation --- docs/source/Plugin/P131.rst | 267 ++++++++++++++++++ .../Plugin/P131_DeviceConfiguration.png | Bin 0 -> 72611 bytes .../Plugin/P131_FlowDirectionOptions.png | Bin 0 -> 12931 bytes docs/source/Plugin/P131_RotationOptions.png | Bin 0 -> 19860 bytes .../source/Plugin/P131_RowsColumnsOptions.png | Bin 0 -> 12918 bytes docs/source/Plugin/P131_SaveError.png | Bin 0 -> 1943 bytes docs/source/Plugin/P131_StartOptions.png | Bin 0 -> 22450 bytes docs/source/Plugin/P131_StripTypeOptions.png | Bin 0 -> 9177 bytes .../Plugin/P131_TextPrintModeOptions.png | Bin 0 -> 19653 bytes .../P131_WriteCommandTriggerOptions.png | Bin 0 -> 7602 bytes docs/source/Plugin/P131_commands.repl | 26 ++ docs/source/Plugin/P131_leds_hairy.png | Bin 0 -> 100989 bytes docs/source/Plugin/P131_leds_shield-horiz.jpg | Bin 0 -> 103405 bytes docs/source/Plugin/P131_leds_shield-vert.jpg | Bin 0 -> 104252 bytes .../Plugin/P131_leds_single-vs-tiled.png | Bin 0 -> 13324 bytes docs/source/Plugin/_Plugin.rst | 3 +- docs/source/Plugin/_plugin_categories.repl | 2 +- docs/source/Plugin/_plugin_substitutions.repl | 1 + .../Plugin/_plugin_substitutions_p13x.repl | 13 + 19 files changed, 310 insertions(+), 2 deletions(-) create mode 100644 docs/source/Plugin/P131.rst create mode 100644 docs/source/Plugin/P131_DeviceConfiguration.png create mode 100644 docs/source/Plugin/P131_FlowDirectionOptions.png create mode 100644 docs/source/Plugin/P131_RotationOptions.png create mode 100644 docs/source/Plugin/P131_RowsColumnsOptions.png create mode 100644 docs/source/Plugin/P131_SaveError.png create mode 100644 docs/source/Plugin/P131_StartOptions.png create mode 100644 docs/source/Plugin/P131_StripTypeOptions.png create mode 100644 docs/source/Plugin/P131_TextPrintModeOptions.png create mode 100644 docs/source/Plugin/P131_WriteCommandTriggerOptions.png create mode 100644 docs/source/Plugin/P131_commands.repl create mode 100644 docs/source/Plugin/P131_leds_hairy.png create mode 100644 docs/source/Plugin/P131_leds_shield-horiz.jpg create mode 100644 docs/source/Plugin/P131_leds_shield-vert.jpg create mode 100644 docs/source/Plugin/P131_leds_single-vs-tiled.png create mode 100644 docs/source/Plugin/_plugin_substitutions_p13x.repl diff --git a/docs/source/Plugin/P131.rst b/docs/source/Plugin/P131.rst new file mode 100644 index 000000000..9de063681 --- /dev/null +++ b/docs/source/Plugin/P131.rst @@ -0,0 +1,267 @@ +.. include:: ../Plugin/_plugin_substitutions_p13x.repl +.. _P131_page: + +|P131_typename| +================================================== + +|P131_shortinfo| + +Plugin details +-------------- + +Type: |P131_type| + +Name: |P131_name| + +Status: |P131_status| + +GitHub: |P131_github|_ + +Maintainer: |P131_maintainer| + +Used libraries: |P131_usedlibraries| + +Description +----------- + +The popular NeoPixel multi-color leds are available in many configurations, either as separate leds or led-stripes and also in a pre-mounted matrix configuration. They are easy to implement, as they only require a single GPIO pin to control up to several hundreds of these pixels. + +This plugin is created to use 1 or more matrices of NeoPixels, and allows to draw graphic elements, write text or display bmp files, with a configurable brightness. + +When using multiple matrices, we use the term 'Tile' in this context, they need to use the same layout and rectangular size per matrix. The Tiles are also configurable in layout and rectangular size. + +This plugin uses the same AdafruitGFX_Helper module, as used in some other Display plugins, like :ref:`P095_page` and :ref:`P116_page`, and implements the same graphic commands. The AdafruitGFX_Helper module is 'limited' to 65535 (RGB565 coded) colors, but the used library uses a smart color mapping scheme to display colors as accurate as possible. + +Matrix and Tile layouts +~~~~~~~~~~~~~~~~~~~~~~~ + +Several Matrix and Tile layout configurations are possible, and supported. Reasons for having a specific layout are usually driven by the challenges of mechanical construction for these types of display. Common requirement is that all matrices and tiles are electrically connected as a single, uninterrupted, serial stream of NeoPixel leds. + +.. note:: **Credits**: Most of this layout-description and the images are based on and copied from the documentation available at the `Adafruit NeoPixel Uber-guide `_ + +**Matrix**: A Matrix is a rectangular set of NeoPixel leds, with configurable width, height, starting led, orientation and direction. + +**Tile**: A Tile is a rectangular set of same size/layout Matrices, with configurable width, height, starting matrix, orientation and direction. + +The plugin handles both single matrices - all NeoPixels in a single uniform grid - and tiled matrices - multiple matrices combined into a larger display: + +.. image:: P131_leds_single-vs-tiled.png + :alt: Leds single versus tiled + +Let's begin with the declaration for a single matrix, because it's simpler to explain. We'll be using an 8*5 matrix of NeoPixels. When looking at this matrix with the text in a readable orientation, the first pixel, #0, is at the top left. Each successive pixel is right one position - pixel 1 is directly to the right of pixel 0, and so forth. At the end of each row, the next pixel is at the left side of the next row. This isn't something we decide in code... it's how the NeoPixels are hard-wired in this circuit board comprising the matrix. + +.. image:: P131_leds_shield-horiz.jpg + :alt: Matrix with horizontal layout + +The first pixel is in Top/Left postition. We refer to this layout as Row mode and Progressive. Row mode means the pixels are arranged in horizontal lines (the opposite, in vertical lines, is column mode). Progressive means each row proceeds in the same direction. Some matrices will reverse direction on each row, as it can be easier to wire that way, especially when using a very wide matrix. We call that a zigzag layout. + +However, if we want to use this matrix in the "tall" direction, so the display is standing up on the desk with the ``Din`` connection at the right-top. When we turn the board this way, the matrix layout changes: + +.. image:: P131_leds_shield-vert.jpg + :alt: Matrix with vertical layout + +Now the first pixel is at Top/Right. Pixels increment top-to-bottom - it's now in Column mode. The flow-direction of the columns is still Progressive though. + +Similar configuration options are available for tiles. Making more specific mounting configurations possible, like this: + +.. image:: P131_leds_hairy.png + :alt: Specific Matrix and Tile configuration + +As shown in these examples, neither a Matrix nor a Tile has to be square, though both have to be rectangular to result in a correct display setup. + +NB: The maximum number of matrices/NeoPixels that can be connected is not determined, though when having > 1500 NeoPixels on a single GPIO pin, this can cause timing issues when the ESP is not fast enough to update all leds within the available time-window, resulting in the content being distorted. + +Signal wiring +~~~~~~~~~~~~~ + +.. note:: If the matrices use a VCC higher than 3.3V, f.e. 5V (and they usually do), a level converter for 3V3 to 5V should be used when connecting the display to the ESP, as the ESP might be damaged, or the logic levels don't match the requirements of the display (high level ~70% of VCC = 3.5V @ VCC 5V), and may not work properly. + +.. code-block:: text + + ESP Level converter 5V NeoMatrix 1 5V NeoMatrix 2 5V NeoMatrix n + ---- --------------- | ----------- | ----------- | ----------- + 3V3 --> LV HV <-+-> VCC +-> VCC +-> VCC ... + GND --- GND ------- GND --- GND - GND --- GND - GND --- GND ... + GPIO --> LV1 ------> HV1 -[470]- DIN - DOUT --> DIN - DOUT --> DIN ... + +NB: It is advised to use a single 220 to 470 ohm resistor in the wiring from ESP (after the level converter) to the first NeoPixel ``Din`` for better signal stability. + +Power consumption +~~~~~~~~~~~~~~~~~ + +By the physical design of these modules, using NeoPixel leds for display, the power consumption is dependent on the number of neopixels that are activated and the brightness that is set. On a display consisting of 4 matrices, the power used was ca. 3A @ 5V with all leds on at brightness 255, so it requires an adequate power supply, preferably separate from the power supply used to power the ESP. + +Also, when using several matrices sequentially, separate wiring should be added for VCC and GND to each group of matrices, to avoid burning out the pcb traces of the matrix where the power is connected. For groups of 4 to 8 matrices, it is advised to use separate wiring for power to each group, and only connect the GND and signal connections Dout/GND to Din/GND of the next group, but **never** the VCC pins. + + +Configuration +------------- + +.. image:: P131_DeviceConfiguration.png + :alt: Device configuration + +Task settings +~~~~~~~~~~~~~ + +* **Name** The name of the task. This should be unique for all devices that are configured. (Initially empty) + +* **Enabled** For the device to work it has to be enabled. When checked, the device will be started as soon as the ESP starts. If desired, the device can also be enabled from f.e. a rule by using the ``TaskEnable,`` or ``TaskEnable,`` command, or disabled using the corresponding ``TaskDisable,|`` commands. + +Actuator +~~~~~~~~ + +* **GPIO -> DIN** Select the GPIO pin that's wired to the ``DIN`` input on the first matrix. + +* **Strip Type**: Select the type of the LEDs mounted on the matrices: + +.. image:: P131_StripTypeOptions.png + :alt: The Strip type options + +*GRB* : Most commonly, the LEDs are of GRB type. + +*GRBW* : If the LEDs also support Brightness control, then the GRBW type should be selected. + + +Matrix +~~~~~~ + +* **Matrix width**: The number of NeoPixels that form the width of 1 Matrix. Range: 1..100. +* **Matrix height**: The number of NeoPixels that form the height of 1 Matrix. Range: 1..100. +* **Matrix start-pixel**: The location of the first NeoPixel of the Matrix. Available options: + +.. image:: P131_StartOptions.png + :alt: Start options + +* **Matrix Rows/Columns mode**: The direction of how the pixels are installed in the Matrix. Available options: + +.. image:: P131_RowsColumnsOptions.png + :alt: Rows/Columns mode options + +* **Matrix flow-direction**: The flow of the pixels on the Matrix. Available options: + +.. image:: P131_FlowDirectionOptions.png + :alt: Flow-direction options + +Multiple matrices: Tiles +~~~~~~~~~~~~~~~~~~~~~~~~ + +* **Tile width**: The number of Matrices that form the width of the Tile. Range: 1..32. +* **Tile height**: The number of Matrices that form the height of the Tile. Range: 1..32. +* **Tile start-matrix**: The location of the first Matrix in the Tile. Available options: + +.. image:: P131_StartOptions.png + :alt: Start options + +* **Matrix Rows/Columns mode**: The direction of how the Matrices are connected in the Tile. Available options: + +.. image:: P131_RowsColumnsOptions.png + :alt: Rows/Columns mode options + +* **Matrix flow-direction**: The flow of the Matrices in the Tile. Available options: + +.. image:: P131_FlowDirectionOptions.png + :alt: Flow-direction options + +Display +~~~~~~~ + +* **Rotation** Depending on how the display is to be mounted/installed, it may be needed to rotate the content, or with a non-square resolution, to use the display in *Landscape* layout instead of the default *Portrait*. + +Available options: + +.. image:: P131_RotationOptions.png + :alt: Rotation + +The available options rotate the display in a clock-wise direction. + +NB: Because of the above Matrix & Tile configuration, this option is less relevant for this display, but available in the AdafruitGFX_Helper module, so still included here as the accompanying ``rot`` subcommand is also supported. + +* **Text print Mode** Defines the handling of text when predefined text or text via the ``txt`` or ``txtfull`` subcommands (see below) is displayed. + +Available options: + +.. image:: P131_TextPrintModeOptions.png + :alt: Text print mode + +* *Continue to next line* Simply 'prints' all text to the display, with automatic overflow to the next line(s) if the text doesn't fit on the current line. +* *Truncate exceeding message* Display the provided message, but any excess at the right border of the display is discarded. +* *Clear then truncate exceeding message* Clear from the current cursor position to the width of the display, then display the provided message, but any excess at the right border of the display is discarded. + +Default setting is *Continue to next line*. + +* **Initial brightness**: The brightness that the display is initially set to. Default is 40, to protect both the eyes and the power-supply powering the display. Range: 0..255. + +* **Maximum allowed brightness**: The brightness that is the maximum it can be set to, either from UI or via the ``brightness`` command, to optionally help protect both the eyes and the power-supply powering the display. Default is 255. Range: 1..255. + +* **Font scaling** The scaling factor for the currently active font. Select a factor between 1 and 4. + +* **Clear display on exit** When checked, will clear the display when the task is disabled, either from settings or via the ``TaskDisable`` command. This will fill the display with all black pixels, turning all NeoPixels off. + +* **Write Command trigger** The command to handle any commands for this device can be selected here. This way you can have different commands when multiple displays are configured. It is processing most commands via the ESPEasy Adafruit Graphics helper class. + +Available options: + +.. image:: P131_WriteCommandTriggerOptions.png + :alt: Write-command trigger + +* *neomatrix* +* *neo* + +The command is handled non-case sensitive. See below for available commands and subcommands. + +Content +^^^^^^^^ + +* **Foreground color** +* **Background color** + +These are the default colors, used to display the content as configured below (if any). + +Colors can be specified in 3 ways: + +* *Color name* Some named colors are recognized: White, Black, Red, Green, Blue, Yellow, Orange, Navy, Darkgreen, Cyan, Darkcyan, Maroon, Purple, Olive, Magenta, Lightgrey, Darkgrey, Pink and Greenyellow. If any of these colors is recognized, the name will be shown. +* *#RGB565* A ``#`` prefixed, 1 to 4 digit, hex-coded color value in RGB565 format (5 bits red, 6 bits green, 5 bits blue) giving the max. number of 65535 colors. This is the value that is shown after the settings are saved, and it is not one of the known color names. +* *#RRGGBB* A ``#`` prefixed, 6 digit, hex coded RGB color value. Will be transformed to an RGB565 value on save! + +If the Foreground and Background colors are the same, the background color will become ``transparent``. If the Foreground color is empty, as a default ``white`` will be set. + +Lines +^^^^^ + +.. warning:: **TODO** Need to complete the implementation and documentation. Only basic display of text is currently available. + +* **Line 1..n** Predefined content can be specified. The number of lines shown depends on the Tile height of the display, the font used and the font scaling that is set. On a 240x240 pixel display, with the default font, and font scling set ot 1, all 24 lines will be displayed, but when using font scaling 2, then only the first 12 lines are displayed. If more lines are needed, then they should be set from the rules or an external source, like commands via http. + +The usual variables, like ``[Taskname#Valuename]``, or ``%v1%``, system variables, formulas and functions can be used. + +Input length is limited to 50 characters per line. If a longer calculated text is needed for a line, then it should be set from the rules or from an external source via http commands. + +If more then 1 line is shown, next to the last Line the remaining capacity in characters is displayed. + +The total combination of lines * input length can not exceed 1000 characters (sized dynamically), as there is limited storage per task available for these settings. An error message will be shown after (trying to) save the settings, **any excess content will be discarded!** + +Example: + +.. image:: P131_SaveError.png + :alt: Save error + +* **Interval** By default, Interval will be set to 0. If set to a non-zero value, the pre-configured content will be updated automatically using that interval (seconds). Depending on the **Text print Mode** setting, content that may have been draw from rules or external commands, may be erased. + + + +Commands +~~~~~~~~ + +.. include:: P131_commands.repl + +.. include:: AdaGFX_commands.repl + + + +Change log +---------- + +.. versionchanged:: 2.0 + ... + + |added| 2022-04-16 New plugin. diff --git a/docs/source/Plugin/P131_DeviceConfiguration.png b/docs/source/Plugin/P131_DeviceConfiguration.png new file mode 100644 index 0000000000000000000000000000000000000000..913d8cfdd006e3261aff0a390317f0dfbe40459e GIT binary patch literal 72611 zcmd?R2Ut^CzdnjnbnK&os5BK7LJ0~e0s$NmkQyK$9YmTS5b2=>I}n=GNDG6MNS6+w zDHst#kuC&?geE0mXaPdGE2uNyIsfmTa-Z*<``qX5XU34dlfCv{d#(5P`@QeG60EJI za&X_NeQa!O2UTz0&}C!$1;@s=yYjc)V9&nuZ#2Qn-upL=+}PL-y<`2qD^~ar7uady zu4L$b!^X|Z)&9P_J<^%Y>aHu&$>!j`OIJiMN{WhK6c;}&a{7|E%tdMN-@$!~JBLqe z*w|TGd7n10ceX})9o(mc&=!>t7rk`x%4yNlDoCWAqs{4WpS&t_sho}NG@I&;KlD)M zvqSLEb4GXgCS*>1RgyCMH5v6{m-|>`p!9F8iqnE$(?fQ(sj5f6x$o7QaN(MBb_R!I zwkIw5mY7Y`>3fGB-8CfT+eh{&qHe_9{`lVEe6gKQ)rq{@uMAFWAHDa-&p#b_HbYEl z31XPvP`;(FXXoxmp_a>WY)cenODy(@y$s*Sh9Yf#4O9pfxWtcBV0+-bUaY_@rV8SI zV?%NgiPhd)Y-|&%^k3ebH8nFMM!z`H&d2r!1_2$(#`fX~buV~%pep$7?F}PX4P)5% zY0&rWgTFHU+}ZD2^o@Vf-_{+(E&&B0&-D(0DIexUB4tyxv@pf5eAU)=EB{^NTJ$_x z!pPQC9)fmXtb@OtvSgAQPsU{pHd=8W+1Vn;mFXo7{xM=+5ZrpW%lyJrB1JSi?Jg&r zB9fqpfCYcM{15(i9Ylmc;xhrBBkp~J1k^x`68Y%e;ynKdH}}8p#Z^HEc6mw^S2o`A zK0YP;KRBKTBO3BKSG4q6LLneA@+Z|hQVHmdJ z{thv@Doe&hoEh$GUD?g2cu$px{ocL_ClL|tNRNReJG5pvt4?*_q^+2V4npi0p6nBMG8lDqh79S&P(Yp45Tg6XH>Bi1B zMhl{5spg}a+mOd|)S^(5+H;u{y7*gkny)K=foH^Nq02T}nP2;>P}89wF<6pQP7S4Y zlqOC2{`ke2g17|h5PZcs`~J|jrr7ImJ!LDY_6!?OIeX6AmtUzdf)c@kn;KrZ};y?BYP&g(~R&dtO47%xjxpqD}jw;k94wH6t+ix3rop zD&!=++skx3L0RGZL#$Q;kEe+pZr{{>%1lp-d|axMDSUb6JW2bBnlHZPfAK2xx7=g;Vbj9Mb(7Q*!?K3iEhr8A_#lqDD zzJEyRe_~Rmi{Mx|%T{5B5n#PuNJaewUTz=#Ki?WYr>r&1b4CO#=B{@3;o{a7MhiG1 z_!NfI<9XxO8tWJZA$%5_-qpdX8;Jo7JQ2IyxLvxMVX?^^cX^`F&}S*b#05Q|JtCLFl8BEw=BGk(En*Dm#gej z>}%S6$AHl~rT`J{zt**IwLWEJMl4`;CVGyG?SVZ2w$Gv*%KJC#DVvQ%Z1}c0y{~pb z46{A`*dRH|UZY+{VKa6YVQ{oqT@t6l@0KYAuR##?nVHrQVf|tp$#xyBEp} zg@?NuadOh@86$V(hRSx`w%lq%`WtU71lF0yDZ9jXwOPn-q3Lr4o0Rbsdi7OH6U#)n zmO_}9*S)&c)tQg zwW+Mb3?kAdeG7)YR!n=_H3d2z(cC0gVRlbCA%k4@uiSkYeOpfW`wo+%5fDfRMm z#`2rA0)M?>xX>^fT(H=X$YHiO)q~ln=DO7U;TSv0pdA*O*@qmE;7dw8Y~YWq9bKcZ z%&(99Hk@9Y@;30K2P%k&SRbjDw4ujHZ?{tH5V%CM0I$oGpL6ur8Rj-jh6@@UQCpWY zZ!}+d@ENY%KfC~s%GsBUJ6bG{T$?N_Kuvp#^jpz{brL6q732b7-j+ACPlT~!uehKW z%eQXJHcv@y+tA(W=#AqkttCiGOGICASEwI>CYXM|;p=_MD^!)rHhJ4*1MeEVt-FzS z*W7S8?ENmbiE&RNV!^fo-8JYFIOOkUQP&?Xzsp_TREc%Le^#}RH86hmJMkn?a!KN< zx&B)hUmzwkYmacmw)Y2SQXgz zwKHEO#FyXeM%?^lP(kycF|}{!o9j-(8M_uQuS%Ql?`pdE8*iRWi5`@vTD5N492Gm}Fw{O$p!(ijY%d~w z1##2vR#MSUKhqDPcg$$`}Q&qFo*l(8D0)Y z0cb`MCUitN(;-ycIw_2lr9T6WyOkTNbrI>1HWayt&U9h zeT)Yf?3DVaNwLl8zR`yMDXhZA^3v`v0UH)FqzydZmc1R?P~LQ4XIST>geclld^Nlx)em(EM%!6d|!d>X@WdB`kUnc-sg3)MUAkJr+C`FxV z*%Pt??u8G!KH(+r*HAqkkbkN&3cp#Cg8p+z|H6Ue@Q$0&u0t*DmQ~MB$Zz?-BO-JZ zhSyici3rByjVm-N#CxLy{hluX?W=#}7$>(?c!4jko6LD-ruY8Imqub}^m|w!y-zMe z)Yq?dW%Q}U?snQaB7*eU-H_L>)jr$R5fUd^R&1@>;fOyl_vT~Z&%yJ>+VC~`;Q!nC5v#AElG zh^4D5zK;(D=Fi)`?uG1nHZF{zy=`nI~tB;p$jX%AgOKC)PYZh&W zY0&jbw!%NK!xfn{3)^>AZOuvTgcIs~29(;WBBGW$W4@2(5@;1ps-LJRiV#2_8ZB^( z$os%!QT`dT5l+1z(!w&ulEPg7O12}m`z@!OCvywo>K82KKwYay z|7B11`sXBdTS-+IHOoKCAbw@f&_u)RROW+e=7S`5iDcR``+@j7k9^a z+p4VGA|Ni{{o=EuEA++2?a#N;k{|8l&K5FTzC$!+@R(4`jpViOGbR=Fh}gf~Fl+t{ z^RwWy{agdijN(&JB_>zhLR}~{B|)9mTel__?d`vpe27^wV}tZ(csCO_lfM=CA#PQN zi>+cau6w@NqsI=n8rrhE%zoWcvh&3Pgk38YwG$Vu&7rL~@l|nJf1D6qmI@drH_5y1 zB@KDHbFi@?!>N0ZPp2Jb zvMPgD8XG2G>uX}r)4~DT(8cobI{o}(y~zui!Y$UhRSrrOHu6`fe zgFsND{NI#7|8arzPmex|uc)nswppN!lal<>P#dd-fFQUMX6Q=G$tdHg2zpfx>g_%`x-hhI?M9g9h@uzJIhJVt!n0irdtF?O1atM zZqk2|_!9+c&3G?%IGac;b+7F;7B?b34>%#i>|yHE9e+J;o;*xfA3cey03OoQp;K5J zWXFa$VFKHn3+!p9mDi@UG3ktes?`}Og>s9{nwILSF-EOtarWXusE5$+>UA{pWK+lgBAd=H;lj&juAjJB6AS=_dy>cbQC6x*q(Vg>4sZd)-~%dH(E1rBNm!rXZ#l6_S&tArD~VivT_zfQWxUfi)u*b`KJTD@1|nybV2GXh5^osg4>+RBM3pK( zRSe!eer!u+S>`e600%tTyF>2z%h9ZTxD`)jZVNcQJGpiU{mH8|1;sTq+CDGf=9uh1 z%Ur#2!&+4b1_m2IJ}3Kb1If#2@iIS0x{_|B#YX97#rHZ2BkrCjz4>X@0_LPL?TE>A zJaROmHfvvOCd?jLfQ&DRnSz#^Db%d3Oq`guBDIkmi>u~A_!cV{?awC7)?a#0ZVeB| z@F6xl{J8Tr?f4WY=)plBie93Ax}BxW0VlR@r{o)-*MXnWYn?Wa>lDQi&Li?)tL-oN zB3|c^y5WveAIe0jL21pVD{<`5)+^0ZvT^n+(WaTbYIZ{?NJ{I{Fco5~ zAkqgJqh8M`rM1%Mp*R9obZ(J#llI?kG6a7IaU~Y}mPkan2jE?OJl}OWVel(^-g>gb zMH*=seBBpwA*?ViDkVoIZ{dQJnt&+Il^;hPE60YmIEW^48%(Yy_)lW+K2^(?o{c)K zB(lSkskvxwx)r95*9^8SCx7IKk@3zDTcu{*HG_I}h{n2-hArsnw;!2s!nZ3ukf{_B zJ3Rh~5_w51I$VZeL+@s{vgu@=A72@2x<)VA4D(qIdowdSa~v+m3yV0BvO zPN%I1;V`Y|z4Wtnvl7ZM=pIu)i&v(>B{`^UXqI|Fh?%n-Dsd~iB;F*y=$=~Iqs=C}z?<|T@I#+MQlBqF>sC)=r6UrcZH z0h$gPYfO@S+MS2NPt3HGxiPSh%6o=b-4t5gA9vpVWR&SM&pwJnpK87&hLkK9fqab` z7%qnRHq5Wc(A;_nOU`a0^ullmj_MKBC~)?yI)=LULB>EGN+?16mD!fN%60v;7%0YL zb>1hHd>o!=pXh|oKu9a#enUpea>84y(^u~fZ4fl(TwmXfM=@RAb|&7s6b&i49u=uf zuN@sF>%hjtMIi;Q%$w-_X7{=cD>r$FU0-&Z3T8DmEsA^4aH)(1evu8KtUbE0w+94q z08b})SW_+o_2{HFi%o6;v>aQU+J6X@Ld0V&ZaFhM~dMg*##1@^hJ z8J=YwTqD6l0I-XD^9uu54osQ%Td=1yCsW>w&9lA!jRnp#Gc!~ZcuFkNG|Z0$$tpjh z!(UK+Wcc;70MUbr%MJc#Sz+PzPFN`K-231>0=5eTo{M|Im4hu>`+xB5TMbhS3(geu zx;;G%xf9Ij$;SX!#aXr=G>y;(-T1`y%TyPhxH#D!!ng5x53#4G=le%;{6JK_y|0GY zMO=S%Rc5+9z zv9iP9;|v-v1`o(EcfDM(Yy~OoD3RDU({+c#EWgh@9fH#$DJ0qul=SjZ*}WuWvH44( zge#363GDE3D@}tZk9P>s+u?J0C>a@JjzqG&S#H&NZ8Mn+r7q88&4=9sb{;8NPHXI( zaQc;mO~-i!eXLf~6%Ngo5SGaDK>8FEXUrc=u#c7Vpm*2wqZqDb6&JGwJeyyo-w^UB z9~#nft|Lbx#%)PIiPUKlkGX*<4LT|u6dx5L%?{Agd+?dM2wh5sOTTOO7xUeHMi)$k zV)t|8`1qg`Hyd{cg7L}5_J&(dgU&ug$x2G%qQ~@8?$f(@pY~|!1N_;|aKGaW@CUGw z9go@J{Z3&*xZTkH87_LaxNYLaJz$K3O!CVv41T(9k#Pqz4+<4g&(^YH2C8}Rb+z7c z-8uR@GKj7_tz4t)A#==xN})9~F>02^_fqIS^xrZal2f^onR%YoJl`7v?N=goV>IK7 zt55@eHAV_CN<)zeZ($2JOnPkHa4s*|CIKG_LTOF_A}@Oe+2BU#uHb;P>uEXQnfn6 z(Np<*v3*Zz5Rj6yy#ROyUj7o-{+-tLzy3Cc*wxdcf9AWKbJjIQ=Z8=h^x@op_wRl) znE#dweam;AW4_0G!N@kgV=Wi8FdR)SwqEzQnWlw&)4+m0e3})($#1W2YEJ1*G}$$Y zrxih7Ul4khIb8ew6G5}F0GB6;jq`o{$v9XR32$;-7Qv~AKw1EV+u2r{!7zfj)!R5K zV#!YG*+TQ2d;#X|%v?y`%Sc2btvs%#$qsHzI@eg#I&pQqjFQXM9c7kf#CmlZcCFd=zyw54Dr8x$% z)?xaitBa89A$Uhf48$+LOsS)6u*v%M34jIz{VgF8{KcEJ^X?rsZaNQptCD`SHYig= zM64_ndtS-VwzbxS#^1T?PLHXI$!~i_g+O1wwBdmNI5{H)M}^etprGWUy8}nyc~<@G zit&*K@ifM9HRZpaum%p$4v63M`{U#_J7TID5xNs&W&MOb2;mQflI%y5k%p2NK ztwCukL9a?qV*(USCu?>5GkRL(qkUmYq$jkAIZ6x#%|uBo4$MGUVRmPm6OE^;{&+Js z_un0f|CP@}Lh!6gj%_afUq2;P17sim@B#?pZePeRCZ$cesgpu;Q61WN)>|hiKjgIk$F5|^{@5t zPM!VwNuz#wm8|cwE@M7hV(1ZPZ)axe ze%y>hC8z7`@D1%Ya%sUH*TQfXvCo!)>pVha;f#DsxljVWY5AC(-D8eK}XL3(#@CoW>|72^@I~Ib^{ESgc z##y0$8+Q?C?1ybtXip2{7RV=LEPnTWL7lqLDAu{QbHTDZ7re{~m&HV8``O3dcuewA zk2j@v8!W`^E|*JAwNjfr$PTZh&K{JzFfsKOgHPnH3z`sSjk`H+R(jWC0vm5m4cAV} zMNUZVKX4qP59x{#Ybx8*mzS>8zOgUJQ5V6{unSu6}<}kS% ztUg|5hxgbZn*@{3s77`kZB@tM7hDO0{?W$oMcmqVhu~jnkT_Jx%Q@aEw0OnI{bvs& zU^SoE|A@fV475dr;1_0A#Fy9e7P3TeGD^Ax4MIVSIC$K9;=c8kEA{l*PX#BT zH;zn}L7vJy)wx_CaaO1}Y(lqcOMT^8d9)TVdPpa|8}G{Rg#73;m#nB`u?SywhznhE zTAXl+G<)Xc!?w@7z8E z|K@b@o#$L4h+RP*UOaH7)Q7P4>4{aQmrOs83Sq&Rwo*fk-q zu1P(6H(CRn-PF~~wE6?Pvi+rQo-D~Slv=q&Oi8ZV{)?bf0@V@nG@<0{AVU$+N775G z4iFltSs$>HT)vLJF&BNZkrtwgjWKOpz}1n~lyJC>vGM|y1IpM_DFC2FeVkn)@NcPE zcCt16*WW{JXF3cg?CrF(e>=-YDzRszrvEXNDNm-!ay2IsEj-eP02qTCUpyTd2!&W&P}sZ zPUs6SJyba0m9%#=U}9IF|4tSNeAZ0-R#avEGl=I<~$}SpAX~(JYm(EYE^T{*lYF z)t-TUU%wh3VpC5?J&OMgY1mK~_bhdNME(d1fj{jau*uXfZ=(LWKk9!YXZ!zn1UbkF z|3(tJbhk~Hpps3T{g1$D1Vc)09n@2#XXXwMkIIFduCWiF^X@aKQ~LB-oehb_SEv;s zgF{?GX6-(?&vm@r*?azL$%Nh%k zJ3|$uSVk9ZLXts6*v)IUbV2P;sX{mqPR(Ek*;UWz$9D?_?Zy_UX!6v3(wGs(Wz(#c z^}v@!Bv~^i8;?3=GOKsKdu1Wv;?ZnlFMmRfM!}%Qq;8c%&9ai$CLP;69x=Z>C3GrG zU&~2U7F{=_&b*~meKX+F9>#nbXj^0)lX@Zbv`lS0h5g23BEndbXyH|s1Nex@a!EeF zuYb^qoEGQ08cHsT;dpoW9RTH-@9dk?&$#T>3*fN-x`DGpP zgYj3K>zc-&$YFWv6)Vl?dSTiau|lqv+jL3vJH(6HJ~Ws{woxEjFrLoWGM({$`?h&9 zpL$m=uuOuw%g5nw%lrl|h(4np72G1k3FDN*44bF=Rcw8{68TpWg$po*(B>gS9^N;A z6XPV(J8-{#yhiW#jlh4I57IRLH5TL+QkwU8xfBo){>609 zE2INkx2l#pD{GIyTf<0hzs7-P29IIkRciR(S#jqw$icHzejzFWQY=vjCqvd!76a#T zj_JFC5f~07bHJ^jr6J8(gF$#41;g2C02_yrfbGgVu@jo&8LM?>2L`vPSwUj5A?kn1 zf~sE}P+!xdRq@zx^MM+QI}d6R#FK*@ikcug7;N&tST8Twc~%OVYb81E`*z0E8gQ^d zx_dUmoL%-x)}k;WX+=vXJ@|lyEYinfW=yI*>=P2cc6sa5=dGbK)U^y8w0EMOcSl`)Xpoum=!(Yq1UEHh`CU=@Mt|6ZItpNQ*6 zE|}27NpBPh9(4B3!7d1|e@SH@B1Z%8TV;#yH*QrqJkcvp2Yix|>-VsvCq#Og{i^?* z)U;i(sbKnhPIyjNm*$a}xEqR|9Ps#sR|zscbv^5wBzG16wvt$S30Y}j!`Kz|BZg@d7BBZtMTzfBo2rYqcYJj)2MA&f@PCvz z78e((Ym1XjTt=YalimOoee7TI2a91#i;x$hRGebDEX5<9^v!-9;Q5D`a<RO1Ml6x_^8ftIH*4UMSkCOJZhcA z0r(PqHF18u$=hpQwkPf~t zw^jiSNO*~d#Nqs^ArG%Sh3m>(&Vu%kfraMS3YHyC^VjQ=_th0c{sPeL+xPyk@uDvo zEmDRSz5q%9B=MQQ_$(OJB&Ske>9d!H;9Cj)GvzDAVZPUXG{tQUaD#R|tFl{^U5-o| z?o=P7GOvY+;HWz4a=;pLINN>u$Nes3N@Sx3LS20p(uE#1KN1wh6=7S5#Eu$p1|9em z><5$Ky?9a|=CuD$nej~=m6~;VUsffbUj9`A0EvF(Xq4PvpBn`*ql7Kf?|MmvAdWhz zT(iO8*Ks<@HY0IV4v={g8ng8S8*cp>maL{Z~Ckxg=N@hQT{BwVuA|TA3 z3+Q*XwmL7w!_byRsC!lz9!8e;Z#$q;nQn!{Ygd~a2{NK(D(*VDWQ&MTy9ayaiCsB% z5ze)o4ehqEqnuOX3->`dV`EdlVhYQ09<@>B5wzGK(A*=?4<3Ip75j=gp*R?p-t>`qT{6IqJaP4!`Gs7hqToiA7kr zXVzWS!Z$VS5XvI`;nb;@LWb0dsb%{@x3bevbw%`v|76(RI>TWc*`N(oUs|Al^;9K;*IxM<9L zBKLPMfly=$Ikqodd!N3N?mcr`NrWrkE9-cI;q)v&p%G#9$x%JYp>Fe6E$KQly`C9H zxHg8@%C9A{-f=Pr-y+`cdSFE&A4PD@8rt>!Zs(|3&}U`*UO>~lJ_Y)wzeC5RgFV0u zS?9}7Uz(sM`uCjg{2bPp=C7xu$3W{RTRCyUb(-|;=e$dEP?+Y|vt_pffI;xNK|4kz zQO7IqsM_#N7RCK03h*&6N!{1q>T*I|=-s`QdQLa!F~UBCaa{>|EDh>*DRO33K? zNGJPsReHCnb1yWJ`VtuTp%2w60diPWI}Ur^Kzu@bgeF>v?N42;$SH_!)C&=#AYk<8 zK$-PuVz;=(nC?$=K6(D|sc)k%4TI0Vw%10-pZ_btX(~=Ko(r{y)eUlGD2KT&J&;h| zNqqUL_K43XT?yLR+C4Ex;M^5-B4VPGuv!aW`1AXC1L6xQwI|!;lRJ1$5A`@Dy#P_l zFw7RK4Dn*mAr&nX2uFOfh8aT8(t!+}GLcih5dy?xT_-GH8T`0xYEuwiisRb_0T9c) zHeEU5wXCn(re~v3I$YL3P@=OJAdp@aAG0Fx#inj4ufAOPtYfby*Guag4aiBR2HS@U z;qnJZr+x={4VbZx0OVp6EVIVYH}kk2V2$k1`-jSYZ{F^$riqi8my{ZHCC9b(PAdTz zH3|O}j6ldhLj9B^G{G3VrGJ=zNLd%=1T}IL`=u&O6n8z_SH`I>AXW|aCIJgXuF?Pb?A{^nx`5dB14#ZvC4f~GtWm;(2`w!x3{W-FyPr2`q1x)* z_5eiKag=<|hExmB1SSItaiJ0j7d!Og8y1{(sPM%qJ&S|~rhMgoIw=IR8~N+_4Z(}` zU*hji-Ks!7=XPd6oiIp(*j~G{uKj;AN%?yv!i!*5{x(j+5}TS->8o@r>CaCl1z`pw z(yW^jXK|*27jg3b#;|~`>Wb=Wk^KDpu?NR+XNuxSUULveeRluhq{u$-Ko z&AqCi5Rsw<;FP$-s;ZZVx+hrFyB){Lf_*!Z@Dt{4V#YH-ApF%g52*HF{RRslGj}xN zR;eEk6yHajng+6_F$cb2)Z2t}=5-69BFJv`ej)F$bMbc1*Xuve5zwPA4f%LDX5@H3 z&vfa#fQ12`G;fCVgFJr>-k_a#Xv6ebN~;i{I&H>Ac2vMPAaok%Ve~Bu-3#*-KCQIO zBl4v@rd%zEU0Yy29(Fy1N(_bK%(*FkNI4-~jYB}5pHKAP5Z))pkFMX)FElS;haVvx zL!2;x)d=C_2y2yc=#Ka;>eb{6hdIAZ8(AQcPP-B+ynXzQbAb-4Bxpqaj>NYi>hZnR z*(dg4i-$zq268#$ken(#o)WEqZ6sN1iu7jx`r5?>EprG+q)BkOQmL+!aGcZoC+Xkdw=F z4K6Ya0eO$$>r^+k24zn8nF1U~MDumYbp7j1Tz^BS9`#9QIuu!SUOi99I^jSp)TNMP zObrKA8c82P;c~Pd?0ln+a7do5&&;QnItE-Fp1`*!lNiR}2skJkDvE0+O^1hvaJH5Z zp7<=y>KEn0H2%VRf{mIWGU2)a1a}3CD{aoKunuNfM=mo%u&qr6DIf)Q6)}i`;I1A3 zXiKohh~@Y$&+2qQ(#HPy4p(~g5}sf6D8E&k6**$?8{aHM3PY8b#c2RQ0`a+Z^ZBhI-HdJYO%uA@^Ulum<>sc`JzzOi zRqYsbSVyHAoq>QIJg!>VDES(w)W^8~Ir83~+CknN?txsr{H{tE6k-O_U%Je)XLRRX zt3S`FVTzXw%Vv}sd)>HcM+`wWaWNZ2)d;*Is2EvMs)LBg7g3#~cZVtuoMV`LnRW_X z8(#q?wbt{VIwbZ8$>~!DuwPsK(-PeKnz&7JG=%vq?4ERgpxSqXi3H-`O%FJp#wh8W zYW)_cjo|cmhW#)1&h^U^qq%SWfKFx7kcm*O6tg^CQh}ALmKVJ>}gaMB&pe+g-y=2c$N$-UcRFaj8N@s z<{;1?D31}~eZ!5xYaew|*51)tWdJt5)?=Z2_MgFtA@}Y3!Cn4_ea3QNoYRYTYSJ@T z>rDV@HfM8WqK#JKa{U5LotC|jZgTW8_NPNJ<|8L$8#_eExrw|M1g-KCNJM}?!7O0& zaE_JwN~8lcEvL;0&C1MME2opz*9XhQ{s?WiXJlc3zD2KD>x|gcG=k}mx2^cT@?A5l z@Po3;^`xxXB+$w+nP9e>opV~D$keXtzE!c z5W5t?v=!-Tqh<-oc0M{6!>2#hk$^qf8Z)>@$S4yUC&LVyqw8^A*LJplLfYqk2sn{ot>49Nmn?4Uiz z4UZ!wqH$$UyKG~0iZtYCEX8ke`2`iyujL<_M?1lC$Oi5xZp440xB-Pl)mz8RmXi=x zfocX8$B@j`86Re)xBySTTX8|UY17S>NDQ#`EM*DU?khk6askx;8bggZ-Ud&!sV;Hm z3Ze0Yf>%oqSbhNy?h^H#rb2{rqprX54*+I69>5*@l#;Tae|ZtLxx`(}>ZkMU8uQhQ zT6jMPtd^y@vt$fQTREizQzEJfddOfO6O}YFgwzsdf$wqrrZMa?iJ10mp^WsNsKF2N z>nmx|)9x6&b+R1zXK4NEw1*q1BqF0YWDM3TgY6n`6LpgWg@VB$kLF|`(hZ7}Jrskx zjWUtsL_Kn=MNxTjK8p!e)G+-^{OSR#jZK1{yiAw4E>IZ?6-uN&I=3Zb5)Oio(_V@E zo5Azrl73TW5`?T`N9T74U0zKSn3Gxw%EwhK&yyXFOq{~tZ)J5^&r=~H$DHh}=`rZ} zTP&^rLn_`({^@}qj4dnRDILRvuHsZQfy3d=J3s(?lyQRY+$5HCE8D)h)o*C%!j@yMrp?p! zu$m)v(LdSSfmM&V-mSq=Al*+yXlMEk3!IV_pKf@KW5dYG`TWf{h;HcW1cX#GtrJ zG$6CRfMctt&$2515vyIYflq@A>%OZ+cQ6B#rk8BA5blm*mr0w)2@^%-w#-V`bbZ+6 zU$wh&=lHYkGyy}gjR{e=bgI|IDQ-SIznK%RbkAb5u`4O3EAzp=;If`!^a|akjhOi{ zJG$x&v#iR2f=ZH(&qnRbYEGsxw9C8gp~1erl>%L!@hzLl*PE$Xn~U9Q%%W<-&E_^T zw}}^1-zW|Wkl*#g&PB-)k1<3=r*2nQal*@6D||1p*yj5zbcm%+Jru-M?Eg0|hr>7M z@67&zdS+QWQEse{1P!Wu`_{iPzW@J_WB#^4!MxVbC@Cq49jxa*4&v3%a8&D|f}xSi zV5tDh|N8szYkB|m5|-!+=yxOVlM<|cf4IYu&wV|W@AutPGGd|Lz}2^UFb{MvH@dB@ z4Fl@X)o~uS<6t8FS>+cBXB-Mu+H*J(M5A z5)oy$34*;N6@9)u%aZ0P$8*{)^)?>o@j~37d40g(J9xkNEX!k#)@O4h>Ns!D&E#bn_OounILsc|XUX+0C0cVIFU>0uH0Y88seTFv zDz<_7MJyc2%Sfa4=d`dG;L5(8zzS!Tx=*QcS z%O^(aEz1{?fe;sO|4-dAG!dNZQ>E39JebGXt0$m$qatOR#5E&74y))T-1t?slrnNe z2xzB%2Q-^L3ULw|huF^~_9vdTk4ayM(K153a=x*mWxFF(fX{08UZO6F=F1rJk{w5^&R-O5 zA;p3fEMPs07vPehJvN^Dbzm(+5y&N@1hxpnTc7VHU(5hi>Atb^HjSQI`VPQhQ{>33 z7?@0pFBiI{Dt${Kf9#U&lW`MfX#4n|IBI597%;@!?|Q-G)GN(NU+gfyV2%!5l2#-A zNh@(E#BGKeUVy$Xq8yf++(;b^pvMf4Lh2k#O^wd=WORBaUj%NfSCEAIk|M`!Qf|d3 zptE`JKe{i|YuFqAZ{=DR{djmL_021Vn8UH>htzXGW;1kn$(~*U;lEDRJlS~r%~BLmG;0P^n!F-__d*d?6 zQAIe+&#zxxxHzSaKG_T5bl_39<@#gN?+{WTdFvvWF+|F?ri|3_2=$D+TpnkZ0omvz z&7qc=xQ*^e=#8fk9FYhOfIZc}29xk+8Hk|o36F<*to98_zS`)b^xDuYwe~M5t22%# zpKm{>u%A$Mc^(-jxNN1?9I;XRsO^d|f5Mdv9qGIQb7r+(!lqNP+}uSmp>S8Cc1o?y z;Sykpsg>&7bRTa{X+eWUwCgn;GI6y!>Uoo8{aU)6-A(=}uqVKFkgTKO@iu1gUY1Aj z;78U;uQ!#{q~{Nq8859Tq<~Yv+f1ML>6CtO zw}$%st{zRq^~w#c8#ji-CI2=?g$d&l4v*%nj9a_VW45&|%oaTRs9EwjSBi%>`@CS3 zu+H>Jo2d@y@dZ-muQ&ATb4@aI{F6qi-(_gMT)x_H$vRvifID^?*30|?$#PY?4Hl7v z75V%O79#WAYqx4mX3nC;`KzP+!woZmVPHeNe^cR4rYJ6dnknX?A~241qKsyh4$|qZ zOSav5a>mmgX=iyX);bCho3wy$e(o9(%wkCiPciGl9(fICMPP#g^K(7XY% z=sb-*FR`i;RXUjO%F^v=!0Qk4ZZjB72r>Qiij8ut$3*$Z9`d0@63uSkQ&0OS$kRvZ zsNe&fzqYy@;`VhO8Y^VCk36DD$&`DUxn1!%b8IH55taH-m!17M6cQ(W>uC~HbQ>=mEWkt*iNl~^!p;mzt$@Te|>g&UDY3z|XMogfaVdm}j_Q*Ejd>$e!MLN*z$~ z4SE_H6qlElKwfoL1@{%lGhEf+`#0MHJPqjkngM^Z{1T(>fcy9G^-Zj;`T5P+9py1^ zea@X_xUj4DMWMvLGb>NpgKq`|vA(f(t{VH@VZ5Wt|5wa=4(TYLT&RISPg7Gi!B3-a zd9K$o(Zd6q|7paz#(!{bHHXGU`yhnqig`Lc=Gt=9M<{Tb|9UO;_1ub9E( z(dx$KaXXn36hV4s>(H2VO+|azwrOPnR113_2QVRUCk3JryBzfM-Zv)@K1lzG%4U%D zVKrug#xE;*Z0JkTF!S2#a0UG5JExFBI4!Ykru)#Qk_RDZ0hCr_S9glKGEVr+@&_Ji z%gt=#f@oJeJ`50*3RdQbUFvgUS}J|4B$o+zK(MY<5I2|b@|=^%^~gd(?p&v&-0+y+>&L(yXMr_}gvQr0aA&9K6QXZR>H~ zqK!vtam|g8i3Qg~SQFmToXO(aS-vCO+`{ts&P(K(5>?;)sTrLJBcE<(>+RO*mG$$Z z!~jY3aN1*a2_w3@>#d<~3yPkd0KSJvG-3|aZfrA0JU8!|6V!!#(&xufoElAL!+a|>K-40zjF?4BW zGtkDMO5XTZ#TCV=N+c%ViP&}fP_lbczQzDMtZ6V&>G5Lw97@Q7QvIblLK?R1$aO)2 zrO3_f!&ZE<-cq$G)b?M6a?(o9J!i1N1i!D+`FyW>5{FhF`X`fUJIVj6LZEmkM z-Jng?N;j-KSgBSDbGgqVZ2_{e{aPef`0rF}h}a3U<&+628H5b;#2(k2>Z7f?^hZ%5 zi=}U+T0>MPkH_9HI?@%iqB_yfu0yv2bX_?DrtE80ejKhEiQvY|dCF?tipnUuM4d4~ zZ-{xD74_u_g_87!YfuFHIr(YzluY;FIa?ui*)tuyW7qvlgj1enAPfx%Tsy`%nhxxI#EYjt-7!R^ zE2-XF>Uf>|=4MFVX)zpu)>-BJ-r9}pIJ}?RSO=J@g_GLXohx!B=O0E^rBb8t+OYGJ zamgxn66ld5Z}e{cez0JEb*sZveKI->T&y0R9I}sHUzzr%XXska zc3ihJ+`Sx8GfrN%3N3(d=~tE93~4LyQ_;KW4}Cg*_H5B$`roMmxI*I7n}Yl=8#{_z z@l0ZwsAp%Cz$U@)a|{MQhngz08LvDTg1;Ug%?{b*(XIUwXbx8}-2x1j z*ujJ)BEl!{tkEAaobU{goHUMVf*l4rm!7)5g4!nzc&shAl^Xr4E&&ClS%D(4NG!_G)C>U~GCkloxgYYZQC8>sFF3o_2&vR};(_>Gy zgoM#WRQuU*{1Tl&n!Y3g=e<`Y9CIU5R|g>`50Ij{aVpG|k(ztDIRxLi)sgljW3lPI zjS!y!ENqD0EfN5jomzywh?%tB3k3M7BiO;oMBadnaMpT>Lic~@8UtAAuT2gdoct~j zU7_a#3)EI3LN;an6OG?%>fuo%O9>Gz<$ckPDP=*%1&N0d1*MA?8AQWuROpEJFIC`{ zeJ(#E$0?-QpH5Ww^CvOO3%uQjG5CmuGa%`_Yn-U4Fq(zJ>)u+5DU);eH-|a3O^Jy0 zH1}m+drJn)8}(xAc#o9l;!MRivMah?7HF6A7&M!_-c0!C+g z;{;veyKxBj+_F`nm_M>6PHbM1iuk|Sd+)d=vvys0%BwSjZAK}I2xF%+h$1DxSP%gr z^d6!DB3)`i&CEE60)k3YN}^(j)JQJ@GRlMq0WuOX(j^fv2?RoDNq~GS*yjDtyU*GC z`<=7T`F{I6|0oc6)>_Yc?sb>zy6*0lB4o*2Xw@^^(WS9tmi1742;#WwVoW-m=%%Y_ zFSx}h9u)tD>I=44%_5KJJB_84KAs<_ZFP~~qF79+uynt>rSnOpVG}3{cuFuSmbD<_ z$uhZ6S~Jw2c?9+<5tUe>6)vPgEhs4`wC$8le=F0o@D5j#KAgAju~qTU9a4Agp4OQ< zzm80#jjJiua!xa)Cv!bT%L9RncrtWGxwQWJ5_HnGAt9RQ5Tg;jP010Gcy!!S>|0o4 zHNSVl_jt!QVd?3^S`V3_R!!>pT-l?ja3i20E2U>#)bSpFZrRDFLH- z|10%`^(2x&5WO%vdu#Q3N!5aknN?IA`Iy_NudfHRSjWYy5J%JK&{%Y>bi&rl~6ukr{k1F z91Lp?--j`*AIv(nBoYWX>7$EHQ5Oh8H}Rs`g7bw{+XDg}+pZAtsfB~lL6<^F3O@Z@D1*_wVFMCE3S$~9dqDJ&UhLgb>RFWL62XCNgwy8|5n;~3JXgo@;>m8>mm zXi6`tKrOsNw9s3vF0AbD3IKISED(9+tb77NVvYmo(r7|J@~^Ewzk9X1Sf!~c*L37y z%+U~g)yQ#2yUnYDW2%+HRsL6gdTSHnq|;c_R(KO+6qmUM5ibWcgd`}2YUgwvGxYQv ziWDtPF4ZcD#y!j^_vQz%>8Fjy5jY2EjcRGBGzAjcR8>kIdaXL`#480vpckUS z$+2a7MNo0R`6lf0&cVq_m8)m)mL3dgIK4dDlIPH5%rh4Ce7*&+h$aN_sI(f)b{0I6 zOXDXi@4t40m<|StQ*o_lcS&!~WBA9d^m+wheZ1&DstqSodYMa;cXHImnQ~No1Inbn z`LzF%28T^bCVw9|dHeC%~g*_C>$7~h^&lKl}}S-y%VUat^wddp;!PeO>L zFgJq2=j5OVU&Gw22KWVmBOf-y9J(LCCWpr77XtX3P^&2ko|@7r8Q&%2<}0$1(M_Xi z48NKhWf=>R`filN)NnGc8|IWG3r%GBdaqvS5CyikVh0?~>Qlxyomx=go^EWnkW-imyfAyws%Uc-*aI>1-CB9Is$+P|MQLN`9o+7rc}u!!2yun`v70{?e!g= zg|lvn^vx0+h$Qp=;E(0C)!4|$NJk?G!~qJ0hW+^+-WFN@EZ}coR;~m|<#y$H=p+CJ zG_|x?!9OFZ%<6|&M~T1F)tiCz*n2gNZ!xo(M@7bsS8epL&3q^1;*l)dK zopRFqnBye|t}v(cZqGiUk3guoYsv-U=~P;fA!?lb9!|VNW``|=wIuCG?kRLt^4w%x ze>E8=N@35xEo(B*p+G-?jxO?~)iRY#P3mi+3*xC`uOIO>QRPVCiYFX0?BE+|UWOFD zlOQ1^z}h{v5hLSx87OA76fj4tpAO#u4jCxkOQ0#oWuS&iwVTotwZoj!uWz}2jo&L=sKAT=%`cp~_mqVEt(hc98e+tojxo6siL}unj0{V_iRDIgy z_c!}IIl&dfD;vX8sD)~1E@SnMV4Qp*co7t3ds*|0)+VA}xinNsQY`=oUm8gCh0<~~ zr}YM2TjVu zi7Udup7?o)@S*=o6Mq-T$8LFuG)Q|t-@GzpC*{7seX{g5|4fUFy5<`p5P8{?iH7BD zt7~K`^??eyce{#GfR44F;*E%|Co}$8IhMl$Q@WN)qdY;XW}b6~H=rXqwBCbd`cISW z$9|}G^JwH;IMRe>^vbV&F_RP^+5siymcPm2BLxf1U1x!@m>c0C94?}m9-a4 zA`kx!IeOQRYBzKTk5ZxlHf%ApnC6)>wYBs?^Us|#9{z8`-?h*5Fpm%yUqnvAr0U z2UsWKCo_OdNT_Iy7dgr8;>H=Q{Z3bIb{adj3I7rEe(2<{KLEp$9-K(sa))V!y!k8u z8zF(cT1$rd#UBSiISyRsPW~r;sl!`Y@mO8v6&jeB;9KJa`^@rZEp%xEdN*kfZ4VwgQUC?Bx^F)?@cTT7-PHHyg>R7p`p8HCRj)YB{ba_QK z`g>-SFE(vdDEznVXMn}cjDkdxVU}jb>m`K|c45U+z#X7AZ9F%&K%!YiI_3QN$xZ^j zcY^S7zz)@<&$g_VG&QFzm2S$q zT$U4bC+%P?zZoLSYRO&&88pn zWBb>R#I^L}fe97zZ?tQ`uXZnJVm6xr_(-uvfwdO5RFp!q;LY}|=o zFk45>tX_`WKv6_s8s@Vh@#DQj71`w1{MfJe1ZiO+R#qQzYyu}jB6eXJ`%uksfM^4e zsW5j4R6(EpCqwM_Llq4qCHyck8PizG2+3Y_efY^sdFR(e2M9L9>YqNo15hqSnaTHl zwUa22sjh6gG8|f$r74nuPU~Gb!Q$hNu+~n*O)-2yF670p7+z+N6>mQJ^X{%)8dy6oa`B8ETdH_PVG*1~gqyi|+V;zrfdYD#>#!^fW+hrHjanrEqYa|1kB3kM z$-er8`03D#JqG)?0!%G@TN?k!&raKe>in`nU3p+SMSKz#mE?%KvL%_0*TCqSx2p}2 zWa88MC@u?hyegW#;l(j!PxrJtpO&u9jQ1x`Mb0YD6O1WL;r(_hLK;L(!z_4P>^t_r z;{Zwb6J*qHV=fS8N}o_E$UgJwEcj>E&VPgJzmkyP2|O-u>@@|%vjADoPcZbMkr5}5 z=69{!OD+I7c;P3@@W+Q_LDTaqlQiDp<}+ipQg~P7G_XwTr5yky1-1qmp%xc>OCjW0 zfVAiT0Z4w}cd~&HXP+cLGER|j0sntg+9+{>43|SoGBT!JVa87BIi+mxNLM4>SWvnc z=McP~EG;5k%STv0A~=qb{pZ$BO&PCAtZT(FN)*r#3C|X{ScS)gVx|$u;F9W$YWATO zab9%}4_cZcipZl+v^MEYPYkBUqe9&Zh93=rz(HX>zvNhnOg=VF?&ztS^p%E+dVIDa zI5}`{gpA1!;X9^|8rYMe17A%}6+Ph=0KjPQ3PKfqvg4(U^+J`z8y**>N{W6HvXa~! z7Abtpm@G`EmUTTqN*#PLu~k))MmZ}j`Qbtl!*8-MYOJzhtk5V?`$*(oo!5tV5#jX} zO)sjV*XB(1UW^_CQ~S%I3Co*`^J<8f^7E#L1`v; z;ljsnSg2LFDLkh~Qabc~yEKZzudRt@0;64IUtuZlv7q23cW<7@S{qtBNFA&q{L<@% zgV&o{9=+uLEmrghA?HI@Wp!c`2(3pga<;VlQ{#~xRY6ru1ev|5HkjLgY-)GeTY0{# z6-XwJ_uT){KjnU_3wsj?#?SQYPFK-V*sY=%3`1o%4tQh=2nhhO@}RWkSUisoN8Rki z&5GNqo>Vv(1HlNFl8$6t^Y03_JqZ30boyW z>;BL)6Y3y+Sq-on@C3m@)qkoWSOJ!{Mdp2*N1L}OLe&&126S`Q(jMrV^D_77s3llf zOxh|FdhJx)WK5ju0qcycOl?8cT%oTB)DNkk+dCgT9%3ohss+(zc3V8UoL58TPESa+QA&t)@`Cf*fOT*?2S(VC&(V+B^EtYpPx;-oq5Fc_^GUg8O(ckh5*yAkS ze%>Z#T6fEC;%x4$z7?R(TNG&GHPO#>JM>~@p{%8Anv%d-e{nOwMFf37aOBn?JEbz5 zITnw(Ji?r>0@mK}5wg?xezRgtgks`v%J;~g>AMs?Ahq=S1->!dIBO6RC59=hWl5P* zuZ+&~3wjs&J%pirLp11s1UAiGTGnTY09)SCI%u&+{{zjyrr!?js@DwZrT*?uDRGvC z`hZtwoQV|+JrY))H6&JEQ?eV$^kE73yR7UWH#7BOQSJ8bx`|?p%vq2Ddlt8m%-Lbm8G6u!Z2D-XkDv}Dj>zl6Nwpv)9#>Nj(odI&)Qg~Md>f?r-m4P-ceJG>DRg5A zPWXr0OY3Nze}UZxTr9kzqGFZOy4K6`j*+&u*pFH-i;HzlO--E%w?0*{S3jh}cYTZ} z#BbO=lHv^Tk$sbvxPQyF?*L`;S%66_7mkIm3uiX$7^!ZH{m&N81kUH*6*`}ugP52& zn*F))*-JTWLN=e zVOIl$U#~+hCB=kN5P!{2e}r5H_aSiW7>mCz>W^{Or-i3J$U(RK59OdG1&zNWK}ZZ% zaJ*eXejt@SR~ggn;dr=|!mjKubt9_7M-N_Y=>&&fXL@bN;6{|$mgA3Rmye5Gl)RChflNc$mjAdlgPU^9wcegbKnG3sQ$Rb4t*$>#U4%{Tz*S3?@N zW`4(iEqy*{uT%cqULQa%4oSuh@6tkhhJ`QA`A*j~HE5Lq7~*XNNEZEqjj`v|@NEfo z$bPYHBhRakZFkAh)W|v}wL8wjOD4Ndw5`1?-Bv!Nx{b1Pb#aiAPG)m8;TguAJFT=; z(Yb;ml4D#Kx9M=YuB@=z%+zr*`sI*c+?_ z+8(;Ok2Q<7ABJTo7(wdi7gX|NqvE&cg%z6+ zTfeo)!NRw-cdt#o6$MV1AT?+~RRM-x06^~N_Y&x@k!NzL*V&y9i!$Y99fy6-E>O6o zDYOhWNMpGK1{Huu@_h65WbEw75(iH_1F(_e3$8BCs+e_ftvAV@XMH~?9oyHQo|W^% z{=u#3x1|qu$2n_pGI|U5>{qL^ct}O~_vmX}J9AU|_={SA39+D5MtFAAYM}#;5}ncR zHU`1PE4vhZ-%?K>B{Fo)ZJmY=wK(w?)=2hiyP)GidDHBD#Tr?{_-9Qtc8yx@v#O>* ze@a=61OO@c$9EfOTEvy@Sj*@dS;YAQQgj;$m2P&)P3T-N0GPH$;xz84@zWgD(FZ?m( zW=-bVNn>?Wp|BeP$l!+>i)=XcuhqRDN5eS3<=sE48l2&gbh}ZG8h&l09vS0rf>LQUEN-5j)j@9@ zEGTGEpW){E&tw}ImCqR#_fDzeK>mLs>u>A~koRmkq6vE@YslR?5LMRQGzQa%?EeXJ z#;tR6wkgRJaoCZ=j_xkr`zURCTz`%&mhF+QeD|ZZd#V-(vlWh ziYdG4{;$14FuGNrIk(i+{{EOfb3w`cd&LNV3yH)Fou>zCuzgpCgw+Li;w_alM*{0h z^Cep)ZrywW->7@zg4S9d6=9x|*0o&eKa6Y(?e&sg?3TK5@kCz*OX{Xo)9N!pP;{nR z0omMb<3g?=LM7`+V&m2xe8li55m_QvvtgJUUXqoJHcH0**uqWB(QXaa3MZ;d-{aMG zllx=HuYSmTh-90r#Jc=rLFrphTuq3(jVWgQWwvd9!8w?D?G5r2FjDu{M-(d!{lm<# zX59&3{##DKe@t@wzgT_!5U(5x# z!4e@2g%9W&Qg8zq#c>pZkncIOp~FS`P~)k+P9fPH7I@0a3SS#y7HZQWCnC*|X4T*CG?Hrx_YYAtw7SjaKI&ry^D_wTjA=ApZ1VMAQx{!PWRK)QG<9VL=C=?(Bk5 zl(JH-1gBR1nuq3IWw(iD3vyifJBbJe8bOTZ+~nU?AaA@(2=OVN9T4o zLEKdw1WvEuai(;SNp5WY5C_E z7U`8L528{F()*-M^H!yNY$M8GoI)znpKP66zFdKiLSGHa4L6t6QB$myv!98E@WeIw zEa;dx$>##BIL=NIKxBX(A3#W*dAqipWbgE6L<%9kxAB^Oc}d@u)R?V;odt|$+Ha2m z!~U?N!eM=J0m9Q~(y+OGoY_uR4zbVQZ8kleg3FuW7Pij&S>(J6E;?DcWBag5*0A== z^ekBeR)HOg4jZWMJmh`JE?zQzH zfh=UVm^xF^A6jplmA#L**v<4!L|Fyf{B=59>R=Z|Ox&$LxaQLTe5LnUnGJ*_nhIa@ z8r&SHfo@+^YW2i6V(EAFk@h@ki~A=TCyP~F9{PBZdhRQz<{a}YcGwwP^VhEI6RTb! zf~eJPgA4!Azy9u2N^qz<%LEdH+bCdv%DOrg|W1nV7>diFH7p_=dNw&ev?-8 zB)%o2r3_TDmYHNFwQ!5{2GISam!C#8*;VbG&QKYJ^X7Mfoog|ps#;{TwU2bpQ?&&U z{nm!x-7!iy?jo079TaZ|IXG^|s%(x>%#%dU2Rfd_N%cE@kRCNp!PU&ZCigJ>KtvlH zZIb?zlSglA*0F*xTYdrpvSqrmTajenD!yX;e!|NQ>#(~^0(T%-TVUbE>U{7lKbb>g z`00(#FEb@+l zi0{;*cr{c(dXUbof*D1ToH5g!cNC>$2f?Nn)#}gdppy}*KBiE=!Bg}}AljPWGiO&G zS1#oRqJhoZr9SaQa@VVI;+O&BMDi;}aUSIz(O*t$w_<6ddr6$)?ZA=l=#~nkR0=J$ zH@sBNJ3O7s9&m$1ayHR@=Y_|rqOZ&wKSHt>P3GaXgP9iNm54OQ2BxZNOH{d5_L-|@ z>?%&L?4_$m0;ke6K}11c2M&V-$g$lo$0-xx0FGw}U>#S3beR)~pR+75b{#sZ_m+fn zwdn)3i~8b-ymx736_*YD@M1-}o~LWRyBp+YLX@l-6R1AiDvD!?Q?u%B82`C4bx80t zmsd%c^Q#UqpfAElIT=H++Q@iN*`ywZ8RrL>pnE~SZ{+Yg`zW39-STA+YAI!ejR6W; z)msU4dL5$n0u>n8n5`gYEYGH=rc(zA|s-4lx2c5h{{1VD8h0wdEv+vg+UJh#`?X zh(RKsC#=K9nNZ}mZ68mGUq93XMJFUIfix3P^;-B8-Ahij#cB7|tEGk*$(eKe1AzS# z82#MuN-k|cGN7KFM7;qtL2rX%BX#S{um#{R09`E*SpRRS3;r*Xo@mgnljMtj5P*`rv zm7vjNUVYN-x1G4pPT@v2Y94V- z>`ek~mgeW3!7X?&=(r(zj!?v?yhgrWzh}him=k1SgG*j_C3$jWddE#Iu#?uWj7OU2 zwIwlU^nhABCGS?vWecKamUXn?XseaOR+(g6Sp<7-fr?C+rt^415;D;GHK$`I2LL_| zR!)IhX!P33fV80(5cXFWx~=wet5s5Teg3+Slpj*5?bqC0s+QWcDy&@6U%S*}yX)g$ z*k_LgHx{5oAPcjG5j{;l4p7#^=dONrnXcXYP-Qhnul*7%ubU?#e@Un$oGe93k`wRm z%>@7*)FNgT+J~AS6>Ga_+ey`~!;fPK75NsusMg-sg&`etWk|LqR{bi|EPXJG`^%?w zG`E+79u{|q-Bt-=2Bt(j2VYa_6ASQSqQ5hsx}QZ&ZOOzVArpnEFHun zS5EZLoAGocZ^-)P-C0ATiJevr#XPayYPEPC?kFBX@l2fHT3V%I&_L5kyoQ>kRx|wU z=QeX4I+HP0`bQhulr?T`T}j1FxwIMHf5=d4(NS%w2K1%(R}pxU*iC%u>m86Qw``HZ3RP5TeN1m-Y^BY0WAnC+32X#c092mTv;0GP)o7S3!E+T$Y@K<~YX z-;XPQ2v=+tyW5RvKGdD}qBpX!Rde zQW_jb3jm~9(&X)LhIUr}2iCR^O#nV3ivOOsTdz4vl7aua3BX4m{Q$`3X%Ao62I^b> z@j05qV*oa=B}&RmAtvr_=_%l8RnH<8fxAkj8x6x9a9St~HCT$1wr{DA#4?YJ35B}= z&e;*X0p^gVk#u*?&~Wx z>%a1KGETKDP5}6_Fj?m`AkOu4!~;?wEu|o-Q$2^SQ|%1OkgC~drweTI%1XQ0O^@Zv zc2C_k>aEwm6y4lg7{%I&jV_$TReQKYo&cu8FP|%^hnPYLaU8M&Ox}Dsl9=jWQGdxla=O9R-%tdbTHC$~wFlc6ia+-N5on;3-H`$y#KkVZkAH``)9^J}Em3 zRa;SJgh^E(H*%c;1>3hYNDC(rNq2zLQO_rw%fg0Riy$iYyt33|R%K8hrIvrE5M7gIZeGw}P*wp>V~HH32#_jGHeLs zU5(r9ic#|wyWtXz8O*xt#=g(+3-`5)Aosrh=JzFClH`BqF$*veKm@%U2&Ad2#aGzR zyV~~eu@M1qThJS1b1d&=x#gz97u$rvd{5vBbDmcA1PjSuaDpVyc`kaL^>!xZ@Earu zq$Sw_2@LGL;OP39{_o-U{R`IUe>Ly#ziajX&$sk4DLBG{d1P3XQ7MHSQUCRjBd5=2 zL2*Axv6RxsnOsITmb^l+dOcl;{Gpjw3%Y~t{S>B8ZA^OTvh;|j1T@<*Iz~$oJ&T&j z$g8HY8Lgrw{l$K()?u@^YmE8J6IF&35azX_6DGa=Vt5F z8ZZbKdq)1bzkYeSfevcmUoI-gr>Re(hzfPId=+RyDtyWQ6wj z%G$bH-u&7=N2!g$x*mqIEx1HyAj8A!IL9p3i^>D<;}v_~bRg@De${8tMR;<-h3JMy zq*dn_O|*q6ctC>G+y)|NJl&MhBN92{+teK&pby2d^JSDP8Nsj`chSxP_MAAVeQ1hM zk_^T7jZ-L1greV7_TU;R?|kwom!>Y2y|pC>8#wF=qXb>+s^*A_6Cl!KHm`&+PlaD+~iNb!;38M3mh{m~s>?!$#13*yDW zNK&PZb7$ec1=zl(#J%I=jz6z<=S@!6PXI^ zzbxl+nPEL$~DF^K#^wgP6H$@)jxv(PlbYUqT$@)LsPVbx{ial3By{LZX z-t%X#0>)frwbg}}vWMHKCdo6G{Vg+|>KV=;2Qsy0`2SY>bc^9mU2cFS!}j?DSEGf6<`w|RGwn)$}@voMb>6kJ8~ zu1vY{pmr0cpM6+h8m%i_Z^9FZGm@Q*t+Su)fp)Ld-^}yHgg+;D)Za*XS~qWr7uWI4 z;mngfX&LkW{HE~eVL{4ub^Qk}Qlsvue{m>2LHb+Vnm<)1x>!UDaaJ{7)Ij$#Go{Lr zd3L+KjA9SF-%p#GIt133Q!>FRS#vHrl6N#J*pNFnpijR&eW!VH){ zq!pkfIi;6>t0cvo;=NpXn0Z(udBE&XsSULJ6x`+D3oBd*C}6P^j+1DwVU}%twjzCZ zN1ZueMZpP@m68F5jO={Ollj`pA{IfqRdAS3Db2fB-Er7**QsTTV2uKv#OyOMfEG0!UtkYipyy<{CiVBYZ2 zD?<*zJmxuwA1u&RL5+h;Swwn4DAW+EwBpJQ#s^GlJhw8>o*%1{i`in{_#K|r65Thh8fRRw? z)-)>KTySjH#7z?Ixj+u?`@;_^hor3uA39TjF-T`$GPM&vcWHu)B86HMAD_;j-5GDi zC9s5{bY*l?n6g1qU_Mv7F^)L@dbM_N23|{KFNUrS9w7B!YGu7{dlWvs*smR&+tTykCu<0?2549-rV{vZy^F>JPo3pAv-7r16F(5%T4O5CvfBrwE%zrvof#gBgFarZ z&OC?6aN}Lz@jX1OG047I6?%1Sf097o;YICZyjg4yPcMFN-vNyR3;J)=HyR}S0;^CO z&O`kG#ws&g5x60+U$-yfEwg|VA57@>@Jw@!Sa^{s9pjJQ=En7^(YE#S{J(&X{HIQ~d*`|~tOQ~{ z#=U3b{b)my0^%dSWE^DPTsBJtJCPBT0&BkIKQRDi8&CKZ@8zHUj79xt)#}dx=NAkX zFU+x^OtX|6L6Q|1Bl==yBU=-4a#o?%B@3{oW=Somu3Txs1y*5Q(l@@QQ_Ot@lqH%5 zA|GE#!(+AuA}#}DWfVZ8cseYxngE>AgnBqHfB3DaQ{+9$C|+B8-KzLvsYn_Y%({|)V`~nOsMqf#G{63>t zEvFZ}ISFpCq4YS7nOwRIv}5V6P}BqTY>6Y5?gm?0wU3dL$;CwY%<@DnRhPsE%PVWi ztI;CuPrF6@<)yvXM>m(Swug_P071;dK{W;3-Q za62%bK5#72Vev97o=$U(wBKntlHHbqyG^Vo?PD!4zA9Zcz85!oW4hXk1(8ssVtsfK z+cg3@)7IotBQT&W0OJtgH4OMQDIzjb*T+_<+<664G2bzB;B}@BtH9#wc2%|PUcol9 z6}ev_c5p?Cd0^0+uA<*lvCt*qSUoKa2dWmplgm~to*`v#ENps=&OqLmd8f( zbVt9YF(4vzfRTEMvdD+wodC7ChteAl(6`+{~JJ`*q+(;Cc(y zy0xG{uWEIr8egvv8{Qm*WjSAf1Jqa*d>H}&3)tGYw5Wh}!6kZ0%a4F(1rr{blwE-?^+~&16Z~=n=csJ1fD*c|Jp#t8d~!4Cr? z%RpVtX-IIsuaR&^+be zCV*!w>fC=uMCJtLsAnv7jFId;+5f=KI2%qY7xd2bP4~VN(TxZH@%c{^W@hCcti2!v zA=I|icm;}`nHFAu0{I6;CNtPXJjKxIkU6k9S76oAtCQDA&;&8Ua_3%gaTZj{hFqhWid74FONtn7X#S-+H{ zZV(O6;>*8n3%krapo9V3Fde?DWLQY0WE_LJZ=7)FP2p#LLo&`y^kAY*xj=6pU<^z| zlI;1bzMM(zJ*DroAs`a@;xCCFJ@|ZHd%dDZMqz`CXBc712G^-f2s?F))^W8!=8@{jfjMWS9Ah;=>$G9ZcX%h zM!qGL5S~Z%0t$}+_`e0ECCUe&{~-t8s|x@T$rS}j@Cna!1uj);AYaryS~+2Ww?O@% zq*dB?0`<++iJ1#xw+R$Ii9EAIDTJfDu+k|4Hj7f*0$K*Nqh1uJND{eYAV}~1yZ@tC8b9rGwZC`QhpOC;?B4@E8Hv}EgDAr zwWdo>7Prz-xTvFliUO-wCAJIO?+GL<_ajPwUnuo&S=`hfoQ$InOvGcG2sa=`7h6{JTKu)7>hFJdoIO1_Vs$U$u{H>WN1v>9Se)5xwI80hj2DU2` zl3+(w^UOxaRK%)l@4U*mDj~nLz+P@s--M}NhpDCV3Ss)DIkxgad`a%5c z05N~i2VuMrEvr~N7&^t3KZa`EIM~ObafUT#Do)HzYMCs&Jx1*;jaZ3D-NPZ6RPU$r zY+_}g`^_yM2|3kyfrJYuU1f}74u3Og1sGA2`YZ8T6{xGrv9Zgsl^p7{@nCAcgcIok zYG-9HzYTyVR4T9Sb7%-SBvN?nohMOrA#p@^4#8fMdYG^OL;%NQ+3XP7chDHr1 zG2c$!8s@#cnGw8WwLb{H^mN4n6*b2x$n-4a;D8x@X`E26k~>EQ+Ps!UbG|W2Ml=DCTE!W2Q#(X*Rw z`8(gR3rY~&Alz(Lcny-b+wzr4VcF>3Gdyl~P5x^;KqRxOZomYvCzPB1qhEv3dR+8=kM25^O^eD9@1;-A7+{E^-1Vk{Ewwq)_X-cw~Q5nZ> zv$~1xDY)eXbmvHwy+#UFgBGC}ZUk0=QxAwTrlyErN0m({u5G%b6212?lN^~JA0Sl^ zb#$Tur(yhP<$1%mln}p!mU7UxfgI9mL|RP4j!yP_k@)>lR(Lf^mVaIq<5JOUEgjST z*VO&N)WGO+-e!t*PHiz#iZWu;5IHe;1rp4hGYg>3jDrk`(~rk`QLDk@Gscc6H4EKw zMl!Cl8Eh+o+P+u% zALLD`!ml3X$UynOsY-8l288cHr<-jSyiC~r#O>oQ+=%paom@q=WK0C%p|_zZsX9pC zoN~XR+*J_nN3yS-^|9}GDNn1NRHC?&XpLBVIT9_n5%hj8>n*MxH?oKF-zPrjUKaj3h$P!PZrqGllgj8fHCKlydP1x?@;Tb@da??-Xu32R? zolSx$=mzKJKP)?&*}rLPGWGDajN*K#!eq_L4W>M$j;XzU5&XD&F|^i7;F8}S<`koN z_?}XFN2qO=*R)_YPz~K~qR?u$bzwvAN)ML3Eh$|*PUs&Em*+;6P?TM%06Thz`n$z3 ztGVb_pWKA1*oyTX6r_n}B%(|lBY)MFIbhF4=fTS!iP@gnTIsfsf(iYJ;Eg`_ZcBe# z`6J7lvMnvK>uxaGXK%FwWJ{4<$XTZ~Z#iV-jj#yyJMDjN$LXkT5c#yGd%5Jk67l0= znQ>rgchfKSBWOubHOsNW)n61|?R#C>O;jGb@PDe{x-{VRE(0Tra6=JLZQSmYf_ zmzNBb&S(q-26t9Z8VY$ZrCC13)!9d)Ev!ou41q2|P_+a{Ggi$F1}i4qlNUjnxxr{D zm-JQIn0&b5t7IIf`;|oK;f+2>GsxILVDH;3X#n1)404G(JVwdUaxC7PQxJ@a6agKJ zH%=<(H&St+>Ba0=TT;pETa+F^Y!t!ilg()}n1aJ`?C@{89eCk=>I`5_j;6F9fJ+PGxeZ9qe0D-aN@ z_qfs&|8lxC7^8v#{((DS#;g4WCMUD2^3D5&*@iKWPbPo~y}6_e)-3`)9EPJUVE?`# zUk#6LNyc9DFl+j}h|*B{dY`*16v>i){wkM5n>=o!kg)t9>v$5Cw_)4-!fI(-9vRKL z*A%%t)+cJCkKx)x&L#?;ElLT$&9Fc@3{F(^T$^Q%EiE@d{OTn764d2gc?sOOcoed> z%{L@yc}jGF^Gz7hQ?wckR=i>`j2EGPAxhV?A+V*V-_jNGbX<>!6t2#C!T+I*ZbkH{ zq1{N`lWlp2Rin~2yuPROoWcQt`;aP$mddzc8R^8E7o}Gd0GM!;_Ok#y#P>Y{41t+3 zCiX7`)1Iwxu{tKV^45Q=#!LmxpwD%3vc}--(Kz%P$=Ktiw45VF&M;Jefo}Wk2*cEd zmvt)!CI|Rp_{rgwXF{h^cZirhyB5F19~N7e4&d9Sd|#gr=N-+q)KnS0~ ztY=Bhm-I7@OyUk@V-C~ySoZnSN?1BG;mak%%Z+X;#yg2=$K5f3t6<`aE|5MsC0b%H z>!Gje)k|__p}AWS5J%1qxXv0xt1x-f1HDzAfEH6O2OT%qEEgX-$eB)+yLP3bn?zGj z#!;SMO~&0@5zH>#y+eIkZq0|Twc9VRq+$wiWQGtdLp>Ly+tuCDwo&1r_BoztlTi5* zSl&$!&QAw~vH1O@mq4?nt`-@;Mt)vxxc!ZXN)<2qH-A-+^Dl)Vuh%u-U z#hg*)`dkip>4s{?8O22R!-t0UX2LE563NPMm%@U1M>R^_6RMi^h%&h7Ex>I}^r6xT zwOd>-Z1A-M?|2lD-r`d^qWD+yc#{NVtufRW?ql6qj$Ht+X)ryEm+9frg+=@j8KsPl z8Jkf%X8EwIA@yOPfhY}Vg^nfxW5Smv(RloF;THqFv;W&&QfI-@eA!J4IL>Y`Wk4pxNK+)hw`*(<$vS)iBxaQU8$SKo&I zDfkSI4k<(C7TwD_N5*e#+R3~C-Zc<{;+B;{o?AZPAHdY#q}B-z2;M)xUrDt4D2jWXoO8b?F<*yF5w#HU8pN+l3d#Rso1>+W_<2mphmZy}UxAGIEbP3*eAcU)k3O_!MU5-JD*}<^U)PVVSoa0?Y`J}wtfnxenk~0m- zf7fJ~(R4>S+bsPyXe*&;950lXlW1CPt8;Q=riFVbo+Tbjfc% zFXeW3FzwBcVk4bxPq_*I+;?E;c4Tv5am?^}VF}Ey)p$BG1%8u~oIgfx*Ryh?%5AW9 zdQ+bDb9uab2rbUN%10TEUKh*yCE%qp`eNmihpK2$0=xZ|69{YnN}0g)3)<65KopU8 zlk5-6p62(yonol0v^-kF_U$>%JVFbyI=~rr-&V9Y&;P?T%D1Qu;74`1@X<}`p73GF6?JNcz$Or)!8(-X# zJ<4p>m4y~W_dAHK3QsA=$#N46tkEkuV?}Vo=xC~CCWOW^ z`2ZQU-uds1yoM~a#r4J=)HK@$v?N$Qo;gSFnh;HdE08xlKn+0Lq*&+{$w4D{l_uDCjb?^9>JjX z_aA<5-TtmWzuS!ODt?i;*uMlk0{-Fs_m4s1MN14hxP|1SGb1gAae_IlYO3P?;W&Z- z9K(NjNqq2SX1d8%CF8iq7KP;Jz|&rLC{sX4_{%rzKbH8dlNc1&@*%m2Uz`U$P6SRW z76Z{eO&s#Q@^5%_=!R`Q%;0Y?V>^B;DvJ#K`Iw(eO2!)hZS zX11EF&I9z`bq{3IX#emGmy6Jo_<=h-e&znY04%A##KO*k9;R)8q9YMwltXh7QA-4Z zXb&J}y^kd##BKux4edMJ0P4DNC2nPzH_M{omN|RA2>uN$-Oq>*%&ZEX;h9-3LjQ}Q zed{-vIsIpbi{y9E5k$(DZ)D%EC;*mLNZ|Uxpm{V{c8ThF6WBEGZ?&#S`u@j`Zjkr{ ze%n}*^UO9l=kQjOl`Bg_c~suLHu@5ti;fL{jM+6$rA`VKR>vHVU_|oS;x_f^$mqqU z%9h<%Nn^uD)>hYA$3mNbtOr=|gk|11K8aXDZaaz~ucQ;nWWX}hl(ZWN1~;m;c+`5! z!mKg+!Y%8QD`>x{mtvkwAvZ zEmCmJ4LduNk7JS^;^KmlQ+=Z7h3dDwjhcPw^f}kbN9U z<30B*IjEPmt+aXkJs$9t1Li!$S!LYDwWPK@u9&Dq%sy_MAS@Y1CfO}!HB|njZ(Q$` zS|+28F>%J)uUL4xW?Nz1T*wJuj(hQa7B|p`zs4Cpvj&QGvd%|?L+;M-N`q<63e|oF z7mPzjv~F4&udOyTN1I67(V7myYt`x|gHf%}WMVZ=U(t~4>zwvrFr3I>;oI<9D81&D zg{3uAI(2BGJe2{!coFx>p(C;1OV)76cEKrV#T#lu?W@29QGOx=kb8> z26zgENDJ-(w#9Ycq{|nXCQ#BDSC>rM0mM-1ct`QK@;Fyj`8yZAJ8Yu5EYke%(V8$t z`ZA8ZN*dMvMp!*w^XBkdetz?&5vof$=)n>55s zI4G0I�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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P131_FlowDirectionOptions.png b/docs/source/Plugin/P131_FlowDirectionOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..4e7605df79b8c8b579378bf76d52e13d3f19e84b GIT binary patch literal 12931 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 rvu%uRH>ZJg-k55NyEO`s4nX3-7}}6Izt40 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 ke#D{!5}vV;Da;pbgl#cG<;h1K!;SUH||9 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P131_SaveError.png b/docs/source/Plugin/P131_SaveError.png new file mode 100644 index 0000000000000000000000000000000000000000..f17023400469c7020a5bb7da74c525cfa64ba5d5 GIT binary patch literal 1943 zcmb_d`&ZHl7XRj3Gwh+J<0P4rN{(q$PC1I?ql2%cu?MLMj;t1%g5oPtDV(NqR&8c& zb$mc=Q)VWZdlUu~B`29J1sPvW;$vWv5&>BQ)UUwOnSWq^n0wB>pL_1P=iJY|Kito) zQ;EoJ4j(xH0I)4KCOQcKEL7$^%+AIfLkbZBGuULrBcsh|w)H43#SHeum}C+FKz{z< zTkiNnJj_MM!V~8Uqccgk0z9!0Psjsy*?V~dfGspOI^s+zMk$FXm>J$_lTLrJdu6?Q zB(_iE)wd#5p5{?kU17cu`tgikB1$Z+@S0d}N}Bd;+`g=_!&j>jZvUL$Q=b$Edr+Um zf0I=LH*#e{k)KD|0<3wBF>K41d zs<||VXfkTMl1-KC0X0{?9H4}6h6d}jxJuIe0} z(ws-6*re;R1XNyZ6lVcbaiCOGrgHy>y-J~Qkzi~7Wm4wY0utHvD$qHBPW__+b}BLW z`is+hLCu3T=kgt0PVYVzq=VX3*x1P;$D&Z)K`~WOE?f)#E*mZ&6&1N3wtYd$wSH5& z>}4fRts>J1hk83s4=6wi1_f3RX$BhNKzGK;nU^o~75$morw!T??7fh4m9M^N*Q>#d zz+Q%^fEHgQ@8DT|N~-0=>Kj*Dc*8JA&F1rU?0VUFy56k=Gbd{LeZEJa$!OZ!C#x=N$5#8We$x z3Dt(?r7)lQs926qF71jTluEvUEQcE;!&_Q)ibfEE@obkwlfwty;7pZ4Bis+vra+Nn!ffh2WjZO+XI zJaWbHV8j!8NhSO`I~xn#C1L8$-6XFi@!_2THS@3OMmA$3T&kID(Xfv#Zf@lAE4VCT z-Ei5vg~~$Ca093N9N_lq6d%qL3ve&fdyzZBgx3~epZu|a`MPR*6GIgdf^zf;rOLl? zt#9z!d_x7Z2-n#+0$n6WMdpPZ0{ocP^F6c;@~5@8n1RBxBRyH-nOZHX8YAr?Um&V` zwqwKI1A`txF+}W@A;`6Rj#*@9zU-0dlkQP&!7}V7#$u=k?niEwS27mDLv-TBc&|Kx zQEm6|Thd5MP#rkYG5lZ}dxS0b{62fLeExE0h51lzQjwvtIN&jk=FMiUF58XC$v?i` zU&B4bCd`&JPxrmH1WLVa>{V*fS8x9dhOj$rxE{{@`yq_X$9Z$(Y7Q}|PEF=e1xg-z=uqFNBu){|qm`wSY;RdEWTG44h!KvX%}nBcJX@ ztDj~hxThSQX5DA?(o~IWw^Ot`nX{vOxVCs5yd+D4;vqn3s^@MAD|>$%kXkZYIl716 z56-spMoqlZ%9ytueZ#G8&wkyI-=J&LIXKhjRZ8qrz}|u9u5ROykS-1XNlOXUpsCE47l=J z>GcEM^#h9lE2QFk-X_9&5{&~E(EHe{j#4!2>*7j`@kQ$xWRQ9Cua$@YQ+NisReuWF c(&V%WxcB6BLh;tFiVyl4dm=HK5t&Z?AAs+*`v3p{ literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P131_StartOptions.png b/docs/source/Plugin/P131_StartOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..d151719967e394b31e5ce333cf1f80e76f7c5e39 GIT binary patch literal 22450 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P131_TextPrintModeOptions.png b/docs/source/Plugin/P131_TextPrintModeOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..cbfd4c7b1416b8d3a0fdca4a040778a8ed176e04 GIT binary patch literal 19653 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P131_WriteCommandTriggerOptions.png b/docs/source/Plugin/P131_WriteCommandTriggerOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..019bcab9b0b96ce47a34195ab46eb402a6906f26 GIT binary patch literal 7602 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 L=~di*^6LKpaHSgz literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P131_commands.repl b/docs/source/Plugin/P131_commands.repl new file mode 100644 index 000000000..104a360b9 --- /dev/null +++ b/docs/source/Plugin/P131_commands.repl @@ -0,0 +1,26 @@ +.. csv-table:: + :header: "Command Syntax", "Extra information" + :widths: 20, 30 + + " + This plugin allows dynamic configuration of the command-trigger. Available triggers are: + + * ``neomatrix`` + * ``neo`` + + The default trigger is ``neomatrix`` + "," + Some commands are postfixed with ``cmd``, indicating device specific commands. Not device-specific commands are genericly applicable to all *Adafruit Graphics Helper* enabled devices, using the ESPEasy ``AdafruitGFX_helper`` module. + " + " + | ``neomatrixcmd,clear`` + "," + | Clear the display, using the default background color. + " + " + | ``neomatrixcmd,bright[,]`` + "," + | Set the level of display brightness, range: 1..255. If no brightness or 0 is provided, the Initial brightness setting is used. + + | The maximum brightness allowed is determined by the Maximum allowed brightness setting. + " diff --git a/docs/source/Plugin/P131_leds_hairy.png b/docs/source/Plugin/P131_leds_hairy.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea944a0825eb761d178f94e84bc924a0be14425 GIT binary patch literal 100989 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

*3<9X(0Rbi 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͇`6D9ADQ-D3m9!=puVA?sQYXGHaY_5Sg@AP%H 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

OAu|)jgDr#-HU~Tuj#G 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 S8NfevKzdrnny=LDpZ#BlddgM+ literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/_Plugin.rst b/docs/source/Plugin/_Plugin.rst index 4fec8d521..d696e2685 100644 --- a/docs/source/Plugin/_Plugin.rst +++ b/docs/source/Plugin/_Plugin.rst @@ -149,7 +149,8 @@ There are different released versions of ESP Easy: ":ref:`P124_page`","|P124_status|","P124" ":ref:`P125_page`","|P125_status|","P125" ":ref:`P126_page`","|P126_status|","P126" - ":ref:`P127_page`","|P127_status|","P125" + ":ref:`P127_page`","|P127_status|","P127" + ":ref:`P131_page`","|P131_status|","P131" Internal GPIO handling diff --git a/docs/source/Plugin/_plugin_categories.repl b/docs/source/Plugin/_plugin_categories.repl index 43ddeeb55..2a83dbe79 100644 --- a/docs/source/Plugin/_plugin_categories.repl +++ b/docs/source/Plugin/_plugin_categories.repl @@ -1,7 +1,7 @@ .. |Plugin_Analog_input| replace:: :ref:`P002_page`, :ref:`P007_page`, :ref:`P025_page`, :ref:`P060_page`, :ref:`P097_page` .. |Plugin_Acceleration| replace:: :ref:`P120_page`, :ref:`P125_page` .. |Plugin_Communication| replace:: :ref:`P016_page`, :ref:`P020_page`, :ref:`P035_page`, :ref:`P044_page`, :ref:`P054_page`, :ref:`P071_page`, :ref:`P087_page`, :ref:`P089_page`, :ref:`P094_page`, :ref:`P101_page`, :ref:`P118_page` -.. |Plugin_Display| replace:: :ref:`P012_page`, :ref:`P023_page`, :ref:`P036_page`, :ref:`P057_page`, :ref:`P073_page`, :ref:`P075_page`, :ref:`P095_page`, :ref:`P104_page`, :ref:`P116_page` +.. |Plugin_Display| replace:: :ref:`P012_page`, :ref:`P023_page`, :ref:`P036_page`, :ref:`P057_page`, :ref:`P073_page`, :ref:`P075_page`, :ref:`P095_page`, :ref:`P104_page`, :ref:`P116_page`, :ref:`P131_page` .. |Plugin_Distance| replace:: :ref:`P110_page`, :ref:`P113_page` .. |Plugin_Dust| replace:: :ref:`P018_page`, :ref:`P053_page`, :ref:`P056_page` .. |Plugin_Energy_AC| replace:: :ref:`P076_page`, :ref:`P077_page`, :ref:`P078_page`, :ref:`P102_page`, :ref:`P108_page` diff --git a/docs/source/Plugin/_plugin_substitutions.repl b/docs/source/Plugin/_plugin_substitutions.repl index 9f0022404..56e782b5b 100644 --- a/docs/source/Plugin/_plugin_substitutions.repl +++ b/docs/source/Plugin/_plugin_substitutions.repl @@ -11,3 +11,4 @@ .. include:: ../Plugin/_plugin_substitutions_p10x.repl .. include:: ../Plugin/_plugin_substitutions_p11x.repl .. include:: ../Plugin/_plugin_substitutions_p12x.repl +.. include:: ../Plugin/_plugin_substitutions_p13x.repl diff --git a/docs/source/Plugin/_plugin_substitutions_p13x.repl b/docs/source/Plugin/_plugin_substitutions_p13x.repl new file mode 100644 index 000000000..d57a42c3e --- /dev/null +++ b/docs/source/Plugin/_plugin_substitutions_p13x.repl @@ -0,0 +1,13 @@ +.. |P131_name| replace:: :cyan:`NeoPixel Matrix` +.. |P131_type| replace:: :cyan:`Display` +.. |P131_typename| replace:: :cyan:`Display - NeoPixel Matrix` +.. |P131_porttype| replace:: `.` +.. |P131_status| replace:: :yellow:`DISPLAY` +.. |P131_github| replace:: P131_NeoPixelMatrix.ino +.. _P131_github: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P131_NeoPixelMatrix.ino +.. |P131_usedby| replace:: `.` +.. |P131_shortinfo| replace:: `NeoPixel Matrix display` +.. |P131_maintainer| replace:: `tonhuisman` +.. |P131_compileinfo| replace:: `.` +.. |P131_usedlibraries| replace:: `https://github.com/adafruit/Adafruit_NeoMatrix` + From 82b88a35fb7dfc970edfb9941b269cda114e28ec Mon Sep 17 00:00:00 2001 From: uwekaditz Date: Thu, 21 Apr 2022 22:08:59 +0200 Subject: [PATCH 18/89] [NEW] css style xwide 1. new style xwide for html items delector and textbox with max-width: 500px and width: 100% 2. new prototype for a table data cell html_TD(const String& style) to use special style elements, e.g. html_TD(F("padding-right: 8px")) --- src/src/Static/WebStaticData.h | 2 +- src/src/WebServer/HTML_wrappers.cpp | 6 ++++++ src/src/WebServer/HTML_wrappers.h | 2 ++ static/espeasy_default.css | 6 ++++++ static/espeasy_default.min.css | 2 +- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/src/Static/WebStaticData.h b/src/src/Static/WebStaticData.h index 7f442436a..7e339b7ac 100644 --- a/src/src/Static/WebStaticData.h +++ b/src/src/Static/WebStaticData.h @@ -84,7 +84,7 @@ static const char DATA_GITHUB_CLIPBOARD_JS[] PROGMEM = {0x66,0x75,0x6e,0x63,0x74 #endif #if defined(WEBSERVER_CSS) && !defined(WEBSERVER_EMBED_CUSTOM_CSS) -static const char DATA_ESPEASY_DEFAULT_MIN_CSS[] PROGMEM = {0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x2c,0x68,0x31,0x2c,0x68,0x32,0x2c,0x68,0x33,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x37,0x30,0x30,0x7d,0x68,0x31,0x2c,0x68,0x36,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x3a,0x27,0x27,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2c,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x74,0x65,0x78,0x74,0x2d,0x64,0x65,0x63,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x6c,0x2c,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x6c,0x65,0x66,0x74,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x2c,0x2e,0x64,0x69,0x76,0x5f,0x72,0x7b,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x72,0x69,0x67,0x68,0x74,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x7d,0x2a,0x7b,0x62,0x6f,0x78,0x2d,0x73,0x69,0x7a,0x69,0x6e,0x67,0x3a,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x78,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x73,0x61,0x6e,0x73,0x2d,0x73,0x65,0x72,0x69,0x66,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x30,0x7d,0x68,0x31,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x36,0x70,0x74,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x38,0x70,0x78,0x20,0x30,0x7d,0x68,0x32,0x2c,0x68,0x33,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x7d,0x68,0x32,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x30,0x20,0x2d,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x36,0x70,0x78,0x7d,0x68,0x33,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x45,0x45,0x45,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x31,0x36,0x70,0x78,0x20,0x2d,0x34,0x70,0x78,0x20,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x7d,0x68,0x36,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x30,0x70,0x74,0x7d,0x63,0x6f,0x64,0x65,0x2c,0x6b,0x62,0x64,0x2c,0x70,0x72,0x65,0x2c,0x73,0x61,0x6d,0x70,0x2c,0x74,0x74,0x2c,0x78,0x6d,0x70,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x2c,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x65,0x6d,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x31,0x36,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x68,0x65,0x6c,0x70,0x2c,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2c,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x61,0x79,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x6c,0x69,0x6e,0x6b,0x2e,0x77,0x69,0x64,0x65,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x6c,0x69,0x6e,0x6b,0x2e,0x72,0x65,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x72,0x65,0x64,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x68,0x65,0x6c,0x70,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x32,0x70,0x78,0x20,0x34,0x70,0x78,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2c,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x33,0x36,0x39,0x7d,0x69,0x6e,0x70,0x75,0x74,0x3a,0x68,0x6f,0x76,0x65,0x72,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x38,0x70,0x78,0x7d,0x69,0x6e,0x70,0x75,0x74,0x2e,0x77,0x69,0x64,0x65,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2e,0x77,0x69,0x64,0x65,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x30,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x30,0x25,0x7d,0x2e,0x77,0x69,0x64,0x65,0x6e,0x75,0x6d,0x62,0x65,0x72,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x30,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x37,0x65,0x6d,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x2c,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x33,0x35,0x70,0x78,0x3b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x7b,0x2d,0x6d,0x6f,0x7a,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x6d,0x73,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x34,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x72,0x65,0x6c,0x61,0x74,0x69,0x76,0x65,0x3b,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x65,0x79,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x35,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x35,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x3a,0x68,0x6f,0x76,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x2c,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x2d,0x6d,0x73,0x2d,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x66,0x66,0x66,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x30,0x20,0x33,0x70,0x78,0x20,0x33,0x70,0x78,0x20,0x30,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x31,0x30,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x37,0x70,0x78,0x3b,0x74,0x6f,0x70,0x3a,0x33,0x70,0x78,0x3b,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x70,0x78,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x2c,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x61,0x79,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x2d,0x6d,0x6f,0x7a,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x6d,0x73,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x39,0x70,0x78,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x72,0x65,0x6c,0x61,0x74,0x69,0x76,0x65,0x3b,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x36,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x36,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x3a,0x68,0x6f,0x76,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x66,0x66,0x66,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x38,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x38,0x70,0x78,0x3b,0x74,0x6f,0x70,0x3a,0x38,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x70,0x78,0x7d,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x27,0x4c,0x75,0x63,0x69,0x64,0x61,0x20,0x43,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x27,0x2c,0x4d,0x6f,0x6e,0x61,0x63,0x6f,0x2c,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x3b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x38,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x30,0x25,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x37,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x32,0x38,0x32,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x2d,0x31,0x32,0x35,0x70,0x78,0x3b,0x6d,0x69,0x6e,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x35,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x31,0x36,0x70,0x78,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x69,0x78,0x65,0x64,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x76,0x69,0x73,0x69,0x62,0x69,0x6c,0x69,0x74,0x79,0x3a,0x68,0x69,0x64,0x64,0x65,0x6e,0x3b,0x7a,0x2d,0x69,0x6e,0x64,0x65,0x78,0x3a,0x31,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2e,0x73,0x68,0x6f,0x77,0x7b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x61,0x6e,0x69,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x61,0x64,0x65,0x69,0x6e,0x20,0x2e,0x35,0x73,0x2c,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x20,0x2e,0x35,0x73,0x20,0x32,0x2e,0x35,0x73,0x3b,0x61,0x6e,0x69,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x61,0x64,0x65,0x69,0x6e,0x20,0x2e,0x35,0x73,0x2c,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x20,0x2e,0x35,0x73,0x20,0x32,0x2e,0x35,0x73,0x3b,0x76,0x69,0x73,0x69,0x62,0x69,0x6c,0x69,0x74,0x79,0x3a,0x76,0x69,0x73,0x69,0x62,0x6c,0x65,0x7d,0x40,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x69,0x6e,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x7d,0x40,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x69,0x6e,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x7d,0x40,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x30,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x7d,0x40,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x30,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x30,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x31,0x46,0x31,0x46,0x31,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x31,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x43,0x46,0x46,0x39,0x35,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x32,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x39,0x44,0x43,0x45,0x46,0x45,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x33,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x41,0x34,0x46,0x43,0x37,0x39,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x34,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x32,0x41,0x42,0x33,0x39,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x39,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x35,0x30,0x7d,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x32,0x37,0x32,0x37,0x32,0x37,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x31,0x46,0x31,0x46,0x31,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x35,0x33,0x30,0x70,0x78,0x3b,0x6f,0x76,0x65,0x72,0x66,0x6c,0x6f,0x77,0x3a,0x61,0x75,0x74,0x6f,0x7d,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x68,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x68,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x38,0x38,0x38,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x37,0x30,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x36,0x70,0x78,0x3b,0x61,0x6c,0x69,0x67,0x6e,0x2d,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6c,0x61,0x70,0x73,0x65,0x3a,0x63,0x6f,0x6c,0x6c,0x61,0x70,0x73,0x65,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x3b,0x6d,0x69,0x6e,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x32,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x72,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x64,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x72,0x7b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x64,0x7b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x33,0x30,0x70,0x78,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x64,0x7b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x33,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x72,0x3a,0x6e,0x74,0x68,0x2d,0x63,0x68,0x69,0x6c,0x64,0x28,0x65,0x76,0x65,0x6e,0x29,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x44,0x45,0x45,0x36,0x46,0x46,0x7d,0x2e,0x68,0x69,0x67,0x68,0x6c,0x69,0x67,0x68,0x74,0x20,0x74,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x64,0x62,0x66,0x66,0x30,0x30,0x37,0x35,0x7d,0x2e,0x61,0x70,0x68,0x65,0x61,0x64,0x65,0x72,0x2c,0x2e,0x68,0x65,0x61,0x64,0x65,0x72,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x38,0x46,0x38,0x46,0x38,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x38,0x70,0x78,0x20,0x31,0x32,0x70,0x78,0x7d,0x2e,0x6e,0x6f,0x74,0x65,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x69,0x74,0x61,0x6c,0x69,0x63,0x7d,0x2e,0x68,0x65,0x61,0x64,0x65,0x72,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x31,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x44,0x44,0x44,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x39,0x30,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x69,0x78,0x65,0x64,0x3b,0x72,0x69,0x67,0x68,0x74,0x3a,0x30,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x7a,0x2d,0x69,0x6e,0x64,0x65,0x78,0x3a,0x31,0x7d,0x2e,0x62,0x6f,0x64,0x79,0x6d,0x65,0x6e,0x75,0x7b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x39,0x36,0x70,0x78,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x62,0x61,0x72,0x7b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x69,0x6e,0x68,0x65,0x72,0x69,0x74,0x3b,0x74,0x6f,0x70,0x3a,0x35,0x35,0x70,0x78,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x20,0x74,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,0x6e,0x74,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x20,0x34,0x70,0x78,0x20,0x30,0x20,0x30,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x70,0x78,0x20,0x31,0x70,0x78,0x20,0x31,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x31,0x36,0x70,0x78,0x20,0x38,0x70,0x78,0x3b,0x77,0x68,0x69,0x74,0x65,0x2d,0x73,0x70,0x61,0x63,0x65,0x3a,0x6e,0x6f,0x77,0x72,0x61,0x70,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x2e,0x61,0x63,0x74,0x69,0x76,0x65,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x20,0x23,0x44,0x44,0x44,0x20,0x23,0x46,0x46,0x46,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x44,0x45,0x46,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x6f,0x6e,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x65,0x65,0x6e,0x7d,0x2e,0x6f,0x66,0x66,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x72,0x65,0x64,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x38,0x30,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x32,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x31,0x70,0x78,0x20,0x31,0x30,0x70,0x78,0x7d,0x2e,0x61,0x6c,0x65,0x72,0x74,0x2c,0x2e,0x77,0x61,0x72,0x6e,0x69,0x6e,0x67,0x7b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x31,0x35,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x32,0x30,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x62,0x72,0x7b,0x63,0x6c,0x65,0x61,0x72,0x3a,0x62,0x6f,0x74,0x68,0x7d,0x2e,0x61,0x6c,0x65,0x72,0x74,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x34,0x34,0x33,0x33,0x36,0x7d,0x2e,0x77,0x61,0x72,0x6e,0x69,0x6e,0x67,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x63,0x61,0x31,0x37,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x32,0x32,0x70,0x78,0x3b,0x6c,0x69,0x6e,0x65,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x30,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x31,0x35,0x70,0x78,0x3b,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x2e,0x33,0x73,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x7b,0x6f,0x76,0x65,0x72,0x66,0x6c,0x6f,0x77,0x2d,0x78,0x3a,0x61,0x75,0x74,0x6f,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x40,0x6d,0x65,0x64,0x69,0x61,0x20,0x73,0x63,0x72,0x65,0x65,0x6e,0x20,0x61,0x6e,0x64,0x20,0x28,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x39,0x36,0x30,0x70,0x78,0x29,0x7b,0x2e,0x73,0x68,0x6f,0x77,0x6d,0x65,0x6e,0x75,0x6c,0x61,0x62,0x65,0x6c,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x31,0x76,0x77,0x3b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x38,0x70,0x78,0x7d,0x7d,0x0a,0}; +static const char DATA_ESPEASY_DEFAULT_MIN_CSS[] PROGMEM = {0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x2c,0x68,0x31,0x2c,0x68,0x32,0x2c,0x68,0x33,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x37,0x30,0x30,0x7d,0x68,0x31,0x2c,0x68,0x36,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x3a,0x27,0x27,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2c,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x74,0x65,0x78,0x74,0x2d,0x64,0x65,0x63,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x6c,0x2c,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x6c,0x65,0x66,0x74,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x2c,0x2e,0x64,0x69,0x76,0x5f,0x72,0x7b,0x66,0x6c,0x6f,0x61,0x74,0x3a,0x72,0x69,0x67,0x68,0x74,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x7d,0x2a,0x7b,0x62,0x6f,0x78,0x2d,0x73,0x69,0x7a,0x69,0x6e,0x67,0x3a,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x78,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x73,0x61,0x6e,0x73,0x2d,0x73,0x65,0x72,0x69,0x66,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x30,0x7d,0x68,0x31,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x36,0x70,0x74,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x38,0x70,0x78,0x20,0x30,0x7d,0x68,0x32,0x2c,0x68,0x33,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x7d,0x68,0x32,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x30,0x20,0x2d,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x36,0x70,0x78,0x7d,0x68,0x33,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x45,0x45,0x45,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x31,0x36,0x70,0x78,0x20,0x2d,0x34,0x70,0x78,0x20,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x7d,0x68,0x36,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x30,0x70,0x74,0x7d,0x63,0x6f,0x64,0x65,0x2c,0x6b,0x62,0x64,0x2c,0x70,0x72,0x65,0x2c,0x73,0x61,0x6d,0x70,0x2c,0x74,0x74,0x2c,0x78,0x6d,0x70,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x2c,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x65,0x6d,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x31,0x36,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x68,0x65,0x6c,0x70,0x2c,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2c,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x61,0x79,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x6c,0x69,0x6e,0x6b,0x2e,0x77,0x69,0x64,0x65,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x2d,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x6c,0x69,0x6e,0x6b,0x2e,0x72,0x65,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x72,0x65,0x64,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x2e,0x68,0x65,0x6c,0x70,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x32,0x70,0x78,0x20,0x34,0x70,0x78,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2c,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x7d,0x2e,0x62,0x75,0x74,0x74,0x6f,0x6e,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x33,0x36,0x39,0x7d,0x69,0x6e,0x70,0x75,0x74,0x3a,0x68,0x6f,0x76,0x65,0x72,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x69,0x6e,0x70,0x75,0x74,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x34,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x38,0x70,0x78,0x7d,0x69,0x6e,0x70,0x75,0x74,0x2e,0x77,0x69,0x64,0x65,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2e,0x77,0x69,0x64,0x65,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x30,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x30,0x25,0x7d,0x69,0x6e,0x70,0x75,0x74,0x2e,0x78,0x77,0x69,0x64,0x65,0x2c,0x73,0x65,0x6c,0x65,0x63,0x74,0x2e,0x78,0x77,0x69,0x64,0x65,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x30,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x2e,0x77,0x69,0x64,0x65,0x6e,0x75,0x6d,0x62,0x65,0x72,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x30,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x37,0x65,0x6d,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x2c,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x32,0x70,0x74,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x33,0x35,0x70,0x78,0x3b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x7b,0x2d,0x6d,0x6f,0x7a,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x6d,0x73,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x34,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x72,0x65,0x6c,0x61,0x74,0x69,0x76,0x65,0x3b,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x2e,0x64,0x69,0x73,0x61,0x62,0x6c,0x65,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x65,0x79,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x35,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x35,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x3a,0x68,0x6f,0x76,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x2c,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x20,0x2e,0x63,0x68,0x65,0x63,0x6b,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x2d,0x6d,0x73,0x2d,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x66,0x66,0x66,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x30,0x20,0x33,0x70,0x78,0x20,0x33,0x70,0x78,0x20,0x30,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x31,0x30,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x37,0x70,0x78,0x3b,0x74,0x6f,0x70,0x3a,0x33,0x70,0x78,0x3b,0x74,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x3a,0x72,0x6f,0x74,0x61,0x74,0x65,0x28,0x34,0x35,0x64,0x65,0x67,0x29,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x35,0x70,0x78,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x2c,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x61,0x79,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2c,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x7b,0x2d,0x6d,0x6f,0x7a,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x6d,0x73,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x39,0x70,0x78,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x72,0x65,0x6c,0x61,0x74,0x69,0x76,0x65,0x3b,0x75,0x73,0x65,0x72,0x2d,0x73,0x65,0x6c,0x65,0x63,0x74,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x65,0x65,0x65,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x36,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x36,0x70,0x78,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x3a,0x68,0x6f,0x76,0x65,0x72,0x20,0x69,0x6e,0x70,0x75,0x74,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x7d,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x3a,0x63,0x68,0x65,0x63,0x6b,0x65,0x64,0x7e,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x62,0x6c,0x6f,0x63,0x6b,0x7d,0x2e,0x63,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0x72,0x32,0x20,0x2e,0x64,0x6f,0x74,0x6d,0x61,0x72,0x6b,0x3a,0x61,0x66,0x74,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x66,0x66,0x66,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x35,0x30,0x25,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x38,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x38,0x70,0x78,0x3b,0x74,0x6f,0x70,0x3a,0x38,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x70,0x78,0x7d,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x2c,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x7b,0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x27,0x4c,0x75,0x63,0x69,0x64,0x61,0x20,0x43,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x27,0x2c,0x4d,0x6f,0x6e,0x61,0x63,0x6f,0x2c,0x6d,0x6f,0x6e,0x6f,0x73,0x70,0x61,0x63,0x65,0x3b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x38,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x38,0x30,0x25,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x31,0x37,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x32,0x38,0x32,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x2d,0x31,0x32,0x35,0x70,0x78,0x3b,0x6d,0x69,0x6e,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x32,0x35,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x31,0x36,0x70,0x78,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x69,0x78,0x65,0x64,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x76,0x69,0x73,0x69,0x62,0x69,0x6c,0x69,0x74,0x79,0x3a,0x68,0x69,0x64,0x64,0x65,0x6e,0x3b,0x7a,0x2d,0x69,0x6e,0x64,0x65,0x78,0x3a,0x31,0x7d,0x23,0x74,0x6f,0x61,0x73,0x74,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x2e,0x73,0x68,0x6f,0x77,0x7b,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x61,0x6e,0x69,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x61,0x64,0x65,0x69,0x6e,0x20,0x2e,0x35,0x73,0x2c,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x20,0x2e,0x35,0x73,0x20,0x32,0x2e,0x35,0x73,0x3b,0x61,0x6e,0x69,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x61,0x64,0x65,0x69,0x6e,0x20,0x2e,0x35,0x73,0x2c,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x20,0x2e,0x35,0x73,0x20,0x32,0x2e,0x35,0x73,0x3b,0x76,0x69,0x73,0x69,0x62,0x69,0x6c,0x69,0x74,0x79,0x3a,0x76,0x69,0x73,0x69,0x62,0x6c,0x65,0x7d,0x40,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x69,0x6e,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x7d,0x40,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x69,0x6e,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x32,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x7d,0x40,0x2d,0x77,0x65,0x62,0x6b,0x69,0x74,0x2d,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x30,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x7d,0x40,0x6b,0x65,0x79,0x66,0x72,0x61,0x6d,0x65,0x73,0x20,0x66,0x61,0x64,0x65,0x6f,0x75,0x74,0x7b,0x66,0x72,0x6f,0x6d,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x33,0x30,0x25,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x2e,0x39,0x7d,0x74,0x6f,0x7b,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x30,0x3b,0x6f,0x70,0x61,0x63,0x69,0x74,0x79,0x3a,0x30,0x7d,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x30,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x31,0x46,0x31,0x46,0x31,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x31,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x43,0x46,0x46,0x39,0x35,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x32,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x39,0x44,0x43,0x45,0x46,0x45,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x33,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x41,0x34,0x46,0x43,0x37,0x39,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x34,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x32,0x41,0x42,0x33,0x39,0x7d,0x2e,0x6c,0x65,0x76,0x65,0x6c,0x5f,0x39,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x35,0x30,0x7d,0x2e,0x6c,0x6f,0x67,0x76,0x69,0x65,0x77,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x32,0x37,0x32,0x37,0x32,0x37,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x31,0x46,0x31,0x46,0x31,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x35,0x33,0x30,0x70,0x78,0x3b,0x6f,0x76,0x65,0x72,0x66,0x6c,0x6f,0x77,0x3a,0x61,0x75,0x74,0x6f,0x7d,0x74,0x65,0x78,0x74,0x61,0x72,0x65,0x61,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x63,0x63,0x63,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x68,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x68,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x38,0x38,0x38,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x37,0x30,0x30,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x36,0x70,0x78,0x3b,0x61,0x6c,0x69,0x67,0x6e,0x2d,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6c,0x61,0x70,0x73,0x65,0x3a,0x63,0x6f,0x6c,0x6c,0x61,0x70,0x73,0x65,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x3b,0x6d,0x69,0x6e,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x32,0x30,0x70,0x78,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x72,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x64,0x2c,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x72,0x7b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x74,0x64,0x7b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x33,0x30,0x70,0x78,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x64,0x7b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x33,0x30,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x3b,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,0x69,0x67,0x6e,0x3a,0x63,0x65,0x6e,0x74,0x65,0x72,0x7d,0x74,0x61,0x62,0x6c,0x65,0x2e,0x6d,0x75,0x6c,0x74,0x69,0x72,0x6f,0x77,0x20,0x74,0x72,0x3a,0x6e,0x74,0x68,0x2d,0x63,0x68,0x69,0x6c,0x64,0x28,0x65,0x76,0x65,0x6e,0x29,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x44,0x45,0x45,0x36,0x46,0x46,0x7d,0x2e,0x68,0x69,0x67,0x68,0x6c,0x69,0x67,0x68,0x74,0x20,0x74,0x64,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x64,0x62,0x66,0x66,0x30,0x30,0x37,0x35,0x7d,0x2e,0x61,0x70,0x68,0x65,0x61,0x64,0x65,0x72,0x2c,0x2e,0x68,0x65,0x61,0x64,0x65,0x72,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x38,0x46,0x38,0x46,0x38,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x38,0x70,0x78,0x20,0x31,0x32,0x70,0x78,0x7d,0x2e,0x6e,0x6f,0x74,0x65,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x74,0x79,0x6c,0x65,0x3a,0x69,0x74,0x61,0x6c,0x69,0x63,0x7d,0x2e,0x68,0x65,0x61,0x64,0x65,0x72,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x31,0x70,0x78,0x20,0x73,0x6f,0x6c,0x69,0x64,0x20,0x23,0x44,0x44,0x44,0x3b,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x39,0x30,0x70,0x78,0x3b,0x6c,0x65,0x66,0x74,0x3a,0x30,0x3b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x66,0x69,0x78,0x65,0x64,0x3b,0x72,0x69,0x67,0x68,0x74,0x3a,0x30,0x3b,0x74,0x6f,0x70,0x3a,0x30,0x3b,0x7a,0x2d,0x69,0x6e,0x64,0x65,0x78,0x3a,0x31,0x7d,0x2e,0x62,0x6f,0x64,0x79,0x6d,0x65,0x6e,0x75,0x7b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,0x6f,0x70,0x3a,0x39,0x36,0x70,0x78,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x62,0x61,0x72,0x7b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x69,0x6e,0x68,0x65,0x72,0x69,0x74,0x3b,0x74,0x6f,0x70,0x3a,0x35,0x35,0x70,0x78,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x73,0x6f,0x6c,0x69,0x64,0x20,0x74,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,0x6e,0x74,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x20,0x34,0x70,0x78,0x20,0x30,0x20,0x30,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x70,0x78,0x20,0x31,0x70,0x78,0x20,0x31,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x34,0x34,0x34,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x34,0x70,0x78,0x20,0x31,0x36,0x70,0x78,0x20,0x38,0x70,0x78,0x3b,0x77,0x68,0x69,0x74,0x65,0x2d,0x73,0x70,0x61,0x63,0x65,0x3a,0x6e,0x6f,0x77,0x72,0x61,0x70,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x2e,0x61,0x63,0x74,0x69,0x76,0x65,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x46,0x46,0x46,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x37,0x44,0x20,0x23,0x44,0x44,0x44,0x20,0x23,0x46,0x46,0x46,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x23,0x44,0x45,0x46,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x6f,0x6e,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x67,0x72,0x65,0x65,0x6e,0x7d,0x2e,0x6f,0x66,0x66,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x72,0x65,0x64,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x72,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x38,0x30,0x3b,0x62,0x6f,0x72,0x64,0x65,0x72,0x2d,0x72,0x61,0x64,0x69,0x75,0x73,0x3a,0x34,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x3a,0x32,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x31,0x70,0x78,0x20,0x31,0x30,0x70,0x78,0x7d,0x2e,0x61,0x6c,0x65,0x72,0x74,0x2c,0x2e,0x77,0x61,0x72,0x6e,0x69,0x6e,0x67,0x7b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x62,0x6f,0x74,0x74,0x6f,0x6d,0x3a,0x31,0x35,0x70,0x78,0x3b,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x3a,0x32,0x30,0x70,0x78,0x3b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x66,0x7d,0x2e,0x64,0x69,0x76,0x5f,0x62,0x72,0x7b,0x63,0x6c,0x65,0x61,0x72,0x3a,0x62,0x6f,0x74,0x68,0x7d,0x2e,0x61,0x6c,0x65,0x72,0x74,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x34,0x34,0x33,0x33,0x36,0x7d,0x2e,0x77,0x61,0x72,0x6e,0x69,0x6e,0x67,0x7b,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x66,0x66,0x63,0x61,0x31,0x37,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x7b,0x63,0x75,0x72,0x73,0x6f,0x72,0x3a,0x70,0x6f,0x69,0x6e,0x74,0x65,0x72,0x3b,0x66,0x6f,0x6e,0x74,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x32,0x32,0x70,0x78,0x3b,0x6c,0x69,0x6e,0x65,0x2d,0x68,0x65,0x69,0x67,0x68,0x74,0x3a,0x32,0x30,0x70,0x78,0x3b,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x6c,0x65,0x66,0x74,0x3a,0x31,0x35,0x70,0x78,0x3b,0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3a,0x2e,0x33,0x73,0x7d,0x2e,0x63,0x6c,0x6f,0x73,0x65,0x62,0x74,0x6e,0x3a,0x68,0x6f,0x76,0x65,0x72,0x7b,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x23,0x30,0x30,0x30,0x7d,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x7b,0x6f,0x76,0x65,0x72,0x66,0x6c,0x6f,0x77,0x2d,0x78,0x3a,0x61,0x75,0x74,0x6f,0x3b,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x30,0x30,0x25,0x7d,0x40,0x6d,0x65,0x64,0x69,0x61,0x20,0x73,0x63,0x72,0x65,0x65,0x6e,0x20,0x61,0x6e,0x64,0x20,0x28,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x39,0x36,0x30,0x70,0x78,0x29,0x7b,0x2e,0x73,0x68,0x6f,0x77,0x6d,0x65,0x6e,0x75,0x6c,0x61,0x62,0x65,0x6c,0x7b,0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0x3a,0x6e,0x6f,0x6e,0x65,0x7d,0x2e,0x6d,0x65,0x6e,0x75,0x7b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x31,0x31,0x76,0x77,0x3b,0x6d,0x61,0x78,0x2d,0x77,0x69,0x64,0x74,0x68,0x3a,0x34,0x38,0x70,0x78,0x7d,0x7d,0x0a,0}; #endif // WEBSERVER_CSS // JavaScript blobs diff --git a/src/src/WebServer/HTML_wrappers.cpp b/src/src/WebServer/HTML_wrappers.cpp index 6611a3289..d15a95aaf 100644 --- a/src/src/WebServer/HTML_wrappers.cpp +++ b/src/src/WebServer/HTML_wrappers.cpp @@ -83,6 +83,12 @@ void html_TD() { addHtml(F("")); } +void html_TD(const String& style) { + addHtml(F("")); +} + void html_TD(int td_cnt) { for (int i = 0; i < td_cnt; ++i) { html_TD(); diff --git a/src/src/WebServer/HTML_wrappers.h b/src/src/WebServer/HTML_wrappers.h index d84c3ab12..4a57e7ecb 100644 --- a/src/src/WebServer/HTML_wrappers.h +++ b/src/src/WebServer/HTML_wrappers.h @@ -30,6 +30,8 @@ void html_TR_TD_height(int height); void html_TD(); +void html_TD(const String& style); + void html_TD(int td_cnt); extern int copyTextCounter; diff --git a/static/espeasy_default.css b/static/espeasy_default.css index c2466b000..5f0ff50bf 100644 --- a/static/espeasy_default.css +++ b/static/espeasy_default.css @@ -141,6 +141,12 @@ select.wide { width: 80% } +input.xwide, +select.xwide { + max-width: 500px; + width: 100% +} + .widenumber { max-width: 500px; width: 100px diff --git a/static/espeasy_default.min.css b/static/espeasy_default.min.css index 220aa09e1..cbc62e329 100644 --- a/static/espeasy_default.min.css +++ b/static/espeasy_default.min.css @@ -1 +1 @@ -.closebtn,h1,h2,h3{font-weight:700}h1,h6{color:#07D}.checkmark:after,.dotmark:after{content:''}.button,.menu{text-decoration:none}.div_l,.menu{float:left}.closebtn,.div_r{float:right;color:#fff}*{box-sizing:border-box;font-family:sans-serif;font-size:12pt;margin:0;padding:0}h1{font-size:16pt;margin:8px 0}h2,h3{font-size:12pt}h2{background-color:#444;color:#FFF;margin:0 -4px;padding:6px}h3{background-color:#EEE;color:#444;margin:16px -4px 0;padding:4px}h6{font-size:10pt}code,kbd,pre,samp,tt,xmp{font-family:monospace,monospace;font-size:1em}.button{background-color:#07D;border:none;border-radius:4px;color:#FFF;margin:4px;padding:4px 16px}.button.help,.checkmark,input,select,textarea{border-color:gray;border-style:solid;border-width:1px}.button.link.wide{display:inline-block;text-align:center;width:100%}.button.link.red{background-color:red}.button.help{border-radius:50%;padding:2px 4px}.checkmark,input,select,textarea{border-radius:4px}.button:hover{background:#369}input:hover,select:hover{background-color:#ccc}input,select,textarea{background-color:#eee;margin:4px;padding:4px 8px}input.wide,select.wide{max-width:500px;width:80%}.widenumber{max-width:500px;width:7em}.container,.container2{font-size:12pt;padding-left:35px;cursor:pointer}.container{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;display:block;margin-left:4px;margin-top:0;position:relative;user-select:none}.container input{cursor:pointer;opacity:0;position:absolute}.checkmark.disabled{background-color:grey}.checkmark{background-color:#eee;height:25px;left:0;position:absolute;top:0;width:25px}.container:hover input~.checkmark{background-color:#ccc}.container input:checked~.checkmark{background-color:#07D}.checkmark:after{display:none;position:absolute}.container input:checked~.checkmark:after,.container2{display:block}.container .checkmark:after{-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);border:solid #fff;border-width:0 3px 3px 0;height:10px;left:7px;top:3px;transform:rotate(45deg);width:5px}#toastmessage,.dotmark,.logviewer{border-color:gray;border-style:solid}#toastmessage,.dotmark{border-width:1px}.container2{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;margin-bottom:20px;margin-left:9px;position:relative;user-select:none}.container2 input{cursor:pointer;opacity:0;position:absolute}.dotmark{background-color:#eee;border-radius:50%;height:26px;left:0;position:absolute;top:0;width:26px}.container2:hover input~.dotmark{background-color:#ccc}.container2 input:checked~.dotmark{background-color:#07D}.dotmark:after{display:none;position:absolute}.container2 input:checked~.dotmark:after{display:block}.container2 .dotmark:after{background:#fff;border-radius:50%;height:8px;left:8px;top:8px;width:8px}.logviewer,textarea{font-family:'Lucida Console',Monaco,monospace;max-width:1000px;padding:4px 8px;width:80%}#toastmessage{background-color:#07D;border-radius:4px;bottom:30%;color:#fff;font-size:17px;left:282px;margin-left:-125px;min-width:250px;padding:16px;position:fixed;text-align:center;visibility:hidden;z-index:1}#toastmessage.show{-webkit-animation:fadein .5s,fadeout .5s 2.5s;animation:fadein .5s,fadeout .5s 2.5s;visibility:visible}@-webkit-keyframes fadein{from{bottom:20%;opacity:0}to{bottom:30%;opacity:.9}}@keyframes fadein{from{bottom:20%;opacity:0}to{bottom:30%;opacity:.9}}@-webkit-keyframes fadeout{from{bottom:30%;opacity:.9}to{bottom:0;opacity:0}}@keyframes fadeout{from{bottom:30%;opacity:.9}to{bottom:0;opacity:0}}.level_0{color:#F1F1F1}.level_1{color:#FCFF95}.level_2{color:#9DCEFE}.level_3{color:#A4FC79}.level_4{color:#F2AB39}.level_9{color:#F50}.logviewer{background-color:#272727;color:#F1F1F1;height:530px;overflow:auto}textarea:hover{background-color:#ccc}table.multirow th,table.normal th{background-color:#444;border-color:#888;color:#FFF;font-weight:700;padding:6px;align-content:center;text-align:center}table.multirow,table.normal{border-collapse:collapse;color:#000;min-width:420px;width:100%}table.multirow tr,table.normal td,table.normal tr{padding:4px}table.normal td{height:30px}table.multirow td{height:30px;padding:4px;text-align:center}table.multirow tr:nth-child(even){background-color:#DEE6FF}.highlight td{background-color:#dbff0075}.apheader,.headermenu{background-color:#F8F8F8;padding:8px 12px}.note{color:#444;font-style:italic}.headermenu{border-bottom:1px solid #DDD;height:90px;left:0;position:fixed;right:0;top:0;z-index:1}.bodymenu{margin-top:96px}.menubar{position:inherit;top:55px}.menu{border:solid transparent;border-radius:4px 4px 0 0;border-width:4px 1px 1px;color:#444;padding:4px 16px 8px;white-space:nowrap}.menu.active{background-color:#FFF;border-color:#07D #DDD #FFF;color:#000}.menu:hover{background:#DEF;color:#000}.menu_button{display:none}.on{color:green}.off{color:red}.div_r{background-color:#080;border-radius:4px;margin:2px;padding:1px 10px}.alert,.warning{margin-bottom:15px;padding:20px;color:#fff}.div_br{clear:both}.alert{background-color:#f44336}.warning{background-color:#ffca17}.closebtn{cursor:pointer;font-size:22px;line-height:20px;margin-left:15px;transition:.3s}.closebtn:hover{color:#000}section{overflow-x:auto;width:100%}@media screen and (max-width:960px){.showmenulabel{display:none}.menu{max-width:11vw;max-width:48px}} +.closebtn,h1,h2,h3{font-weight:700}h1,h6{color:#07D}.checkmark:after,.dotmark:after{content:''}.button,.menu{text-decoration:none}.div_l,.menu{float:left}.closebtn,.div_r{float:right;color:#fff}*{box-sizing:border-box;font-family:sans-serif;font-size:12pt;margin:0;padding:0}h1{font-size:16pt;margin:8px 0}h2,h3{font-size:12pt}h2{background-color:#444;color:#FFF;margin:0 -4px;padding:6px}h3{background-color:#EEE;color:#444;margin:16px -4px 0;padding:4px}h6{font-size:10pt}code,kbd,pre,samp,tt,xmp{font-family:monospace,monospace;font-size:1em}.button{background-color:#07D;border:none;border-radius:4px;color:#FFF;margin:4px;padding:4px 16px}.button.help,.checkmark,input,select,textarea{border-color:gray;border-style:solid;border-width:1px}.button.link.wide{display:inline-block;text-align:center;width:100%}.button.link.red{background-color:red}.button.help{border-radius:50%;padding:2px 4px}.checkmark,input,select,textarea{border-radius:4px}.button:hover{background:#369}input:hover,select:hover{background-color:#ccc}input,select,textarea{background-color:#eee;margin:4px;padding:4px 8px}input.wide,select.wide{max-width:500px;width:80%}input.xwide,select.xwide{max-width:500px;width:100%}.widenumber{max-width:500px;width:7em}.container,.container2{font-size:12pt;padding-left:35px;cursor:pointer}.container{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;display:block;margin-left:4px;margin-top:0;position:relative;user-select:none}.container input{cursor:pointer;opacity:0;position:absolute}.checkmark.disabled{background-color:grey}.checkmark{background-color:#eee;height:25px;left:0;position:absolute;top:0;width:25px}.container:hover input~.checkmark{background-color:#ccc}.container input:checked~.checkmark{background-color:#07D}.checkmark:after{display:none;position:absolute}.container input:checked~.checkmark:after,.container2{display:block}.container .checkmark:after{-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);border:solid #fff;border-width:0 3px 3px 0;height:10px;left:7px;top:3px;transform:rotate(45deg);width:5px}#toastmessage,.dotmark,.logviewer{border-color:gray;border-style:solid}#toastmessage,.dotmark{border-width:1px}.container2{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;margin-bottom:20px;margin-left:9px;position:relative;user-select:none}.container2 input{cursor:pointer;opacity:0;position:absolute}.dotmark{background-color:#eee;border-radius:50%;height:26px;left:0;position:absolute;top:0;width:26px}.container2:hover input~.dotmark{background-color:#ccc}.container2 input:checked~.dotmark{background-color:#07D}.dotmark:after{display:none;position:absolute}.container2 input:checked~.dotmark:after{display:block}.container2 .dotmark:after{background:#fff;border-radius:50%;height:8px;left:8px;top:8px;width:8px}.logviewer,textarea{font-family:'Lucida Console',Monaco,monospace;max-width:1000px;padding:4px 8px;width:80%}#toastmessage{background-color:#07D;border-radius:4px;bottom:30%;color:#fff;font-size:17px;left:282px;margin-left:-125px;min-width:250px;padding:16px;position:fixed;text-align:center;visibility:hidden;z-index:1}#toastmessage.show{-webkit-animation:fadein .5s,fadeout .5s 2.5s;animation:fadein .5s,fadeout .5s 2.5s;visibility:visible}@-webkit-keyframes fadein{from{bottom:20%;opacity:0}to{bottom:30%;opacity:.9}}@keyframes fadein{from{bottom:20%;opacity:0}to{bottom:30%;opacity:.9}}@-webkit-keyframes fadeout{from{bottom:30%;opacity:.9}to{bottom:0;opacity:0}}@keyframes fadeout{from{bottom:30%;opacity:.9}to{bottom:0;opacity:0}}.level_0{color:#F1F1F1}.level_1{color:#FCFF95}.level_2{color:#9DCEFE}.level_3{color:#A4FC79}.level_4{color:#F2AB39}.level_9{color:#F50}.logviewer{background-color:#272727;color:#F1F1F1;height:530px;overflow:auto}textarea:hover{background-color:#ccc}table.multirow th,table.normal th{background-color:#444;border-color:#888;color:#FFF;font-weight:700;padding:6px;align-content:center;text-align:center}table.multirow,table.normal{border-collapse:collapse;color:#000;min-width:420px;width:100%}table.multirow tr,table.normal td,table.normal tr{padding:4px}table.normal td{height:30px}table.multirow td{height:30px;padding:4px;text-align:center}table.multirow tr:nth-child(even){background-color:#DEE6FF}.highlight td{background-color:#dbff0075}.apheader,.headermenu{background-color:#F8F8F8;padding:8px 12px}.note{color:#444;font-style:italic}.headermenu{border-bottom:1px solid #DDD;height:90px;left:0;position:fixed;right:0;top:0;z-index:1}.bodymenu{margin-top:96px}.menubar{position:inherit;top:55px}.menu{border:solid transparent;border-radius:4px 4px 0 0;border-width:4px 1px 1px;color:#444;padding:4px 16px 8px;white-space:nowrap}.menu.active{background-color:#FFF;border-color:#07D #DDD #FFF;color:#000}.menu:hover{background:#DEF;color:#000}.menu_button{display:none}.on{color:green}.off{color:red}.div_r{background-color:#080;border-radius:4px;margin:2px;padding:1px 10px}.alert,.warning{margin-bottom:15px;padding:20px;color:#fff}.div_br{clear:both}.alert{background-color:#f44336}.warning{background-color:#ffca17}.closebtn{cursor:pointer;font-size:22px;line-height:20px;margin-left:15px;transition:.3s}.closebtn:hover{color:#000}section{overflow-x:auto;width:100%}@media screen and (max-width:960px){.showmenulabel{display:none}.menu{max-width:11vw;max-width:48px}} From 2dbbf819b2b5189af00fea2891618d42ddd786b7 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 23 Apr 2022 14:37:53 +0200 Subject: [PATCH 19/89] [P095] Updated documentation --- docs/source/Plugin/P095.rst | 161 +++++++++++++++++- .../Plugin/P095_DeviceConfiguration.png | Bin 0 -> 98805 bytes docs/source/Plugin/P095_RotationOptions.png | Bin 0 -> 18982 bytes docs/source/Plugin/P095_SaveError.png | Bin 0 -> 1943 bytes .../Plugin/P095_TFTDisplayModelOptions.png | Bin 0 -> 42661 bytes .../Plugin/P095_TextPrintModeOptions.png | Bin 0 -> 17578 bytes .../P095_WriteCommandTriggerOptions.png | Bin 0 -> 25822 bytes docs/source/Plugin/P095_commands.repl | 99 ++++------- .../Plugin/_plugin_substitutions_p09x.repl | 6 +- 9 files changed, 190 insertions(+), 76 deletions(-) create mode 100644 docs/source/Plugin/P095_DeviceConfiguration.png create mode 100644 docs/source/Plugin/P095_RotationOptions.png create mode 100644 docs/source/Plugin/P095_SaveError.png create mode 100644 docs/source/Plugin/P095_TFTDisplayModelOptions.png create mode 100644 docs/source/Plugin/P095_TextPrintModeOptions.png create mode 100644 docs/source/Plugin/P095_WriteCommandTriggerOptions.png diff --git a/docs/source/Plugin/P095.rst b/docs/source/Plugin/P095.rst index 4a1c5644e..9e4497852 100644 --- a/docs/source/Plugin/P095.rst +++ b/docs/source/Plugin/P095.rst @@ -24,21 +24,164 @@ Used libraries: |P095_usedlibraries| Description ----------- -This plugin allow to control a TFT screen (ILI9341) through HTTP API +The ILI9341, ILI9342, ILI9481, ILI9486 and ILI9488 chip families drive color TFT displays in a few resolutions, and support 65535 colors (RGB565 coded). -## Environment -Tested with WEMOS D1 Mini Pro and Wemos TDFT 2.4 -Tested with ESPEasy 2.4.2 -tag mega-201902225) +This plugin supports these display models: + +* **ILI934x** with resolution 240 x 320 pixels +* **ILI948x** with resolution 320 x 480 pixels + +The plugin can be configured to show predefined text, a reservation for up to 24 lines is made, but only the lines that can fit on-screen will be shown, or via commands, sent via http or from rules, text or graphical elements like lines, rectangles, circles, pixels, etc., can be shown. + +Hardware +-------- TFT Shield : https://docs.wemos.cc/en/latest/d1_mini_shiled/tft_2_4.html Price : ~ 5.40€/$ (https://fr.aliexpress.com/item/32919729730.html) +Connections +^^^^^^^^^^^ + +These displays are connected using the SPI interface, minimally with 3 signal wires, though usually also support the ``CS`` signal, so 4-wire SPI can be used, to allow multiple SPI-connected devices. + +The text on most displays is somewhat confusing, as not the usual SPI names are used: + +.. code-block:: none + + ESP TFT + -------- ------ + 3V3 --- VCC (most displays only support 3.3V) + GND --- GND + MOSI --> SDA/SDI + CLK --> SCL/SCK + (gpio) --> DC + (gpio) --> CS + (gpio) --> RES/RST/RESET (optional, Reset) + (gpio) --> BLK/LED (optional, Backlight, TFT-pin can also be connected to VCC for always-on) + + (gpio) = configurable GPIO pin. -Supported hardware ------------------- +Device configuration +-------------------- -|P095_usedby| +.. image:: P095_DeviceConfiguration.png + :alt: Device configuration + +* **Name** A unique name should be entered here. + +* **Enabled** The device can be disabled or enabled. When not enabled the device should not use any resources. + +Actuator +^^^^^^^^ + +* **GPIO -> TFT CS** Select the GPIO pin to use for the ``CS`` connection. If the display doesn't have a ``CS`` connection it can be set to *None*. +* **GPIO -> TFT DC** The GPIO pin to use for the ``DC`` connection (Data/Command). +* **GPIO -> TFT RST** Select the GPIO pin to use for the ``RES`` (reset) connection. If the display doesn't have a ``RES`` (or RST) connection, or no free pin is available, it can be set to *None*. If it is set to None, for proper operation it may need too be wired to the Reset connection on the ESP, so the device is initialized correctly. +* **GPIO -> Backlight (optional)** Select the GPIO pin to use for controlling the backlight. To save power, the backlight can be dimmed, or turned off if the display is turned off. If set to *None*, usually the max. brightness is used for the backlight. +* **Backlight percentage** The backlight can be controlled via PWM modulation on the Backlight (BLK) pin of the display. This is set as a percentage between 1 and 100. +* **Display button** A GPIO pin can be configured to wake the display on demand. This, combined with the **Display Timeout** setting, can preserve the lifetime of the display, and save some power. +* **Inversed Logic** When checked, reverses the pin-state action of the **Display button** gpio. This allows an external circuit, f.e. an IR sensor, that may provide a *high* signal when activated, to wake the display. +* **Display Timeout** Select the timeout in seconds to turn off the display after the last update or wake-up. Only used if the **Display button** is *also* configured. +* **TFT Display model** Select the hardware model that is connected. Currently there are only preset resolutions available. + +Available options: + +.. image:: P095_TFTDisplayModelOptions.png + :alt: TFT Display model options + +Layout +^^^^^^^^ + +* **Rotation** Depending on how the display is to be mounted/installed, it may be needed to rotate the content, or with a non-square resolution, to use the display in *Landscape* layout instead of the default *Portrait*. + +Available options: + +.. image:: P095_RotationOptions.png + :alt: Rotation + +The available options rotate the display in a clock-wise direction. + +* **Text print Mode** Defines the handling of text when predefined text or text via the ``txt`` or ``txtfull`` subcommands (see below) is displayed. + +Available options: + +.. image:: P095_TextPrintModeOptions.png + :alt: Text print mode + +* *Continue to next line* Simply 'prints' all text to the display, with automatic overflow to the next line(s) if the text doesn't fit on the current line. +* *Truncate exceeding message* Display the provided message, but any excess at the right border of the display is discarded. +* *Clear then truncate exceeding message* Clear from the current cursor position to the end of the display, then display the provided message, but any excess at the right border of the display is discarded. + +Default setting is *Continue to next line*. + +* **Font scaling** The scaling factor for the currently active font. Select a factor between 1 and 10. + +* **Clear display on exit** When checked, will clear the display when the task is disabled, either from settings or via the ``TaskDisable`` command. The screen will be turned off, and when a backlight pin is configured, also the backlight is turned off. + +* **Write Command trigger** The command to handle any commands for this device can be selected here. This can make the commands compatible with other (tft) displays, using the same command structure via the ESPEasy Adafruit Graphics helper class. + +Available options: + +.. image:: P095_WriteCommandTriggerOptions.png + :alt: Write-command trigger + +* *tft* +* *ili9341* +* *ili9342* +* *ili9481* +* *ili9486* +* *ili9488* + +The command is handled non-case sensitive. See below for available commands and subcommands. + +* **Wake display on receiving text** When checked, the display will be enabled once any content is written to the screen, either triggered by the Interval, or from a command. Default checked. + +* **Text Coordinates in col/row** When checked, the coordinates for the ``txp``, ``txz`` and ``txtfull`` subcommands will be handled in cursor columns & rows, instead of pixels. Column and row are calculated from the current font size and font scaling settings. + +* **Use -1px offset for txp & txtfull** For backward compatibility with the previous, non-AdafruitGFX_helper based, plugin implementation, that used 0-based coordinates, an offset of -1 pixel can be applied to the ``txp``, ``txz`` and ``txtfull`` subcommands. This option is enabled by default. + +* **Background-fill for text** When checked, for any text-line sent to the screen, the entire background (including top and bottom lines) will have the provided background color, *unless* transparent is used (Background color == Foreground color). Default checked. + +Content +^^^^^^^^ + +* **Foreground color** +* **Background color** + +These are the default colors, used to display the content as configured below (if any). The background color is also used as the Clear screen color. + +Colors can be specified in 3 ways: + +* *Color name* Some named colors are recognized: White, Black, Red, Green, Blue, Yellow, Orange, Navy, Darkgreen, Cyan, Darkcyan, Maroon, Purple, Olive, Magenta, Lightgrey, Darkgrey, Pink and Greenyellow. If any of these colors is recognized, the name will be shown. +* *#RGB565* A ``#`` prefixed, 1 to 4 digit, hex-coded color value in RGB565 format (5 bits red, 6 bits green, 5 bits blue) giving the max. number of 65535 colors. This is the value that is shown after the settings are saved, and it is not one of the known color names. +* *#RRGGBB* A ``#`` prefixed, 6 digit, hex coded RGB color value. Will be transformed to an RGB565 value! + +If the Foreground and Background colors are the same, the background color will become ``transparent``. If the Forground color is empty, as a default ``white`` will be set. + +* **Line 1..24** Predefined content can be specified. The number of lines available depends on the size of the display, the font used, the font scaling that is set and the selected rotation. + +The usual variables, like ``[Taskname#Valuename]``, or ``%v1%``, system variables, formulas and functions can be used. + +Input length is limited to 60 characters per line. If a longer calculated text is needed for a line, then it should be set from the rules or from an external source via http commands. + +Next to Line 24, the remaining capacity in characters is displayed. + +The total combination of lines * input length can not exceed 1000 characters (sized dynamically), as there is limited storage per task available for these settings. An error message will be shown after (trying to) save the settings, **any excess content will be discarded!** + +Example: + +.. image:: P095_SaveError.png + :alt: Save error + +* **Interval** By default, Interval will be set to 0. If set to a non-zero value, the pre-configured content will be updated automatically using that interval (seconds). Depending on the **Text print Mode** setting, content that may have been draw from rules or external commands, may be erased. + +Values +^^^^^^ + +The current text-cursor position is available in 2 variables **CursorX** and **CursorY**, that will be updated on every change of text or received command. **No** events are generated, and these values will never be sent to controllers. + +The values can be used in rules, if desired. They will follow the **Text Coordinates in col/row** setting. Commands available ^^^^^^^^^^^^^^^^^^ @@ -54,4 +197,6 @@ Change log .. versionchanged:: 2.0 ... - |added| 2020-04-20 + |added| 2020-04-20 Initially added + + |added| 2022-04-23 Rewrite of the plugin based on AdafruitGFX_helper, udated documentation based on shared settings with :ref:`P116_page` and AdafruitGFX_helper diff --git a/docs/source/Plugin/P095_DeviceConfiguration.png b/docs/source/Plugin/P095_DeviceConfiguration.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea623904325ba050f29405709f37d714a531d8b GIT binary patch literal 98805 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 fs*K+6D5>V`=bW^;QcWBt@Apc literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P095_RotationOptions.png b/docs/source/Plugin/P095_RotationOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..ca110533b24cca0f78149c709ee9227f62040d96 GIT binary patch literal 18982 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P095_SaveError.png b/docs/source/Plugin/P095_SaveError.png new file mode 100644 index 0000000000000000000000000000000000000000..f17023400469c7020a5bb7da74c525cfa64ba5d5 GIT binary patch literal 1943 zcmb_d`&ZHl7XRj3Gwh+J<0P4rN{(q$PC1I?ql2%cu?MLMj;t1%g5oPtDV(NqR&8c& zb$mc=Q)VWZdlUu~B`29J1sPvW;$vWv5&>BQ)UUwOnSWq^n0wB>pL_1P=iJY|Kito) zQ;EoJ4j(xH0I)4KCOQcKEL7$^%+AIfLkbZBGuULrBcsh|w)H43#SHeum}C+FKz{z< zTkiNnJj_MM!V~8Uqccgk0z9!0Psjsy*?V~dfGspOI^s+zMk$FXm>J$_lTLrJdu6?Q zB(_iE)wd#5p5{?kU17cu`tgikB1$Z+@S0d}N}Bd;+`g=_!&j>jZvUL$Q=b$Edr+Um zf0I=LH*#e{k)KD|0<3wBF>K41d zs<||VXfkTMl1-KC0X0{?9H4}6h6d}jxJuIe0} z(ws-6*re;R1XNyZ6lVcbaiCOGrgHy>y-J~Qkzi~7Wm4wY0utHvD$qHBPW__+b}BLW z`is+hLCu3T=kgt0PVYVzq=VX3*x1P;$D&Z)K`~WOE?f)#E*mZ&6&1N3wtYd$wSH5& z>}4fRts>J1hk83s4=6wi1_f3RX$BhNKzGK;nU^o~75$morw!T??7fh4m9M^N*Q>#d zz+Q%^fEHgQ@8DT|N~-0=>Kj*Dc*8JA&F1rU?0VUFy56k=Gbd{LeZEJa$!OZ!C#x=N$5#8We$x z3Dt(?r7)lQs926qF71jTluEvUEQcE;!&_Q)ibfEE@obkwlfwty;7pZ4Bis+vra+Nn!ffh2WjZO+XI zJaWbHV8j!8NhSO`I~xn#C1L8$-6XFi@!_2THS@3OMmA$3T&kID(Xfv#Zf@lAE4VCT z-Ei5vg~~$Ca093N9N_lq6d%qL3ve&fdyzZBgx3~epZu|a`MPR*6GIgdf^zf;rOLl? zt#9z!d_x7Z2-n#+0$n6WMdpPZ0{ocP^F6c;@~5@8n1RBxBRyH-nOZHX8YAr?Um&V` zwqwKI1A`txF+}W@A;`6Rj#*@9zU-0dlkQP&!7}V7#$u=k?niEwS27mDLv-TBc&|Kx zQEm6|Thd5MP#rkYG5lZ}dxS0b{62fLeExE0h51lzQjwvtIN&jk=FMiUF58XC$v?i` zU&B4bCd`&JPxrmH1WLVa>{V*fS8x9dhOj$rxE{{@`yq_X$9Z$(Y7Q}|PEF=e1xg-z=uqFNBu){|qm`wSY;RdEWTG44h!KvX%}nBcJX@ ztDj~hxThSQX5DA?(o~IWw^Ot`nX{vOxVCs5yd+D4;vqn3s^@MAD|>$%kXkZYIl716 z56-spMoqlZ%9ytueZ#G8&wkyI-=J&LIXKhjRZ8qrz}|u9u5ROykS-1XNlOXUpsCE47l=J z>GcEM^#h9lE2QFk-X_9&5{&~E(EHe{j#4!2>*7j`@kQ$xWRQ9Cua$@YQ+NisReuWF c(&V%WxcB6BLh;tFiVyl4dm=HK5t&Z?AAs+*`v3p{ literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P095_TFTDisplayModelOptions.png b/docs/source/Plugin/P095_TFTDisplayModelOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..9871ddae0fe7e299d05b9cecf9958de6fa89ed22 GIT binary patch literal 42661 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≪3^qb02_S$>Yhu31%B<0~}2 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 WXLVJajQI-iQhTVWRH9%W{Qm&UpXf~h literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P095_TextPrintModeOptions.png b/docs/source/Plugin/P095_TextPrintModeOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..44a864edada9073972fb863d58c78532cf6aa8ce GIT binary patch literal 17578 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%0Dl94J4 z#G}yAHL^a^tO1O#S5)}j&>cd*GvfYhwK)parU_iSTI_=v+{DtHd23!z0t#K%OlU}q zR9n8G?_>HS#zTzZp{DSjNn4wwEt((lW3(3vwORq*@qVPBM5n9bKIJ`MA^XAM2J#(L zJ{IbQjbTUcG*6-VJUt<>qc*>RrEw5=P5iUl5Z<@-_4O^{)kTl)$6rzGD4E#|Ynp#) zen*%mX>#>TgS)Zp1^9NN4;w!7C=jy7=gJ1DZAF4IqY z*C=#e8%NuC}%aHtZNF?*_K1U$T+BX)Niczp~`Z}sQj%oU!xOSDo zvl=Qi3ZQTFZW2|{J2sY(lzI&DT|?0X6gCXkHOe0%Sdch(8V`GfK6<7e{bY-0gPae_ zhKiZ3VT?AeMSigxuVO4VR2Ci{W|dAoydgXH2(1Hs!1SXlenfPMsx`v2rl(;_X&jQW zimDuxcChYg$v!tLc#pb+Q}WsKmTX_GVbWRy!aj%EIaq0hUMXzEe8`H{Y-8L2_P%88KCC6Wz^w3YT<|{#x(=chEj}Akx}KD` zuk7qx$}6YXB61n3+rWC*MV@Zu!N)%xMbIib(km**kT`m=j&~spaVZLQF$VEp1f#!Gq+<;bFSOq$K*u&v~|!x!I0ub~|=5 z1=+c9Xqx2x3%eZ#2A0xEvFk9`^uddp`^%1RZ9h3WIhtt_!~Q&W7j#@XO1mqC#E}?$ zYQLM0gM)i=`+or#nyjoyOG0c@0?~4nHOFjA?>hCug6}a;EwwNz?CuwzEvt->CH=yI zx;VS$X%60jrb3vQ8H$UaXI`h?*=0a%o(5KcyW`tQmS!Y=sdYwn&M3`jVHJEy`Kckd zz4a$3iAYIBarO1Dqr;*Ss&-#lU57UA=@%~vo)8Om;bpEmFn6SnR5cB`6y;v?Yi!cP2g{op!!qeSkWfHtZ_I4}__+HLnfhtTWe!s*e`1p1zJ|3?x-L`e-4-b3`kD(}0x6h%5aJ1egStgk-O)8SZL zgwhuw%zALR1pXvLde6MS(r+F{@8K)HgWezY;>$|jN0HqRAd!4{k?%=8dD9y>|ndwyf!od+(%e9=HtcgA?4a=+kxXR|r~s$5jPSiZ`-mf4X&&LVD)U zX=rowTIdnL+Kg{%_bs0wIc=$XcDym9)c3V;H65UkF5kf=uc&MJ`3Q>SIS{Bc4cVyV zDU`DPrS!u~rvJ;&2s!z|1kx$;_(L3sr?pbuG*s;Z>z#@h_kgZI4f@nLg4qilWvt;* zb2IS)9gpaK?mpdR`Tvf&+jgHG zM+@b;+NiT9N8R~$u4g;9tCQQ@Ndx&V>gPNRT=%{_>d$cAef@phMsDjEOEnAdjzX0I{3y|zNDhz&=GiU~`pP-PvzYRt1(^8o-s?nj$$~SnB%n zlm}c+et`D{WSj>opbxM6u?*|vfj^ZY;d-!Kb3f2e1dmT8p- z4Ld^Ib;dm|?!G(AxN+`w)*a$L%Y!0(X;^s&`0~XG2J-F-yrjRsKb61y%fB@F1Nmi? zhWtWHLw-><3Mu`KM4n(8g*?e!74k&h>`3`ht{%CMJ|yJv(n#cY!c`!@?;45xo^BNK zypo1IU!`Hse_61CE`hL1X~#@ELS$rYyL@7*xxQ1}3NlUH|3CUOumpbeju8L=002ov JPDHLkV1f&iil_hp literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P095_WriteCommandTriggerOptions.png b/docs/source/Plugin/P095_WriteCommandTriggerOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd9e9a496a18cf58ecf5498be262c51311742d4 GIT binary patch literal 25822 zcmZ^~by$?&6Fv-rbR#9*9fH!`jerU$AuUQR4ND0k-7Tf0h|;mt0#ZvWh}5#cQc_Fr zf=j#$e!jo=y59JMW%qfm=Q(rcoSC_2=035H4Yf##?h|2QVUg-+tD9h9-9cc!ele#NJ=Cw zAuRS#SX@k8oK1-BfrRWM30W~QQX&o0$HEW9g(YR!gxRz_Je*w}+0<^I5G_{^!@^?2 z(ot7=5@5aCx#i6{7g#eFHgqY^x|=g0@h#QCzpoF}^-A^Axxf10zD;tT9GXFRcX1Xp(mju{0TC>#y`^?kk_U9hyDFRu)DxWiQi z`NFZIuxM19k}I7XNTsZ}KO|)YW`ExJ>SwV=JgqS1OW^tl;}!1BxBp%02-4`c`gil@ zQkM7QC(x$|`NW*rA6dB{e=o15qFHa!bRj7t6+U}NZ9=?><4TyZ{Y zfQV9JF}zx1M9}&P^hTid;F6o4Z%qDwetJ8>VW=y{qXDUEh^Ei`jzheS&ZW(X)I`Ch z?hX{U>>#a#lI7+A&AFz&!o>64ze@zhAumLNZ5N73UrX)-=9ifEXF$w0pN@9ng()Z) zn5*@mu@6|bKeUkTbvSY}mpHF4`MDsobWhHcI+G4|Gccv-$>DnG$c#Y9kz&gb@xy#b z(Xhby3mFrrQNv|ZN6gVzcwqqfV5{md`xdutO>@Gn!YamcV}TuK7IVO^i8!xydAU7C zv+vuMRr!U|&pKt7W9jmg=|s*P*~P`R->Sr8+z^UWS49Efj9f|)WPEU} zuX}ehmo6pX0Q7+r#a^Yu#^tu^wSlBKtOVs{754c%GKq zg?Y-?^x+!vT9=>9@sBCMB~JckI#Z(bJfauQ+*&ihTpngj=&rP`!|WlA9n8)#zE_sE zAF>ZL5u)Xsl1V(i*jgj$S19MrqoV6T-u-gaMBS^qQf0|gJ}8wkQLl|Z@{6j8zV7SO zuR`y+9@HDQ?5#Tv7w;PhcKJ~~|H8{PdG+wx*OB_k?>DHLdQuKE%8MX1I~Gxd&`+d4 znt>EDymO>P&3%rnIImgFBHUN2Em|Loy(Z}#U$^KhPzO#m4O-m@Rfr!a)47fcyG9AF z6&NzkCoUAzOiPr3Y{M{h9iiJ_#b#NicEVQ+UsSu3G5KOt8-E|E_~)r zW+T2Dku)5Fj4XO-w=Vh2awx`zr+JZsV>kO1da&8?Ogis$;4~rnci66D@xrrK*2AJt zGp(ONxBI*b`|c$wbRQ+KrXaMJPdCFD)(p31w-t%%8zbqeepF-mIv)7QI9_LjFw=bQ z>oYi4PMIp#YBQ%(SQ7h0W)Dex*Tg58GV2h%G7u1LR)-MSGu22M;cgSId#nEHa(Z62 zV}GJSe;qu~c>d;p<}%%rjVdWE$o~e4F8dMlvdlHJ@8RUgeNn4HN>pvf``DODL4e(h zZ%p2Wc8t8Km?zd?e`tStg4;VdYYE?7zb<(*TISw@az z*w~0M9Nf}Er`M2rWHapJ^1OitWn(yFt_j#hAOtWL<{Wd~4uqMTn~QxnJoC7|xKQn1 zj9ozQo29GC)tEe9EvsqVeWlm0@Pd6dnIxJquiH7=kz3B@_76UH>F(SN`8XVfRH!RjRY7JcGyqHUHEkQDYS{n3VyV48GO1bRKndXtwJ95srO(6Gp_Un ztA3f}ix)3$q5+{9bU@ef09AmO?m6AGcp70vz&put%MNd^2kt(6*Cb+Uko)WZQ z+Zz*KYn?rHc5~Z<*0r^L`QMPMD@Bp7SBh-jP|^kz_6CahZ=S9~FmE%%D0e*}PIO!G zD*KV)e35)0N36Q)_V%`2l!8$ERq~ldLw)^i3=ze>W;*$@5`lFsKj!Tp64EJ?eViX^ z5{SBMeG_9P_^z_Y2d~qfrTcxiEe*XoE@BKU`tTtxrtNxlqoJcCxZ3>ra}&(!TH{`H$xqD5`yVrnd$-EfD8+Zk{Szl6{#qlx_c~%g2faF&Oq$H1Abt)=OiVnQ zD!O`dh4i>??pwMTTVfhQbzO&O1ahClP~Zx_8m=qnr^Yd1p^2QqNgMxg#O*w#15usb zD7@$!q)=ggA!^Qam3_?T5_Yis7TOhNLq<-%4(kMNAWm{~8HOChC#R>mnVFd}=;Z2o znm!K(2V{81UFU@suC#(GDzr4Uw8|dy<#<1uShz(Jtct;B(4*=boWM_eO-!qGrnglA z0gb%6FgYeh=%FtzIvRbD5SuW0(Q923p?<2Ms_+u#elU73uy>-D(aYt_G#h@iRE(hxg4)vKMvuNNNKNKPf%Tintidr^~3 zw$=sBkyJSF--jh;qC6*VVUcLtScv6{)Pz&qo!h&H(|> zn>)r@%)SVf+`=aBUT;Y`sFSmE6|zGvkX-KVjl!ItT!{WMK7+GlPmPOuo6iTDj#PY$ z_ek({mnY@44r1-1xb=yGl`1Yk^>#7;6o2}t21kPZ^x0!!a z200)eA9-^gY<=~&q!p6fW8A0H`VVS!m|yKDJCA*&lCL<1T7R2S$lw1@r#6seHS_u2 z&OI?9y={n9m--46`yB zbR*XnHK@^pu^Vy5y)OVki_Es!k8h0ST|eE?D%BO$GisD)90{j)=#b3sZ`YijOz=|6 z{@bu`EiaETjd5?FwBv>}oF&U2<5r#2h0+UdtPG8DKq%DUNZuCDW1WsVZSE^aucXQ4#_};7Ze#!xfM3y!+Jvzeq ze~rmvm`zAd9{8lD{h07(&?G+0)7b~iD*(&_E+F~}FoQ0)x3~X42EFuQQ2Mu2n|$CD zRyrF08z*cWb0dK0=QGt%%YOh^gZ1=pAd@y>XAFxw$|mz_owD zdfkF^gWm^H1mHjX+IC<$?j0mO(fI*1xcKqQjh#G*6I~lz&!qS_iZ$U)#vrqL^U}kz zMLN`hSc)xxJb7uHy#$FgIr6tbe+b@LEYb+Yy0sY@rN+j_jJ`!u;;l(Xc;6xfJxqGu z&~l~kUj609FFO2NLnyguWrSkZ z{9lT5zOp?5dt~<0^exE0>)MxdH|)SB$SoNSe;SB?bTxju-c9{}y~3lDTZy?&s?ucs znxqC35?{sgW0n`+=6A2O3#xx{y~X>&PpUY9xpxtk^Ou)Z|HH_ei?kc`80V$v;&R?} zu~uc1*|pA55?ltazA?^CrtDRBkH-c>Xq)S{jwSo(cL~&}^&RBE zuheele50GZ3{HbF`gqZuB+n1}=FncwVQD}`qj&HObbTK(14jB!f=@ANPP(2)7rTee z@Z3x+YAsO;maY!%2=4=Wykv-eA*qf?>#+Jj4%6%VD%ExYjLiweYiFL`yoJX7%Zo); z!tucE{q-H2>xoI~gmr6v#7qK+{JNy`fiJfw{?ux9rTFtk^?1xi?WaR-Qlfq>g&Ba6 z1>}xLx&4bJs?ZX17xJ-Wp(0G$Mlb>nv9f}F%P>8tiftvn_hszXg~Wev0iOz|U+Dsz zH!=1T?{&%yj1=(D@4Q01I6@@StdjbfL&DM$kTd}DStvqe_Wy~Iizbh{ySK~XEn zY>Pq4jyWa}F}d&)HS>8&#KvG0XRAim=EgcjXuGafT1K@27BO;in;dZKwXw>5NK={C z#=x&I5_kPFsT^DOYkvED)tdyp24lrc!4~AVR!eRJ&u*44)|Ul6@YR)+lq_v+mBDzE zhrHUEl^n~O;3Z5Zs=fH>{K0<1+wKJ~eo8tD+{y8vDqND=z47y`rv=P?eb};E->Kjz zyLmOybqx%>E@ALSD9P`pUk^|^R*THnK|2{u^~mi^FebwNJeXgJ46~cFL7O$RjHYtU zHek@8e#=>aDGPP+=Bd7A+=h z6NX=Wm0ZSXTBK-IXW#ZF3FDwLZ~XD{NSi1oK*+gZ0?+jU_eS>vgN>*dAkEvPwa#eR zi&MPc2SHzcy?}o{zny`~GRE7Ud_xx9Y$xW{w3^@`0V}qPlP6Su_^L%WZl3$eKZ%Rv z0HQ;nFz?qiGBxHKnAFpI%2hO2r!Sf6xMbsYH{I=tMX%w9+2IvI_HUsav_Bgo5Hb3k z8gw5Z{k8L+pSAChX#)O z!^eNF!`BKBH*eL`KkUEY3${?|f?F3p({+nIsou|4Z{HAqFk(jYf3&4?g9uDTz&SIR z@t;o`LZ?g?=^o_sP_y(d#-fqPW>)g7Ix(n@Xrj*JRc7^RN`$q zaKylo8`H^nonH(>n^4iDrlsJXO^uxS_8;6W<8}J$-R|KSV)JBk10Df@TQR789)u;3KX`j^{%iDf|0*xOWRX!aaiJDpUC`x=1v%nI@ ztVIoD{k_U(lnky&bLJ0a9vrBF2&S&vU}a*{*l1<*M5qCSx&zb4)jKo>uWf&F+0g_;EyPX3liulY?Fw=N4JvsMH~y| z3A0L;`?OQiCl;9{Eg61a5)91_a1jzhTzLH_ct3|BR0e|&+I@0kK#c5VyZ0?B^gRRG z)Cl?&o_Nt^E~d))yDz}H7x2SxiYPcJ5L0%SXf*2EFVjEYJ}Q4a&yFyf8@xbAW20I{ z;<~6qXXM8BVu>E>{DN~06Qt4jwU9@n>a3!n;O*XB(EHE3nJouP>ny;TS0Ze+J^H!# zeLn;VqWb9+<3(fKgY;jh6Ew@1+kBH0)N8XD+=MCO4|3F3+nX30oqrj#Cui}e{`0hB zskxOj$(7B5;{=<`<}~)J(kxyJ^Tv`>+v2sCT#^2~0i$M80eAh?#M9eKqK1qHpn^-` zQ-WgYV>LFuEqu$N!ri^S;qmciR}VK^4aSXFBL{D9z2@4as~%>w=Pf zO?PW1b52sIdNLVj6rn6i(m~y;4ui5%@2daK294}gLX%##KWUB?Js2FM^ZO4~z6QL8 zUu8_bDZQ+QwswjF+wYwk5d3ZX`t2KJcsNZ+n6?ZgCVG5~6-F1QVPV;K;y7-TIX(SI zs9j`-F|WSWF{+TUQR@?ayBr0j{t|RHEzuVOxxcfN^-UNTuN{BZb0#uuLR(P^OtQAL z8$%<{dC1OC{L%P;EOKvYu{Wr>c5i34dD_tePjEK*^z_kJk13L%F4ng6Z1T=JGcwl_ z<8IQ9dCz1OZO{Idaco%cz+mWJU5`w-Vz&(*0TBJwd&x2rn`{v&EiE3$N$~p&_Sni5zxi}eEPueat@+c(?CLYmOMh3kA<0K(Kqw6>BU^pa zIig-1hs8>L|ZMN)tjb^ z%gC@(r>BcQikg{{8CrLCaKalI9UtChDr1T00`ckTrL1StSa4?mJFEpnbO2z!;|5}J zsratr0IR;XXOgv?FJ@zz=jLFK(v18fy2_=(ir@oR!*bKgVomAt0ny`TlTiY{zFN0>=wMY1cAKJ2GPqiA0|{*}$a&ha z5T%TU9-bXYyL})>zkh2&+nF?vHQ%LoGWc;~nTt`=Eb=dF9+zo?7G05>xWkJF%=tZDti8)J3! z;)5{c0y>2+W^35wCjnaD{eHb7`|2vgPy)%&kL7R@l9Nbm1}3Jol@&_Nwc$UrISGmO zt%Na`zcL&erYJ%PycIWnX#i!`yYTE{0wpiquGQH~bY z#cMBq+VG5!VDSy#vxU(0?Sw0QRS^{f#_dB_Kr{M+=KVlg3gwqpt%MADqY%h!t?fOu zSZv6UfwKXdc(QT{L8_>T5Ph!AbJg0nFQYn-v$!oHGDNHIIRXMz;`EN|YaxQ94FrZn zv#^fQ@r^r20anUv;)2A)-Y;R@g4Bp@_0&_&m*y*(vA%d%hJSL$8|btpHDE|j##DPF ziL(3R;HIHvynUBLM50=8#aKQ!ZCRbhb#yxuS}Y9{da?auj`Q6B{1ZO(Oal> z3VwdWurMfTZh40QJW4}z0nB|%xAWqK1S^QDR&Y(v@fWaV8tR$(x15~3w6-ZaIYsFy zy$gLwF+#4g-2)LT&AooVMovmHth^L{a(bd?WLD(kzv3~Ga)MH;)}m*s)nbiMD#-3& zj}F_6!20+y=r}%}qRw}i4_G~-(9kY7i%5JLvzR|R>fm_iyJE&xHtenY)^@KSvb-*F zake>>Iy@oS$>DXdem(W-hJdQ19QPE(UrQKre3RH*>7Be;PSzF!F2}h}?(o|!!rb8` z&RP0&ov-$Gc3fC0J!|ykM)dS-`ua(nDJsg5z6nNl_kX9ZgYSVvy?ZhV1^cVs?3OKw zQ+e!D*B%Y9thy1P@2>^B090rxUX6~yFQXXv>5q5__(%0Qm4}N9K;&m~>FIZ}@}k#7 zRN`jNR|p~^LmFpbu%y_nn#Nwp<#n=j3~WKq9|n5|NM+*q!Y>HHt?z>LGZ) zld%XFp60ALzno{{Y_KvVz+%8X+P~M5eq5_R-i*KCoE0`l7O_6sLgO;K|`>w-(hl@ui>ivWD#d{+s$yfFa)qcyRrMbSz{GCPXg8l8=x5=!& zMx>w1{+|>wq7WiG))Yfu-47ATfd%H}C8Q(GJY|o5^2G9_Wn`&GbER9EgN=fK3~UL? zXIgCN3ppV*?A>YByzrN5c$>7ej)64ABPX;-bq|Tm@JWn^iTX;p)w5y^394wUSSW4c zWdF8D=xWdSdy2ht(S_m9Ue+hDHN*D4n)1(NUlPap5v=~ z#}e4R=Aj@XJba+C|3M2~4-qDA40bVei{)&kx__-8_OZ9>>@ewJ<4I5bc?if|&LkY( zAkhd_iPIPMx-(IDCJZC4<*Cw(uNT9w8#9fd)Muy2QU38jQIbepTvGPVd&h?oTnyr} zTqQY*N!_+Ylh2o*-bJb&t9{Q)zy>y$Jr^-DgKPRM)0@9!A(ee`8Ky-rd7cVwbHP<(@)jI6#|rD6Z8^D773y_nO4q~Qbl z-?7Og&aMCB0)!0dA8bQPU8wP-P4TL6c0P2=0`$e@B{`ADV$#wHvLl}JV%y^%5p|<6 zgrh=dQZT9aFWpG?nFnQCL+;|zj*L{D?e2caD`Cya$bDP`Bn?D4UV<>Gm_b9?y_ytI z9uVse!1*~<*C>zhEBn>;c;Ki{e37hatM!zrO&RY}1@ga`vU-!9@gfjgl_DYYvF+`w z6PVP;lav#Inp<`6>*Vv6m=Y(nxE~Sj=kKel1wl;7y!KufSa!kKd`}5~FhY(t{U~77+M|sur`VqAKykjGw0}1%AC@6lga6+C{)Ci$ku(V%h{w* zT=vg3@h9b_?G>hN?Q*46#QS@?cn3@Qzu7AvMr0W78d2^2{E*@l;oIEE>8T=?4u2X4 zR)i?riCCe897s00#bcxUJ^FOWPkAGDVL>Wgl)=_@?D~V>72y)IOUb9mqiwP~pG1D;AynjE zOuFdfELvF+4F4ee$U1UrABgwrQX$x_g0y&1;*~dYc4Ca~=XhRyOV}WZ?cYC#)Dra* zZv+ufaplrbEI}UAjOM*Nl_nnCA69Qlf0n_92GAn0!Aq7>TmKOxNbL`gW;FZzl+tlO z9aVYi6d%sLMAFG0KiFE>)>=kwIyN5SS1f%=|J%msb^Q0K_TLJxy>z3shGeBIqv~KG zR+}sH>fp0F%c}$GR$m_~@1s zH;7L#?PfY!yn~9j1j|a@C43)FrcA;<`E7431sPQ7(Z+vDDphMGRn}T({hU&tE03{E z;V13~?zu@Jx0Ib{F@A4=RgJzJ+B$E2sv0pnVaO+s5KmTCMN4(wI1E@ncjacJoyJAk z*eL$dww+D8vWtC&RBD}PA*zR@=E(t(IvB{gbx05$@7(tRDWxt zR+n5ma!Ftn{$KXePR+-_Ndhht=8dyb3ck|Xu}U8*U%%O3Yy|ttPTHCkJX|A;-noOU zYx@!kI($U`9TXS1i$NCITW2o-s5<_xUZNtVx}0`q2})KOV6s46j%T8@^;_O z0Pd6(TV>~^IPTU52a)6N5kktExx`jEV|mcy)X|S8Co0P9wXqKATP`&o9dCoGOTasm zK0D=HY`?xGwv>{he-J%qJK7k=a%iu+i~dbCPhicfQ}VDyN~gGF4j0D_*SDn!ewjr3 z3um@!X%=z`VxMuh%ryFm$I9t>zBccCw3WEy^$l#eP5!Fa2Mgx3q)dXH zTf)4skhJ`X`K<;1ww|q3CqdTxXbEuzg-9%?r_KJzF>hRHhYgpwcF{eNE(JsAVvP93 zLP`ZCqpltM&sl>k}TIC9M4p9$rYHWP_zVoro?x`%kyRj z7$-e<-eclg2Cb_HW8XtUO1C#&@KC+`d3+VK(HpXAR`Bv)P0LH)PA9QqJtDd#=wESD z00nnjNQBu^K~a(_%;tlMZEubk94=QU6tj{^ij-kB!_HD35K`WK>432ml!MmuHgpc& zL;k72B=gliX7n>YZFeGgq3t|XUuT6@&?JRFOzy`x%f>TK#QUV*Cdoi4Qzty21J>RH zahLv(_a%!$qN-3CD&l$9EV!cWq{FOS(YB%Oi($C6fBfD=NRJJRnf{w_5{bQvL=`o< z7P&vZo6}eX7g(k?ZLx)FnhsXSAT3=@g700kkrH9dG~Tn zlF?0%ljXRZ3(Y8Nt2MPfzsI6e9Q2dX9XgpSXDI#52j_cpU-c859CFT=$_ERih$~#( z6>(*!u`P_|n9vB=J!F^O-)O$QOL2KcA$yDR;WbCvdh4~w#%I|--8FIxM71TeGk+c$ zGtfJAPjMEwAlua1e)5#h6b!x{#KFFA>XcKn^qs}CeB|U^5HxV=^A;c)gs*_;n0Q-h zDqr55q&c+!d&gFr+qqkypNV}DfB7mZM?xdI^3evE5I1($*JJSNfkAnCQ4g86tRg-$ zGr_oQ&_U~N57@s%crs11fImjj^do%+17MSe2ItN@&;#ggko}B zC57o&;MrE?N*z=u0i;ADk%jJ*bJB)1tsjtnxtyF?;8ajhm}LAhq^G7Y-`U2QZ{cjwB)VAIH^~akG<&eO8O-B;VvUn>S1O6y$xx+_K-Wm zgX}f}9DFMWvDB;LL^4ioqgc_fz6Z+&IitRtVg(@`l-?h;@S@QU(h}ipFSRv!CBzjK zL`<0ksP=kcNJrQ~8~F7Rl;OaW08+Wd&rm=w!7mYl(>Xb9@W8NmY?p@CyZ3>qnP>i3 z;ukA^9Y&XZ38}PsCV#T6*a;$Q6g$=*RjlrN+0V+&4~Y^hOU6p&xJ{)cH}Iydy(3?L z2s`}Hy0<6IqLcIl_sj#95A6>Q{W=kh2nteRrSE>@>cQ&0&G6$yN6EvmAL+Z|JsUgm zlIkrUaETugt9hl-eHUP43^hnblSGt0nw$RwVikQlK!>E`N9tinMSquzzQ=2iv?C zr%oGFtEMw^aO+hh%pkXfIU|4Q0{X>unhrl&L3a_IPOD99={_?DwGrqWsJBbEFjfNE%7@F?6?A zS&WM-`u&<%YA~L%2kQ(YZtR&#q!MFlthQ80y361m0)N&7gXLw2=QCMpW}!w(Pc$cT&csYPBoeO5&hfE;6-*U`0qf46ba9C6;eyc?~>h-NVVxks7OLaMG0VJ8NtWOrHd|jaMWgAY^w3 z<%3;FkE|aaDHh~q91a<$OZEb0@U_^&I&{+Q152)ST%Bnb@}fKqSC*(}H-6f>OO!Si zsi;=?_%-Q>Pjh@LAS95xlTuyk$5tK}Q1q#O$93{Cy0OEX^8xQ-~L_JUF+ow*+83&xb#?BT&xtBnHElKu+U^{`L4c)g=X&QDp6UKaw{rF$O{KxDpJ*9u)u}m@<1&V?Po-A}ckgcic zT7$-!+5wBUFXYwNHFF5+>1}8ZX(&Dm1q{hQ4~P+1_6GSR_a)Y9`d#7m%J>;s^MF5Ao? z`2;C)e|fnXDp_w|gxfY0P4vyPFGEIRc+^Lcm|xu!yWBhY%b&(Mu#D@b>Zg}EgR;4C z-vx;+j%$lZB5)NwKbr;N%M=2K6V_o0vz#HhDh%&GCOgmNjeTNt)-MDFwpF;`xbyaV z4a+NJ8W}iV1vn-6I*s-w(&vzHirFSN1%Cd?=P+A(B?N&Jk-;U&U_H!C(y-3~FUXMW z^SkVW0Q2{j-T{zvna2KIp(~DykJ?nQ&dA70?7Fa5 zyy4Z0V;B?bs6#S)QK+10x4cO7#N?gmc1t_3!WI0uFE3#cIM(L0*A{oND}2-tJ;9_H z79S5Cpy|NVtEy*8=-g1{jmjQ?+j!ls(tx)MlJBsFP`G(-Qy>dGKz=yOl-Q*M|ZV_j;ATrYg>ZE^ByUTOL!BTs4LflHCn-( z{`+&0zSmcuWXMR0k$&e~)1=2-)4t7*%%xVtkGegUyS;@Tvs^IGm6fWUp~#RFxQ~C6 zuSw2tip+1N_|}gh@arLdk$v7Wa(-u$Ne}Kc`)L@mje_P^@3%0HzbRK+HpYR!VRonmpa16sz;K%pIJrQ(Ysx9&@u_gu)`jLnLW8 z_8t>S@t0+I5M6iZ$ncMvewA^OzmrmS*FyDW9bOOAF68S@c;v=Dt-5b zy4i!RY7$L)<$GfkS;U{iRA>Y4MyirvFDiiC+|z;&e(cfR-G3|p(Lt?tAF3$Uqtk!5 zTqlPAA<#Hs@`qydySD~x+pqG_pEud(w|=f_(f%G=P1r)s`B_F2hO?!#%)RdcES9Oy zcj+(9Eo}nG#Rg#_&evHs-sqfd`y}Ss2ZLgtanOOD=p>me|Abl?X?4D5Cw>{Zzspht zxfeGQ)3E5@TiJZCf}iwLJfcdboYue~r%JIze~LjvOfofd>mq;j*gC=hPxn<7+LaD{ zz|Fb(;5&xrdqapCKK6PIcfb2C%@zpVH-#r?XK3sp-30YT05EO16?)!lup_!yBUPNE zUC*TiVw%9u@%C%ph0kaOLA^D2=@-Mqr>&^>eTvHi_PzY7+%m=Y=E5V3M+#pL?<@j) zBy-!W>aP`c7i?qI3|E627Bh^Acz_WM=4?M^!y#%LW^+~GP8Y8})GTernsS2GK4^=* zLJWVWOn(8nFc@kw;Fs{jqt-bvQeon31UYM4AZ^|eagf5#xE|6_kAg6zxA{n=kA3%&_9ceaZ0O&-B-WTf(z z@s9yCgLO}6S?mBkh*3xumgSx+3A z$CSA_ck*q4*rXvgSbC+L9w5 z(p*tFr3(ynpyrMGwA|`QdQ>%mbSas#r-xiN`_#x#zl$&$i>+L6* zL3UF(Mq3X1L0pOKe_UV~CaT+{Q%?Gryo=pkqSFVb12KYJGmxgmkGkiC@u}22HeaDW zEtXI0LVCnsveelzowze@Ik90AcG!#)w`}qBNU|7LSk+KV61_41?V5a|fYi+kVz7Mt z>YMV1%a~oWClq=Csw{d5F)Ci^`1}qTBX7QCTB}okdx1r4B!OHhB(K3toesj3-RNc#mjSr zc8s|1`lf0`>)m;M4AcNQx+FvxhwaH8@ws@11-##Ka2SVfVq>H>`W+Kb?-#qTT4le?=NN;PnH>A zqVjwlXYcFm7}2Y|L2P1fo>BG)7rQ-19F(e`X&Z+NtmoH!aOC3?3*K}%`_BCR)Kv?1 zyiUo%MALbciG^;fw+<_cpsJkl;^B5usEF>W-{iCLG9B^F^K;0Vo%O1drMs9zHS)^-R$?QKl_n;WN+SPSJUgmodn8m=Pzb@rSFpSTo!VctGISo zs%SHhShd!23erIBRoIAuU($fhfSL&r1aFAfHkb=WtTgmX_{H7p%Foenrt z&!cZE|3di~a;LQcbPLx9M>gU(%Cjwj1{EFcg_11#)yfgy-=Xh(Zho$~wYR#8Fik@k zu6ktq90N`|J11vmJXnmCAQgE@2@ucs5Q%W_{50k7Ut7 zk!Uad_?%#fj)(}OyrM?4X)YA6$%&VD4B7ggJw5UB#&&l4-M1(@F&KmV6XdD4AfH0f0s% z#z18!_T&eTEhoGcCoc2%N=7kWs+!+6#{Z5t|p!?OWvnrQlbfhhIiN2#L~gWiw{3q+$p+ zPDJ`84<%<*Cg*nCKjq80c(}S}mA{L+W0SlkwS&1YJ-dgt5VsW0I6yK%a${X6$0fOrVF@YOx z^Z}wq#HfsDQ%4S|F9X^w7CdRR_EAf$LG{o7sfbeM5g_bnEma;g5#7BD`MpsuMC**v zOL|?M3IqLaRv|2-bc%U$Zcc=m$)LQ!RMs?q!1|nJ3$gX+V2R0sClm2K_-g$^v7<=l zxK~{4p+Ij50a1P6&=`%Qt)s#37Jo;heyb5Z0dOh$?0e{a__(MYv^V<jfzMcq+yTD=^)9F{xwdm`tn+v(~DH#&-%IfFVzawJ9Z*VYq%Sn2STx<;H z&}Z`cPqp$9WfngvhY&YoT3RQrqN0qUA!7z+=B$-e6^8rwQ+iay`6AVFBuDEOw74Z? zX~kY!lP5cjcC1i>S$fgD4z9tvJUkVSukW9ZkB?k%94|;YQrFje6y`tYN60djX3-h{ zvuVdzblBD4&H1aO4O}>j;EzW^!&M!;;K5GK6bjRSPF($_4HGS-6nOEN1-eqrGqQPXyZv17K8HNG2&XW za)bV5Any*d(4iXZ&im)s(jTZ}+IMKkb^OPmK2*H_S5fC3Pxbr$aVsmEjO?t)C?e}P zcG;CAilY$976->UMz*Ywy~-?~WMm(E&!Ws@J0zTA)H%mIzc)VL&+mVa$GPwOecji6 zUHAQZzRaGB53W{(0_*1+-N-$V&9KnzSaO^h6)7IF- zE_x!HC0>3SsH|)f9xyPdtmgbu{bu4?8Uqc)BI)N(%Q9PXQad=@)>NV9E*_J!`E=RU zt2Z;RHk%RRAMLWQ>1ORl-GeZCQrVde@gY(zI2vC89x@C6q}~~+ziqaT8+-Bb z4s1yI?5^ntW2*!Fe zp`jqG37=O2RB}7WO)$5^^z&<_U$EJw zX3x3nuj*v(GT}MimHJ09z$uU&D4LC^V_>JjT>TMQ36qlP^VpWm=<*^d{5!K8$`wcdDBOe5;BYTm zh2M{d9jeAM6$OLC;VV??XTZna>E=1ZD+7%^WTp(YttIT#GzTk3G`n;izkA|DcDddN z9stbk>7ybWdL=6sun#Ed<%#tmk_1{)2b!Hi-7Nct{)Bdn0RVP*jPkKV5j&AcG2w$B zKfcs?1(+jB_d~zF|F`Ib`AV-T0pchKYMtascPtt}FBJpx>c+%gL;}bXM=jw!X4&9> zcTFRJ(*e8G$k}%L|B0VDmjFCw$srI$l7K@1KuARNxUZ$YgV=~+c-B%Nn6R)g2R3|? zT2LPd{fCp$_=*{S&I%|<9H(Inkn(5ZPlj{xXZD&ubPnH@9d`!ml$`xM04PD@X+7ef z6@qTItnQ+V%N|C<&MO<*8;k|W)ibQuv*L_;RXRn)o2$X`bv?0HO^s0d!t%f%uqlw; zhK2^UJgY_KcK^Q?K|8G?n+srPL}orf{_60cOu{k;VRNJ{Z zr%df|};wB!Vt`$YxfBFoz9ZZH(4Nh@yRVqk>QQseWF9SaUH zojbzGpm))7#wk%-G+@ml+d0JHM2r* zy;JF$1%Xl&1A$oDwd8>OfLk}$#rKvs$I1{GT?O@9c+S%{Y>@taBDX1g$xcNy0(9SG z1+L+S&?cObflJ%RkV!uLvx<9&KPlzCfrO!wGeBAj*da{;9&YdWuSgJaGKV9G2kGCc zZ5h9FGP_6QK4cXm&dDMeo6dTT>j>t8ezq7LuKn6T8R9@7Ar^qA0A~2rj>u_Ljj=;l zKkqL!Bav38QR3&fGCvqwN-RZSxc&vl%){Iedx!VIw;VcW(RDq4>&ECmMybF7#B$)J z`RQ?4cx)f3@?q!J{89e?+kg3{{i3Yp6D_BQ09J@50N;ckG97;n^VBJx6^du8{!+Im z?YR^K+k-(8Z?zm>TYp_Q-{dFvAL$#M?d}C{xo$qzvYW!McX9Zy>Y5kNSwyb|5#_~iC79ta*W@w3c>iGgKR9|E>2+l9bDKYOGu^D*PULk9S@P=VjR z0NLbp$8iL?g?ph=-x*qNb`#vtV8q`~yGe0dz2s?2eC-8GpV40>&(m0Y7cXR0B%qXo z{a;6=E3IDjdMV=ULrQazFn2ErUiH%mlsFAs%TYwek}*MqK3<}#x!GC}Q&m;L7& zfJOnJ7IXGqMm6qHrb+`gP3OPygw6xJPM(G`HGT20{90GrdFJZ!8eK@VP_fi^y=s%T~j2T?vYx51*_jEH92;a5 z9^eFa@hHcUh|ZZ|I^p(!tw%I0WzI`z?}lbJz|fS|HZ6gk^STWbWzuk%llyx~Ta{VpUsnK@n6rc7 z?s;I<0agOIwM)=c2~$b-T-yifmY&uxt<1}Ty>Pel`R8*-;6CTnJE7(VAk*)8^Sqp<&@K zRhZHe^2U91%{AHM$dAUggbmzIYG8BwZyt_%?V0Z{$4p-YInJhNgRv=qAHqCPjw24v z=3@(MiceTi!*}BAA|}iVduB~K&dP?1x+q1=X4&5D6ptlipjvbb)%g)kd!eh3ra-v0 zFZxoN`U}l=uUAp}qlt=syZ)-Y#%1kTrOYL_#}6<^INzGBsOFZ-#rGb?Lfp6l*T-bO zdn25tufG8k{c5EwQ)>~#v}O_yz&j!868_ouxhzX_bB=!#p<#}n@U2;(Je5DUl3H4< zM`1mH6WrLnpziTg8k)vLrf90$onJ13d>tFt`0w8l5MxUzHqqMU5mK*sK+QY{*_oE& z$l#}7(v54nr!shxmMu)8M5waaRHVsDK-e7}BwB5fi099xb)uUtMLqnEj@P00v(LUn zzye|o%c!O`>i$D6BfScDf7IGa0gu~Zy9;Ex1~@(uq}g>|S>u*V!z#lu!F9QQ@i0eA z@niJWM4;|_4P;y)VjC=4C2G~smG454(K6c*!Y&VcUIHOBw5J#PD1ctWt%X^Tf{t<1-5>wDp5Ob^DfEyQMK5ni5-Jq!%a8VH%>gAeg)6Zb89X+8KINaD7zqD1)h$WiB zzIMD6Ys^LC;{K_<32MM5`doj;;|iOJLp(mfO6fI$XWP70^v5JN=my;Nf?_GClGVhV zW9~NU#(BxVpSfgJ^fuaO8$vbX&%R{sqS(8?@8{&`czx`MpY(K=_pIT*3~tWOH&08< z<3#~+%&TDAsK$+{qH1t}FN6VmPXf2|97pEbzxt3wV)psXAX+!Mrzc+|w`-`HB~wz8 zMZ`vvO!j>=T9*?FDBDj+NIM0|A{*%hzRbPOBds%4NXYA~irY;Idb^+-5}b7ZbFt(G z-4zVgOjx&_O0p}Ty3JEukE?;6veu00C%9oA3w2(i8U_qJm`SaEyuBZNTS>jdtUN-d zH2BMm?OwIyz~b`Vk6=dw{9I%~qrdGq_o~yK0IhcJcTZ|t*o|#f+||G;`6GJ1#7|5X zfnQo&b0u%=&7L$kog4)%N5g#S@W4?}^<-=H0iu+HgJURFHQlg(aL{li;=I^4=g;Yw znVA_nEr7)^KkwV4#(>m;QT}J1&|c7^u9#KLzu7;G3ok4GCvWLJ8wZD7ew{#9p@>Dd z{}?~2^}>l&?31(3L4`D9z6&00pg z!1$Rek;ju2Mw@w4dUu8ugjjEOYY1#d;JK(Nu+ZHH6;dh56fs2HS~`hPf((aaatQU! zUne=6*k{L+;j;po)AP_a?QgAY0b(do#V9v^mDvk&_}8C!1MV=!U6@`cadBUmj;6X! z&E$+kZbcU6cKHl4NN79s}8v>?58Fq{i~7 z8p^+xrS!YaJ4y>`d?qmNZ22jB%#&f(0b$ zE5Ocn$4N^`P4ik?B${EiMK2&GXq%#p%h>Ma3=LDxbo}8P+u(AZ099F`?ezyP5PkNr zlryemvE=;+HJi@)i4za);TOJ-?y}hYs21IDJd(2h9n?9qwWu}~xjt+~3rBxZ^Lebf zrKJa6Abrlb$?&_q+16?!Gt}j)3(h;0KjiK=)9H!4EyKf<1?4*I_iLoOvf`U*&`309 zE?9NG=f5tT;AB#>mpLhn3&_k^lPP2lJ$l;3w^&*}vcsN{R2pG=h`5UMUgCzgk0 z_Gs0X*`U_ z>P%JB-g!>^sd01rtoe4W;BIgK%8xX=Ze2UySK7MWy7mDtSjfOa7gm2sN)1FaKa2y{ zy9m$WRH^RT-~}=gZX|hD)yKu!$(&qK@Yi5xpNbg~AYpM12?DWFaQe;8+z4rEL#IaH z&&o~OueV6oT4?P&@za*<(xE;2SoXP`JGl5}6-SPeW+?ramo>pN%a^}3E9|wqThc^c z3BH5btTg^%WZ^(k5#r5Wfvu90jZiO2$b6@%<`%x032AK$>MSqY`AAV4WllM%@TP#% zCV9qD#!+ZYtacdGawZuqMfnirP~+s-XytCEpZFei|L)c$ z7Hgw=11_*SiDsL^)=*1Zi})Oyd(E}+sx8lk^vmsh&jT3PcQmATiwyOz#chpB6ql#N zt*z#-o5Khe`IBxt;l^HXLTv5hRAxG!u6eXLXU>d}5E}xy3F+6YzEhJ4M%OSC7G4-S zGal{5sC;70_Yc$gK$c_>vC5?-+MdYAfhs4eIz~>0|`nt9Up%Z|5Yz0 zIP0_Y0E@66qDCMry=hQA!C|}h?$usNG(1OKwM34&05_ zM>dUv-20+2)M{6k%b+PPrA3zJk9x*VNARCsJ!=s>3*cZVvVC?^pUJj>@{; zEeq{q!=%cYAqCl<2q%pur=`zZ!L^{tqWH>F0be8 zD4(k4G-V`pR17Z?R=2UL#fw_jtsXgDvR>40Ry~>kw$ITnp}Mny=lQ&!nP}+YlWngr zFTmtS10$jPPqr1WgThGJ?Q?^Uqr>z$~b!Wck3S1#3a7Drsgu#KEqJ41%&B-&^&^!jgX_hvUJiJc?gnh zy69B1q(<+-&&8Y29L%@=dxH!#s`5>SoM}9<;s#f4T5{>;O^V$6px3b(@|tbdJ5%a4 z;`w9Af5ao#Ijq3yo!d^n(iNei!7*Lo5t(7Q8 z2rQ3@T3uCV6{NyPo5R*W4Sc%a>3Kmiw`V8o`3pAk zYp%6=iJF;m`YTlQp7m7@rb%gYUYVuRhF*)8$op5{rtEfI=|WYiudm){cj%}F*QEC( zZKU@b_jRrmyb%-_q+lf2VW!9}`Q8ahJ1Q1=1!@cIyH{?O_d$S- z6d$#H%O6Gtjpp0JNx>y?aRY?OP{TNKTzCAQyfBEo%|QkvT+PoiJu@RR3v$wf7Smbz z&c^I_EZgdKuSQ=iig*=sby6{s~*nS z#D@DW_EFTm0Zy)KHj~aS>geO!Q@cim&ImuIn6T3Iv;jb>-Nry~BgQeaoX`v_abVI&$uH3wAr! z*1wl5Um~v@IwYMOgWXPRuS9-*E#PFtejN-jjuf&k2o{$8*KZ0^eX=W&k{OF_oN;=Q^>4sUFp3$7Tnqte;K9^v_S`Lt5`FEiDKA{K?$rMra-fsb2Xj(>(g4TSZTm*Z!ur3dO?P6`<-r9%mH%Q>wuN zV0QJ)fviK5wF-JZH3qlM#inW6^cY_!vDxuqH*P1$eiJ&@g3BtZQYWsMQPuE|zeXqZ zh2B*7IWW|);rX}QY(E**Bx=5MaPUv&{R!ZS{c*;3AD2}V`$*UNFL$QxBAT|hLGnh3*o)DI2XK$+3Z_AD3X+t>>K<;H|?q!?oP+W zi~Hjv)T@~dM`5hFT5+-^PqBEqm4NRB!`I^jXP*cz{?ao1`&5Dz)=QkERJuZ>6lw7U(CMD)4W*vOCfBfUi=^(Ll@1;HVAnwV{upNDPlhIG9N|_BdK7MgQlD z3Gt7Kk<9{GZdK3>;t6LS4@XUp#p3jSH5caslo-%9GVK@AV%tBpTzja~PGrauJ#lLv zXeA<5jE?5lEeUJUslh5l-U#d1&o_4cIj>IPY4uwm?{Dni(FDiq$Uc|Sf`T+pvUKj;oVV%q7MUE)K`m8&;wu81 zrmVUs2T#AGv0)zPs;Zz4v(J*3j7CnQvv1Br9}wONhJuJb#MANP9UNRW_<)3jg6H&q1bDqJS$D~`N+^wz4EfBw zzK)T<(sQ8ljUn5~_11V>9{FyThI_KqieN4EXT?!QtX5vN%p`N9v+GHLp<$x9m;F<^ z(VVsluFFqHl*vUXv~?#1lbxY8N;Tl`4DN3%?>oY3RK`Ntx}}9E@il&9(ZfZL5~(wN5Asr|>$nKjju_W^w;_nF&A42U zxY4fsc$zuumFBJ~)7EE&_0Xnb0qnXpuCw?agsSuM#)~F#bHQIN$FqT{kS7Pkm9-Xv z`M%Q0$wqmgNJ~g75tlTeJ6Enbx4|TNQ!GOy-8t!jSS@e^1>bah{p}ViIh;GUFV+N{ zxRHyH@SfN>A>xLg-_p1m*^V7}JMkhj=xW6~2?4XnuVH`0ih{azIJO!N*VAKeb=?p# z^5^F8-sy^D_DGg`p*oQ6(U?l?gr>AJ~-A;4?3ob zY~ws+*hen!J6K0p#*WDwsyqu?=6^!kIdt1lcT!Ea>^<9shsrvOt;iEpWr{#J%`?B( z%ValbV|j1P>-svg2&u7lI%&h_#dm{BIB9&;u@c*H^XbX57#z=?`KDzkImV`dnrnwzraXEOoV)um&0Dxsb~& zUSqO)^saC^E#qO4mc{{txMNWQ87hp;C#l!&6`frr=qaDm#}heO1+f!Kzno0X7n2nU z%CliV0!@1ZeufPPf;G5bMOi{i#wU3{_aq~?Jn8IUPe0zoY~4$kt_viqp0MtDo4p+e R{BIHxJso51&zd$N{|BZjK05#a literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P095_commands.repl b/docs/source/Plugin/P095_commands.repl index 0333daf36..0e4f1aa8f 100644 --- a/docs/source/Plugin/P095_commands.repl +++ b/docs/source/Plugin/P095_commands.repl @@ -1,69 +1,38 @@ .. csv-table:: - :header: "Command", "Extra information" - :widths: 20, 30 + :header: "Command Syntax", "Extra information" + :widths: 20, 30 - " - ``TFTCMD,`` - "," - Control the screen (on, off, clear,..) + " + This plugin allows dynamic configuration of the command-trigger. Available triggers are: - Examples: + * ``tft`` + * ``ili9341`` + * ``ili9342`` + * ``ili9481`` + * ``ili9486`` + * ``ili9488`` - - ``tftcmd,on`` Switch display on. - - ``tftcmd,off`` Switch display off. - - ``tftcmd,clear`` Clear whole display. - - ``tftcmd,clear,green`` Clear whole display with green color. - - ``tftcmd,inv,1`` Invert the dispaly (value:0 normal display, 1 inverted display) - - ``tftcmd,rot,2`` Rotate display (value from 0 to 3 inclusive) - " - " - ``TFT,,....`` - "," - Draw line, rect, circle, triangle and text - - Subcommands: - - - ``tft,txt,`` Write simple text (use last position, color and size) - - ``tft,txp,,`` Set text position (move the cursor) - - ``tft,txc,,`` Set text color (background is transparent if not provided - - ``tft,txs,`` Set text size - - ``tft,txtfull,,,,,,`` Write text with all options - - ``tft,l,,,<2>,,`` Draw a simple line - - ``tft,lh,,,`` Draw an horizontal line (width = Line width in pixels (positive = right of first point, negative = point of first corner). - - ``tft,lv,,,`` Draw a vertical line (height= Line height in pixels (positive = below first point, negative = above first point). - - ``tft,r,,,,,`` Draw a rectangle - - ``tft,rf,,,,,,`` Draw a filled rectangle - - ``tft,c,,,,`` Draw a circle - - ``tft,cf,,,,,`` Draw a filled circle - - ``tft,t,,,,,,,`` Draw a triangle - - ``tft,tf,,,,,,,,`` Draw a filled triangle - - ``tft,rr,,,,,,`` Draw a round rectangle - - ``tft,rrf,,,,,,,`` Draw a filled round rectangle - - ``tft,px,,,`` Print a single pixel - - ``tft,font,`` Switch to font - SEVENSEG24, SEVENSEG18, FREESANS, DEFAULT - " - -Examples: - -Write Text : - ``tft,txtfull,0,0,HelloWorld`` - -Write Text another place: - ``tft,txtfull,100,40,HelloWorld`` - -Write bigger Text : - ``tft,txtfull,0,0,3,HelloWorld`` - -Write RED Text : - ``tft,txtfull,0,0,3,HelloWorld`` - -Write RED Text (size is 1): - ``tft,txtfull,0,0,1,RED,HelloWorld`` - -Write RED Text on YELLOW background (size is 1): - ``tft,txtfull,0,0,1,RED,YELLOW,HelloWorld`` - -Select font : - -- ``tft,font,SEVENSEG24`` -- ``tft,txtfull,0,0,1,RED,17.0`` + The default trigger is ``tft`` + "," + Some commands are postfixed with ``cmd``, indicating device specific commands. Not device-specific commands are genericly applicable to all *Adafruit Graphics* enabled devices, using the ESPEasy ``AdafruitGFX_helper`` module. + " + " + | ``tftcmd,on`` + "," + | Switch the display on. + " + " + | ``tftcmd,off`` + "," + | Switch the display off. If the Backlight is connected and configured, that will also be turned off. + " + " + | ``tftcmd,clear`` + "," + | Clear the display, using the default background color. + " + " + | ``tftcmd,backlight,`` + "," + | Set the level of backlight brightness, from 1..100%. Only applicable if a backlight pin is configured. + " diff --git a/docs/source/Plugin/_plugin_substitutions_p09x.repl b/docs/source/Plugin/_plugin_substitutions_p09x.repl index d63f82d3e..ebc821e51 100644 --- a/docs/source/Plugin/_plugin_substitutions_p09x.repl +++ b/docs/source/Plugin/_plugin_substitutions_p09x.repl @@ -59,9 +59,9 @@ .. |P094_compileinfo| replace:: `.` .. |P094_usedlibraries| replace:: `.` -.. |P095_name| replace:: :cyan:`TFT 2.4 inches ILI9341` +.. |P095_name| replace:: :cyan:`TFT ILI934x/ILI948x` .. |P095_type| replace:: :cyan:`Display` -.. |P095_typename| replace:: :cyan:`Display - TFT 2.4 inches ILI9341` +.. |P095_typename| replace:: :cyan:`Display - TFT ILI934x/ILI948x` .. |P095_porttype| replace:: `.` .. |P095_status| replace:: :yellow:`DISPLAY, TESTING` .. |P095_github| replace:: _P095_ILI9341.ino @@ -70,7 +70,7 @@ .. |P095_shortinfo| replace:: `.` .. |P095_maintainer| replace:: `TD-er` .. |P095_compileinfo| replace:: `.` -.. |P095_usedlibraries| replace:: `Adafruit GFX, Adafruit ILI9341` +.. |P095_usedlibraries| replace:: `Adafruit GFX, Adafruit ILI9341 (locally extended copy)` .. |P097_name| replace:: :cyan:`Touch ESP32` .. |P097_type| replace:: :cyan:`Internal` From f1c80fcc11d7ffd383398080e4fb2d5919aade0d Mon Sep 17 00:00:00 2001 From: uwekaditz Date: Sat, 7 May 2022 20:52:34 +0200 Subject: [PATCH 20/89] [P037] Using xWide and html_TD(const String& style) --- src/src/PluginStructs/P037_data_struct.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/src/PluginStructs/P037_data_struct.cpp b/src/src/PluginStructs/P037_data_struct.cpp index a4a17f700..92c267d02 100644 --- a/src/src/PluginStructs/P037_data_struct.cpp +++ b/src/src/PluginStructs/P037_data_struct.cpp @@ -200,20 +200,20 @@ bool P037_data_struct::webform_load( html_TR_TD(); addHtml(F(" ")); addHtmlInt(varNr + 1); - html_TD(); + html_TD(F("padding-right: 8px")); id = F("p037_template"); id += (varNr + 1); addTextBox(id, mqttTopics[varNr], 40, - false, false, EMPTY_STRING, F("wide")); - html_TD(); + false, false, EMPTY_STRING, F("xwide")); + html_TD(F("padding-right: 8px")); id = F("p037_attribute"); id += (varNr + 1); addTextBox(id, jsonAttributes[varNr], 20, - false, false, EMPTY_STRING, EMPTY_STRING); + false, false, EMPTY_STRING, F("xwide")); html_TD(); } else # endif // ifdef P037_JSON_SUPPORT From 1cd2e2ac59ffd0512e2b4c115e7e7f1518ac89d8 Mon Sep 17 00:00:00 2001 From: TD-er Date: Mon, 16 May 2022 22:26:56 +0200 Subject: [PATCH 21/89] [PlatformIO] Do not extend multiple PIO envs --- platformio_esp32_envs.ini | 8 +++++++- platformio_esp82xx_base.ini | 7 ++++++- platformio_esp82xx_envs.ini | 27 +++++++++++---------------- platformio_special_envs.ini | 25 ++++++++++++++++++++----- 4 files changed, 44 insertions(+), 23 deletions(-) diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index 63659c578..253448f28 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -8,7 +8,13 @@ lib_ignore = ESP8266WiFi, ESP8266Ping, ESP8266WebServer, ESP8266HTTPUpdateServer, ESP8266mDNS, ESPEasy_ESP8266Ping, RABurton ESP8266 Mutex, TinyWireM, LittleFS_esp32 [esp32_base] -extends = common, core_esp32_IDF4_4__2_0_3 +extends = core_esp32_IDF4_4__2_0_3 +lib_archive = ${common.lib_archive} +framework = ${common.framework} +upload_speed = ${common.upload_speed} +monitor_speed = ${common.monitor_speed} +targets = ${common.targets} +src_filter = ${common.src_filter} lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, Adafruit ILI9341 ESPEasy, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ArduinoOTA, ESP32HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate extra_scripts = post:tools/pio/post_esp32.py ${extra_scripts_default.extra_scripts} diff --git a/platformio_esp82xx_base.ini b/platformio_esp82xx_base.ini index 6b71dd99e..4fe21ae94 100644 --- a/platformio_esp82xx_base.ini +++ b/platformio_esp82xx_base.ini @@ -43,7 +43,12 @@ lib_ignore = LittleFS(esp8266) lib_ignore = ${no_ir.lib_ignore}, ${no_sd.lib_ignore}, ${no_littlefs.lib_ignore} [esp82xx_common] -extends = common +lib_archive = ${common.lib_archive} +framework = ${common.framework} +upload_speed = ${common.upload_speed} +monitor_speed = ${common.monitor_speed} +targets = ${common.targets} +src_filter = ${common.src_filter} build_flags = ${debug_flags.build_flags} ${mqtt_flags.build_flags} -DHTTPCLIENT_1_1_COMPATIBLE=0 diff --git a/platformio_esp82xx_envs.ini b/platformio_esp82xx_envs.ini index 7b84b3b07..e7a3acafa 100644 --- a/platformio_esp82xx_envs.ini +++ b/platformio_esp82xx_envs.ini @@ -10,13 +10,6 @@ build_flags = ${regular_platform.build_flags} -DBUILD_NO_DEBUG -DPLUGIN_BUILD_CUSTOM -[hard_esp82xx_alt_wifi] -platform = ${regular_platform_alt_wifi.platform} -platform_packages = ${regular_platform_alt_wifi.platform_packages} -build_flags = ${regular_platform_alt_wifi.build_flags} - -DBUILD_NO_DEBUG - -DPLUGIN_BUILD_CUSTOM - [esp8266_custom_common] ;lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341 @@ -716,7 +709,9 @@ build_flags = ${regular_platform.build_flags} ; GPIO12 Red Led and Relay (0 = Off, 1 = On) ; GPIO13 Blue Led (0 = On, 1 = Off) [env:hard_SONOFF_POW_4M1M] -extends = esp8266_4M1M, hard_esp82xx +extends = esp8266_4M1M +platform = ${hard_esp82xx.platform} +platform_packages = ${hard_esp82xx.platform_packages} build_flags = ${hard_esp82xx.build_flags} ${esp8266_4M1M.build_flags} -D PLUGIN_SET_SONOFF_POW @@ -725,7 +720,7 @@ build_flags = ${hard_esp82xx.build_flags} ; Build including power measurement plugins for those devices that have only 1M flash. ; For example those made by BlitzWolf SHP [env:hard_other_POW_ESP8285_1M] -extends = esp8266_1M_OTA, hard_esp82xx +extends = esp8266_1M_OTA platform = ${hard_esp82xx.platform} platform_packages = ${hard_esp82xx.platform_packages} build_flags = ${hard_esp82xx.build_flags} @@ -735,7 +730,7 @@ build_flags = ${hard_esp82xx.build_flags} ; ITEAD / SONOFF S20 version -------------------- ;[env:hard_SONOFF_S20_1M] -;extends = esp8266_1M_OTA, hard_esp82xx +;extends = esp8266_1M_OTA ;platform = ${hard_esp82xx.platform} ;platform_packages = ${hard_esp82xx.platform_packages} ;build_flags = ${hard_esp82xx.build_flags} ${esp8266_1M_OTA.build_flags} -D PLUGIN_SET_SONOFF_S2x @@ -743,7 +738,7 @@ build_flags = ${hard_esp82xx.build_flags} ; ITEAD / SONOFF 4CH version -------------------- ;[env:hard_SONOFF_4CH_1M] -;extends = esp8285_1M_OTA, hard_esp82xx +;extends = esp8285_1M_OTA ;platform = ${hard_esp82xx.platform} ;platform_packages = ${hard_esp82xx.platform_packages} ;build_flags = ${hard_esp82xx.build_flags} ${esp8285_1M_OTA.build_flags} -D PLUGIN_SET_SONOFF_4CH @@ -752,7 +747,7 @@ build_flags = ${hard_esp82xx.build_flags} ; ITEAD / SONOFF TOUCH version ------------------ ;[env:hard_SONOFF_TOUCH_1M] -;extends = esp8285_1M_OTA, hard_esp82xx +;extends = esp8285_1M_OTA ;platform = ${hard_esp82xx.platform} ;platform_packages = ${hard_esp82xx.platform_packages} ;build_flags = ${hard_esp82xx.build_flags} ${esp8285_1M_OTA.build_flags} -D PLUGIN_SET_SONOFF_TOUCH @@ -763,7 +758,7 @@ build_flags = ${hard_esp82xx.build_flags} ; GPIO04 Relay (non inverted) ; GPIO05 Button [env:hard_Shelly_1_2M256] -extends = esp8266_2M256, hard_esp82xx +extends = esp8266_2M256 platform = ${hard_esp82xx.platform} platform_packages = ${hard_esp82xx.platform_packages} build_flags = ${hard_esp82xx.build_flags} @@ -771,7 +766,7 @@ build_flags = ${hard_esp82xx.build_flags} -D PLUGIN_SET_SHELLY_1 [env:hard_Shelly_PLUG_S_2M256] -extends = esp8266_2M256, hard_esp82xx +extends = esp8266_2M256 platform = ${hard_esp82xx.platform} platform_packages = ${hard_esp82xx.platform_packages} build_flags = ${hard_esp82xx.build_flags} @@ -782,7 +777,7 @@ build_flags = ${hard_esp82xx.build_flags} ; Ventus W266 weather station ; https://www.letscontrolit.com/wiki/index.php/VentusW266 [env:hard_Ventus_W266_1M] -extends = esp8266_1M, hard_esp82xx +extends = esp8266_1M platform = ${hard_esp82xx.platform} platform_packages = ${hard_esp82xx.platform_packages} build_flags = ${hard_esp82xx.build_flags} @@ -790,7 +785,7 @@ build_flags = ${hard_esp82xx.build_flags} -D PLUGIN_SET_VENTUS_W266 [env:hard_LCtech_relay_x2_1M] -extends = esp8266_1M, hard_esp82xx +extends = esp8266_1M platform = ${hard_esp82xx.platform} platform_packages = ${hard_esp82xx.platform_packages} build_flags = ${hard_esp82xx.build_flags} diff --git a/platformio_special_envs.ini b/platformio_special_envs.ini index 5f82f904b..66e9a74bb 100644 --- a/platformio_special_envs.ini +++ b/platformio_special_envs.ini @@ -13,7 +13,10 @@ build_flags = ${compiler_warnings.build_flags} [env:spec_debug_custom_ESP8266_4M1M] -extends = esp8266_4M1M, debug_pio +extends = esp8266_4M1M +build_type = ${debug_pio.build_type} +check_tool = ${debug_pio.check_tool} +check_flags = ${debug_pio.check_flags} platform = ${regular_platform.platform} platform_packages = ${regular_platform.platform_packages} build_flags = ${regular_platform.build_flags} @@ -24,7 +27,10 @@ lib_ignore = ${regular_platform.lib_ignore}, IRremoteESP8266, Hea extra_scripts = ${extra_scripts_esp8266.extra_scripts} [env:spec_debug_custom_IR_ESP8266_4M1M] -extends = esp8266_4M1M, debug_pio +extends = esp8266_4M1M +build_type = ${debug_pio.build_type} +check_tool = ${debug_pio.check_tool} +check_flags = ${debug_pio.check_flags} platform = ${regular_platform.platform} platform_packages = ${regular_platform.platform_packages} build_flags = ${regular_platform.build_flags} @@ -36,7 +42,10 @@ extra_scripts = ${extra_scripts_esp8266.extra_scripts} [env:spec_debug_beta_custom_ESP8266_4M1M] -extends = esp8266_4M1M, debug_pio +extends = esp8266_4M1M +build_type = ${debug_pio.build_type} +check_tool = ${debug_pio.check_tool} +check_flags = ${debug_pio.check_flags} platform = ${beta_platform.platform} platform_packages = ${beta_platform.platform_packages} build_flags = ${beta_platform.build_flags} @@ -48,7 +57,10 @@ extra_scripts = ${extra_scripts_esp8266.extra_scripts} [env:spec_debug_custom_ESP32_4M316k] -extends = esp32_common, debug_pio +extends = esp32_common +build_type = ${debug_pio.build_type} +check_tool = ${debug_pio.check_tool} +check_flags = ${debug_pio.check_flags} platform = ${esp32_common.platform} build_flags = ${esp32_common.build_flags} ${debug_pio.build_flags} -DPLUGIN_BUILD_CUSTOM board = esp32dev @@ -56,7 +68,10 @@ extra_scripts = ${esp32_common.extra_scripts} pre:tools/pio/pre_custom_esp32.py [env:spec_debug_max_ESP32_16M8M] -extends = esp32_common, debug_pio +extends = esp32_common +build_type = ${debug_pio.build_type} +check_tool = ${debug_pio.check_tool} +check_flags = ${debug_pio.check_flags} lib_ignore = ${esp32_always.lib_ignore}, ESP32_ping lib_deps = ${esp32_common.lib_deps}, VL53L0X board_upload.maximum_size = 4194304 From 9638f4340c5b463e96652aa3b694ced90d4c4497 Mon Sep 17 00:00:00 2001 From: TD-er Date: Mon, 16 May 2022 23:09:36 +0200 Subject: [PATCH 22/89] [PlatformIO] Change src_filter into build_src_filter for PIO 6.0.0 See: https://github.com/platformio/platformio-core/issues/4270 --- platformio.ini | 7 +++++-- platformio_esp32_envs.ini | 3 +-- platformio_esp82xx_base.ini | 3 +-- platformio_esp82xx_envs.ini | 6 +++--- platformio_special_envs.ini | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/platformio.ini b/platformio.ini index 2b21f42eb..b5b5b04aa 100644 --- a/platformio.ini +++ b/platformio.ini @@ -30,6 +30,11 @@ default_envs = normal_ESP32_16M8M_LittleFS ; ..etc ;build_cache_dir = $PROJECT_DIR\.buildcache +src_filter = +<*> -<.git/> -<.svn/> - - - - -<*/Commands/> -<*/ControllerQueue/> -<*/DataStructs/> -<*/DataTypes/> -<*/Globals/> -<*/Helpers/> -<*/PluginStructs/> -<*/WebServer/> + +; Backwards compatibility: https://github.com/platformio/platformio-core/issues/4270 +build_src_filter = ${platformio.src_filter} + ; add these: @@ -88,8 +93,6 @@ upload_speed = 115200 monitor_speed = 115200 ;targets = size, checkprogsize targets = -src_filter = +<*> -<.git/> -<.svn/> - - - - -<*/Commands/> -<*/ControllerQueue/> -<*/DataStructs/> -<*/DataTypes/> -<*/Globals/> -<*/Helpers/> -<*/PluginStructs/> -<*/WebServer/> - [env] diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index 253448f28..d42a0b856 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -14,8 +14,7 @@ framework = ${common.framework} upload_speed = ${common.upload_speed} monitor_speed = ${common.monitor_speed} targets = ${common.targets} -src_filter = ${common.src_filter} -lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, Adafruit ILI9341 ESPEasy, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ArduinoOTA, ESP32HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate +lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, Adafruit ILI9341 ESPEasy, adafruit/Adafruit GFX Library@^1.11.1, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ArduinoOTA, ESP32HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate extra_scripts = post:tools/pio/post_esp32.py ${extra_scripts_default.extra_scripts} build_unflags = -Wall diff --git a/platformio_esp82xx_base.ini b/platformio_esp82xx_base.ini index 4fe21ae94..9f2cf75dd 100644 --- a/platformio_esp82xx_base.ini +++ b/platformio_esp82xx_base.ini @@ -48,13 +48,12 @@ framework = ${common.framework} upload_speed = ${common.upload_speed} monitor_speed = ${common.monitor_speed} targets = ${common.targets} -src_filter = ${common.src_filter} build_flags = ${debug_flags.build_flags} ${mqtt_flags.build_flags} -DHTTPCLIENT_1_1_COMPATIBLE=0 build_unflags = -DDEBUG_ESP_PORT -fexceptions -lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, ESP8266WebServer, Adafruit ILI9341 ESPEasy, Adafruit GFX Library, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, bblanchon/ArduinoJson @ ^6.17.2, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/RABurton ESP8266 Mutex @ ^1.0.2, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ESP8266HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate +lib_deps = td-er/ESPeasySerial @ 2.0.8, I2Cdevlib-Core, ESP8266WebServer, Adafruit ILI9341 ESPEasy, adafruit/Adafruit GFX Library@^1.11.1, LOLIN_EPD, adafruit/Adafruit BusIO @ ^1.10.0, bblanchon/ArduinoJson @ ^6.17.2, VL53L0X @ 1.3.0, SparkFun VL53L1X 4m Laser Distance Sensor @ 1.2.9, td-er/RABurton ESP8266 Mutex @ ^1.0.2, td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1, ESP8266HTTPUpdateServer, FrogmoreScd30, Multi Channel Relay Arduino Library, SparkFun ADXL345 Arduino Library, ITG3205, Adafruit_ST77xx, ShiftRegister74HC595_NonTemplate lib_ignore = ${esp82xx_defaults.lib_ignore}, IRremoteESP8266, HeatpumpIR, LittleFS(esp8266), ServoESP32, TinyWireM monitor_filters = esp8266_exception_decoder extra_scripts = pre:tools/pio/pre_default_check.py diff --git a/platformio_esp82xx_envs.ini b/platformio_esp82xx_envs.ini index e7a3acafa..43cce407e 100644 --- a/platformio_esp82xx_envs.ini +++ b/platformio_esp82xx_envs.ini @@ -12,7 +12,7 @@ build_flags = ${regular_platform.build_flags} [esp8266_custom_common] -;lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341 +;lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, adafruit/Adafruit GFX Library@^1.11.1, LOLIN_EPD, Adafruit ILI9341 lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, IRremoteESP8266, HeatpumpIR extra_scripts = pre:tools/pio/pre_custom_esp82xx.py ${extra_scripts_esp8266.extra_scripts} @@ -37,7 +37,7 @@ build_flags = ${regular_platform.build_flags} ${esp8266_4M1M.build_flags} -DPLUGIN_BUILD_CUSTOM -DPLUGIN_BUILD_IR -lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341 ESPEasy, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx +lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, adafruit/Adafruit GFX Library@^1.11.1, LOLIN_EPD, Adafruit ILI9341 ESPEasy, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx extra_scripts = ${esp8266_custom_common.extra_scripts} @@ -82,7 +82,7 @@ platform_packages = ${beta_platform.platform_packages} build_flags = ${beta_platform.build_flags} ${esp8266_4M1M.build_flags} -DPLUGIN_BUILD_CUSTOM -lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341 ESPEasy, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx +lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, adafruit/Adafruit GFX Library@^1.11.1, LOLIN_EPD, Adafruit ILI9341 ESPEasy, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library, Adafruit_ST77xx extra_scripts = ${esp8266_custom_common.extra_scripts} diff --git a/platformio_special_envs.ini b/platformio_special_envs.ini index 66e9a74bb..3a286e22a 100644 --- a/platformio_special_envs.ini +++ b/platformio_special_envs.ini @@ -37,7 +37,7 @@ build_flags = ${regular_platform.build_flags} ${debug_pio.build_flags} ${esp8266_4M1M.build_flags} -DPLUGIN_BUILD_CUSTOM -lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, Adafruit GFX Library, LOLIN_EPD, Adafruit ILI9341, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library +lib_ignore = ESP32_ping, ESP32WebServer, ServoESP32, ESP32HTTPUpdateServer, adafruit/Adafruit GFX Library@^1.11.1, LOLIN_EPD, Adafruit ILI9341, adafruit/Adafruit BusIO, Adafruit NeoPixel, Adafruit Motor Shield V2 Library extra_scripts = ${extra_scripts_esp8266.extra_scripts} From 6be636dc869a7eab41dfbf117026c7e158abe1e5 Mon Sep 17 00:00:00 2001 From: TD-er Date: Tue, 17 May 2022 00:07:49 +0200 Subject: [PATCH 23/89] [PlatformIO] Revert to PlatformIO 5.2.5 --- platformio.ini | 10 ++++------ requirements.txt | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/platformio.ini b/platformio.ini index b5b5b04aa..4a55744ea 100644 --- a/platformio.ini +++ b/platformio.ini @@ -30,12 +30,6 @@ default_envs = normal_ESP32_16M8M_LittleFS ; ..etc ;build_cache_dir = $PROJECT_DIR\.buildcache -src_filter = +<*> -<.git/> -<.svn/> - - - - -<*/Commands/> -<*/ControllerQueue/> -<*/DataStructs/> -<*/DataTypes/> -<*/Globals/> -<*/Helpers/> -<*/PluginStructs/> -<*/WebServer/> - -; Backwards compatibility: https://github.com/platformio/platformio-core/issues/4270 -build_src_filter = ${platformio.src_filter} - - ; add these: ; -Werror -Wall -Wextra -pedantic -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op @@ -93,6 +87,10 @@ upload_speed = 115200 monitor_speed = 115200 ;targets = size, checkprogsize targets = +src_filter = +<*> -<.git/> -<.svn/> - - - - -<*/Commands/> -<*/ControllerQueue/> -<*/DataStructs/> -<*/DataTypes/> -<*/Globals/> -<*/Helpers/> -<*/PluginStructs/> -<*/WebServer/> + +; Backwards compatibility: https://github.com/platformio/platformio-core/issues/4270 +;build_src_filter = +<*> -<.git/> -<.svn/> - - - - -<*/Commands/> -<*/ControllerQueue/> -<*/DataStructs/> -<*/DataTypes/> -<*/Globals/> -<*/Helpers/> -<*/PluginStructs/> -<*/WebServer/> [env] diff --git a/requirements.txt b/requirements.txt index b737c31c8..84a73a241 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,7 +19,7 @@ MarkupSafe==2.0.1 marshmallow==3.14.0 packaging==21.0 pathtools==0.1.2 -platformio>=5.2.3 +platformio<6 port-for==0.6.1 pycparser==2.20 pyelftools==0.27 From 6e9378d3f4b199054aa90538cfc4408dc6bd4145 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Tue, 17 May 2022 22:18:00 +0200 Subject: [PATCH 24/89] [P095] Make Splash at start configurable, docs updated --- docs/source/Plugin/P095.rst | 2 + .../Plugin/P095_DeviceConfiguration.png | Bin 98805 -> 103577 bytes docs/source/Plugin/P095_commands.repl | 2 + src/_P095_ILI9341.ino | 10 ++++- src/src/PluginStructs/P095_data_struct.cpp | 35 +++++++----------- src/src/PluginStructs/P095_data_struct.h | 20 ++++++---- 6 files changed, 39 insertions(+), 30 deletions(-) diff --git a/docs/source/Plugin/P095.rst b/docs/source/Plugin/P095.rst index 9e4497852..a99fe7d31 100644 --- a/docs/source/Plugin/P095.rst +++ b/docs/source/Plugin/P095.rst @@ -117,6 +117,8 @@ Default setting is *Continue to next line*. * **Font scaling** The scaling factor for the currently active font. Select a factor between 1 and 10. +* **Show splash on start** When available, and enabled, will show an ESPEasy & plugin name text-splash during start of the plugin. If also some content is configured, this will be written over the splash, as that is not cleared after being displayed. + * **Clear display on exit** When checked, will clear the display when the task is disabled, either from settings or via the ``TaskDisable`` command. The screen will be turned off, and when a backlight pin is configured, also the backlight is turned off. * **Write Command trigger** The command to handle any commands for this device can be selected here. This can make the commands compatible with other (tft) displays, using the same command structure via the ESPEasy Adafruit Graphics helper class. diff --git a/docs/source/Plugin/P095_DeviceConfiguration.png b/docs/source/Plugin/P095_DeviceConfiguration.png index 4ea623904325ba050f29405709f37d714a531d8b..c00a7a10865bc1419777d7eb14ad3295b9ea1cd4 100644 GIT binary patch literal 103577 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

_cMXKb2i%D}YvD&x?<Q;0+vH*) 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 S?hX6`I&;G5c-2oo-}*P^jm^~n literal 98805 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 diff --git a/docs/source/Plugin/P095_commands.repl b/docs/source/Plugin/P095_commands.repl index 0e4f1aa8f..e88f9821e 100644 --- a/docs/source/Plugin/P095_commands.repl +++ b/docs/source/Plugin/P095_commands.repl @@ -15,6 +15,8 @@ The default trigger is ``tft`` "," Some commands are postfixed with ``cmd``, indicating device specific commands. Not device-specific commands are genericly applicable to all *Adafruit Graphics* enabled devices, using the ESPEasy ``AdafruitGFX_helper`` module. + + If one of the alternative **Write Command trigger** options is selected, then also the plugin specific commands change from ``tftcmd`` to f.e. ``ili9481cmd``. " " | ``tftcmd,on`` diff --git a/src/_P095_ILI9341.ino b/src/_P095_ILI9341.ino index 567d195d3..340c8af40 100644 --- a/src/_P095_ILI9341.ino +++ b/src/_P095_ILI9341.ino @@ -19,6 +19,7 @@ /** * Changelog: + * 2022-05-17 tonhuisman: Add setting for Splash during plugin startup, default on, when compiled in * 2022-01-09 tonhuisman: Add support for ILI9342 (M5Stack, 240x320), ILI9481, ILI9486 and ILI9488 (320x480) displays * 2021-11-16 tonhuisman: Add support for PLUGIN_GET_DISPLAY_PARAMETERS, removed commented old source * 2021-08-17 tonhuisman: Reformatted source using Uncrustify, small cleanups @@ -251,7 +252,7 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) hardwareOptions, P095_CONFIG_FLAG_GET_TYPE); } - + addFormSubHeader(F("Layout")); AdaGFXFormRotation(F("p095_rotate"), P095_CONFIG_ROTATION); @@ -260,6 +261,10 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) AdaGFXFormFontScaling(F("p095_fontscale"), P095_CONFIG_FLAG_GET_FONTSCALE); + # ifdef P095_SHOW_SPLASH + addFormCheckBox(F("Show splash on start"), F("p095_splash"), P095_CONFIG_FLAG_GET_SHOW_SPLASH); + # endif // ifdef P095_SHOW_SPLASH + addFormCheckBox(F("Clear display on exit"), F("p095_clearOnExit"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_CLEAR_ON_EXIT)); { @@ -351,6 +356,9 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) bitWrite(lSettings, P095_CONFIG_FLAG_USE_COL_ROW, isFormItemChecked(F("p095_colrow"))); // Bit 3 Col/Row addressing bitWrite(lSettings, P095_CONFIG_FLAG_COMPAT_P095, !isFormItemChecked(F("p095_compat"))); // Bit 4 Compat_P095 (inv) bitWrite(lSettings, P095_CONFIG_FLAG_BACK_FILL, !isFormItemChecked(F("p095_backfill"))); // Bit 5 Back fill text (inv) + # ifdef P095_SHOW_SPLASH + bitWrite(lSettings, P095_CONFIG_FLAG_SHOW_SPLASH, !isFormItemChecked(F("p095_splash"))); // Bit 6 Show splash on startup (inv) + # endif // ifdef P095_SHOW_SPLASH set4BitToUL(lSettings, P095_CONFIG_FLAG_CMD_TRIGGER, getFormItemInt(F("p095_commandtrigger"))); // Bit 8..11 Command trigger set4BitToUL(lSettings, P095_CONFIG_FLAG_FONTSCALE, getFormItemInt(F("p095_fontscale"))); // Bit 12..15 Font scale diff --git a/src/src/PluginStructs/P095_data_struct.cpp b/src/src/PluginStructs/P095_data_struct.cpp index 6f7aecd11..4f6223960 100644 --- a/src/src/PluginStructs/P095_data_struct.cpp +++ b/src/src/PluginStructs/P095_data_struct.cpp @@ -98,15 +98,8 @@ P095_data_struct::P095_data_struct(ILI9xxx_type_e displayType, * Destructor ***************************************************************************/ P095_data_struct::~P095_data_struct() { - if (nullptr != gfxHelper) { - delete gfxHelper; - gfxHelper = nullptr; - } - - if (nullptr != tft) { - delete tft; - tft = nullptr; - } + delete gfxHelper; + delete tft; } /**************************************************************************** @@ -166,17 +159,20 @@ bool P095_data_struct::plugin_init(struct EventStruct *event) { gfxHelper->setTxtfullCompensation(!bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_COMPAT_P095) ? 0 : 1); } updateFontMetrics(); - tft->fillScreen(_bgcolor); // fill screen with black color - tft->setTextColor(_fgcolor, _bgcolor); // set text color to white and black background + tft->fillScreen(_bgcolor); // fill screen with background color + tft->setTextColor(_fgcolor, _bgcolor); // set text color to white and configured background tft->setTextSize(_fontscaling); // Handles 0 properly, text size, default 1 = very small tft->setCursor(0, 0); // move cursor to position (0, 0) pixel displayOnOff(true); # ifdef P095_SHOW_SPLASH - uint16_t yPos = 0; - gfxHelper->printText(String(F("ESPEasy")).c_str(), 0, yPos, 3, ST77XX_WHITE, ST77XX_BLUE); - yPos += (3 * _fontheight); - gfxHelper->printText(String(F("ILI9341")).c_str(), 0, yPos, 2, ST77XX_BLUE, ST77XX_WHITE); - delay(100); // Splash + + if (P095_CONFIG_FLAG_GET_SHOW_SPLASH) { + uint16_t yPos = 0; + gfxHelper->printText(String(F("ESPEasy")).c_str(), 0, yPos, 3, ADAGFX_WHITE, ADAGFX_BLUE); + yPos += (3 * _fontheight); + gfxHelper->printText(String(F("ILI934x/ILI948x")).c_str(), 0, yPos, 2, ADAGFX_BLUE, ADAGFX_WHITE); + delay(100); // Splash + } # endif // ifdef P095_SHOW_SPLASH updateFontMetrics(); @@ -213,13 +209,10 @@ bool P095_data_struct::plugin_exit(struct EventStruct *event) { displayOnOff(false); } - if (nullptr != gfxHelper) { delete gfxHelper; } + delete gfxHelper; gfxHelper = nullptr; - if (nullptr != tft) { - // delete tft; // Library is not properly inherited so no destructor called - free(tft); // Free up some memory without calling the destructor chain - } + delete tft; tft = nullptr; return true; } diff --git a/src/src/PluginStructs/P095_data_struct.h b/src/src/PluginStructs/P095_data_struct.h index 7e55796c1..51961f540 100644 --- a/src/src/PluginStructs/P095_data_struct.h +++ b/src/src/PluginStructs/P095_data_struct.h @@ -4,17 +4,19 @@ #include "../../_Plugin_Helper.h" #ifdef USES_P095 -# include <Adafruit_GFX.h> // include Adafruit graphics library -# include <Adafruit_ILI9341.h> // include Adafruit ILI9341 TFT library +# include <Adafruit_GFX.h> // include Adafruit graphics library +# include <Adafruit_ILI9341.h> // include Adafruit ILI9341 TFT library -# include "../Helpers/AdafruitGFX_helper.h" // Use Adafruit graphics helper object +# include "../Helpers/AdafruitGFX_helper.h" // Use Adafruit graphics helper object # include "../CustomBuild/StorageLayout.h" -# define P095_Nlines 24 // The number of different lines which can be displayed +# define P095_Nlines 24 // The number of different lines which can be displayed # define P095_Nchars 60 -# define P095_DebounceTreshold 5 // number of 20 msec (fifty per second) ticks before the button has settled +# define P095_DebounceTreshold 5 // number of 20 msec (fifty per second) ticks before the button has settled -// # define P095_SHOW_SPLASH // Enable to show initial splash (text) +# ifndef LIMIT_BUILD_SIZE +# define P095_SHOW_SPLASH // Enable to show initial splash (text) +# endif // ifndef LIMIT_BUILD_SIZE # define P095_CONFIG_VERSION PCONFIG(0) // Settings version # define P095_CONFIG_ROTATION PCONFIG(1) // Rotation @@ -31,6 +33,7 @@ # define P095_CONFIG_FLAG_USE_COL_ROW 3 // Flag: Use Col/Row text addressing in commands # define P095_CONFIG_FLAG_COMPAT_P095 4 // Flag: Compatibility -1 offset like original P095 # define P095_CONFIG_FLAG_BACK_FILL 5 // Flag: Background fill when printing text +# define P095_CONFIG_FLAG_SHOW_SPLASH 6 // Flag: Show splash during startup of the plugin # define P095_CONFIG_FLAG_CMD_TRIGGER 8 // Flag-offset to store 4 bits for Command trigger, uses bits 8, 9, 10 and 11 # define P095_CONFIG_FLAG_FONTSCALE 12 // Flag-offset to store 4 bits for Font scaling, uses bits 12, 13, 14 and 15 # define P095_CONFIG_FLAG_MODE 16 // Flag-offset to store 4 bits for Mode, uses bits 16, 17, 18 and 19 @@ -43,6 +46,7 @@ # define P095_CONFIG_FLAG_GET_FONTSCALE (get4BitFromUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_FONTSCALE)) # define P095_CONFIG_FLAG_GET_MODE (get4BitFromUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_MODE)) # define P095_CONFIG_FLAG_GET_TYPE (get4BitFromUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_TYPE)) +# define P095_CONFIG_FLAG_GET_SHOW_SPLASH (!bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_SHOW_SPLASH)) // Inverted setting, default on # ifdef ESP32 @@ -55,8 +59,8 @@ # else // ifdef ESP32 // Was: for D1 Mini with shield connection - # define P095_TFT_CS 0 // D3 - # define P095_TFT_DC 4 // D2 + # define P095_TFT_CS 0 // D3 + # define P095_TFT_DC 4 // D2 # define P095_TFT_RST -1 // D4 // -1 # define P095_BACKLIGHT_PIN -1 // D6 // 15 // D8 -> Blocks Wemos # endif // ifdef ESP32 From d2b1eb40072df5c16ff3a6bce7f4235a1d8464ed Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 21 May 2022 13:30:02 +0200 Subject: [PATCH 25/89] [P095] Fix for displaying text on previous location was not overwriting old content Add Text print mode for centered text Extend txtfull subcommand to enable centered text --- src/src/Helpers/AdafruitGFX_helper.cpp | 172 ++++++++++++++++--------- src/src/Helpers/AdafruitGFX_helper.h | 22 ++-- 2 files changed, 120 insertions(+), 74 deletions(-) diff --git a/src/src/Helpers/AdafruitGFX_helper.cpp b/src/src/Helpers/AdafruitGFX_helper.cpp index 3069c25a5..ba60e3d8b 100644 --- a/src/src/Helpers/AdafruitGFX_helper.cpp +++ b/src/src/Helpers/AdafruitGFX_helper.cpp @@ -48,6 +48,7 @@ const __FlashStringHelper* toString(AdaGFXTextPrintMode mode) { case AdaGFXTextPrintMode::ContinueToNextLine: return F("Continue to next line"); case AdaGFXTextPrintMode::TruncateExceedingMessage: return F("Truncate exceeding message"); case AdaGFXTextPrintMode::ClearThenTruncate: return F("Clear then truncate exceeding message"); + case AdaGFXTextPrintMode::TruncateExceedingCentered: return F("Truncate, centered if maxWidth set"); case AdaGFXTextPrintMode::MAX: break; } return F("None"); @@ -80,12 +81,14 @@ void AdaGFXFormTextPrintMode(const __FlashStringHelper *id, const __FlashStringHelper *textModes[textModeCount] = { // Be sure to use all available modes from enum! toString(AdaGFXTextPrintMode::ContinueToNextLine), toString(AdaGFXTextPrintMode::TruncateExceedingMessage), - toString(AdaGFXTextPrintMode::ClearThenTruncate) + toString(AdaGFXTextPrintMode::ClearThenTruncate), + toString(AdaGFXTextPrintMode::TruncateExceedingCentered), }; const int textModeOptions[textModeCount] = { static_cast<int>(AdaGFXTextPrintMode::ContinueToNextLine), static_cast<int>(AdaGFXTextPrintMode::TruncateExceedingMessage), - static_cast<int>(AdaGFXTextPrintMode::ClearThenTruncate) + static_cast<int>(AdaGFXTextPrintMode::ClearThenTruncate), + static_cast<int>(AdaGFXTextPrintMode::TruncateExceedingCentered), }; addFormSelector(F("Text print Mode"), id, textModeCount, textModes, textModeOptions, selectedIndex); @@ -445,8 +448,10 @@ AdafruitGFX_helper::AdafruitGFX_helper(Adafruit_SPITFT *display, # endif // ifdef ADAGFX_ENABLE_BMP_DISPLAY -void AdafruitGFX_helper::initialize() -{ +/**************************************************************************** + * common initialization, called from constructors + ***************************************************************************/ +void AdafruitGFX_helper::initialize() { _trigger.toLowerCase(); // store trigger in lowercase # ifndef BUILD_NO_DEBUG @@ -595,7 +600,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { _display->setTextColor(_fgcolor, _bgcolor); } } - else if (subcommand.equals(F("txs")) && (argCount == 1)) + else if (subcommand.equals(F("txs")) && (argCount == 1)) // txs: Text size = font scaling, 1..10 { if ((nParams[0] >= 0) || (nParams[0] <= 10)) { _fontscaling = nParams[0]; @@ -605,7 +610,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { success = false; } } - else if (subcommand.equals(F("txtfull")) && (argCount >= 3) && (argCount <= 6)) { // txtfull: Text at position, with size and color + else if (subcommand.equals(F("txtfull")) && (argCount >= 3) && (argCount <= 8)) { // txtfull: Text at position, with size and color switch (argCount) { case 3: // single text @@ -676,6 +681,36 @@ bool AdafruitGFX_helper::processCommand(const String& string) { AdaGFXparseColor(sParams[4], _colorDepth)); } break; + case 7: // 7: text + size + color + bkcolor + printmode + case 8: // as 7 but: + maxwidth + + # if ADAGFX_ARGUMENT_VALIDATION + + if (invalidCoordinates(nParams[0] - _p095_compensation, nParams[1] - _p095_compensation, _columnRowMode)) { + success = false; + } else + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + AdaGFXTextPrintMode tmpPrintMode = _textPrintMode; + + if ((nParams[5] >= 0) && (nParams[5] < static_cast<int>(AdaGFXTextPrintMode::MAX))) { + _textPrintMode = static_cast<AdaGFXTextPrintMode>(nParams[5]); + _display->setTextWrap(_textPrintMode == AdaGFXTextPrintMode::ContinueToNextLine); + } + printText(sParams[argCount - 1].c_str(), + nParams[0] - _p095_compensation, + nParams[1] - _p095_compensation, + nParams[2], + AdaGFXparseColor(sParams[3], _colorDepth), + AdaGFXparseColor(sParams[4], _colorDepth), + argCount == 8 ? nParams[argCount - 2] : 0); + + if (_textPrintMode != tmpPrintMode) { + _textPrintMode = tmpPrintMode; + _display->setTextWrap(_textPrintMode == AdaGFXTextPrintMode::ContinueToNextLine); + } + } + break; default: success = false; break; @@ -761,10 +796,10 @@ bool AdafruitGFX_helper::processCommand(const String& string) { if (sParams[0].equals(F("sevenseg24"))) { _display->setFont(&Seven_Segment24pt7b); - calculateTextMetrics(21, 42, 35); + calculateTextMetrics(21, 42, 35, true); } else if (sParams[0].equals(F("sevenseg18"))) { _display->setFont(&Seven_Segment18pt7b); - calculateTextMetrics(16, 32, 25); + calculateTextMetrics(16, 33, 26, true); } else if (sParams[0].equals(F("freesans"))) { _display->setFont(&FreeSans9pt7b); calculateTextMetrics(10, 16, 12); @@ -858,7 +893,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED } else if (sParams[0].equals(F("default"))) { // font,default is always available! _display->setFont(); - calculateTextMetrics(6, 10); + calculateTextMetrics(6, 9); } else { success = false; } @@ -1168,48 +1203,36 @@ bool AdafruitGFX_helper::processCommand(const String& string) { /**************************************************************************** * printText: Print text on display at a specific pixel or column/row location ***************************************************************************/ -void AdafruitGFX_helper::printText(const char *string, - int X, - int Y, - unsigned int textSize, - unsigned short color, - unsigned short bkcolor) { +void AdafruitGFX_helper::printText(const char *string, + int16_t X, + int16_t Y, + uint8_t textSize, + uint16_t color, + uint16_t bkcolor, + uint16_t maxWidth) { int16_t _x = X; int16_t _y = Y + (_heightOffset * textSize); uint16_t _w = 0; - uint8_t _h = 0; - int16_t x1, y1; - uint16_t w0, w1, h1; + int16_t x1 = 0, y1 = 0; + uint16_t w1 = 0, h1 = 0; + int16_t ot = 0, ob = 0, ol = 0; + uint16_t res_x = _res_x; + String newString = string; if (_columnRowMode) { _x = X * (_fontwidth * textSize); // We need this multiple times _y = (Y * (_fontheight * textSize)) + (_heightOffset * textSize); } - if (_textBackFill && (color != bkcolor)) { // Draw extra lines above text - // Estimate used width - _w = _textPrintMode == AdaGFXTextPrintMode::ContinueToNextLine ? - strlen(string) * _fontwidth * textSize : - ((_textcols + 1) * _fontwidth * textSize) - _x; - - do { - _display->drawLine(_x, _y, _x + _w - 1, _y, bkcolor); - _h++; - _y++; // Shift down entire line - } while (_h < textSize); - } - _display->setCursor(_x, _y); _display->setTextColor(color, bkcolor); _display->setTextSize(textSize); - String newString = string; - if (_textPrintMode != AdaGFXTextPrintMode::ContinueToNextLine) { if (_isProportional) { // Proportional font. This is rather slow! _display->getTextBounds(newString, _x, _y, &x1, &y1, &w1, &h1); // Count length - while ((newString.length() > 0) && ((_x + w1) > _res_x)) { + while ((newString.length() > 0) && ((_x + w1) > res_x)) { newString.remove(newString.length() - 1); // Cut last character off _display->getTextBounds(newString, _x, _y, &x1, &y1, &w1, &h1); // Re-count length } @@ -1221,43 +1244,64 @@ void AdafruitGFX_helper::printText(const char *string, } } - w1 = 0; + _display->getTextBounds(newString, _x, _y, &x1, &y1, &w1, &h1); // Count length - _display->getTextBounds(F(" "), _x, _y, &x1, &y1, &w1, &h1); + if ((maxWidth > 0) && (_x + maxWidth <= _res_x)) { + res_x = _x + maxWidth; + _w = maxWidth; - if (w1 == 0) { w1 = _fontwidth; } // Some fonts seem to have a 0-wide space, this is an endless loop protection - - if (_textPrintMode == AdaGFXTextPrintMode::ClearThenTruncate) { // Clear before print - _display->setCursor(_x, _y); - w0 = 0; - uint16_t w2 = 0; - - _display->getTextBounds(newString, _x, _y, &x1, &y1, &w2, &h1); // Count length in pixels - - for (; (w0 < w2); w0 += w1) { // Clear previously used text with spaces - _display->print(' '); + if ((_textPrintMode == AdaGFXTextPrintMode::TruncateExceedingCentered) && + (maxWidth > w1)) { + ol = (_w - (w1 + 2 * (x1 - _x))) / 2; } + } else { + _w = w1 + 2 * (x1 - _x); + } + + if (_textBackFill && (color != bkcolor)) { // Fill extra space above and below text + ot -= textSize; + ob += textSize; + _y += textSize; + } + + if ((_textPrintMode == AdaGFXTextPrintMode::ClearThenTruncate) || + (color != bkcolor)) { // Clear before print + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { + String log = F("printText: clear: _x:"); + log += _x; + log += F(", _y:"); + log += _y; + log += F(", x1:"); + log += x1; + log += F(", y1:"); + log += y1; + log += F(", w1:"); + log += w1; + log += F(", h1:"); + log += h1; + log += F(", _res_x/max:"); + log += _res_x; + log += '/'; + log += res_x; + log += F(", str:"); + log += newString; + addLogMove(LOG_LEVEL_DEBUG, log); + } + # endif // ifndef BUILD_NO_DEBUG + + if (_textPrintMode == AdaGFXTextPrintMode::ClearThenTruncate) { + _display->fillRect(_x + ot, y1, res_x - _x, h1 + ob, bkcolor); // Clear text area to right edge of screen + } else { + _display->fillRect(_x + ot, y1, _w, h1 + ob, bkcolor); // Clear text area + } + delay(0); } - _display->setCursor(_x, _y); + _display->setCursor(_x + ol, _y); // add left offset to center, _y may be updated _display->print(newString); - - _display->getTextBounds(newString, _x, _y, &x1, &y1, &w0, &h1); // Count length in pixels - - for (; ((_x + w0) < _res_x) && _textPrintMode != AdaGFXTextPrintMode::ContinueToNextLine; w0 += w1) { - _display->print(' '); - } - - if (_textBackFill && (color != bkcolor)) { // Draw extra lines below text - _y += ((_fontheight - 1) * textSize); - _h = 0; - - do { - _display->drawLine(_x, _y - _h, _x + _w - 1, _y - _h, bkcolor); - _h++; - } while (_h <= textSize); - } } /**************************************************************************** diff --git a/src/src/Helpers/AdafruitGFX_helper.h b/src/src/Helpers/AdafruitGFX_helper.h index 34f93c337..b4af0e0e8 100644 --- a/src/src/Helpers/AdafruitGFX_helper.h +++ b/src/src/Helpers/AdafruitGFX_helper.h @@ -160,11 +160,12 @@ enum class AdaGFX7Colors: uint16_t { # endif // if ADAGFX_SUPPORT_7COLOR enum class AdaGFXTextPrintMode : uint8_t { - ContinueToNextLine = 0u, - TruncateExceedingMessage = 1u, - ClearThenTruncate = 2u, // Should have max. 16 options + ContinueToNextLine = 0u, + TruncateExceedingMessage = 1u, + ClearThenTruncate = 2u, + TruncateExceedingCentered = 3u, // Should have max. 16 options - MAX // Keep as last + MAX // Keep as last }; # if ADAGFX_SUPPORT_7COLOR @@ -269,12 +270,13 @@ public: bool processCommand(const String& string); // Parse the string for recognized commands and apply them on the graphics display - void printText(const char *string, - int X, - int Y, - unsigned int textSize = 0, - unsigned short color = ADAGFX_WHITE, - unsigned short bkcolor = ADAGFX_BLACK); + void printText(const char *string, + int16_t X, + int16_t Y, + uint8_t textSize = 0, + uint16_t color = ADAGFX_WHITE, + uint16_t bkcolor = ADAGFX_BLACK, + uint16_t maxWidth = 0); void calculateTextMetrics(uint8_t fontwidth, uint8_t fontheight, int8_t heightOffset = 0, From 06fed50becc82fd05522a785951c5af58edf9925 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 21 May 2022 13:30:26 +0200 Subject: [PATCH 26/89] [P095] Update documentation --- docs/source/Plugin/AdaGFX_commands.repl | 7 ++++++- docs/source/Plugin/P095.rst | 1 + .../Plugin/P095_TextPrintModeOptions.png | Bin 17578 -> 24262 bytes 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/source/Plugin/AdaGFX_commands.repl b/docs/source/Plugin/AdaGFX_commands.repl index dd86b1a34..75e9ae72c 100644 --- a/docs/source/Plugin/AdaGFX_commands.repl +++ b/docs/source/Plugin/AdaGFX_commands.repl @@ -33,6 +33,7 @@ * 0 : Continue to next line (wrap text onto the next line) * 1 : Truncate exceeding message (cut-off text that won't fit on the screen width) * 2 : Clear then truncate exceeding message (Clear to width of screen, then print the message) + * 3 : Truncate and center message in available space, when maxTextWidthPixels is provided in ``txtfull`` subcommand. Will act like 1 : Truncate exceeding message if no width provided. " " ``<trigger>,txt,<text>`` @@ -69,11 +70,15 @@ Set font scaling option. Only values from 0 to 10 are accepted. 0 assumes 1 by default. " " - ``<trigger>,txtfull,<x>,<y>,<size=1>,<foreColor=white>,<backColor=transparent>,<text>`` + ``<trigger>,txtfull,<x>,<y>,<size=1>,<foreColor=current>,<backColor=foreColor>,<textPrintMode=current>,<maxTextWidthPixels=0>,<text>`` "," Write text at position X/Y with all options. Depending on the setting **Text Coordinates in col/row**, these coordinates are pixels (default) or column/rows. All options that have a default specified (size, foreColor, backColor) can be left out, but text is expected. ForeColor and BackColor use the last set Foreground and Background colors (that will by default be white and transparent if not provided). + + ``textPrintMode`` can be passed an invalid value (f.e. -1) to use the current setting. + + ``maxTextWidthPixels`` can be used to have textPrintMode > 0 (see ``tpm`` subcommand) but clear only a limited area width instead of clearing until the right edge of the screen. 0 implies that the right edge of the screen is used. " " ``<trigger>,asciitable[,<offset>,<fontscaling>]`` diff --git a/docs/source/Plugin/P095.rst b/docs/source/Plugin/P095.rst index a99fe7d31..0e7439e99 100644 --- a/docs/source/Plugin/P095.rst +++ b/docs/source/Plugin/P095.rst @@ -112,6 +112,7 @@ Available options: * *Continue to next line* Simply 'prints' all text to the display, with automatic overflow to the next line(s) if the text doesn't fit on the current line. * *Truncate exceeding message* Display the provided message, but any excess at the right border of the display is discarded. * *Clear then truncate exceeding message* Clear from the current cursor position to the end of the display, then display the provided message, but any excess at the right border of the display is discarded. +* *Truncate, centered if maxWidth set* Like *Truncate exceeding message* but centered in available width when that is provided (in ``txtfull`` subcommand). Default setting is *Continue to next line*. diff --git a/docs/source/Plugin/P095_TextPrintModeOptions.png b/docs/source/Plugin/P095_TextPrintModeOptions.png index 44a864edada9073972fb863d58c78532cf6aa8ce..11f53788180f6d5986ec6b0135ff134dbf525e1f 100644 GIT binary patch literal 24262 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 U$wxT{Fz7)B*Nv`y)<M4dAJ~sD6#xJL literal 17578 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%0Dl94J4 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 JPDHLkV1f&iil_hp From ac4724686c8217ccd9207692d5c4640ac40cdfd5 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 4 Jun 2022 13:57:00 +0200 Subject: [PATCH 27/89] [Build] Update custom ESP32 NO_OTA_LittleFS build configuration --- platformio_esp32_envs.ini | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index f5bdb1d63..cebd75841 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -94,18 +94,6 @@ build_flags = ${esp32_base.build_flags} lib_deps = ${esp32_base.lib_deps} LittleFS -[env:custom_ESP32_4M2M_NO_OTA_LittleFS] -extends = esp32_common -build_flags = ${esp32_common.build_flags} -DPLUGIN_BUILD_CUSTOM - -DNO_HTTP_UPDATER -board = esp32dev -board_build.partitions = esp32_partition_app1810k_spiffs2172k.csv -board_build.filesystem = littlefs -lib_deps = ${esp32_common.lib_deps}, https://github.com/lorol/LITTLEFS.git -extra_scripts = ${esp32_common.extra_scripts} - pre:tools/pio/pre_custom_esp32.py - - [esp32_custom_base] extends = esp32_common @@ -146,6 +134,13 @@ lib_ignore = ${esp32_always.lib_ignore} extra_scripts = ${esp32_base.extra_scripts} pre:tools/pio/pre_custom_esp32.py +[env:custom_ESP32_4M2M_NO_OTA_LittleFS] +extends = esp32_custom_base_LittleFS +board = esp32_4M +build_flags = ${esp32_custom_base_LittleFS.build_flags} + -DNO_HTTP_UPDATER +board_build.partitions = esp32_partition_app1810k_spiffs2172k.csv + [env:normal_ESP32_4M316k] extends = esp32_common From 457402f095add256cdfe30f59d1adacead9c29d5 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 11 Jun 2022 17:38:34 +0200 Subject: [PATCH 28/89] [P131] Code optimizations, make splash configurable --- src/_P131_NeoPixelMatrix.ino | 149 +++++++++------------ src/src/PluginStructs/P131_data_struct.cpp | 31 +++-- src/src/PluginStructs/P131_data_struct.h | 73 +++++----- 3 files changed, 118 insertions(+), 135 deletions(-) diff --git a/src/_P131_NeoPixelMatrix.ino b/src/_P131_NeoPixelMatrix.ino index 17b150f40..432c7949b 100644 --- a/src/_P131_NeoPixelMatrix.ino +++ b/src/_P131_NeoPixelMatrix.ino @@ -7,6 +7,8 @@ // ####################################################################################################### /** Changelog: + * 2022-06-11 tonhuisman: Cleanup and optimize, make startup-splash configurable + * Removed old setting for Brightness, check settings if older version has been used! * 2022-03-16 tonhuisman: Add textmode option, start scrolling implementation * 2022-03-12 tonhuisman: Add Max. Brightness setting. Bugfixing. * 2022-03-11 tonhuisman: Add Initial Brightness setting @@ -20,33 +22,6 @@ # include "./src/PluginStructs/P131_data_struct.h" -/****************************************** - * enquoteString wrap in ", ' or ` unless all 3 quote types are used - *****************************************/ -String P131enquoteString(const String& input) { - char quoteChar = '"'; - - if (input.indexOf(quoteChar) > -1) { - quoteChar = '\''; - - if (input.indexOf(quoteChar) > -1) { - quoteChar = '`'; - - if (input.indexOf(quoteChar) > -1) { - return input; // All types of supported quotes used, return original string - } - } - } - String result; - - result.reserve(input.length() + 2); - result = quoteChar; - result += input; - result += quoteChar; - - return result; -} - boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) { boolean success = false; @@ -98,17 +73,19 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) break; } - case PLUGIN_GET_DEVICEGPIONAMES: { + case PLUGIN_GET_DEVICEGPIONAMES: + { event->String1 = formatGpioName_output(F("DIN")); break; } case PLUGIN_WEBFORM_LOAD: { + const int optionValuesZeroOne[] { 0, 1 }; + { const __FlashStringHelper *stripOptions[] = { F("GRB"), F("GRBW") }; // Selection copied from P038 - int stripIndices[] = { 0, 1 }; - addFormSelector(F("Strip Type"), F("p131_strip"), 2, stripOptions, stripIndices, P131_CONFIG_FLAGS_GET_STRIP_TYPE); + addFormSelector(F("Strip Type"), F("striptype"), 2, stripOptions, optionValuesZeroOne, P131_CONFIG_FLAGS_GET_STRIP_TYPE); } { @@ -117,71 +94,67 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) F("Top/Right"), F("Bottom/Left"), F("Bottom/Right") }; - int optionValuesTop[] { 0, 2, 1, 3 }; + const int optionValuesTop[] { 0, 2, 1, 3 }; const __FlashStringHelper *optionsRowCol[] = { F("Rows"), F("Columns") }; - int optionValuesRowCol[] { 0, 1 }; const __FlashStringHelper *optionsProZig[] = { F("Progressive"), F("Zigzag") }; - int optionValuesProZig[] { 0, 1 }; addFormSubHeader(F("Matrix")); - addFormNumericBox(F("Matrix width"), F("p131_matrixwidth"), + addFormNumericBox(F("Matrix width"), F("matrixwidth"), P131_CONFIG_MATRIX_WIDTH, 1, 100); - addFormNumericBox(F("Matrix height"), F("p131_matrixheight"), + addFormNumericBox(F("Matrix height"), F("matrixheight"), P131_CONFIG_MATRIX_HEIGHT, 1, 100); - addFormSelector(F("Matrix start-pixel"), F("p131_matrixstart"), 4, optionsTop, optionValuesTop, + addFormSelector(F("Matrix start-pixel"), F("matrixstart"), 4, optionsTop, optionValuesTop, get2BitFromUL(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE_TOP)); - addFormSelector(F("Matrix Rows/Columns mode"), F("p131_matrixrowcol"), 2, optionsRowCol, optionValuesRowCol, + addFormSelector(F("Matrix Rows/Columns mode"), F("matrixrowcol"), 2, optionsRowCol, optionValuesZeroOne, bitRead(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE_RC)); - addFormSelector(F("Matrix flow direction"), F("p131_matrixprozig"), 2, optionsProZig, optionValuesProZig, + addFormSelector(F("Matrix flow direction"), F("matrixprozig"), 2, optionsProZig, optionValuesZeroOne, bitRead(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE_PZ)); addFormSubHeader(F("Multiple matrices: Tiles")); - addFormNumericBox(F("Tile matrix width"), F("p131_tilewidth"), + addFormNumericBox(F("Tile matrix width"), F("tilewidth"), P131_CONFIG_TILE_WIDTH, 1, 32); - addFormNumericBox(F("Tile matrix height"), F("p131_tileheight"), + addFormNumericBox(F("Tile matrix height"), F("tileheight"), P131_CONFIG_TILE_HEIGHT, 1, P131_Nlines); - addFormSelector(F("Tile start-matrix"), F("p131_tilestart"), 4, optionsTop, optionValuesTop, + addFormSelector(F("Tile start-matrix"), F("tilestart"), 4, optionsTop, optionValuesTop, get2BitFromUL(P131_CONFIG_FLAGS, P131_FLAGS_TILE_TYPE_TOP)); - addFormSelector(F("Tile Rows/Columns mode"), F("p131_tilerowcol"), 2, optionsRowCol, optionValuesRowCol, + addFormSelector(F("Tile Rows/Columns mode"), F("tilerowcol"), 2, optionsRowCol, optionValuesZeroOne, bitRead(P131_CONFIG_FLAGS, P131_FLAGS_TILE_TYPE_RC)); - addFormSelector(F("Tile flow direction"), F("p131_tileprozig"), 2, optionsProZig, optionValuesProZig, + addFormSelector(F("Tile flow direction"), F("tileprozig"), 2, optionsProZig, optionValuesZeroOne, bitRead(P131_CONFIG_FLAGS, P131_FLAGS_TILE_TYPE_PZ)); } addFormSubHeader(F("Display")); - AdaGFXFormRotation(F("p131_rotate"), P131_CONFIG_FLAG_GET_ROTATION); + AdaGFXFormRotation(F("rotate"), P131_CONFIG_FLAG_GET_ROTATION); - AdaGFXFormTextPrintMode(F("p131_mode"), P131_CONFIG_FLAG_GET_MODE); + AdaGFXFormTextPrintMode(F("tpmode"), P131_CONFIG_FLAG_GET_MODE); - if ((P131_CONFIG_FLAG_GET_MAXBRIGHT == 0) && (P131_CONFIG_FLAG_GET_BRIGHTNESS == 0)) { // TODO TO BE REMOVED! - uint32_t lSettings = 0; - set8BitToUL(lSettings, P131_CONFIG_FLAG_B_BRIGHTNESS, P131_CONFIG_BRIGHTNESS_OLD); - set8BitToUL(lSettings, P131_CONFIG_FLAG_B_MAXBRIGHT, 255); - P131_CONFIG_FLAGS_B = lSettings; - } - addFormNumericBox(F("Initial brightness"), F("p131_brightness"), P131_CONFIG_FLAG_GET_BRIGHTNESS, 0, 255); + addFormNumericBox(F("Initial brightness"), F("brightness"), P131_CONFIG_FLAG_GET_BRIGHTNESS, 0, 255); addUnit(F("0..255")); - addFormNumericBox(F("Maximum allowed brightness"), F("p131_maxbright"), P131_CONFIG_FLAG_GET_MAXBRIGHT, 1, 255); + addFormNumericBox(F("Maximum allowed brightness"), F("maxbright"), P131_CONFIG_FLAG_GET_MAXBRIGHT, 1, 255); addUnit(F("1..255")); - AdaGFXFormFontScaling(F("p131_fontscale"), P131_CONFIG_FLAG_GET_FONTSCALE, 4); + AdaGFXFormFontScaling(F("fontscale"), P131_CONFIG_FLAG_GET_FONTSCALE, 4); - addFormCheckBox(F("Clear display on exit"), F("p131_clearOnExit"), bitRead(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_CLEAR_ON_EXIT)); + # ifdef P131_SHOW_SPLASH + addFormCheckBox(F("Show splash on start"), F("splash"), P131_CONFIG_FLAG_GET_SHOW_SPLASH); + # endif // ifdef P131_SHOW_SPLASH + + addFormCheckBox(F("Clear display on exit"), F("clearOnExit"), bitRead(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_CLEAR_ON_EXIT)); { const __FlashStringHelper *commandTriggers[] = { // Be sure to use all options available in the enum (except MAX)! @@ -193,26 +166,27 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) static_cast<int>(P131_CommandTrigger::neo) }; addFormSelector(F("Write Command trigger"), - F("p131_commandtrigger"), + F("commandtrigger"), static_cast<int>(P131_CommandTrigger::MAX), commandTriggers, commandTriggerOptions, P131_CONFIG_FLAG_GET_CMD_TRIGGER); + # ifndef LIMIT_BUILD_SIZE addFormNote(F("Select the command that is used to handle commands for this display.")); + # endif // ifndef LIMIT_BUILD_SIZE } addFormSubHeader(F("Content")); - AdaGFXFormForeAndBackColors(F("p131_foregroundcolor"), + AdaGFXFormForeAndBackColors(F("fgcolor"), P131_CONFIG_GET_COLOR_FOREGROUND, - F("p131_backgroundcolor"), + F("bgcolor"), P131_CONFIG_GET_COLOR_BACKGROUND); { String strings[P131_Nlines]; LoadCustomTaskSettings(event->TaskIndex, strings, P131_Nlines, 0); - String line; // Default reserved length is plenty uint16_t remain = DAT_TASKS_CUSTOM_SIZE; addFormSubHeader(F("Lines")); @@ -231,8 +205,6 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) addHtml(F("&nbsp;")); addHtmlInt(varNr + 1); - // line = F("Line "); - // line += (varNr + 1); html_TD(); // Text addTextBox(getPluginCustomArgName(varNr), parseStringKeepCase(strings[varNr], 1), @@ -242,9 +214,9 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) EMPTY_STRING, EMPTY_STRING); - String opts = parseString(strings[varNr], 2); - int optBits = 0; - validIntFromString(opts, optBits); + String opts = parseString(strings[varNr], 2); + uint32_t optBits = 0; + validUIntFromString(opts, optBits); html_TD(); // Scroll addCheckBox(getPluginCustomArgName(varNr + 100), bitRead(optBits, P131_OPTBITS_SCROLL) == 1, false @@ -298,47 +270,50 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_WEBFORM_SAVE: { const uint8_t prevLines = P131_CONFIG_TILE_HEIGHT; - P131_CONFIG_MATRIX_WIDTH = getFormItemInt(F("p131_matrixwidth")); - P131_CONFIG_MATRIX_HEIGHT = getFormItemInt(F("p131_matrixheight")); - P131_CONFIG_TILE_WIDTH = getFormItemInt(F("p131_tilewidth")); - P131_CONFIG_TILE_HEIGHT = getFormItemInt(F("p131_tileheight")); + P131_CONFIG_MATRIX_WIDTH = getFormItemInt(F("matrixwidth")); + P131_CONFIG_MATRIX_HEIGHT = getFormItemInt(F("matrixheight")); + P131_CONFIG_TILE_WIDTH = getFormItemInt(F("tilewidth")); + P131_CONFIG_TILE_HEIGHT = getFormItemInt(F("tileheight")); uint32_t lSettings = 0; // Bits are already in the correct order/configuration to be passed on to the constructor // Matrix bits - set2BitToUL(lSettings, P131_FLAGS_MATRIX_TYPE_TOP, getFormItemInt(F("p131_matrixstart")) & 0x03); - bitWrite(lSettings, P131_FLAGS_MATRIX_TYPE_RC, getFormItemInt(F("p131_matrixrowcol"))); - bitWrite(lSettings, P131_FLAGS_MATRIX_TYPE_PZ, getFormItemInt(F("p131_matrixprozig"))); + set2BitToUL(lSettings, P131_FLAGS_MATRIX_TYPE_TOP, getFormItemInt(F("matrixstart")) & 0x03); + bitWrite(lSettings, P131_FLAGS_MATRIX_TYPE_RC, getFormItemInt(F("matrixrowcol"))); + bitWrite(lSettings, P131_FLAGS_MATRIX_TYPE_PZ, getFormItemInt(F("matrixprozig"))); // Tile bits - set2BitToUL(lSettings, P131_FLAGS_TILE_TYPE_TOP, getFormItemInt(F("p131_tilestart")) & 0x03); - bitWrite(lSettings, P131_FLAGS_TILE_TYPE_RC, getFormItemInt(F("p131_tilerowcol"))); - bitWrite(lSettings, P131_FLAGS_TILE_TYPE_PZ, getFormItemInt(F("p131_tileprozig"))); + set2BitToUL(lSettings, P131_FLAGS_TILE_TYPE_TOP, getFormItemInt(F("tilestart")) & 0x03); + bitWrite(lSettings, P131_FLAGS_TILE_TYPE_RC, getFormItemInt(F("tilerowcol"))); + bitWrite(lSettings, P131_FLAGS_TILE_TYPE_PZ, getFormItemInt(F("tileprozig"))); // Other settings - set4BitToUL(lSettings, P131_CONFIG_FLAG_MODE, getFormItemInt(F("p131_mode"))); - set4BitToUL(lSettings, P131_CONFIG_FLAG_ROTATION, getFormItemInt(F("p131_rotate"))); - set4BitToUL(lSettings, P131_CONFIG_FLAG_FONTSCALE, getFormItemInt(F("p131_fontscale"))); - set4BitToUL(lSettings, P131_CONFIG_FLAG_CMD_TRIGGER, getFormItemInt(F("p131_commandtrigger"))); + set4BitToUL(lSettings, P131_CONFIG_FLAG_MODE, getFormItemInt(F("tpmode"))); + set4BitToUL(lSettings, P131_CONFIG_FLAG_ROTATION, getFormItemInt(F("rotate"))); + set4BitToUL(lSettings, P131_CONFIG_FLAG_FONTSCALE, getFormItemInt(F("fontscale"))); + set4BitToUL(lSettings, P131_CONFIG_FLAG_CMD_TRIGGER, getFormItemInt(F("commandtrigger"))); - bitWrite(lSettings, P131_CONFIG_FLAG_CLEAR_ON_EXIT, isFormItemChecked(F("p131_clearOnExit"))); - bitWrite(lSettings, P131_CONFIG_FLAG_STRIP_TYPE, getFormItemInt(F("p131_strip")) == 1); + bitWrite(lSettings, P131_CONFIG_FLAG_CLEAR_ON_EXIT, isFormItemChecked(F("clearOnExit"))); + bitWrite(lSettings, P131_CONFIG_FLAG_STRIP_TYPE, getFormItemInt(F("striptype")) == 1); + # ifdef P131_SHOW_SPLASH + bitWrite(lSettings, P131_CONFIG_FLAG_SHOW_SPLASH, !isFormItemChecked(F("splash"))); + # endif // ifdef P131_SHOW_SPLASH P131_CONFIG_FLAGS = lSettings; lSettings = 0; - set8BitToUL(lSettings, P131_CONFIG_FLAG_B_BRIGHTNESS, getFormItemInt(F("p131_brightness"))); - set8BitToUL(lSettings, P131_CONFIG_FLAG_B_MAXBRIGHT, getFormItemInt(F("p131_maxbright"))); + set8BitToUL(lSettings, P131_CONFIG_FLAG_B_BRIGHTNESS, getFormItemInt(F("brightness"))); + set8BitToUL(lSettings, P131_CONFIG_FLAG_B_MAXBRIGHT, getFormItemInt(F("maxbright"))); P131_CONFIG_FLAGS_B = lSettings; - String color = web_server.arg(F("p131_foregroundcolor")); + String color = web_server.arg(F("fgcolor")); uint16_t fgcolor = ADAGFX_WHITE; // Default to white when empty if (!color.isEmpty()) { fgcolor = AdaGFXparseColor(color); // Reduce to rgb565 } - color = web_server.arg(F("p131_backgroundcolor")); + color = web_server.arg(F("bgcolor")); const uint16_t bgcolor = AdaGFXparseColor(color); P131_CONFIG_COLORS = fgcolor | (bgcolor << 16); // Store as a single setting @@ -349,7 +324,7 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) for (uint8_t varNr = 0; varNr < prevLines; varNr++) { error.clear(); - error += P131enquoteString(web_server.arg(getPluginCustomArgName(varNr))); + error += wrapWithQuotes(web_server.arg(getPluginCustomArgName(varNr))); error += ','; uint32_t optBits = 0; bitWrite(optBits, P131_OPTBITS_SCROLL, isFormItemChecked(getPluginCustomArgName(varNr + 100))); @@ -357,7 +332,7 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) bitWrite(optBits, P131_OPTBITS_PIXELSCROLL, isFormItemChecked(getPluginCustomArgName(varNr + 300))); error += optBits; error += ','; - error += getFormItemInt(getPluginCustomArgName(varNr + 400)); + error += getFormItemIntCustomArgName(varNr + 400); strings[varNr] = error; } error.clear(); @@ -375,9 +350,11 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_INIT: { if (PIN(0) != -1) { + # ifndef BUILD_NO_DEBUG String log = F("neomatrix: INIT, matrixType: 0b"); log += String(P131_CONFIG_FLAGS_GET_MATRIX_TYPE, BIN); addLogMove(LOG_LEVEL_INFO, log); + # endif // ifndef BUILD_NO_DEBUG initPluginTaskData(event->TaskIndex, new (std::nothrow) P131_data_struct(P131_CONFIG_MATRIX_WIDTH, P131_CONFIG_MATRIX_HEIGHT, P131_CONFIG_TILE_WIDTH, diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp index 9168fcb30..f3035b5d2 100644 --- a/src/src/PluginStructs/P131_data_struct.cpp +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -97,7 +97,7 @@ bool P131_data_struct::plugin_init(struct EventStruct *event) { } # endif // ifndef BUILD_NO_DEBUG } else { - addLog(LOG_LEVEL_INFO, F("NEOMATRIX: No init?")); + addLog(LOG_LEVEL_INFO, F("NEOMATRIX: Init failed.")); } if (isInitialized()) { @@ -118,10 +118,13 @@ bool P131_data_struct::plugin_init(struct EventStruct *event) { matrix->fillScreen(_bgcolor); // fill screen with black color # ifdef P131_SHOW_SPLASH - uint16_t yPos = 0; - gfxHelper->printText(String(F("ESPEasy")).c_str(), 0, yPos, 1, ADAGFX_WHITE, ADAGFX_BLACK); - matrix->show(); - delay(100); // Splash + + if (P131_CONFIG_FLAG_GET_SHOW_SPLASH) { + uint16_t yPos = 0; + gfxHelper->printText(String(F("ESPEasy")).c_str(), 0, yPos, 1, ADAGFX_WHITE, ADAGFX_BLACK); + matrix->show(); + delay(100); // Splash + } # endif // ifdef P131_SHOW_SPLASH matrix->setTextColor(_fgcolor, _bgcolor); // set text color to white and black background @@ -139,7 +142,9 @@ bool P131_data_struct::plugin_init(struct EventStruct *event) { * plugin_exit: De-initialize before destruction ***************************************************************************/ bool P131_data_struct::plugin_exit(struct EventStruct *event) { + # ifndef BUILD_NO_DEBUG addLog(LOG_LEVEL_INFO, F("NEOMATRIX: Exit.")); + # endif // ifndef BUILD_NO_DEBUG if ((nullptr != matrix) && bitRead(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_CLEAR_ON_EXIT)) { matrix->setTextColor(ADAGFX_WHITE, ADAGFX_BLACK); @@ -153,10 +158,10 @@ bool P131_data_struct::plugin_exit(struct EventStruct *event) { * cleanup: De-initialize pointers ***************************************************************************/ void P131_data_struct::cleanup() { - if (nullptr != gfxHelper) { delete gfxHelper; } + delete gfxHelper; gfxHelper = nullptr; - if (nullptr != matrix) { delete matrix; } + delete matrix; matrix = nullptr; } @@ -176,9 +181,9 @@ bool P131_data_struct::plugin_read(struct EventStruct *event) { for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { content[x] = P131_content_struct(); - String opts = parseString(strings[x], 2); - int optBits = 0; - validIntFromString(opts, optBits); + String opts = parseString(strings[x], 2); + uint32_t optBits = 0; + validUIntFromString(opts, optBits); content[x].active = bitRead(optBits, P131_OPTBITS_SCROLL); content[x].rightScroll = bitRead(optBits, P131_OPTBITS_RIGHTSCROLL); content[x].pixelMode = bitRead(optBits, P131_OPTBITS_PIXELSCROLL); @@ -237,8 +242,8 @@ void P131_data_struct::display_content(struct EventStruct *event, * plugin_write: Handle commands ***************************************************************************/ bool P131_data_struct::plugin_write(struct EventStruct *event, const String& string) { - bool success = false; - String cmd = parseString(string, 1); + bool success = false; + const String cmd = parseString(string, 1); if ((nullptr != matrix) && cmd.equals(_commandTriggerCmd)) { String sub = parseString(string, 2); @@ -333,7 +338,7 @@ void P131_data_struct::updateFontMetrics() { log += F(", yp: "); log += matrix->getCursorY(); } - addLog(LOG_LEVEL_INFO, log); + addLogMove(LOG_LEVEL_INFO, log); } # endif // ifdef P131_DEBUG_LOG } diff --git a/src/src/PluginStructs/P131_data_struct.h b/src/src/PluginStructs/P131_data_struct.h index 02d04f9c4..bfb89e9ed 100644 --- a/src/src/PluginStructs/P131_data_struct.h +++ b/src/src/PluginStructs/P131_data_struct.h @@ -5,8 +5,8 @@ #ifdef USES_P131 # include <Adafruit_NeoMatrix.h> -# include "../Helpers/AdafruitGFX_helper.h" // Use Adafruit graphics helper object -# include "../src/src/CustomBuild/StorageLayout.h" // Available custom storage +# include "../Helpers/AdafruitGFX_helper.h" // Use Adafruit graphics helper object +# include "../CustomBuild/StorageLayout.h" // Available custom storage # include <vector> @@ -15,35 +15,35 @@ # define P131_Nlines 16 // The number of different lines which can be displayed # define P131_Nchars 50 -# define P116_SHOW_SPLASH // Enable to show splash (text) +# define P131_SHOW_SPLASH // Enable to show splash (text) # define P131_CONFIG_MATRIX_WIDTH PCONFIG(0) # define P131_CONFIG_MATRIX_HEIGHT PCONFIG(1) # define P131_CONFIG_TILE_WIDTH PCONFIG(2) # define P131_CONFIG_TILE_HEIGHT PCONFIG(3) -# define P131_CONFIG_BRIGHTNESS_OLD PCONFIG(4) // TODO TO BE REMOVED! # define P131_CONFIG_FLAGS PCONFIG_LONG(0) # define P131_CONFIG_FLAGS_B PCONFIG_LONG(1) # define P131_CONFIG_COLORS PCONFIG_LONG(3) // 2 Colors fit in 1 long -# define P131_FLAGS_MATRIX_TYPE 0 // MatrixType flags -# define P131_FLAGS_MATRIX_TYPE_TOP 0 // MatrixType flags Top/Bottom/Left/Right -# define P131_FLAGS_MATRIX_TYPE_RC 2 // MatrixType Row/Col -# define P131_FLAGS_MATRIX_TYPE_PZ 3 // MatrixType Progressive/Zigzag -# define P131_FLAGS_TILE_TYPE 4 // TileType flags -# define P131_FLAGS_TILE_TYPE_TOP 4 // TileType Top/Bottom/Left/Right -# define P131_FLAGS_TILE_TYPE_RC 6 // TileType RowCol -# define P131_FLAGS_TILE_TYPE_PZ 7 // TileType Progressive/Zigzag -# define P131_CONFIG_FLAG_ROTATION 8 // Flag-offset to store 4 bits for Rotation, uses bits 8, 9, 10, 11 -# define P131_CONFIG_FLAG_MODE 12 // Flag-offset to store 4 bits for Mode, uses bits 12, 13, 14 and 15 -# define P131_CONFIG_FLAG_FONTSCALE 20 // Flag-offset to store 4 bits for Font scaling, uses bits 20, 21, 22, 23 -# define P131_CONFIG_FLAG_CMD_TRIGGER 24 // Flag-offset to store 4 bits for Command trigger, uses bits 24, 25, 26, 27 -# define P131_CONFIG_FLAG_CLEAR_ON_EXIT 28 // Flag: Clear display on exit -# define P131_CONFIG_FLAG_STRIP_TYPE 29 // Flag: Strip type +# define P131_FLAGS_MATRIX_TYPE 0 // MatrixType flags +# define P131_FLAGS_MATRIX_TYPE_TOP 0 // MatrixType flags Top/Bottom/Left/Right +# define P131_FLAGS_MATRIX_TYPE_RC 2 // MatrixType Row/Col +# define P131_FLAGS_MATRIX_TYPE_PZ 3 // MatrixType Progressive/Zigzag +# define P131_FLAGS_TILE_TYPE 4 // TileType flags +# define P131_FLAGS_TILE_TYPE_TOP 4 // TileType Top/Bottom/Left/Right +# define P131_FLAGS_TILE_TYPE_RC 6 // TileType RowCol +# define P131_FLAGS_TILE_TYPE_PZ 7 // TileType Progressive/Zigzag +# define P131_CONFIG_FLAG_ROTATION 8 // Flag-offset to store 4 bits for Rotation, uses bits 8, 9, 10, 11 +# define P131_CONFIG_FLAG_MODE 12 // Flag-offset to store 4 bits for Mode, uses bits 12, 13, 14 and 15 +# define P131_CONFIG_FLAG_FONTSCALE 20 // Flag-offset to store 4 bits for Font scaling, uses bits 20, 21, 22, 23 +# define P131_CONFIG_FLAG_CMD_TRIGGER 24 // Flag-offset to store 4 bits for Command trigger, uses bits 24, 25, 26, 27 +# define P131_CONFIG_FLAG_CLEAR_ON_EXIT 28 // Flag: Clear display on exit +# define P131_CONFIG_FLAG_STRIP_TYPE 29 // Flag: Strip type +# define P131_CONFIG_FLAG_SHOW_SPLASH 30 // Flag: Show splash -# define P131_CONFIG_FLAG_B_BRIGHTNESS 0 // Brightness, 8 bits -# define P131_CONFIG_FLAG_B_MAXBRIGHT 8 // Maximum Brightness, 8 bits +# define P131_CONFIG_FLAG_B_BRIGHTNESS 0 // Brightness, 8 bits +# define P131_CONFIG_FLAG_B_MAXBRIGHT 8 // Maximum Brightness, 8 bits # define P131_CONFIG_FLAGS_GET_MATRIX_TYPE (get8BitFromUL(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE)) # define P131_CONFIG_FLAG_GET_ROTATION (get4BitFromUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_ROTATION)) @@ -54,6 +54,7 @@ # define P131_CONFIG_FLAG_GET_MODE (get4BitFromUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_MODE)) # define P131_CONFIG_FLAG_GET_BRIGHTNESS (get8BitFromUL(P131_CONFIG_FLAGS_B, P131_CONFIG_FLAG_B_BRIGHTNESS)) # define P131_CONFIG_FLAG_GET_MAXBRIGHT (get8BitFromUL(P131_CONFIG_FLAGS_B, P131_CONFIG_FLAG_B_MAXBRIGHT)) +# define P131_CONFIG_FLAG_GET_SHOW_SPLASH (!bitRead(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_SHOW_SPLASH)) // Inverted setting, default on # define P131_CONFIG_GET_COLOR_FOREGROUND (P131_CONFIG_COLORS & 0xFFFF) # define P131_CONFIG_GET_COLOR_BACKGROUND ((P131_CONFIG_COLORS >> 16) & 0xFFFF) @@ -65,8 +66,8 @@ enum class P131_CommandTrigger : uint8_t { neomatrix = 0u, - neo, - MAX // Keep as last item! + neo = 1u, + MAX = 2u // Keep as last item! }; const __FlashStringHelper* P131_CommandTrigger_toString(P131_CommandTrigger cmd); @@ -126,21 +127,21 @@ private: Adafruit_NeoMatrix *matrix = nullptr; AdafruitGFX_helper *gfxHelper = nullptr; - uint8_t _matrixWidth = 8; - uint8_t _matrixHeight = 8; - uint8_t _tileWidth = 1; - uint8_t _tileHeight = 1; - int8_t _pin = -1; - uint8_t _matrixType = NEO_MATRIX_TOP | NEO_MATRIX_LEFT | NEO_MATRIX_ROWS | NEO_MATRIX_PROGRESSIVE; - uint8_t _ledType = NEO_TILE_TOP | NEO_TILE_LEFT | NEO_TILE_ROWS | NEO_TILE_PROGRESSIVE; - uint8_t _rotation = 0; - uint8_t _fontscaling = 1; - AdaGFXTextPrintMode _textmode = AdaGFXTextPrintMode::ContinueToNextLine; + uint8_t _matrixWidth = 8; + uint8_t _matrixHeight = 8; + uint8_t _tileWidth = 1; + uint8_t _tileHeight = 1; + int8_t _pin = -1; + uint8_t _matrixType = NEO_MATRIX_TOP | NEO_MATRIX_LEFT | NEO_MATRIX_ROWS | NEO_MATRIX_PROGRESSIVE; + uint8_t _ledType = NEO_TILE_TOP | NEO_TILE_LEFT | NEO_TILE_ROWS | NEO_TILE_PROGRESSIVE; + uint8_t _rotation = 0; + uint8_t _fontscaling = 1; + AdaGFXTextPrintMode _textmode = AdaGFXTextPrintMode::ContinueToNextLine; String _commandTrigger; - uint8_t _brightness = 40; - uint8_t _maxbright = 255; - uint16_t _fgcolor = ADAGFX_WHITE; - uint16_t _bgcolor = ADAGFX_BLACK; + uint8_t _brightness = 40; + uint8_t _maxbright = 255; + uint16_t _fgcolor = ADAGFX_WHITE; + uint16_t _bgcolor = ADAGFX_BLACK; uint16_t _textcols = 0; uint16_t _textrows = 0; From 386b630716d7e7347b3c91f6f36594f73bed2055 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 12 Jun 2022 14:06:52 +0200 Subject: [PATCH 29/89] [Settings] Add PCONFIG_ULONG(n), union with PCONFIG_LONG(n) --- src/_Plugin_Helper.h | 3 +++ src/src/DataStructs/SettingsStruct.h | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/_Plugin_Helper.h b/src/_Plugin_Helper.h index 3d4b0e5c3..d24f6dbb5 100644 --- a/src/_Plugin_Helper.h +++ b/src/_Plugin_Helper.h @@ -60,6 +60,9 @@ #ifndef PCONFIG_LONG # define PCONFIG_LONG(n) (Settings.TaskDevicePluginConfigLong[event->TaskIndex][(n)]) #endif // ifndef PCONFIG_LONG +#ifndef PCONFIG_ULONG + # define PCONFIG_ULONG(n) (Settings.TaskDevicePluginConfigULong[event->TaskIndex][(n)]) +#endif // ifndef PCONFIG_ULONG #ifndef PIN // Please note the 'offset' of N compared to normal pin numbering. diff --git a/src/src/DataStructs/SettingsStruct.h b/src/src/DataStructs/SettingsStruct.h index c4f47deea..686d56a85 100644 --- a/src/src/DataStructs/SettingsStruct.h +++ b/src/src/DataStructs/SettingsStruct.h @@ -279,7 +279,10 @@ class SettingsStruct_tmpl int16_t TaskDevicePluginConfig[N_TASKS][PLUGIN_CONFIGVAR_MAX]; boolean TaskDevicePin1Inversed[N_TASKS] = {0}; float TaskDevicePluginConfigFloat[N_TASKS][PLUGIN_CONFIGFLOATVAR_MAX]; - long TaskDevicePluginConfigLong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; + union { + long TaskDevicePluginConfigLong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; + uint32_t TaskDevicePluginConfigULong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; + }; uint8_t TaskDeviceSendDataFlags[N_TASKS] = {0}; uint8_t OLD_TaskDeviceGlobalSync[N_TASKS] = {0}; uint8_t TaskDeviceDataFeed[N_TASKS] = {0}; // When set to 0, only read local connected sensorsfeeds From a70b26b5d4785748f54fe095635d7f5446f91a10 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 12 Jun 2022 14:13:02 +0200 Subject: [PATCH 30/89] [P131] Fix loading content, implement PCONFIG_ULONG(n) --- src/_P131_NeoPixelMatrix.ino | 50 +++++++++---------- src/src/PluginStructs/P131_data_struct.cpp | 56 ++++++++++++---------- src/src/PluginStructs/P131_data_struct.h | 5 +- 3 files changed, 57 insertions(+), 54 deletions(-) diff --git a/src/_P131_NeoPixelMatrix.ino b/src/_P131_NeoPixelMatrix.ino index 432c7949b..d17132dfb 100644 --- a/src/_P131_NeoPixelMatrix.ino +++ b/src/_P131_NeoPixelMatrix.ino @@ -7,6 +7,8 @@ // ####################################################################################################### /** Changelog: + * 2022-06-12 tonhuisman: Fix reading settings before plugin_ten_per_second() is executed + * Implement PCONFIG_ULONG(n) macro * 2022-06-11 tonhuisman: Cleanup and optimize, make startup-splash configurable * Removed old setting for Brightness, check settings if older version has been used! * 2022-03-16 tonhuisman: Add textmode option, start scrolling implementation @@ -58,15 +60,12 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) P131_CONFIG_TILE_WIDTH = 1; // Default tile width P131_CONFIG_TILE_HEIGHT = 1; // Default tile height - uint32_t lSettings = 0; - set8BitToUL(lSettings, P131_FLAGS_MATRIX_TYPE, NEO_MATRIX_TOP | NEO_MATRIX_LEFT | NEO_MATRIX_ROWS | NEO_MATRIX_PROGRESSIVE); - set8BitToUL(lSettings, P131_FLAGS_TILE_TYPE, NEO_TILE_TOP | NEO_TILE_LEFT | NEO_TILE_ROWS | NEO_TILE_PROGRESSIVE); - P131_CONFIG_FLAGS = lSettings; + set8BitToUL(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE, + NEO_MATRIX_TOP | NEO_MATRIX_LEFT | NEO_MATRIX_ROWS | NEO_MATRIX_PROGRESSIVE | + NEO_TILE_TOP | NEO_TILE_LEFT | NEO_TILE_ROWS | NEO_TILE_PROGRESSIVE); - lSettings = 0; - set8BitToUL(lSettings, P131_CONFIG_FLAG_B_BRIGHTNESS, 40); // Default brightness - set8BitToUL(lSettings, P131_CONFIG_FLAG_B_MAXBRIGHT, 255); // Default max brightness - P131_CONFIG_FLAGS_B = lSettings; + set8BitToUL(P131_CONFIG_FLAGS_B, P131_CONFIG_FLAG_B_BRIGHTNESS, 40); // Default brightness + set8BitToUL(P131_CONFIG_FLAGS_B, P131_CONFIG_FLAG_B_MAXBRIGHT, 255); // Default max brightness P131_CONFIG_COLORS = ADAGFX_WHITE | (ADAGFX_BLACK << 16); @@ -275,37 +274,32 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) P131_CONFIG_TILE_WIDTH = getFormItemInt(F("tilewidth")); P131_CONFIG_TILE_HEIGHT = getFormItemInt(F("tileheight")); - uint32_t lSettings = 0; - // Bits are already in the correct order/configuration to be passed on to the constructor // Matrix bits - set2BitToUL(lSettings, P131_FLAGS_MATRIX_TYPE_TOP, getFormItemInt(F("matrixstart")) & 0x03); - bitWrite(lSettings, P131_FLAGS_MATRIX_TYPE_RC, getFormItemInt(F("matrixrowcol"))); - bitWrite(lSettings, P131_FLAGS_MATRIX_TYPE_PZ, getFormItemInt(F("matrixprozig"))); + set2BitToUL(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE_TOP, getFormItemInt(F("matrixstart")) & 0x03); + bitWrite(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE_RC, getFormItemInt(F("matrixrowcol"))); + bitWrite(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE_PZ, getFormItemInt(F("matrixprozig"))); // Tile bits - set2BitToUL(lSettings, P131_FLAGS_TILE_TYPE_TOP, getFormItemInt(F("tilestart")) & 0x03); - bitWrite(lSettings, P131_FLAGS_TILE_TYPE_RC, getFormItemInt(F("tilerowcol"))); - bitWrite(lSettings, P131_FLAGS_TILE_TYPE_PZ, getFormItemInt(F("tileprozig"))); + set2BitToUL(P131_CONFIG_FLAGS, P131_FLAGS_TILE_TYPE_TOP, getFormItemInt(F("tilestart")) & 0x03); + bitWrite(P131_CONFIG_FLAGS, P131_FLAGS_TILE_TYPE_RC, getFormItemInt(F("tilerowcol"))); + bitWrite(P131_CONFIG_FLAGS, P131_FLAGS_TILE_TYPE_PZ, getFormItemInt(F("tileprozig"))); // Other settings - set4BitToUL(lSettings, P131_CONFIG_FLAG_MODE, getFormItemInt(F("tpmode"))); - set4BitToUL(lSettings, P131_CONFIG_FLAG_ROTATION, getFormItemInt(F("rotate"))); - set4BitToUL(lSettings, P131_CONFIG_FLAG_FONTSCALE, getFormItemInt(F("fontscale"))); - set4BitToUL(lSettings, P131_CONFIG_FLAG_CMD_TRIGGER, getFormItemInt(F("commandtrigger"))); + set4BitToUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_MODE, getFormItemInt(F("tpmode"))); + set4BitToUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_ROTATION, getFormItemInt(F("rotate"))); + set4BitToUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_FONTSCALE, getFormItemInt(F("fontscale"))); + set4BitToUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_CMD_TRIGGER, getFormItemInt(F("commandtrigger"))); - bitWrite(lSettings, P131_CONFIG_FLAG_CLEAR_ON_EXIT, isFormItemChecked(F("clearOnExit"))); - bitWrite(lSettings, P131_CONFIG_FLAG_STRIP_TYPE, getFormItemInt(F("striptype")) == 1); + bitWrite(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_CLEAR_ON_EXIT, isFormItemChecked(F("clearOnExit"))); + bitWrite(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_STRIP_TYPE, getFormItemInt(F("striptype")) == 1); # ifdef P131_SHOW_SPLASH - bitWrite(lSettings, P131_CONFIG_FLAG_SHOW_SPLASH, !isFormItemChecked(F("splash"))); + bitWrite(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_SHOW_SPLASH, !isFormItemChecked(F("splash"))); # endif // ifdef P131_SHOW_SPLASH - P131_CONFIG_FLAGS = lSettings; - lSettings = 0; - set8BitToUL(lSettings, P131_CONFIG_FLAG_B_BRIGHTNESS, getFormItemInt(F("brightness"))); - set8BitToUL(lSettings, P131_CONFIG_FLAG_B_MAXBRIGHT, getFormItemInt(F("maxbright"))); - P131_CONFIG_FLAGS_B = lSettings; + set8BitToUL(P131_CONFIG_FLAGS_B, P131_CONFIG_FLAG_B_BRIGHTNESS, getFormItemInt(F("brightness"))); + set8BitToUL(P131_CONFIG_FLAGS_B, P131_CONFIG_FLAG_B_MAXBRIGHT, getFormItemInt(F("maxbright"))); String color = web_server.arg(F("fgcolor")); uint16_t fgcolor = ADAGFX_WHITE; // Default to white when empty diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp index f3035b5d2..109a9b000 100644 --- a/src/src/PluginStructs/P131_data_struct.cpp +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -165,35 +165,42 @@ void P131_data_struct::cleanup() { matrix = nullptr; } +/**************************************************************************** + * loadContent: load the default content if not yet loaded + ***************************************************************************/ +void P131_data_struct::loadContent(struct EventStruct *event) { + if (!stringsInitialized) { + LoadCustomTaskSettings(event->TaskIndex, strings, P131_Nlines, 0); + stringsInitialized = true; + } + + if (!contentInitialized && stringsInitialized) { + content.clear(); + content.reserve(P131_CONFIG_TILE_HEIGHT); + + for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { + content[x] = P131_content_struct(); + String opts = parseString(strings[x], 2); + uint32_t optBits = 0; + validUIntFromString(opts, optBits); + content[x].active = bitRead(optBits, P131_OPTBITS_SCROLL); + content[x].rightScroll = bitRead(optBits, P131_OPTBITS_RIGHTSCROLL); + content[x].pixelMode = bitRead(optBits, P131_OPTBITS_PIXELSCROLL); + opts = parseString(strings[x], 3); + int speed = 0; + validIntFromString(opts, speed); + content[x].speed = speed; + } + contentInitialized = true; + } +} + /**************************************************************************** * plugin_read: Re-draw the default content ***************************************************************************/ bool P131_data_struct::plugin_read(struct EventStruct *event) { if (isInitialized()) { - if (!stringsInitialized) { - LoadCustomTaskSettings(event->TaskIndex, strings, P131_Nlines, 0); - stringsInitialized = true; - } - - if (!contentInitialized && stringsInitialized) { - content.clear(); - content.reserve(P131_CONFIG_TILE_HEIGHT); - - for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { - content[x] = P131_content_struct(); - String opts = parseString(strings[x], 2); - uint32_t optBits = 0; - validUIntFromString(opts, optBits); - content[x].active = bitRead(optBits, P131_OPTBITS_SCROLL); - content[x].rightScroll = bitRead(optBits, P131_OPTBITS_RIGHTSCROLL); - content[x].pixelMode = bitRead(optBits, P131_OPTBITS_PIXELSCROLL); - opts = parseString(strings[x], 3); - int speed = 0; - validIntFromString(opts, speed); - content[x].speed = speed; - } - contentInitialized = true; - } + loadContent(event); bool hasContent = false; @@ -289,6 +296,7 @@ bool P131_data_struct::plugin_ten_per_second(struct EventStruct *event) { bool success = false; if (isInitialized()) { + loadContent(event); success = true; for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { diff --git a/src/src/PluginStructs/P131_data_struct.h b/src/src/PluginStructs/P131_data_struct.h index bfb89e9ed..f057607b1 100644 --- a/src/src/PluginStructs/P131_data_struct.h +++ b/src/src/PluginStructs/P131_data_struct.h @@ -22,8 +22,8 @@ # define P131_CONFIG_TILE_WIDTH PCONFIG(2) # define P131_CONFIG_TILE_HEIGHT PCONFIG(3) -# define P131_CONFIG_FLAGS PCONFIG_LONG(0) -# define P131_CONFIG_FLAGS_B PCONFIG_LONG(1) +# define P131_CONFIG_FLAGS PCONFIG_ULONG(0) +# define P131_CONFIG_FLAGS_B PCONFIG_ULONG(1) # define P131_CONFIG_COLORS PCONFIG_LONG(3) // 2 Colors fit in 1 long # define P131_FLAGS_MATRIX_TYPE 0 // MatrixType flags @@ -123,6 +123,7 @@ private: void cleanup(); void display_content(struct EventStruct *event, bool scrollOnly = false); + void loadContent(struct EventStruct *event); Adafruit_NeoMatrix *matrix = nullptr; AdafruitGFX_helper *gfxHelper = nullptr; From c569472c01510f7f584e2d5ca019883ed87ddfd3 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 12 Jun 2022 15:18:34 +0200 Subject: [PATCH 31/89] [Build] Restore TEST_E builds for ESP and ESP32s2 --- platformio_esp32_envs.ini | 20 ++++++++++++++++++++ platformio_esp32s2_envs.ini | 7 +++++++ 2 files changed, 27 insertions(+) diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index fd7b1df46..c7b7a0714 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -182,6 +182,14 @@ build_flags = ${esp32_common.build_flags} -DPLUGIN_SET_TEST_D_ESP32 -DTESTING_USE_RTTTL +[env:test_E_ESP32_4M316k] +extends = esp32_common +board = esp32_4M +build_flags = ${esp32_common.build_flags} + -DFEATURE_ARDUINO_OTA + -DPLUGIN_SET_TEST_E_ESP32 + -DTESTING_USE_RTTTL + [env:test_A_ESP32_IRExt_4M316k] extends = esp32_IRExt @@ -205,6 +213,12 @@ board = esp32_4M build_flags = ${esp32_IRExt.build_flags} -DPLUGIN_SET_TEST_D_ESP32 +[env:test_E_ESP32_IRExt_4M316k] +extends = esp32_IRExt +board = esp32_4M +build_flags = ${esp32_IRExt.build_flags} + -DPLUGIN_SET_TEST_E_ESP32 + [env:energy_ESP32_4M316k] extends = esp32_common board = esp32_4M @@ -258,6 +272,12 @@ build_flags = ${env:test_D_ESP32_4M316k.build_flags} -DHAS_ETHERNET -DTESTING_USE_RTTTL +[env:test_E_ESP32_4M316k_ETH] +extends = env:test_E_ESP32_4M316k +build_flags = ${env:test_E_ESP32_4M316k.build_flags} + -DHAS_ETHERNET + -DTESTING_USE_RTTTL + ; ESP32 MAX builds 16M flash ------------------------------ diff --git a/platformio_esp32s2_envs.ini b/platformio_esp32s2_envs.ini index a0f273491..e9adecba0 100644 --- a/platformio_esp32s2_envs.ini +++ b/platformio_esp32s2_envs.ini @@ -82,6 +82,13 @@ build_flags = ${esp32s2_common.build_flags} -DPLUGIN_SET_TEST_D_ESP32 -DTESTING_USE_RTTTL +[env:test_E_ESP32s2_4M316k] +extends = esp32s2_common +board = esp32s2 +build_flags = ${esp32s2_common.build_flags} + -DPLUGIN_SET_TEST_E_ESP32 + -DTESTING_USE_RTTTL + [env:energy_ESP32s2_4M316k] extends = esp32s2_common From 54e9a103b8c174e5b6683ed9d9dea4bc91cb0136 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 12 Jun 2022 15:20:08 +0200 Subject: [PATCH 32/89] [Fix] Complete implementation for changed addFormSelector() definition --- src/src/WebServer/Markup_Forms.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/src/WebServer/Markup_Forms.cpp b/src/src/WebServer/Markup_Forms.cpp index cc05d678a..04827e02f 100644 --- a/src/src/WebServer/Markup_Forms.cpp +++ b/src/src/WebServer/Markup_Forms.cpp @@ -436,9 +436,17 @@ void addFormSelector(const String& label, const String options[], const int indices[], int selectedIndex, - bool reloadonchange) + bool reloadonchange + #ifdef ENABLE_TOOLTIPS + , const String& tooltip + #endif // ifdef ENABLE_TOOLTIPS + ) { - addFormSelector(label, id, optionCount, options, indices, nullptr, selectedIndex, reloadonchange); + addFormSelector(label, id, optionCount, options, indices, nullptr, selectedIndex, reloadonchange + #ifdef ENABLE_TOOLTIPS + , tooltip + #endif // ifdef ENABLE_TOOLTIPS + ); } void addFormSelector(const String & label, From 45ad5bd34f63117f6c5271e4a6e3ff3ed449b5c9 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 12 Jun 2022 15:41:07 +0200 Subject: [PATCH 33/89] [P129] Optimizations and small fixes --- src/_P129_74HC165.ino | 56 +++++++++++----------- src/src/PluginStructs/P129_data_struct.cpp | 13 ++--- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/_P129_74HC165.ino b/src/_P129_74HC165.ino index 28cf5d01a..8b794a670 100644 --- a/src/_P129_74HC165.ino +++ b/src/_P129_74HC165.ino @@ -7,6 +7,7 @@ // ####################################################################################################### /** Changelog: + * 2022-06-12 tonhuisman: Optimizations and small fixes * 2022-02-25 tonhuisman: Rename command to ShiftIn,<subcommand>,<arg>... * 2022-02-23 tonhuisman: Add command handling. * 2022-02-22 tonhuisman: Compare results and generate events. @@ -125,9 +126,11 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_WEBFORM_LOAD: { addFormPinSelect(formatGpioName_output(F("Load pin (<SPAN STYLE=\"text-decoration:overline\">PL</SPAN>)")), - F("p129_load_pin"), + F("load_pin"), P129_CONFIG_LOAD_PIN); + # ifndef LIMIT_BUILD_SIZE addFormNote(F("All GPIO pins <B>must</B> be configured to correctly initialize the plugin.")); + # endif // ifndef LIMIT_BUILD_SIZE addFormSubHeader(F("Device configuration")); @@ -140,7 +143,7 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) chipOption[i] = i + 1; } addFormSelector(F("Number of chips (Q7 &rarr; DS)"), - F("p129_chips"), + F("chipcnt"), P129_MAX_CHIP_COUNT, chipCount, chipOption, @@ -150,30 +153,31 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) String unit = F("Daisychained 1.."); unit += P129_MAX_CHIP_COUNT; addUnit(unit); - + # ifndef LIMIT_BUILD_SIZE addFormNote(F("Changing the number of chips will reload the page and update the Event configuration.")); + # endif // ifndef LIMIT_BUILD_SIZE } const __FlashStringHelper *frequencyOptions[] = { F("10/sec (100 msec)"), F("50/sec (20 msec)") }; - int frequencyValues[] = { P129_FREQUENCY_10, P129_FREQUENCY_50 }; - addFormSelector(F("Sample frequency"), F("p129_frequency"), 2, frequencyOptions, frequencyValues, P129_CONFIG_FLAGS_GET_READ_FREQUENCY); + const int frequencyValues[] = { P129_FREQUENCY_10, P129_FREQUENCY_50 }; + addFormSelector(F("Sample frequency"), F("frequency"), 2, frequencyOptions, frequencyValues, P129_CONFIG_FLAGS_GET_READ_FREQUENCY); addFormSubHeader(F("Display and output")); # ifdef P129_SHOW_VALUES - addFormCheckBox(F("Values display (Off=Hex/On=Bin)"), F("p129_valuesdisplay"), P129_CONFIG_FLAGS_GET_VALUES_DISPLAY == 1); + addFormCheckBox(F("Values display (Off=Hex/On=Bin)"), F("valuesdisplay"), P129_CONFIG_FLAGS_GET_VALUES_DISPLAY == 1); # endif // ifdef P129_SHOW_VALUES const __FlashStringHelper *outputOptions[] = { F("Decimal &amp; hex/bin"), F("Decimal only"), F("Hex/bin only") }; - int outputValues[] = { P129_OUTPUT_BOTH, P129_OUTPUT_DEC_ONLY, P129_OUTPUT_HEXBIN }; - addFormSelector(F("Output selection"), F("p129_output"), 3, outputOptions, outputValues, P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION); + const int outputValues[] = { P129_OUTPUT_BOTH, P129_OUTPUT_DEC_ONLY, P129_OUTPUT_HEXBIN }; + addFormSelector(F("Output selection"), F("outputsel"), 3, outputOptions, outputValues, P129_CONFIG_FLAGS_GET_OUTPUT_SELECTION); - addFormCheckBox(F("Separate events per pin"), F("p129_separate_events"), P129_CONFIG_FLAGS_GET_SEPARATE_EVENTS == 1); + addFormCheckBox(F("Separate events per pin"), F("separate_events"), P129_CONFIG_FLAGS_GET_SEPARATE_EVENTS == 1); addFormSubHeader(F("Event configuration")); @@ -242,20 +246,20 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_WEBFORM_SAVE: { - P129_CONFIG_LOAD_PIN = getFormItemInt(F("p129_load_pin")); - P129_CONFIG_CHIP_COUNT = getFormItemInt(F("p129_chips")); + P129_CONFIG_LOAD_PIN = getFormItemInt(F("load_pin")); + P129_CONFIG_CHIP_COUNT = getFormItemInt(F("chipcnt")); uint32_t lSettings = 0u; # ifdef P129_SHOW_VALUES - if (isFormItemChecked(F("p129_valuesdisplay"))) { bitSet(lSettings, P129_FLAGS_VALUES_DISPLAY); } + if (isFormItemChecked(F("valuesdisplay"))) { bitSet(lSettings, P129_FLAGS_VALUES_DISPLAY); } - if (isFormItemChecked(F("p129_separate_events"))) { bitSet(lSettings, P129_FLAGS_SEPARATE_EVENTS); } + if (isFormItemChecked(F("separate_events"))) { bitSet(lSettings, P129_FLAGS_SEPARATE_EVENTS); } # endif // ifdef P129_SHOW_VALUES - if (getFormItemInt(F("p129_frequency"))) { bitSet(lSettings, P129_FLAGS_READ_FREQUENCY); } - set4BitToUL(lSettings, P129_FLAGS_OUTPUT_SELECTION, getFormItemInt(F("p129_output"))); + if (getFormItemInt(F("frequency"))) { bitSet(lSettings, P129_FLAGS_READ_FREQUENCY); } + set4BitToUL(lSettings, P129_FLAGS_OUTPUT_SELECTION, getFormItemInt(F("outputsel"))); P129_CONFIG_FLAGS = lSettings & 0xFFFF; @@ -300,12 +304,10 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) P129_CONFIG_CHIP_COUNT)); P129_data_struct *P129_data = static_cast<P129_data_struct *>(getPluginTaskData(event->TaskIndex)); - if (nullptr == P129_data) { - return success; - } - - if (P129_data->isInitialized()) { - success = P129_data->plugin_init(event); + if (nullptr != P129_data) { + if (P129_data->isInitialized()) { + success = P129_data->plugin_init(event); + } } if (!success) { @@ -329,12 +331,10 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) { P129_data_struct *P129_data = static_cast<P129_data_struct *>(getPluginTaskData(event->TaskIndex)); - if (nullptr == P129_data) { - return success; + if (nullptr != P129_data) { + success = P129_data->plugin_read(event); // Get state } - success = P129_data->plugin_read(event); // Get state - break; } @@ -431,12 +431,10 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) { P129_data_struct *P129_data = static_cast<P129_data_struct *>(getPluginTaskData(event->TaskIndex)); - if (nullptr == P129_data) { - return success; + if (nullptr != P129_data) { + success = P129_data->plugin_write(event, string); } - success = P129_data->plugin_write(event, string); - break; } } diff --git a/src/src/PluginStructs/P129_data_struct.cpp b/src/src/PluginStructs/P129_data_struct.cpp index 552ffae18..18dd072a0 100644 --- a/src/src/PluginStructs/P129_data_struct.cpp +++ b/src/src/PluginStructs/P129_data_struct.cpp @@ -36,7 +36,8 @@ bool P129_data_struct::plugin_init(struct EventStruct *event) { return false; } -const uint32_t P129_data_struct::getChannelState(uint8_t offset, uint8_t size) const { +const uint32_t P129_data_struct::getChannelState(uint8_t offset, + uint8_t size) const { uint32_t result = 0u; uint16_t sft = 0u; const uint8_t last = offset + size; @@ -78,7 +79,7 @@ bool P129_data_struct::plugin_write(struct EventStruct *event, const String & string) { bool success = false; - String command = parseString(string, 1); + const String command = parseString(string, 1); if (command.equals(F("shiftin"))) { const String subcommand = parseString(string, 2); @@ -216,10 +217,10 @@ void P129_data_struct::sendInputEvent(struct EventStruct *event, uint8_t group, uint8_t bit, uint8_t state) { - String send; - uint8_t pin = (group * 8) + bit + 1; // 1..128 - uint8_t chip = group + (bit / 8) + 1; // 1..16 - uint8_t port = (bit % 8); // 0..7 + String send; + const uint8_t pin = (group * 8) + bit + 1; // 1..128 + const uint8_t chip = group + (bit / 8) + 1; // 1..16 + const uint8_t port = (bit % 8); // 0..7 send.reserve(40); send += getTaskDeviceName(event->TaskIndex); From 99f92b61078cf9259001a81ce2f7f5067786a080 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 12 Jun 2022 14:06:52 +0200 Subject: [PATCH 34/89] [Settings] Add PCONFIG_ULONG(n), union with PCONFIG_LONG(n) (cherry picked from commit 386b630716d7e7347b3c91f6f36594f73bed2055) --- src/_Plugin_Helper.h | 3 +++ src/src/DataStructs/SettingsStruct.h | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/_Plugin_Helper.h b/src/_Plugin_Helper.h index 3d4b0e5c3..d24f6dbb5 100644 --- a/src/_Plugin_Helper.h +++ b/src/_Plugin_Helper.h @@ -60,6 +60,9 @@ #ifndef PCONFIG_LONG # define PCONFIG_LONG(n) (Settings.TaskDevicePluginConfigLong[event->TaskIndex][(n)]) #endif // ifndef PCONFIG_LONG +#ifndef PCONFIG_ULONG + # define PCONFIG_ULONG(n) (Settings.TaskDevicePluginConfigULong[event->TaskIndex][(n)]) +#endif // ifndef PCONFIG_ULONG #ifndef PIN // Please note the 'offset' of N compared to normal pin numbering. diff --git a/src/src/DataStructs/SettingsStruct.h b/src/src/DataStructs/SettingsStruct.h index c4f47deea..686d56a85 100644 --- a/src/src/DataStructs/SettingsStruct.h +++ b/src/src/DataStructs/SettingsStruct.h @@ -279,7 +279,10 @@ class SettingsStruct_tmpl int16_t TaskDevicePluginConfig[N_TASKS][PLUGIN_CONFIGVAR_MAX]; boolean TaskDevicePin1Inversed[N_TASKS] = {0}; float TaskDevicePluginConfigFloat[N_TASKS][PLUGIN_CONFIGFLOATVAR_MAX]; - long TaskDevicePluginConfigLong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; + union { + long TaskDevicePluginConfigLong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; + uint32_t TaskDevicePluginConfigULong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; + }; uint8_t TaskDeviceSendDataFlags[N_TASKS] = {0}; uint8_t OLD_TaskDeviceGlobalSync[N_TASKS] = {0}; uint8_t TaskDeviceDataFeed[N_TASKS] = {0}; // When set to 0, only read local connected sensorsfeeds From 5d4f427052c4782b5f4a993f83a65f5a47360122 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 12 Jun 2022 16:53:06 +0200 Subject: [PATCH 35/89] [P129] Implement use of PCONFIG_ULONG() --- src/_P129_74HC165.ino | 12 +++++------- src/src/PluginStructs/P129_data_struct.cpp | 22 ++++++++++------------ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/_P129_74HC165.ino b/src/_P129_74HC165.ino index 8b794a670..3ed76bc42 100644 --- a/src/_P129_74HC165.ino +++ b/src/_P129_74HC165.ino @@ -7,7 +7,7 @@ // ####################################################################################################### /** Changelog: - * 2022-06-12 tonhuisman: Optimizations and small fixes + * 2022-06-12 tonhuisman: Optimizations and small fixes. Implement use of PCONFIG_ULONG() * 2022-02-25 tonhuisman: Rename command to ShiftIn,<subcommand>,<arg>... * 2022-02-23 tonhuisman: Add command handling. * 2022-02-22 tonhuisman: Compare results and generate events. @@ -200,7 +200,7 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) for (uint8_t i = 0; i < P129_CONFIG_CHIP_COUNT; i++) { if (i % 4 == 0) { - bits = PCONFIG_LONG(i / 4) & 0x0ffffffff; + bits = PCONFIG_ULONG(i / 4) & 0x0ffffffff; off = 0; # ifndef P129_DEBUG_LOG @@ -275,7 +275,7 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) for (uint8_t j = 0; j < 8; j++) { bitWrite(bits, off * 8 + (7 - j), isFormItemChecked(getPluginCustomArgName((i * 8 + (7 - j)) + 1))); } - PCONFIG_LONG(i / 4) = bits; + PCONFIG_ULONG(i / 4) = bits; # ifndef P129_DEBUG_LOG @@ -304,10 +304,8 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) P129_CONFIG_CHIP_COUNT)); P129_data_struct *P129_data = static_cast<P129_data_struct *>(getPluginTaskData(event->TaskIndex)); - if (nullptr != P129_data) { - if (P129_data->isInitialized()) { - success = P129_data->plugin_init(event); - } + if ((nullptr != P129_data) && P129_data->isInitialized()) { + success = P129_data->plugin_init(event); } if (!success) { diff --git a/src/src/PluginStructs/P129_data_struct.cpp b/src/src/PluginStructs/P129_data_struct.cpp index 18dd072a0..86a346679 100644 --- a/src/src/PluginStructs/P129_data_struct.cpp +++ b/src/src/PluginStructs/P129_data_struct.cpp @@ -91,11 +91,11 @@ bool P129_data_struct::plugin_write(struct EventStruct *event, if (validChannel(pin + 1) && ((value == 0) || (value == 1))) { const uint8_t ulong = pin / 32; const uint8_t bit = pin % 32; - uint32_t lSettings = PCONFIG_LONG(ulong); + uint32_t lSettings = PCONFIG_ULONG(ulong); bitWrite(lSettings, bit, value); - PCONFIG_LONG(ulong) = lSettings; - success = true; + PCONFIG_ULONG(ulong) = lSettings; + success = true; # ifdef P129_DEBUG_LOG if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { @@ -119,11 +119,11 @@ bool P129_data_struct::plugin_write(struct EventStruct *event, if ((chip >= 0) && (chip < P129_CONFIG_CHIP_COUNT) && ((value == 0) || (value == 1))) { const uint8_t ulong = chip / 4; const uint8_t bit = (chip % 4) * 8; - uint32_t lSettings = PCONFIG_LONG(ulong); + uint32_t lSettings = PCONFIG_ULONG(ulong); set8BitToUL(lSettings, bit, value == 1 ? 0xFF : 0x00); - PCONFIG_LONG(ulong) = lSettings; - success = true; + PCONFIG_ULONG(ulong) = lSettings; + success = true; # ifdef P129_DEBUG_LOG if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { @@ -197,15 +197,13 @@ bool P129_data_struct::plugin_readData(struct EventStruct *event) { void P129_data_struct::checkDiff(struct EventStruct *event) { for (uint8_t i = 0; i < P129_CONFIG_CHIP_COUNT; i += 4) { - const uint32_t bits = PCONFIG_LONG(i / 4); - - if (bits != 0) { // Any input event enabled? + if (PCONFIG_ULONG(i / 4) != 0) { // Any input event enabled? const uint32_t read = readBuffer[i + 3] << 24 | readBuffer[i + 2] << 16 | readBuffer[i + 1] << 8 | readBuffer[i + 0]; const uint32_t prev = prevBuffer[i + 3] << 24 | prevBuffer[i + 2] << 16 | prevBuffer[i + 1] << 8 | prevBuffer[i + 0]; - for (uint8_t j = 0; j < 32; j++) { // Check all 32 bits - if (bitRead(bits, j) && (bitRead(read, j) != bitRead(prev, j))) { // Event enabled and bit changed? - sendInputEvent(event, i, j, bitRead(read, j)); // Send out new state + for (uint8_t j = 0; j < 32; j++) { // Check all 32 bits + if (bitRead(PCONFIG_ULONG(i / 4), j) && (bitRead(read, j) != bitRead(prev, j))) { // Event enabled and bit changed? + sendInputEvent(event, i, j, bitRead(read, j)); // Send out new state } } } From a858c047a4b47a3cda3191608251aec86407cf7a Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 12 Jun 2022 19:54:11 +0200 Subject: [PATCH 36/89] [Settings] Replace long by int32_t for PCONFIG_LONG(n) (cherry picked from commit b5f6fa1c736037a443bde980af391813fe328283) --- src/src/DataStructs/SettingsStruct.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/DataStructs/SettingsStruct.h b/src/src/DataStructs/SettingsStruct.h index 686d56a85..19c559226 100644 --- a/src/src/DataStructs/SettingsStruct.h +++ b/src/src/DataStructs/SettingsStruct.h @@ -280,7 +280,7 @@ class SettingsStruct_tmpl boolean TaskDevicePin1Inversed[N_TASKS] = {0}; float TaskDevicePluginConfigFloat[N_TASKS][PLUGIN_CONFIGFLOATVAR_MAX]; union { - long TaskDevicePluginConfigLong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; + int32_t TaskDevicePluginConfigLong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; uint32_t TaskDevicePluginConfigULong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; }; uint8_t TaskDeviceSendDataFlags[N_TASKS] = {0}; From aaec8938f8520afb779c8c59615aef3563de87f7 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 12 Jun 2022 20:05:52 +0200 Subject: [PATCH 37/89] [P129] Remove undesirable const declarations --- src/src/PluginStructs/P129_data_struct.cpp | 4 ++-- src/src/PluginStructs/P129_data_struct.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/src/PluginStructs/P129_data_struct.cpp b/src/src/PluginStructs/P129_data_struct.cpp index 86a346679..c48b06635 100644 --- a/src/src/PluginStructs/P129_data_struct.cpp +++ b/src/src/PluginStructs/P129_data_struct.cpp @@ -36,8 +36,8 @@ bool P129_data_struct::plugin_init(struct EventStruct *event) { return false; } -const uint32_t P129_data_struct::getChannelState(uint8_t offset, - uint8_t size) const { +uint32_t P129_data_struct::getChannelState(uint8_t offset, + uint8_t size) { uint32_t result = 0u; uint16_t sft = 0u; const uint8_t last = offset + size; diff --git a/src/src/PluginStructs/P129_data_struct.h b/src/src/PluginStructs/P129_data_struct.h index cfebc68b4..6687e72ef 100644 --- a/src/src/PluginStructs/P129_data_struct.h +++ b/src/src/PluginStructs/P129_data_struct.h @@ -78,10 +78,10 @@ public: private: - const uint32_t getChannelState(uint8_t offset, - uint8_t size) const; + uint32_t getChannelState(uint8_t offset, + uint8_t size); - const bool validChannel(uint channel) const { + bool validChannel(uint channel) { return channel > 0 && channel <= (_chipCount * 8); } From 4357fd6261a100b66ee640f140f54e6f08af8952 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 12 Jun 2022 19:54:11 +0200 Subject: [PATCH 38/89] [Settings] Replace long by int32_t for PCONFIG_LONG(n) (cherry picked from commit b5f6fa1c736037a443bde980af391813fe328283) --- src/src/DataStructs/SettingsStruct.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/DataStructs/SettingsStruct.h b/src/src/DataStructs/SettingsStruct.h index 686d56a85..19c559226 100644 --- a/src/src/DataStructs/SettingsStruct.h +++ b/src/src/DataStructs/SettingsStruct.h @@ -280,7 +280,7 @@ class SettingsStruct_tmpl boolean TaskDevicePin1Inversed[N_TASKS] = {0}; float TaskDevicePluginConfigFloat[N_TASKS][PLUGIN_CONFIGFLOATVAR_MAX]; union { - long TaskDevicePluginConfigLong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; + int32_t TaskDevicePluginConfigLong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; uint32_t TaskDevicePluginConfigULong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; }; uint8_t TaskDeviceSendDataFlags[N_TASKS] = {0}; From dd2f9ae5ac7dd87a859df69f9a9a229bf6510297 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 12 Jun 2022 20:42:59 +0200 Subject: [PATCH 39/89] [P131] Corrections for nullptr, resize and 0 checks --- src/src/PluginStructs/P131_data_struct.cpp | 84 ++++++++++++---------- 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp index 109a9b000..6f4f0a791 100644 --- a/src/src/PluginStructs/P131_data_struct.cpp +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -48,7 +48,7 @@ P131_data_struct::P131_data_struct(uint8_t matrixWidth, // **************************************************************************/ P131_data_struct::~P131_data_struct() { if (isInitialized()) { - delete matrix; + // delete matrix; // Doesn't have a virtual destructor matrix = nullptr; } } @@ -113,27 +113,29 @@ bool P131_data_struct::plugin_init(struct EventStruct *event) { true, _textBackFill); - gfxHelper->setRotation(_rotation); - matrix->setBrightness(std::min(_maxbright, _brightness)); // Set brightness, so we don't get blinded by the light - matrix->fillScreen(_bgcolor); // fill screen with black color + success = (nullptr != gfxHelper); - # ifdef P131_SHOW_SPLASH + if (success) { + gfxHelper->setRotation(_rotation); + matrix->setBrightness(std::min(_maxbright, _brightness)); // Set brightness, so we don't get blinded by the light + matrix->fillScreen(_bgcolor); // fill screen with black color - if (P131_CONFIG_FLAG_GET_SHOW_SPLASH) { - uint16_t yPos = 0; - gfxHelper->printText(String(F("ESPEasy")).c_str(), 0, yPos, 1, ADAGFX_WHITE, ADAGFX_BLACK); - matrix->show(); - delay(100); // Splash + # ifdef P131_SHOW_SPLASH + + if (P131_CONFIG_FLAG_GET_SHOW_SPLASH) { + uint16_t yPos = 0; + gfxHelper->printText(String(F("ESPEasy")).c_str(), 0, yPos, 1, ADAGFX_WHITE, ADAGFX_BLACK); + matrix->show(); + delay(100); // Splash + } + # endif // ifdef P131_SHOW_SPLASH + + matrix->setTextColor(_fgcolor, _bgcolor); // set text color to white and black background + gfxHelper->setColumnRowMode(false); // Pixel-mode + matrix->setTextSize(_fontscaling); // Handles 0 properly, text size, default 1 = very small + matrix->setCursor(0, 0); // move cursor to position (0, 0) pixel + updateFontMetrics(); } - # endif // ifdef P131_SHOW_SPLASH - - matrix->setTextColor(_fgcolor, _bgcolor); // set text color to white and black background - gfxHelper->setColumnRowMode(false); // Pixel-mode - matrix->setTextSize(_fontscaling); // Handles 0 properly, text size, default 1 = very small - matrix->setCursor(0, 0); // move cursor to position (0, 0) pixel - updateFontMetrics(); - - success = true; } return success; } @@ -161,7 +163,7 @@ void P131_data_struct::cleanup() { delete gfxHelper; gfxHelper = nullptr; - delete matrix; + // delete matrix; // Doesn't have a virtual destructor matrix = nullptr; } @@ -176,7 +178,7 @@ void P131_data_struct::loadContent(struct EventStruct *event) { if (!contentInitialized && stringsInitialized) { content.clear(); - content.reserve(P131_CONFIG_TILE_HEIGHT); + content.resize(P131_CONFIG_TILE_HEIGHT); for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { content[x] = P131_content_struct(); @@ -221,28 +223,30 @@ bool P131_data_struct::plugin_read(struct EventStruct *event) { ***************************************************************************/ void P131_data_struct::display_content(struct EventStruct *event, bool scrollOnly) { - int16_t yPos = 0; + if (isInitialized() && (nullptr != gfxHelper)) { + int16_t yPos = 0; - for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { - String tmpString = parseStringKeepCase(strings[x], 1); + for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { + String tmpString = parseStringKeepCase(strings[x], 1); - if (!scrollOnly || - (scrollOnly && content[x].active)) { - String newString = AdaGFXparseTemplate(tmpString, _textcols, gfxHelper); + if (!scrollOnly || + (scrollOnly && content[x].active)) { + String newString = AdaGFXparseTemplate(tmpString, _textcols, gfxHelper); - # if ADAGFX_PARSE_SUBCOMMAND - updateFontMetrics(); - # endif // if ADAGFX_PARSE_SUBCOMMAND + # if ADAGFX_PARSE_SUBCOMMAND + updateFontMetrics(); + # endif // if ADAGFX_PARSE_SUBCOMMAND - // TODO apply scrolling offset - if (yPos < _ypix) { - gfxHelper->printText(newString.c_str(), 0, yPos, _fontscaling, _fgcolor, _bgcolor); + // TODO apply scrolling offset + if (yPos < _ypix) { + gfxHelper->printText(newString.c_str(), 0, yPos, _fontscaling, _fgcolor, _bgcolor); + } } + delay(0); + yPos += (_fontheight * _fontscaling); } - delay(0); - yPos += (_fontheight * _fontscaling); + matrix->show(); } - matrix->show(); } /**************************************************************************** @@ -283,7 +287,7 @@ bool P131_data_struct::plugin_write(struct EventStruct *event, const String& str } } - if (success) { + if (isInitialized() && success) { matrix->show(); } return success; @@ -323,6 +327,12 @@ bool P131_data_struct::plugin_ten_per_second(struct EventStruct *event) { * updateFontMetrics: recalculate x and y columns, based on font size and font scale ***************************************************************************/ void P131_data_struct::updateFontMetrics() { + if (_fontscaling == 0) { _fontscaling = 1; } // Sanity checks + + if (_fontwidth == 0) { _fontwidth = 6; } + + if (_fontheight == 0) { _fontheight = 10; } + if (nullptr != gfxHelper) { gfxHelper->getTextMetrics(_textcols, _textrows, _fontwidth, _fontheight, _fontscaling, _heightOffset, _xpix, _ypix); gfxHelper->getColors(_fgcolor, _bgcolor); From b38fedf3c36f62cc24147a61186b4e6d8eb43eef Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Mon, 13 Jun 2022 21:26:56 +0200 Subject: [PATCH 40/89] [P131] Restore delete of matrix object to properly free memory --- src/src/PluginStructs/P131_data_struct.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp index 6f4f0a791..74b2ae363 100644 --- a/src/src/PluginStructs/P131_data_struct.cpp +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -48,7 +48,7 @@ P131_data_struct::P131_data_struct(uint8_t matrixWidth, // **************************************************************************/ P131_data_struct::~P131_data_struct() { if (isInitialized()) { - // delete matrix; // Doesn't have a virtual destructor + delete matrix; // Doesn't have a virtual destructor (yet) matrix = nullptr; } } @@ -163,7 +163,7 @@ void P131_data_struct::cleanup() { delete gfxHelper; gfxHelper = nullptr; - // delete matrix; // Doesn't have a virtual destructor + delete matrix; // Doesn't have a virtual destructor (yet) matrix = nullptr; } From 9b5517b75dc49f0f75eadf5a617f06af1268513e Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Tue, 14 Jun 2022 21:45:55 +0200 Subject: [PATCH 41/89] [P131] Implement splash without delay() --- src/_P131_NeoPixelMatrix.ino | 3 +- src/src/PluginStructs/P131_data_struct.cpp | 86 ++++++++++++++-------- src/src/PluginStructs/P131_data_struct.h | 12 ++- 3 files changed, 68 insertions(+), 33 deletions(-) diff --git a/src/_P131_NeoPixelMatrix.ino b/src/_P131_NeoPixelMatrix.ino index d17132dfb..d5d9e4e35 100644 --- a/src/_P131_NeoPixelMatrix.ino +++ b/src/_P131_NeoPixelMatrix.ino @@ -7,6 +7,7 @@ // ####################################################################################################### /** Changelog: + * 2022-06-13 tonhuisman: Improved Splash handling, non-blocking delay, default 3 seconds * 2022-06-12 tonhuisman: Fix reading settings before plugin_ten_per_second() is executed * Implement PCONFIG_ULONG(n) macro * 2022-06-11 tonhuisman: Cleanup and optimize, make startup-splash configurable @@ -415,7 +416,7 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) P131_data_struct *P131_data = static_cast<P131_data_struct *>(getPluginTaskData(event->TaskIndex)); if (nullptr != P131_data) { - success = P131_data->plugin_ten_per_second(event); // 10 per second operation, update scrolling + success = P131_data->plugin_ten_per_second(event); // 10 per second operation, update scrolling, handle splash counter } break; diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp index 74b2ae363..27e2a54b0 100644 --- a/src/src/PluginStructs/P131_data_struct.cpp +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -126,7 +126,11 @@ bool P131_data_struct::plugin_init(struct EventStruct *event) { uint16_t yPos = 0; gfxHelper->printText(String(F("ESPEasy")).c_str(), 0, yPos, 1, ADAGFX_WHITE, ADAGFX_BLACK); matrix->show(); - delay(100); // Splash + _splashState = true; // Splash + _splashCounter = P131_SPLASH_DURATION; + # ifndef BUILD_NO_DEBUG + addLog(LOG_LEVEL_INFO, F("P131 Splash start.")); + # endif // ifndef BUILD_NO_DEBUG } # endif // ifdef P131_SHOW_SPLASH @@ -201,7 +205,7 @@ void P131_data_struct::loadContent(struct EventStruct *event) { * plugin_read: Re-draw the default content ***************************************************************************/ bool P131_data_struct::plugin_read(struct EventStruct *event) { - if (isInitialized()) { + if (isInitialized() && !_splashState) { loadContent(event); bool hasContent = false; @@ -253,42 +257,45 @@ void P131_data_struct::display_content(struct EventStruct *event, * plugin_write: Handle commands ***************************************************************************/ bool P131_data_struct::plugin_write(struct EventStruct *event, const String& string) { - bool success = false; - const String cmd = parseString(string, 1); + bool success = false; - if ((nullptr != matrix) && cmd.equals(_commandTriggerCmd)) { - String sub = parseString(string, 2); - success = true; + if (isInitialized() && !_splashState) { + const String cmd = parseString(string, 1); - if (sub.equals(F("clear"))) { - matrix->fillScreen(_bgcolor); - } - else if (sub.startsWith(F("bright")) && (event->Par2 >= 0) && (event->Par2 <= 255)) { - if (parseString(string, 3).isEmpty()) { // No argument, then - matrix->setBrightness(std::min(_maxbright, _brightness)); // use initial brightness + if ((nullptr != matrix) && cmd.equals(_commandTriggerCmd)) { + String sub = parseString(string, 2); + success = true; + + if (sub.equals(F("clear"))) { + matrix->fillScreen(_bgcolor); + } + else if (sub.startsWith(F("bright")) && (event->Par2 >= 0) && (event->Par2 <= 255)) { + if (parseString(string, 3).isEmpty()) { // No argument, then + matrix->setBrightness(std::min(_maxbright, _brightness)); // use initial brightness + } else { + matrix->setBrightness(std::min(_maxbright, static_cast<uint8_t>(event->Par2))); + } } else { - matrix->setBrightness(std::min(_maxbright, static_cast<uint8_t>(event->Par2))); + success = false; } - } else { - success = false; } - } - else if (matrix && (cmd.equals(_commandTrigger) || - (gfxHelper && gfxHelper->isAdaGFXTrigger(cmd)))) { - success = true; + else if (matrix && (cmd.equals(_commandTrigger) || + (gfxHelper && gfxHelper->isAdaGFXTrigger(cmd)))) { + success = true; - if (nullptr != gfxHelper) { - String tmp(string); + if (nullptr != gfxHelper) { + String tmp(string); - // Hand it over after replacing variables - success = gfxHelper->processCommand(AdaGFXparseTemplate(tmp, _textcols, gfxHelper)); + // Hand it over after replacing variables + success = gfxHelper->processCommand(AdaGFXparseTemplate(tmp, _textcols, gfxHelper)); - updateFontMetrics(); // Font or color may have changed + updateFontMetrics(); // Font or color may have changed + } } - } - if (isInitialized() && success) { - matrix->show(); + if (success) { + matrix->show(); + } } return success; } @@ -299,7 +306,28 @@ bool P131_data_struct::plugin_write(struct EventStruct *event, const String& str bool P131_data_struct::plugin_ten_per_second(struct EventStruct *event) { bool success = false; - if (isInitialized()) { + # ifdef P131_SHOW_SPLASH + + if (_splashState) { // Decrement splash counter + _splashCounter--; + _splashState = _splashCounter != 0; + + if (!_splashState) { + # ifndef BUILD_NO_DEBUG + addLog(LOG_LEVEL_INFO, F("P131 Splash finished.")); + # endif // ifndef BUILD_NO_DEBUG + + if (nullptr != matrix) { + matrix->fillScreen(_bgcolor); // fill screen with black color + } + + // Schedule the surrogate initial PLUGIN_READ that has been suppressed by the splash + Scheduler.schedule_task_device_timer(event->TaskIndex, millis() + 10); + } + } + # endif // ifdef P131_SHOW_SPLASH + + if (isInitialized() && !_splashState) { loadContent(event); success = true; diff --git a/src/src/PluginStructs/P131_data_struct.h b/src/src/PluginStructs/P131_data_struct.h index f057607b1..ceb1213f7 100644 --- a/src/src/PluginStructs/P131_data_struct.h +++ b/src/src/PluginStructs/P131_data_struct.h @@ -10,12 +10,13 @@ # include <vector> -# define P131_DEBUG_LOG // Enable for some (extra) logging +# define P131_DEBUG_LOG // Enable for some (extra) logging -# define P131_Nlines 16 // The number of different lines which can be displayed +# define P131_Nlines 16 // The number of different lines which can be displayed # define P131_Nchars 50 -# define P131_SHOW_SPLASH // Enable to show splash (text) +# define P131_SHOW_SPLASH // Enable to show splash (text) +# define P131_SPLASH_DURATION (3000 / 100) // 3 seconds in 100 millisecond chunks # define P131_CONFIG_MATRIX_WIDTH PCONFIG(0) # define P131_CONFIG_MATRIX_HEIGHT PCONFIG(1) @@ -159,6 +160,11 @@ private: std::vector<P131_content_struct>content; bool contentInitialized = false; + + bool _splashState = false; // Have this always available to avoid 'many' #ifdefs in the code + # ifdef P131_SHOW_SPLASH + uint8_t _splashCounter = P131_SPLASH_DURATION; + # endif // ifdef P131_SHOW_SPLASH }; #endif // ifdef USES_P131 #endif // ifndef PLUGINSTRUCTS_P131_DATA_STRUCT_H From bccf9fc68cd2c41b62ae3b8ad649dd7f1845683e Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Tue, 14 Jun 2022 21:56:16 +0200 Subject: [PATCH 42/89] [P095] Implement splash without delay() (cherry picked from commit e897a337753e3b3aecadc0bcfe53e1b10d3080a1) --- src/_P095_ILI9341.ino | 2 ++ src/src/PluginStructs/P095_data_struct.cpp | 35 ++++++++++++++++++---- src/src/PluginStructs/P095_data_struct.h | 6 ++++ 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/_P095_ILI9341.ino b/src/_P095_ILI9341.ino index 340c8af40..3e617fbaa 100644 --- a/src/_P095_ILI9341.ino +++ b/src/_P095_ILI9341.ino @@ -19,6 +19,8 @@ /** * Changelog: + * 2022-06-14 tonhuisman: Improved Splash handling, non-blocking delay, default 3 seconds + * 2022-06-11 tonhuisman: Implement support for getting config values, see AdafruitGFX_Helper.h changelog for details. Code optimization * 2022-05-17 tonhuisman: Add setting for Splash during plugin startup, default on, when compiled in * 2022-01-09 tonhuisman: Add support for ILI9342 (M5Stack, 240x320), ILI9481, ILI9486 and ILI9488 (320x480) displays * 2021-11-16 tonhuisman: Add support for PLUGIN_GET_DISPLAY_PARAMETERS, removed commented old source diff --git a/src/src/PluginStructs/P095_data_struct.cpp b/src/src/PluginStructs/P095_data_struct.cpp index 4f6223960..7bd83fa0e 100644 --- a/src/src/PluginStructs/P095_data_struct.cpp +++ b/src/src/PluginStructs/P095_data_struct.cpp @@ -171,7 +171,11 @@ bool P095_data_struct::plugin_init(struct EventStruct *event) { gfxHelper->printText(String(F("ESPEasy")).c_str(), 0, yPos, 3, ADAGFX_WHITE, ADAGFX_BLUE); yPos += (3 * _fontheight); gfxHelper->printText(String(F("ILI934x/ILI948x")).c_str(), 0, yPos, 2, ADAGFX_BLUE, ADAGFX_WHITE); - delay(100); // Splash + _splashState = true; // Splash + _splashCounter = P095_SPLASH_DURATION; + # ifndef BUILD_NO_DEBUG + addLog(LOG_LEVEL_INFO, F("P095 Splash start")); + # endif // ifndef BUILD_NO_DEBUG } # endif // ifdef P095_SHOW_SPLASH updateFontMetrics(); @@ -221,7 +225,7 @@ bool P095_data_struct::plugin_exit(struct EventStruct *event) { * plugin_read: Re-draw the default content ***************************************************************************/ bool P095_data_struct::plugin_read(struct EventStruct *event) { - if (nullptr != tft) { + if ((nullptr != tft) && !_splashState) { String strings[P095_Nlines]; LoadCustomTaskSettings(event->TaskIndex, strings, P095_Nlines, 0); @@ -264,6 +268,27 @@ bool P095_data_struct::plugin_read(struct EventStruct *event) { * plugin_ten_per_second: check button, if any, that wakes up the display ***************************************************************************/ bool P095_data_struct::plugin_ten_per_second(struct EventStruct *event) { + # ifdef P095_SHOW_SPLASH + + if (_splashState) { // Decrement splash counter + _splashCounter--; + _splashState = _splashCounter != 0; + + if (!_splashState) { + # ifndef BUILD_NO_DEBUG + addLog(LOG_LEVEL_INFO, F("P095 Splash finished.")); + # endif // ifndef BUILD_NO_DEBUG + + if (nullptr != tft) { + tft->fillScreen(_bgcolor); // fill screen with background color + } + + // Schedule the surrogate initial PLUGIN_READ that has been suppressed by the splash + Scheduler.schedule_task_device_timer(event->TaskIndex, millis() + 10); + } + } + # endif // ifdef P095_SHOW_SPLASH + if ((P095_CONFIG_BUTTON_PIN != -1) && (getButtonState()) && (nullptr != tft)) { displayOnOff(true); markButtonStateProcessed(); @@ -275,7 +300,7 @@ bool P095_data_struct::plugin_ten_per_second(struct EventStruct *event) { * plugin_once_a_second: Count down display timer, if any, and turn display off if countdown reached ***************************************************************************/ bool P095_data_struct::plugin_once_a_second(struct EventStruct *event) { - if (_displayTimer > 0) { + if ((_displayTimer > 0) && !_splashState) { _displayTimer--; if ((nullptr != tft) && (_displayTimer == 0)) { @@ -292,7 +317,7 @@ bool P095_data_struct::plugin_write(struct EventStruct *event, const String& str bool success = false; String cmd = parseString(string, 1); - if ((nullptr != tft) && cmd.equals(_commandTriggerCmd)) { + if ((nullptr != tft) && cmd.equals(_commandTriggerCmd) && !_splashState) { String arg1 = parseString(string, 2); success = true; @@ -357,7 +382,7 @@ bool P095_data_struct::plugin_write(struct EventStruct *event, const String& str } } else if (tft && (cmd.equals(_commandTrigger) || - (gfxHelper && gfxHelper->isAdaGFXTrigger(cmd)))) { + (gfxHelper && gfxHelper->isAdaGFXTrigger(cmd))) && !_splashState) { success = true; if (!bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_NO_WAKE)) { // Wake display? diff --git a/src/src/PluginStructs/P095_data_struct.h b/src/src/PluginStructs/P095_data_struct.h index 51961f540..7db8c1787 100644 --- a/src/src/PluginStructs/P095_data_struct.h +++ b/src/src/PluginStructs/P095_data_struct.h @@ -17,6 +17,7 @@ # ifndef LIMIT_BUILD_SIZE # define P095_SHOW_SPLASH // Enable to show initial splash (text) # endif // ifndef LIMIT_BUILD_SIZE +# define P095_SPLASH_DURATION (3000 / 100) // 3 seconds in 100 millisecond chunks # define P095_CONFIG_VERSION PCONFIG(0) // Settings version # define P095_CONFIG_ROTATION PCONFIG(1) // Rotation @@ -165,6 +166,11 @@ private: int8_t _leftMarginCompensation = 0; // Not settable yet int8_t _topMarginCompensation = 0; + + bool _splashState = false; // Have this always available to avoid 'many' #ifdefs in the code + # ifdef P095_SHOW_SPLASH + uint8_t _splashCounter = P095_SPLASH_DURATION; + # endif // ifdef P095_SHOW_SPLASH }; From 42706cbbb74042222413e5db5f1e295957e21406 Mon Sep 17 00:00:00 2001 From: uwekaditz <mueller.dresden@t-online.de> Date: Tue, 14 Jun 2022 22:28:12 +0200 Subject: [PATCH 43/89] Update P037_data_struct.cpp Solved merging conflicts --- src/src/PluginStructs/P037_data_struct.cpp | 28 ++++++++++------------ 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/src/PluginStructs/P037_data_struct.cpp b/src/src/PluginStructs/P037_data_struct.cpp index 92c267d02..9f89b4985 100644 --- a/src/src/PluginStructs/P037_data_struct.cpp +++ b/src/src/PluginStructs/P037_data_struct.cpp @@ -178,7 +178,7 @@ bool P037_data_struct::webform_load( addFormSubHeader(F("Topic subscriptions")); // Global topic prefix - addFormTextBox(F("Prefix for all topics"), F("p037_topicprefix"), globalTopicPrefix, 40); + addFormTextBox(F("Prefix for all topics"), F("topicprefix"), globalTopicPrefix, 40); # ifdef P037_JSON_SUPPORT @@ -201,14 +201,14 @@ bool P037_data_struct::webform_load( addHtml(F("&nbsp;")); addHtmlInt(varNr + 1); html_TD(F("padding-right: 8px")); - id = F("p037_template"); + id = F("template"); id += (varNr + 1); addTextBox(id, mqttTopics[varNr], 40, false, false, EMPTY_STRING, F("xwide")); html_TD(F("padding-right: 8px")); - id = F("p037_attribute"); + id = F("attribute"); id += (varNr + 1); addTextBox(id, jsonAttributes[varNr], @@ -220,7 +220,7 @@ bool P037_data_struct::webform_load( { String label = F("MQTT Topic "); label += (varNr + 1); - id = F("p037_template"); + id = F("template"); id += (varNr + 1); addFormTextBox(label, id, mqttTopics[varNr], 40); } @@ -495,7 +495,7 @@ bool P037_data_struct::webform_save( for (uint8_t varNr = 0; varNr < VARS_PER_TASK; varNr++) { - String argName = F("p037_template"); + String argName = F("template"); argName += (varNr + 1); mqttTopics[varNr] = web_server.arg(argName); @@ -503,14 +503,14 @@ bool P037_data_struct::webform_save( # ifdef P037_JSON_SUPPORT if (jsonEnabled) { - argName = F("p037_attribute"); + argName = F("attribute"); argName += (varNr + 1); jsonAttributes[varNr] = web_server.arg(argName); } # endif // P037_JSON_SUPPORT } - globalTopicPrefix = web_server.arg(F("p037_topicprefix")); + globalTopicPrefix = web_server.arg(F("topicprefix")); # if P037_MAPPING_SUPPORT || P037_FILTER_SUPPORT String left, right; @@ -545,8 +545,7 @@ bool P037_data_struct::webform_save( valueArray[mappingOffset] = EMPTY_STRING; } - if ((left.isEmpty() && !right.isEmpty()) || - (!left.isEmpty() && right.isEmpty())) { + if (left.isEmpty() != right.isEmpty()) { if (firstError) { error += F("Name and value should both be filled for mapping "); firstError = false; @@ -592,8 +591,7 @@ bool P037_data_struct::webform_save( valueArray[filterOffset] = EMPTY_STRING; } - if ((left.isEmpty() && !right.isEmpty()) || - (!left.isEmpty() && right.isEmpty())) { + if (left.isEmpty() != right.isEmpty()) { if (firstError) { error += F("Name and value should both be filled for filter "); firstError = false; @@ -656,14 +654,14 @@ String P037_data_struct::mapValue(const String& input, const String& attribute) if (!input.isEmpty()) { parseMappings(); - String operands = P037_OPERAND_LIST; + const String operands = P037_OPERAND_LIST; int8_t idx = 0; for (uint8_t mappingOffset = P037_START_MAPPINGS; mappingOffset <= P037_END_MAPPINGS && idx <= _maxIdx; mappingOffset++) { - String name = parseStringKeepCase(valueArray[mappingOffset], 1, P037_VALUE_SEPARATOR); - String oper = parseString(valueArray[mappingOffset], 2, P037_VALUE_SEPARATOR); - String valu = parseStringKeepCase(valueArray[mappingOffset], 3, P037_VALUE_SEPARATOR); + const String name = parseStringKeepCase(valueArray[mappingOffset], 1, P037_VALUE_SEPARATOR); + const String oper = parseString(valueArray[mappingOffset], 2, P037_VALUE_SEPARATOR); + const String valu = parseStringKeepCase(valueArray[mappingOffset], 3, P037_VALUE_SEPARATOR); if ((name == input) || ((!attribute.isEmpty()) && (name == attribute))) { int8_t operandIndex = operands.indexOf(oper); From 52524b7e26a6b26c0ebc49d6389680c29d43fcc5 Mon Sep 17 00:00:00 2001 From: uwekaditz <mueller.dresden@t-online.de> Date: Tue, 14 Jun 2022 22:49:52 +0200 Subject: [PATCH 44/89] Reset P037_data_struct.cpp to mega Solve merging conflicts --- src/src/PluginStructs/P037_data_struct.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/src/PluginStructs/P037_data_struct.cpp b/src/src/PluginStructs/P037_data_struct.cpp index 9f89b4985..f80a408be 100644 --- a/src/src/PluginStructs/P037_data_struct.cpp +++ b/src/src/PluginStructs/P037_data_struct.cpp @@ -200,20 +200,20 @@ bool P037_data_struct::webform_load( html_TR_TD(); addHtml(F("&nbsp;")); addHtmlInt(varNr + 1); - html_TD(F("padding-right: 8px")); + html_TD(); id = F("template"); id += (varNr + 1); addTextBox(id, mqttTopics[varNr], 40, - false, false, EMPTY_STRING, F("xwide")); - html_TD(F("padding-right: 8px")); + false, false, EMPTY_STRING, F("wide")); + html_TD(); id = F("attribute"); id += (varNr + 1); addTextBox(id, jsonAttributes[varNr], 20, - false, false, EMPTY_STRING, F("xwide")); + false, false, EMPTY_STRING, EMPTY_STRING); html_TD(); } else # endif // ifdef P037_JSON_SUPPORT From b794cc97828aaf6f3a3c67cf95cf86b2e376d4a4 Mon Sep 17 00:00:00 2001 From: uwekaditz <mueller.dresden@t-online.de> Date: Tue, 14 Jun 2022 22:51:45 +0200 Subject: [PATCH 45/89] [P037] Using xWide and html_TD(const String& style) --- src/src/PluginStructs/P037_data_struct.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/src/PluginStructs/P037_data_struct.cpp b/src/src/PluginStructs/P037_data_struct.cpp index f80a408be..9f89b4985 100644 --- a/src/src/PluginStructs/P037_data_struct.cpp +++ b/src/src/PluginStructs/P037_data_struct.cpp @@ -200,20 +200,20 @@ bool P037_data_struct::webform_load( html_TR_TD(); addHtml(F("&nbsp;")); addHtmlInt(varNr + 1); - html_TD(); + html_TD(F("padding-right: 8px")); id = F("template"); id += (varNr + 1); addTextBox(id, mqttTopics[varNr], 40, - false, false, EMPTY_STRING, F("wide")); - html_TD(); + false, false, EMPTY_STRING, F("xwide")); + html_TD(F("padding-right: 8px")); id = F("attribute"); id += (varNr + 1); addTextBox(id, jsonAttributes[varNr], 20, - false, false, EMPTY_STRING, EMPTY_STRING); + false, false, EMPTY_STRING, F("xwide")); html_TD(); } else # endif // ifdef P037_JSON_SUPPORT From 00c9eb71e3017afac65b79f53a62e8cb601c638b Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Thu, 16 Jun 2022 20:23:31 +0200 Subject: [PATCH 46/89] [P095] Use ESPEasy-specific ILI9341 extended library --- platformio_esp32_envs.ini | 1 - platformio_esp82xx_base.ini | 1 - 2 files changed, 2 deletions(-) diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index 5324d4d5c..961e4d13c 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -36,7 +36,6 @@ lib_deps = VL53L0X @ 1.3.0 adafruit/Adafruit BusIO @ ^1.10.0 adafruit/Adafruit GFX Library@^1.11.1 - adafruit/Adafruit ILI9341@^1.5.10 td-er/ESPeasySerial @ 2.0.10 td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1 ShiftRegister74HC595_NonTemplate diff --git a/platformio_esp82xx_base.ini b/platformio_esp82xx_base.ini index 498627810..622b0d2d7 100644 --- a/platformio_esp82xx_base.ini +++ b/platformio_esp82xx_base.ini @@ -75,7 +75,6 @@ lib_deps = VL53L0X @ 1.3.0 adafruit/Adafruit BusIO @ ^1.10.0 adafruit/Adafruit GFX Library@^1.11.1 - adafruit/Adafruit ILI9341@^1.5.10 bblanchon/ArduinoJson @ ^6.17.2 td-er/ESPeasySerial @ 2.0.10 td-er/RABurton ESP8266 Mutex @ ^1.0.2 From e570d7a0f07c06a80bc32681f9628d1079603034 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Fri, 17 Jun 2022 14:50:55 +0200 Subject: [PATCH 47/89] [P131] Add to NeoPixel builds, make it fit in ESP8266 4M NeoPixel build --- platformio_esp82xx_envs.ini | 1 + src/src/CustomBuild/define_plugin_sets.h | 3 ++ src/src/PluginStructs/P131_data_struct.h | 36 ++++++++++++------------ 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/platformio_esp82xx_envs.ini b/platformio_esp82xx_envs.ini index b8738814e..913bf3cbf 100644 --- a/platformio_esp82xx_envs.ini +++ b/platformio_esp82xx_envs.ini @@ -748,6 +748,7 @@ platform_packages = ${regular_platform.platform_packages} build_flags = ${regular_platform.build_flags} ${esp8266_4M1M.build_flags} -D PLUGIN_NEOPIXEL_COLLECTION + -D LIMIT_BUILD_SIZE ; neopixel : 1024k version ---------------------------- [env:neopixel_ESP8266_1M_Domoticz] diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index 8f6bb7b13..affbf5048 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -1325,6 +1325,9 @@ To create/register a plugin, you have to : #ifndef USES_P128 #define USES_P128 // NeoPixelBusFX #endif + #ifndef USES_P131 + #define USES_P131 // NeoMatrix + #endif #endif #ifdef CONTROLLER_SET_TESTING diff --git a/src/src/PluginStructs/P131_data_struct.h b/src/src/PluginStructs/P131_data_struct.h index ceb1213f7..c19541802 100644 --- a/src/src/PluginStructs/P131_data_struct.h +++ b/src/src/PluginStructs/P131_data_struct.h @@ -25,26 +25,26 @@ # define P131_CONFIG_FLAGS PCONFIG_ULONG(0) # define P131_CONFIG_FLAGS_B PCONFIG_ULONG(1) -# define P131_CONFIG_COLORS PCONFIG_LONG(3) // 2 Colors fit in 1 long +# define P131_CONFIG_COLORS PCONFIG_ULONG(3) // 2 Colors fit in 1 long -# define P131_FLAGS_MATRIX_TYPE 0 // MatrixType flags -# define P131_FLAGS_MATRIX_TYPE_TOP 0 // MatrixType flags Top/Bottom/Left/Right -# define P131_FLAGS_MATRIX_TYPE_RC 2 // MatrixType Row/Col -# define P131_FLAGS_MATRIX_TYPE_PZ 3 // MatrixType Progressive/Zigzag -# define P131_FLAGS_TILE_TYPE 4 // TileType flags -# define P131_FLAGS_TILE_TYPE_TOP 4 // TileType Top/Bottom/Left/Right -# define P131_FLAGS_TILE_TYPE_RC 6 // TileType RowCol -# define P131_FLAGS_TILE_TYPE_PZ 7 // TileType Progressive/Zigzag -# define P131_CONFIG_FLAG_ROTATION 8 // Flag-offset to store 4 bits for Rotation, uses bits 8, 9, 10, 11 -# define P131_CONFIG_FLAG_MODE 12 // Flag-offset to store 4 bits for Mode, uses bits 12, 13, 14 and 15 -# define P131_CONFIG_FLAG_FONTSCALE 20 // Flag-offset to store 4 bits for Font scaling, uses bits 20, 21, 22, 23 -# define P131_CONFIG_FLAG_CMD_TRIGGER 24 // Flag-offset to store 4 bits for Command trigger, uses bits 24, 25, 26, 27 -# define P131_CONFIG_FLAG_CLEAR_ON_EXIT 28 // Flag: Clear display on exit -# define P131_CONFIG_FLAG_STRIP_TYPE 29 // Flag: Strip type -# define P131_CONFIG_FLAG_SHOW_SPLASH 30 // Flag: Show splash +# define P131_FLAGS_MATRIX_TYPE 0 // MatrixType flags +# define P131_FLAGS_MATRIX_TYPE_TOP 0 // MatrixType flags Top/Bottom/Left/Right +# define P131_FLAGS_MATRIX_TYPE_RC 2 // MatrixType Row/Col +# define P131_FLAGS_MATRIX_TYPE_PZ 3 // MatrixType Progressive/Zigzag +# define P131_FLAGS_TILE_TYPE 4 // TileType flags +# define P131_FLAGS_TILE_TYPE_TOP 4 // TileType Top/Bottom/Left/Right +# define P131_FLAGS_TILE_TYPE_RC 6 // TileType RowCol +# define P131_FLAGS_TILE_TYPE_PZ 7 // TileType Progressive/Zigzag +# define P131_CONFIG_FLAG_ROTATION 8 // Flag-offset to store 4 bits for Rotation, uses bits 8, 9, 10, 11 +# define P131_CONFIG_FLAG_MODE 12 // Flag-offset to store 4 bits for Mode, uses bits 12, 13, 14 and 15 +# define P131_CONFIG_FLAG_FONTSCALE 20 // Flag-offset to store 4 bits for Font scaling, uses bits 20, 21, 22, 23 +# define P131_CONFIG_FLAG_CMD_TRIGGER 24 // Flag-offset to store 4 bits for Command trigger, uses bits 24, 25, 26, 27 +# define P131_CONFIG_FLAG_CLEAR_ON_EXIT 28 // Flag: Clear display on exit +# define P131_CONFIG_FLAG_STRIP_TYPE 29 // Flag: Strip type +# define P131_CONFIG_FLAG_SHOW_SPLASH 30 // Flag: Show splash -# define P131_CONFIG_FLAG_B_BRIGHTNESS 0 // Brightness, 8 bits -# define P131_CONFIG_FLAG_B_MAXBRIGHT 8 // Maximum Brightness, 8 bits +# define P131_CONFIG_FLAG_B_BRIGHTNESS 0 // Brightness, 8 bits +# define P131_CONFIG_FLAG_B_MAXBRIGHT 8 // Maximum Brightness, 8 bits # define P131_CONFIG_FLAGS_GET_MATRIX_TYPE (get8BitFromUL(P131_CONFIG_FLAGS, P131_FLAGS_MATRIX_TYPE)) # define P131_CONFIG_FLAG_GET_ROTATION (get4BitFromUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_ROTATION)) From 4b8a3e477bf5116633f12fc689d6d3db4cbd3ff9 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Thu, 30 Jun 2022 22:29:29 +0200 Subject: [PATCH 48/89] [Build] Enable SD-card support for Display and NeoPixel sets --- src/src/CustomBuild/define_plugin_sets.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index 1cadcc4f8..2e707081e 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -1255,6 +1255,9 @@ To create/register a plugin, you have to : #if !defined(LIMIT_BUILD_SIZE) && (defined(ESP8266) || !(ESP_IDF_VERSION_MAJOR > 3)) #define LIMIT_BUILD_SIZE // Reduce buildsize (on ESP8266 / pre-IDF4.x) to fit in all Display plugins #endif + #if !defined(FEATURE_SD) + #define FEATURE_SD + #endif #ifndef USES_ADAFRUITGFX_HELPER #define USES_ADAFRUITGFX_HELPER #endif @@ -1307,6 +1310,9 @@ To create/register a plugin, you have to : // Collection of all NeoPixel plugins #ifdef PLUGIN_NEOPIXEL_COLLECTION + #if !defined(FEATURE_SD) && !defined(ESP8266_1M) + #define FEATURE_SD + #endif #ifndef USES_P038 #define USES_P038 // NeoPixel #endif From c941209cfb431c0ac376aa52a73f0f2f1d940284 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 9 Jul 2022 21:02:05 +0200 Subject: [PATCH 49/89] [NeoPixel] Add generic power calculation to documentation --- docs/source/Plugin/NeoPixel_Power.rst | 7 +++++++ docs/source/Plugin/P038.rst | 5 +++++ docs/source/Plugin/P041.rst | 7 ++++++- docs/source/Plugin/P042.rst | 7 ++++++- docs/source/Plugin/P070.rst | 7 ++++++- docs/source/Plugin/P128.rst | 5 +++++ docs/source/Plugin/P131.rst | 2 +- 7 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 docs/source/Plugin/NeoPixel_Power.rst diff --git a/docs/source/Plugin/NeoPixel_Power.rst b/docs/source/Plugin/NeoPixel_Power.rst new file mode 100644 index 000000000..2b4a09e08 --- /dev/null +++ b/docs/source/Plugin/NeoPixel_Power.rst @@ -0,0 +1,7 @@ +By the physical design of these modules, using NeoPixel leds for display that can consume up to 60 mA each, the power consumption is dependent on the number of neopixels that are activated and the brightness that is set. On a set of NeoPixels, like consisting of 64 pixels, the max. power used 60 mA * 64 = 3840 mA @ 5V = 19.2 watt with all leds on at max brightness (255), so it requires an adequate power supply, preferably separate from the power supply used to power the ESP. + +When reducing the brightness to 40% (0.4 * 255 = 102), that power is reduced to ca. 1.5 A @ 5V = ca. 7.5 watt. 40% is usually enough during daylight conditions, at night the brightness can often be reduced to 20%. + +For a set of 300 pixels, the max. power would count up to 300 * 60 mA @ 5V = 90 W. At 40% brightness, that is reduced to 36 W. + +Reasoning back from the available power supply max. load (f.e. 30 W), the max. allowed brightness can be calculated by dividing the max. load by the voltage (5V) and the number of pixels (300) = 20 mA, 60 / 20 = 3 = ~33% brightness = 85. That will still be bright enough, but will put quite a strain at the power supply. \ No newline at end of file diff --git a/docs/source/Plugin/P038.rst b/docs/source/Plugin/P038.rst index 1c6feb557..93e2e42ef 100644 --- a/docs/source/Plugin/P038.rst +++ b/docs/source/Plugin/P038.rst @@ -31,6 +31,11 @@ Supported hardware A few examples of NeoPixel LEDs and strips (Image sourced from Aliexpress) +Power consumption +~~~~~~~~~~~~~~~~~ + +.. include:: NeoPixel_Power.rst + Configuration ------------- diff --git a/docs/source/Plugin/P041.rst b/docs/source/Plugin/P041.rst index e0da2b59f..b6d609c75 100644 --- a/docs/source/Plugin/P041.rst +++ b/docs/source/Plugin/P041.rst @@ -1,4 +1,4 @@ -.. include:: ../Plugin/_plugin_substitutions_p04x.repl +.. include:: ../Plugin/_plugin_substitutions_p04x.repl .. _P041_page: |P041_typename| @@ -26,6 +26,11 @@ Supported hardware |P041_usedby| +Power consumption +~~~~~~~~~~~~~~~~~ + +.. include:: NeoPixel_Power.rst + .. Commands available .. ^^^^^^^^^^^^^^^^^^ diff --git a/docs/source/Plugin/P042.rst b/docs/source/Plugin/P042.rst index 034e986c4..076a183dc 100644 --- a/docs/source/Plugin/P042.rst +++ b/docs/source/Plugin/P042.rst @@ -1,4 +1,4 @@ -.. include:: ../Plugin/_plugin_substitutions_p04x.repl +.. include:: ../Plugin/_plugin_substitutions_p04x.repl .. _P042_page: |P042_typename| @@ -26,6 +26,11 @@ Supported hardware |P042_usedby| +Power consumption +~~~~~~~~~~~~~~~~~ + +.. include:: NeoPixel_Power.rst + .. Commands available .. ^^^^^^^^^^^^^^^^^^ diff --git a/docs/source/Plugin/P070.rst b/docs/source/Plugin/P070.rst index d3858cbce..1399debc2 100644 --- a/docs/source/Plugin/P070.rst +++ b/docs/source/Plugin/P070.rst @@ -1,4 +1,4 @@ -.. include:: ../Plugin/_plugin_substitutions_p07x.repl +.. include:: ../Plugin/_plugin_substitutions_p07x.repl .. _P070_page: |P070_typename| @@ -26,6 +26,11 @@ Supported hardware |P070_usedby| +Power consumption +~~~~~~~~~~~~~~~~~ + +.. include:: NeoPixel_Power.rst + .. Commands available .. ^^^^^^^^^^^^^^^^^^ diff --git a/docs/source/Plugin/P128.rst b/docs/source/Plugin/P128.rst index 08317b5f8..318f4391e 100644 --- a/docs/source/Plugin/P128.rst +++ b/docs/source/Plugin/P128.rst @@ -33,6 +33,11 @@ LED strips (sometimes called stripes) using the WS281x type (and clones) of mult |P128_usedby| +Power consumption +~~~~~~~~~~~~~~~~~ + +.. include:: NeoPixel_Power.rst + Configuration ------------- diff --git a/docs/source/Plugin/P131.rst b/docs/source/Plugin/P131.rst index 9de063681..122ca512a 100644 --- a/docs/source/Plugin/P131.rst +++ b/docs/source/Plugin/P131.rst @@ -89,7 +89,7 @@ NB: It is advised to use a single 220 to 470 ohm resistor in the wiring from ESP Power consumption ~~~~~~~~~~~~~~~~~ -By the physical design of these modules, using NeoPixel leds for display, the power consumption is dependent on the number of neopixels that are activated and the brightness that is set. On a display consisting of 4 matrices, the power used was ca. 3A @ 5V with all leds on at brightness 255, so it requires an adequate power supply, preferably separate from the power supply used to power the ESP. +.. include:: NeoPixel_Power.rst Also, when using several matrices sequentially, separate wiring should be added for VCC and GND to each group of matrices, to avoid burning out the pcb traces of the matrix where the power is connected. For groups of 4 to 8 matrices, it is advised to use separate wiring for power to each group, and only connect the GND and signal connections Dout/GND to Din/GND of the next group, but **never** the VCC pins. From f9184a81c0770896adf1580230222c8864c5ab59 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Fri, 15 Jul 2022 16:56:57 +0200 Subject: [PATCH 50/89] [AdaGFX] Add getTextSize and get/setValidation methods --- src/src/Helpers/AdafruitGFX_helper.cpp | 17 +++++++++++++++++ src/src/Helpers/AdafruitGFX_helper.h | 8 ++++++++ 2 files changed, 25 insertions(+) diff --git a/src/src/Helpers/AdafruitGFX_helper.cpp b/src/src/Helpers/AdafruitGFX_helper.cpp index a32b621a5..410e393e6 100644 --- a/src/src/Helpers/AdafruitGFX_helper.cpp +++ b/src/src/Helpers/AdafruitGFX_helper.cpp @@ -1260,6 +1260,19 @@ void AdafruitGFX_helper::printText(const char *string, } } +/**************************************************************************** + * getTextSize length and height in pixels + ***************************************************************************/ +uint16_t AdafruitGFX_helper::getTextSize(const String& text, + uint16_t & h) { + int16_t x; + int16_t y; + uint16_t w; + + _display->getTextBounds(text.c_str(), 0, 0, &x, &y, &w, &h); // Count length and height in pixels + return w; +} + /**************************************************************************** * color565: convert r, g, b colors to rgb565 (by bit-shifting) ***************************************************************************/ @@ -1753,6 +1766,10 @@ bool AdafruitGFX_helper::invalidCoordinates(int X, # endif // if ADAGFX_ARGUMENT_VALIDATION +void AdafruitGFX_helper::setValidation(const bool& state) { + _useValidation = state; +} + void AdafruitGFX_helper::setRotation(uint8_t m) { uint8_t rotation = m & 3; diff --git a/src/src/Helpers/AdafruitGFX_helper.h b/src/src/Helpers/AdafruitGFX_helper.h index 34f93c337..4d1cc1b52 100644 --- a/src/src/Helpers/AdafruitGFX_helper.h +++ b/src/src/Helpers/AdafruitGFX_helper.h @@ -316,6 +316,14 @@ public: int16_t y); # endif // ifdef ADAGFX_ENABLE_BMP_DISPLAY + uint16_t getTextSize(const String& text, + uint16_t & h); // return length and height in pixels using current font + + void setValidation(const bool& state); + bool getValidation() const { + return _useValidation; + } + private: void initialize(); From 16a734d413316244beeb5b9e35c0c65c0d997434 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Fri, 15 Jul 2022 19:09:37 +0200 Subject: [PATCH 51/89] [P131] Add horizontal scroll feature, fix clear on exit bug --- src/_P131_NeoPixelMatrix.ino | 44 +++++--- src/src/PluginStructs/P131_data_struct.cpp | 117 +++++++++++++++++---- src/src/PluginStructs/P131_data_struct.h | 15 +-- 3 files changed, 134 insertions(+), 42 deletions(-) diff --git a/src/_P131_NeoPixelMatrix.ino b/src/_P131_NeoPixelMatrix.ino index d5d9e4e35..2a3d91552 100644 --- a/src/_P131_NeoPixelMatrix.ino +++ b/src/_P131_NeoPixelMatrix.ino @@ -7,6 +7,8 @@ // ####################################################################################################### /** Changelog: + * 2022-07-15 tonhuisman: Implement horizontal scrolling (left/right, opt. empty start) for predefined content + * 2022-07-11 tonhuisman: Fix Clear on Exit issue * 2022-06-13 tonhuisman: Improved Splash handling, non-blocking delay, default 3 seconds * 2022-06-12 tonhuisman: Fix reading settings before plugin_ten_per_second() is executed * Implement PCONFIG_ULONG(n) macro @@ -196,8 +198,9 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) html_table_header(F("Line #&nbsp;")); html_table_header(F("Text")); html_table_header(F("Scroll")); - html_table_header(F("Right")); - html_table_header(F("/Pixel")); + html_table_header(F("Empty start")); + html_table_header(F("Scroll right")); + html_table_header(F("Stepsize")); html_table_header(F("Speed")); for (uint8_t varNr = 0; varNr < P131_CONFIG_TILE_HEIGHT; varNr++) { @@ -221,31 +224,37 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) html_TD(); // Scroll addCheckBox(getPluginCustomArgName(varNr + 100), bitRead(optBits, P131_OPTBITS_SCROLL) == 1, false # ifdef ENABLE_TOOLTIPS - , F("Scroll text if length > display-width") + , F("Scroll text") + # endif // ifdef ENABLE_TOOLTIPS + ); + html_TD(); // Start with empty display, inverted setting + addCheckBox(getPluginCustomArgName(varNr + 200), bitRead(optBits, P131_OPTBITS_STARTBLANK) == 0, false + # ifdef ENABLE_TOOLTIPS + , F("Start and end scroll with empty display") # endif // ifdef ENABLE_TOOLTIPS ); html_TD(); // Scroll from right - addCheckBox(getPluginCustomArgName(varNr + 200), bitRead(optBits, P131_OPTBITS_RIGHTSCROLL) == 1, false + addCheckBox(getPluginCustomArgName(varNr + 300), bitRead(optBits, P131_OPTBITS_RIGHTSCROLL) == 1, false # ifdef ENABLE_TOOLTIPS - , F("Scroll in from right") - # endif // ifdef ENABLE_TOOLTIPS - ); - html_TD(); // Scroll per character or per pixel - addCheckBox(getPluginCustomArgName(varNr + 300), bitRead(optBits, P131_OPTBITS_PIXELSCROLL) == 1, false - # ifdef ENABLE_TOOLTIPS - , F("Scroll per pixel") + , F("Scroll from left to right") # endif // ifdef ENABLE_TOOLTIPS ); + html_TD(); // Pixels per step, offset with -1 + addNumericBox(getPluginCustomArgName(varNr + 400), get4BitFromUL(optBits, P131_OPTBITS_SCROLLSTEP) + 1, 1, 16 + # ifdef ENABLE_TOOLTIPS + , EMPTY_STRING, F("Scroll 1..16 pixels / step") + # endif // ifdef ENABLE_TOOLTIPS + ); opts = parseString(strings[varNr], 3); int scrollSpeed = 0; validIntFromString(opts, scrollSpeed); if (scrollSpeed == 0) { scrollSpeed = 10; } - html_TD(); // Speed 0.1 steps per second - addNumericBox(getPluginCustomArgName(varNr + 400), scrollSpeed, 1, 600 + html_TD(); // Speed 0.1 seconds per step + addNumericBox(getPluginCustomArgName(varNr + 500), scrollSpeed, 1, 600 # ifdef ENABLE_TOOLTIPS - , F(""), F("Scroll-speed in 0.1 steps / second.") + , EMPTY_STRING, F("Scroll-speed in 0.1 seconds / step") # endif // ifdef ENABLE_TOOLTIPS ); @@ -323,11 +332,12 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) error += ','; uint32_t optBits = 0; bitWrite(optBits, P131_OPTBITS_SCROLL, isFormItemChecked(getPluginCustomArgName(varNr + 100))); - bitWrite(optBits, P131_OPTBITS_RIGHTSCROLL, isFormItemChecked(getPluginCustomArgName(varNr + 200))); - bitWrite(optBits, P131_OPTBITS_PIXELSCROLL, isFormItemChecked(getPluginCustomArgName(varNr + 300))); + bitWrite(optBits, P131_OPTBITS_STARTBLANK, !isFormItemChecked(getPluginCustomArgName(varNr + 200))); // Inverted + bitWrite(optBits, P131_OPTBITS_RIGHTSCROLL, isFormItemChecked(getPluginCustomArgName(varNr + 300))); + set4BitToUL(optBits, P131_OPTBITS_SCROLLSTEP, getFormItemIntCustomArgName(varNr + 400) - 1); // Offset -1 error += optBits; error += ','; - error += getFormItemIntCustomArgName(varNr + 400); + error += getFormItemIntCustomArgName(varNr + 500); strings[varNr] = error; } error.clear(); diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp index 27e2a54b0..398c1b197 100644 --- a/src/src/PluginStructs/P131_data_struct.cpp +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -136,9 +136,31 @@ bool P131_data_struct::plugin_init(struct EventStruct *event) { matrix->setTextColor(_fgcolor, _bgcolor); // set text color to white and black background gfxHelper->setColumnRowMode(false); // Pixel-mode - matrix->setTextSize(_fontscaling); // Handles 0 properly, text size, default 1 = very small + matrix->setTextSize(_fontscaling); // Handles 0 properly, text size, default 1 matrix->setCursor(0, 0); // move cursor to position (0, 0) pixel updateFontMetrics(); + + // Load + loadContent(event); + + // Setup initial scroll position + for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { + if (content[x].active) { + String tmpString = parseStringKeepCase(strings[x], 1); + String newString = AdaGFXparseTemplate(tmpString, _textcols, gfxHelper); + uint16_t h; + content[x].length = gfxHelper->getTextSize(newString, h); + content[x].pixelPos = 0; + + if (content[x].startBlank) { + if (content[x].rightScroll) { + content[x].pixelPos = -1 * content[x].length; + } else { + content[x].pixelPos = _xpix; + } + } + } + } } } return success; @@ -153,8 +175,8 @@ bool P131_data_struct::plugin_exit(struct EventStruct *event) { # endif // ifndef BUILD_NO_DEBUG if ((nullptr != matrix) && bitRead(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_CLEAR_ON_EXIT)) { - matrix->setTextColor(ADAGFX_WHITE, ADAGFX_BLACK); matrix->fillScreen(ADAGFX_BLACK); // fill screen with black color + matrix->show(); } cleanup(); return true; @@ -191,7 +213,8 @@ void P131_data_struct::loadContent(struct EventStruct *event) { validUIntFromString(opts, optBits); content[x].active = bitRead(optBits, P131_OPTBITS_SCROLL); content[x].rightScroll = bitRead(optBits, P131_OPTBITS_RIGHTSCROLL); - content[x].pixelMode = bitRead(optBits, P131_OPTBITS_PIXELSCROLL); + content[x].startBlank = bitRead(optBits, P131_OPTBITS_STARTBLANK) == 0; // Inverted + content[x].stepWidth = get4BitFromUL(optBits, P131_OPTBITS_SCROLLSTEP); opts = parseString(strings[x], 3); int speed = 0; validIntFromString(opts, speed); @@ -228,27 +251,90 @@ bool P131_data_struct::plugin_read(struct EventStruct *event) { void P131_data_struct::display_content(struct EventStruct *event, bool scrollOnly) { if (isInitialized() && (nullptr != gfxHelper)) { - int16_t yPos = 0; + int16_t yPos = 0; + bool useVal = gfxHelper->getValidation(); + gfxHelper->setValidation(false); // Ignore validation to enable scrolling for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { - String tmpString = parseStringKeepCase(strings[x], 1); - if (!scrollOnly || (scrollOnly && content[x].active)) { - String newString = AdaGFXparseTemplate(tmpString, _textcols, gfxHelper); + String tmpString = parseStringKeepCase(strings[x], 1); + String newString = AdaGFXparseTemplate(tmpString, _textcols, gfxHelper); + uint16_t h; + content[x].length = gfxHelper->getTextSize(newString, h); # if ADAGFX_PARSE_SUBCOMMAND updateFontMetrics(); # endif // if ADAGFX_PARSE_SUBCOMMAND - // TODO apply scrolling offset if (yPos < _ypix) { - gfxHelper->printText(newString.c_str(), 0, yPos, _fontscaling, _fgcolor, _bgcolor); + gfxHelper->printText(newString.c_str(), + content[x].pixelPos, + yPos, + _fontscaling, + _fgcolor, + _bgcolor); + + if (scrollOnly && content[x].active) { + if (content[x].rightScroll && (content[x].pixelPos > 0)) { + // Clear left from text + matrix->fillRect(content[x].pixelPos - (content[x].stepWidth + 1), + yPos, + (content[x].stepWidth + 1), + h, + _bgcolor); + } + + if (!content[x].rightScroll && (content[x].pixelPos + content[x].length < _xpix) && (content[x].stepWidth > 0)) { + // Clear right from text + matrix->fillRect(content[x].pixelPos + content[x].length + 1, + yPos, + content[x].stepWidth, + h, + _bgcolor); + } + } + } + + if (scrollOnly && content[x].active) { + if (content[x].rightScroll) { + // Fully scrolled? then reset, starting left of the screen or with right side aligned right if not startBlank + if (content[x].pixelPos > (content[x].startBlank ? _xpix : 0 - (content[x].stepWidth + 1))) { + if (content[x].startBlank) { + content[x].pixelPos = -1 * content[x].length; + } else { + content[x].pixelPos = (-1 * content[x].length) + _xpix - (content[x].stepWidth + 1); + } + } + } else { + // Fully scrolled? then reset, starting at right of the screen or left if not startBlank + if (content[x].pixelPos + content[x].length < (content[x].startBlank ? 0 : _xpix + (content[x].stepWidth + 1))) { + if (content[x].startBlank) { + content[x].pixelPos = _xpix; + } else { + content[x].pixelPos = content[x].stepWidth + 1; + } + } + } + + // Logging used only during development + // String log = F("display_content: x="); + // log += x; + // log += F(", pxPos="); + // log += content[x].pixelPos; + // log += F(", len="); + // log += content[x].length; + // log += F(", stp="); + // log += content[x].stepWidth + 1; + // log += F(", xpix="); + // log += _xpix; + // addLogMove(LOG_LEVEL_INFO, log); } } delay(0); yPos += (_fontheight * _fontscaling); } + gfxHelper->setValidation(useVal); matrix->show(); } } @@ -336,14 +422,9 @@ bool P131_data_struct::plugin_ten_per_second(struct EventStruct *event) { if (content[x].loop == -1) { content[x].loop = content[x].speed; } // Initialize if (!content[x].loop--) { - if (content[x].pixelMode) { - if (content[x].pixelPos > 0) { - // TODO - } - } + content[x].pixelPos += (content[x].rightScroll ? 1 : -1) * (content[x].stepWidth + 1); - // TODO - // display_content(event, true); + display_content(event, true); } } } @@ -370,7 +451,7 @@ void P131_data_struct::updateFontMetrics() { } # ifdef P131_DEBUG_LOG - if (loglevelActiveFor(LOG_LEVEL_INFO)) { + if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { String log = F("updateFontMetrics: size: "); log += _fontscaling; log += F(", fg: "); @@ -384,7 +465,7 @@ void P131_data_struct::updateFontMetrics() { log += F(", yp: "); log += matrix->getCursorY(); } - addLogMove(LOG_LEVEL_INFO, log); + addLogMove(LOG_LEVEL_DEBUG, log); } # endif // ifdef P131_DEBUG_LOG } diff --git a/src/src/PluginStructs/P131_data_struct.h b/src/src/PluginStructs/P131_data_struct.h index c19541802..ce5a0aa76 100644 --- a/src/src/PluginStructs/P131_data_struct.h +++ b/src/src/PluginStructs/P131_data_struct.h @@ -10,12 +10,12 @@ # include <vector> -# define P131_DEBUG_LOG // Enable for some (extra) logging +# define P131_DEBUG_LOG // Enable for some (extra) logging -# define P131_Nlines 16 // The number of different lines which can be displayed +# define P131_Nlines 16 // The number of different lines which can be displayed # define P131_Nchars 50 -# define P131_SHOW_SPLASH // Enable to show splash (text) +// # define P131_SHOW_SPLASH // Enable to show splash (text) # define P131_SPLASH_DURATION (3000 / 100) // 3 seconds in 100 millisecond chunks # define P131_CONFIG_MATRIX_WIDTH PCONFIG(0) @@ -63,7 +63,8 @@ // Line options # define P131_OPTBITS_SCROLL 0 // Scrolling enabled # define P131_OPTBITS_RIGHTSCROLL 1 // Scroll in from right -# define P131_OPTBITS_PIXELSCROLL 2 // Scroll per character (0) or per pixel (1) +# define P131_OPTBITS_STARTBLANK 3 // Start with blank display (1) or not (0) +# define P131_OPTBITS_SCROLLSTEP 4 // Number of pixels to scroll enum class P131_CommandTrigger : uint8_t { neomatrix = 0u, @@ -74,15 +75,15 @@ enum class P131_CommandTrigger : uint8_t { const __FlashStringHelper* P131_CommandTrigger_toString(P131_CommandTrigger cmd); struct P131_content_struct { - int16_t start = 0; // - int16_t length = 0; // + int16_t length = 0; // Intermediate storage for current length int16_t position = 0; // position within the string to display (characters) int16_t pixelPos = 0; // current left-offset on display int16_t speed = 0; // 0.1 sec. steps int16_t loop = -1; // steps before we go, -1 = restart from speed + int8_t stepWidth = 0; // Nr. of pixels to scroll - 1 bool active = false; bool rightScroll = false; - bool pixelMode = false; + bool startBlank = false; }; struct P131_data_struct : public PluginTaskData_base { From 017396234a85a14f41128eb09c8c587a78157bb8 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Fri, 15 Jul 2022 20:18:47 +0200 Subject: [PATCH 52/89] [P131] Code optimization --- src/src/PluginStructs/P131_data_struct.cpp | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp index 398c1b197..ab117782c 100644 --- a/src/src/PluginStructs/P131_data_struct.cpp +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -213,8 +213,8 @@ void P131_data_struct::loadContent(struct EventStruct *event) { validUIntFromString(opts, optBits); content[x].active = bitRead(optBits, P131_OPTBITS_SCROLL); content[x].rightScroll = bitRead(optBits, P131_OPTBITS_RIGHTSCROLL); - content[x].startBlank = bitRead(optBits, P131_OPTBITS_STARTBLANK) == 0; // Inverted - content[x].stepWidth = get4BitFromUL(optBits, P131_OPTBITS_SCROLLSTEP); + content[x].startBlank = bitRead(optBits, P131_OPTBITS_STARTBLANK) == 0; // Inverted + content[x].stepWidth = get4BitFromUL(optBits, P131_OPTBITS_SCROLLSTEP) + 1; // Add offset once opts = parseString(strings[x], 3); int speed = 0; validIntFromString(opts, speed); @@ -278,18 +278,18 @@ void P131_data_struct::display_content(struct EventStruct *event, if (scrollOnly && content[x].active) { if (content[x].rightScroll && (content[x].pixelPos > 0)) { // Clear left from text - matrix->fillRect(content[x].pixelPos - (content[x].stepWidth + 1), + matrix->fillRect(content[x].pixelPos - content[x].stepWidth, yPos, - (content[x].stepWidth + 1), + content[x].stepWidth, h, _bgcolor); } - if (!content[x].rightScroll && (content[x].pixelPos + content[x].length < _xpix) && (content[x].stepWidth > 0)) { + if (!content[x].rightScroll && (content[x].pixelPos + content[x].length < _xpix) && (content[x].stepWidth > 1)) { // Clear right from text matrix->fillRect(content[x].pixelPos + content[x].length + 1, yPos, - content[x].stepWidth, + content[x].stepWidth - 1, h, _bgcolor); } @@ -299,20 +299,20 @@ void P131_data_struct::display_content(struct EventStruct *event, if (scrollOnly && content[x].active) { if (content[x].rightScroll) { // Fully scrolled? then reset, starting left of the screen or with right side aligned right if not startBlank - if (content[x].pixelPos > (content[x].startBlank ? _xpix : 0 - (content[x].stepWidth + 1))) { + if (content[x].pixelPos > (content[x].startBlank ? _xpix : 0 - content[x].stepWidth)) { if (content[x].startBlank) { content[x].pixelPos = -1 * content[x].length; } else { - content[x].pixelPos = (-1 * content[x].length) + _xpix - (content[x].stepWidth + 1); + content[x].pixelPos = (-1 * content[x].length) + _xpix - content[x].stepWidth; } } } else { // Fully scrolled? then reset, starting at right of the screen or left if not startBlank - if (content[x].pixelPos + content[x].length < (content[x].startBlank ? 0 : _xpix + (content[x].stepWidth + 1))) { + if (content[x].pixelPos + content[x].length < (content[x].startBlank ? 0 : _xpix + content[x].stepWidth)) { if (content[x].startBlank) { content[x].pixelPos = _xpix; } else { - content[x].pixelPos = content[x].stepWidth + 1; + content[x].pixelPos = content[x].stepWidth; } } } @@ -325,7 +325,7 @@ void P131_data_struct::display_content(struct EventStruct *event, // log += F(", len="); // log += content[x].length; // log += F(", stp="); - // log += content[x].stepWidth + 1; + // log += content[x].stepWidth; // log += F(", xpix="); // log += _xpix; // addLogMove(LOG_LEVEL_INFO, log); @@ -422,7 +422,7 @@ bool P131_data_struct::plugin_ten_per_second(struct EventStruct *event) { if (content[x].loop == -1) { content[x].loop = content[x].speed; } // Initialize if (!content[x].loop--) { - content[x].pixelPos += (content[x].rightScroll ? 1 : -1) * (content[x].stepWidth + 1); + content[x].pixelPos += (content[x].rightScroll ? 1 : -1) * content[x].stepWidth; display_content(event, true); } From 35c5f39081bb44ebccdefb909796d6e689634bd8 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Fri, 15 Jul 2022 22:15:46 +0200 Subject: [PATCH 53/89] [P131] Scrolling fixes --- src/src/PluginStructs/P131_data_struct.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp index ab117782c..3b286cc51 100644 --- a/src/src/PluginStructs/P131_data_struct.cpp +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -145,14 +145,15 @@ bool P131_data_struct::plugin_init(struct EventStruct *event) { // Setup initial scroll position for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { + content[x].pixelPos = 0; + if (content[x].active) { String tmpString = parseStringKeepCase(strings[x], 1); String newString = AdaGFXparseTemplate(tmpString, _textcols, gfxHelper); uint16_t h; - content[x].length = gfxHelper->getTextSize(newString, h); - content[x].pixelPos = 0; + content[x].length = gfxHelper->getTextSize(newString, h); - if (content[x].startBlank) { + if (content[x].startBlank && (content[x].length > _xpix)) { if (content[x].rightScroll) { content[x].pixelPos = -1 * content[x].length; } else { @@ -275,7 +276,7 @@ void P131_data_struct::display_content(struct EventStruct *event, _fgcolor, _bgcolor); - if (scrollOnly && content[x].active) { + if (scrollOnly && content[x].active && (content[x].length > _xpix)) { if (content[x].rightScroll && (content[x].pixelPos > 0)) { // Clear left from text matrix->fillRect(content[x].pixelPos - content[x].stepWidth, @@ -418,7 +419,7 @@ bool P131_data_struct::plugin_ten_per_second(struct EventStruct *event) { success = true; for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { - if (content[x].active) { + if (content[x].active && content[x].length > _xpix) { if (content[x].loop == -1) { content[x].loop = content[x].speed; } // Initialize if (!content[x].loop--) { From b1bbeb6b85382acd32d1c7d1cf5b37b4ccd2896f Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Fri, 15 Jul 2022 22:16:05 +0200 Subject: [PATCH 54/89] [P131] Documentation updates --- docs/source/Plugin/P131.rst | 10 ++++++++-- .../Plugin/P131_DeviceConfiguration.png | Bin 72611 -> 72828 bytes .../Plugin/_plugin_substitutions_p13x.repl | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/source/Plugin/P131.rst b/docs/source/Plugin/P131.rst index 122ca512a..8b997152d 100644 --- a/docs/source/Plugin/P131.rst +++ b/docs/source/Plugin/P131.rst @@ -228,14 +228,20 @@ If the Foreground and Background colors are the same, the background color will Lines ^^^^^ -.. warning:: **TODO** Need to complete the implementation and documentation. Only basic display of text is currently available. - * **Line 1..n** Predefined content can be specified. The number of lines shown depends on the Tile height of the display, the font used and the font scaling that is set. On a 240x240 pixel display, with the default font, and font scling set ot 1, all 24 lines will be displayed, but when using font scaling 2, then only the first 12 lines are displayed. If more lines are needed, then they should be set from the rules or an external source, like commands via http. The usual variables, like ``[Taskname#Valuename]``, or ``%v1%``, system variables, formulas and functions can be used. Input length is limited to 50 characters per line. If a longer calculated text is needed for a line, then it should be set from the rules or from an external source via http commands. +Per **Line** you can define if Scrolling should be used for displaying the content. When enabled, the other available options will be used to scroll the text. + +* **Scroll**: Enables (horizontal) scrolling of the content. NB: Scrolling will *only* be enabled if the content length won't fit on the display! +* **Empty start**: When checked, the display will start empty, and the text will be scrolled in. It will also scroll out until the display is empty again. (Default enabled). When unchecked, the display will start with the content that fits on the display, and scroll until the 'other' end of the text is visible. The display won't be empty when having this setting off. +* **Scroll right**: By default, scrolling will be from right to left, when checked, scrolling will be from left to right direction. +* **Stepsize**: The number of pixels that each step will scroll. Range 1..16, default 1. +* **Speed**: The number of 0.1 seconds before the next scroll step will be applied. Range 1..600 (0.1 second to 60 seconds), default 10 (1 step per second). + If more then 1 line is shown, next to the last Line the remaining capacity in characters is displayed. The total combination of lines * input length can not exceed 1000 characters (sized dynamically), as there is limited storage per task available for these settings. An error message will be shown after (trying to) save the settings, **any excess content will be discarded!** diff --git a/docs/source/Plugin/P131_DeviceConfiguration.png b/docs/source/Plugin/P131_DeviceConfiguration.png index 913d8cfdd006e3261aff0a390317f0dfbe40459e..452a21567b14f3731605295874849ce5ff6dca9f 100644 GIT binary patch literal 72828 zcmd?Q30PBEwl<t<yTnqILPcgME8+kM3IZ}l3k4MwL57G78bAdEWFC`P?Z6-sMKQ%J zA|epLpfZyv1R@|JW0U}qF+d1&NXYo@fL2xC?!Nc-|J~>R{vl7*gE={SpFOPou6Mm_ zowzfnEjO-LSPy|fHXc8A#1;biD;@$_o4jr<xI$8PaRGmRxOVJZ5CpP`B>w-qWQ|RV z;G%BuQF!nX&mi|euWP|x{(g|N?tz}3enD6KgUv5q3-%A(xPHIh-hBppb@u7#{G|Dl z&VC~u1Ec-=oVQ1^A&{RS$B!Jg3wNFBx4yd53qcE0Su>K9R&v|g=sm=2@_Btacb<D? ze8dXU+EjS#%@xOO<=-ER>|audd*6Sge=^x!;xF_I@WYSqb)NpD;i1{N?%{>K#?#Uj zb>Vj*dk;Z225eum_Ahpvt}J#@WM<xE5tfzYauj7&=lD_}q_<3OUrvjpnQ=!RSg${x zv;+L-RV-+5;~x#!nzeiNLhByrBk>Q%lP+aRTdmx4{AF9L+RCM;pD&YEFLg}mB32uC zEy?3o8yw(eF2=GNFn2Og{G*YzNZx=H+P43bH3}ZB9V9FsA}>EsMQK;QuORG3Mf1>Z zNAhB*G*tSaPO^FQ)M~de?_yuqZ@-<s2kJm`?~8iJ9gw;+Y4gewHzU(({`HAZ4cSjE zai`N>?>4pd@(xqM>(_UNp6TuDAz*?QzYg>OF#&$67TOa!{+Tl;o5Apl$#pv5kPCHS z=;u%;U&&{pZ27ZMtrM;HZJC|Dd6Ztv_OOE#jEFWpTDZj@wzPN*_hERZ&w(#D#H*^U zeT&HsISx%-nWn<K*zSkQc%3y4MG=N>Iv4buptfNo@BXn5(3el}dH%EB%J^=3v}TL~ zzSODBab|d3s<ejk3x(U7E9=#Tl`h<4fY8f1>2tN$6{qkp)y;n(M?Gl7CW^!zy!18> z!<pP;aOf!Il#2QEt9I>ON??LmAJgKoSFOh@>4gzyIv6PG^y+>Lfmv2cYeb=f@ZQ(r zFt*LLgOSlG7l=8DftEL!W~KRElIAIMS7xLOgGS)dm3_XiXUb>hmP}}?t6c<|f0ouz zady(T+&H@S*@Y<MN@*Xq)elkL7_U)xx$uO;K`^!%qJfyGO^LL|h5v{fU3+NN67GR% z=puZ{c}&PlMy@{-xsy#e2NV8mpfuWou`KG$k@lHgGV6*>R*LIpS2X(=sjnK7r!GRz z(*hU#!dsbTmszI#Yv7D!x3jkVuR84Hy$gi16YlS7W$niTJjqYrkLtMF&2yr(ux5$x zqY$HJOH=L-R`#Ix63M$cLE|&_JN?v)h4kEj!=iN$6)}OVTD$#MHk#F<H7@w=E@(iX zMT877eV+~6aXID_qe;AVsQCw19>>qT94*$yKV0bwV+M6Ndx^9@M89C4^Qh}1tmL_V zXnZO3%yekv2|u&2439%6v^(WTli1Db*6I3)TU8}_ngpzAv%0PatH$K)%1Z9>Aa%U$ zop!AJRa?1x^)NJEB6SR&kdmhcK22V^l6p_tDrT>Nhy06`uN|ZW`06gCA}v-;V@Ipm zzkT+Sp$^{xOoHfMBK-yYxv-P~7k_=9DZK&wx&B!fA^v$^l!YcF{1?=Wl;~-=(3sv} zfEu>{Y>*|gnBy-moNApI)DdyeJW4~Bi^wy23wwyh=fSiI%QR72gSK!Iwp-PbbD0xz zP#FUG3v?UAB=BMdw?Q<$5cq;yIZV?;jbTOS<{XL3F`lAsZ2@Cw{3WcvD_uovp&T`e ze!e!B%D7Ff&>k$Scjqah=~-K0tX9>B7${$t&rPEVSy8qA5XhtY*zX}2yMyr)bkP7z zix9wP-ysT%(5`&htXhVogZp~Q@`S$t6`?q|uE<<fo+W|it2Te9VM5>#%m)|udE9FG z4l?_Sl?cZ&a)!otQ>rQww4>Ky8N6y=NH{_`JtKU~$@LdS8Xjt>KT}N%<nL-A6PH8} zMG0+pHk8ZwEi_C>4OLgabPE?|418C(CtY-h$j#ssKp-aj>!Cf9ufkO`gu-BZCFP>{ zPL3qx!Zy?((R8ny{=wjpZnr4mOgsz5tsi2GCPaiie4}&~w=$QC)@#&3wcBSi_yeAE z2Ix^<6LMrdb^}%d@@1koinRXrhc%nrOLDeLp>_=OhJr)vaF_57j+k8bum)_YUWy@T zL-T8#w=t-lJ)b4Q3`WtKa-6WMEY&STWa&LwSb?fz1=EG{nZ*h9f|WC9u)Pi`^osL> zN;HvC+CFo?Z`2r5y<Ds3%!+=RMV}lVU#@keg)LR$U<MgaHk4)Mylo4zkb6-Vb$sJS zxT>g^$V_l#nu++#=i4><$X(kR{-VZ~c|rLQwM|BgeV5v@1~MDm??q}x2e~3|WC;#$ zk6IpE<VswBFE!XI<&C7hBh$&{FqXt#&ONSB((HZvy&xrghw7pg+YsTIDH@|)W-s?m zal;%JqAt8XA*yx!EaV+Tqc8-tqbhtRNKq1L#*T<Kg}Ul(Vo5$>Ej$wSE!~Bis#-1K zmo}ER(lyYL!nu)K(BwKB+d0TqwlR?>LCq;a(cQMfcxh-m;Y&j%ubfV%#Q7w?t75d< z47T>x^R70OM=cWhc|)*ASWa65EdIj=EPLk+1Y%9;x4?}kGPsJfJz<P~)vc5MeK}b> zjbP7@LLIm_EZAlbR7X_5NLYm*Ge@tD`Cy!ok_d0weWpt^JuYv$Q!X+w?C#04%qqbo z4b4C(tGLhKw4;~wFy6<OnumrP)@0K|XBR5T!x}TtsJ9%3BXxSA6zVW-ltMP*1YDjm z4s#;Hs)a4{8#{)HzWcP4Ji8O@MYCCa)r^I@lC*_T<-0QL*)jvcrhRMzK_FO|_dk^2 zzu*rnti1AlHEc3dR!g;50`jIam@Hk$TjRH|#-2^S)i>TnIJsyZc$stp4IghtyJrnZ zXi~mpz2!)ZaE>*Oc-l?;R71F$D10aQF;gC&M7=7KZxy8|DebWEv6$_g%$f^Is>X2e zV?xi(Zab^`v*|?MOll9YB$YbV=O!>I_tzlIWd90t4-(DMYmL}T5miVttxjpRO4`!$ zoK;`5Zk;=^wy1NgW-`JLM(}<&VJ7MxW{AQ#AA`~a(fUI)cI~`q(4#z)M$TPi*e(R5 z?-aG?zBB1r<l<XG!uMR}5n@!V)s>`WT!&;azXS|!>`Tj@q@x*bAs>8H@5;Ca%DEXh zR<u<s-DTY+vSHiAc(SA1Ab5vEMRa)O4zRJE-&x><s@sf2Y9_+lX2Qd{f_iwgD{h8A zZ>E!1|Cfy-`2<vjuV^_=giF3$?(bvl>Z^6u?J}=E@BqToPuEOAhaDc2$1GvZ{5BG> zZGtG3)Y3)qhb2b7kgt0G(Y?(y3n}s|w8#v;pj0)}4t0p8b*D6_I~xeo8;Dxg&8qDR zQrdHeI+4-sl<OnIRvS&r=N2gUO$eygd)r`37tM2QxXz$EZp5TnWlBi|&*agC@wumU zJS$Jj?2{KCI|*)xsyW)kkZwaH4T}F|(5xOg<CDd%_g;@Bwjcq}9qbDrd86H3M3A$> z7x%n)TkPl(86!&%q<y}m2{^I8o;HQ?-_-3uTNpjLzh`+tcai?n!kVyl6^mxK5I>l4 zfd~4SKWzpDyUuRmS3~9B#E@T2yEEknaxlB1jJxGWi9Thjls6SNZu(IJOHW4#FWbVb zctQ39u8d7}5u@&kL1}aJeZr77`o7AdR#wMhtzA5&14%T?y)3~~(LhOyFmu{<rx0E> zuj=plWx@ICOyNxBlyF(W2TT(+xEvNrc=)0u%T*LG*FqF%8?12%Z^LnPkhggJ1~<WJ z{<To97^}Hs3+TlxW9%{p&8257)Q{G;$bJV2Po36BB-7FjU>=M7L%&I@ntohvjLuT6 z3(Jtgya9%O#bc7c>}65FY5Qcstq<R`KsO2#gv*U9n`~O59}tF}6wK+houZ?3M1Ff- z!!ie3g2|=P{dBE`=rZ!75AyZw{`Aa*Blnkn>QJ_<V^Z3V>KyZBp*B5Wc$k&_EaH^4 zQKs9LzsxYRX$DQhiW)-9Uej_KZ~2D~`V(Hj0k#cV%i=D4ZrIy}cwjNywk->0z4qCD z0fokc84Pz5wAHSzXV;bx$W#>IRHQ1#>VA5W;@j?^U7Gkm_C=p1e&FBh5N?mANU0;~ zVW@jCo-LwE?~%1ROEZGSm|>TC(wA5n<?qhA8Z6LXnEFY=gh&$9!3JH!8g5B|_uE`J zA4NK0CLBjK!i0RLea>l<M+p&Niu?0)V_(7i2P>}>%c4<@(VK?d*wI%%lPP_u=)r`y z^d(md+@rT-!vhMrZAa$=UillNa7|h5c1FP)O*6Y(FeGn`<KQ|RQUZ4^YmmTBHr>p4 zIVi2+Z00Nlxt`|*m?n3pvGBVb;aeQ5AIWVEkC<GNU~tNE{AUYQA-b@K6!v|yL;>M* zOeKS-3!juceRQ6lSGXKRQI1T?8Z;h097bw3d&G%ZZ1oz{4;4iuVAh`SLql~DGDT=h z4+~s2k4bzVi!sz#i0*-&=LWF)!yH3*cuxp<A-sxu_rw@7;Eu3NPLQ0)h>e%2BvX`6 z4Y!a>F}VRWsKfqXk$G0uV&%L34`V)^qs4UnWK_RWq)9$<U`wG(6xad9&TQHipDU#K zOhBZpsk5=&{2zPrXCy`=-}MGmj!95P(&mA;Ym%yL4-?HT&-p%sU3nWgf;!~4gYGHh z2fs!`tS#w}dGuV<agW4;t6Id$*4F%PPYPrDo&IqYX;NsMXG~zZlo?ghb=)noaN&Jd zOo=RCzpUy^UZS5ng;+g=&xynpP6rJvhg$%n%T^P9QlA^9N*c_hl_;ANWy4I$W90Cm z&c!vNsgxBY8G$7V4{M{Bi#Q8L{BT=$QD|MowZ(42%#H5pk7(n;kFlfvyZ#CZ?~Sz7 z{8B&3`?cIu?kb3?-mm*87z{TSE@EU;a*}#s&J^s7GNwKvg^V&l)?3@4af1O*hfnbW z)Y?3ewI0siE;}nvm%N8`M;0fwQDVumm?L<OnSPr&&#2PIk3!$KjJ&tW;4pix!Q2Y9 z!}ktsAo2YS?e54NtI%xVJ@aAteZ$(VXieXVpmtust4!*&yYJd!j<CGmku662$+luq zX>@)+L3<BhgN(N2Px%XNmfJWrF1L8=+49p-ZZx4VVosOHZ%d*oDd6iy>sb(h1_|(e zXS<~aD|IX@NtTG$ZXX<agxQtLZ#lubmso-q83`sCREE5U4z%^a8W33S{-_|`94fid zvz^J_v^B1$;(mhr;RU&cHMY}pOjE>YW1`2bJln93PtcfwDf|76IouL`_3%=}CxvJ~ z%LF(Tv%P2m{s1PihJC)-1fw_+w0|++K$|<iFWCZCoK1cpn;0vm#qS9eJ2y0QnW%wU zG7y!_XU#>J-{Ns9htc7AIWPW3<JH6Vh*@rRxuSr1^KCV(H&gYiJNF>{ZP#UyY64s5 zz%PgPn+QLKmct4MM?=xWj>5clbBBe%I@S#T&PWZR&Nqhl8@Gc%U^g_63SI!Jk9hka zs9ZIHtS%8hHMr}{e#G4nHmvZX^LoqUcjZg#!euOQS)w9zayquq@Gm}-*JW<zR0zjP zqG6R7=fS`*)5#5x>*Tkw-&=p^NAFV!<gn|8@ZLnbo`Dn!Dsh^7nKdJvmTG1fa#P%d zwH`ml^EectZ=h3gmau1rHZbP@upGIYILkL~a1-^wtfvcI4#J!_0c>a$)B7&sG8^qG z+<TqISqh8K5{`;Oy6&F~7&IEJ8q}|AS+4U{=}_g*p?8zZ2-`K%RX#{z*Fe5_fhgt; zRCYkpw1%&paCk8H`rtT@$ZbWR+a~h8Jy@HEnmms_<2vTAEOLm*xYo~$HfI6ejjH2a zy~W#v8O|dt-<YQiF7j%=#TnMe<ZiAIs^<k~!czto=xr@^7sL_E7A@Xo3R<2<s$FLp zF6dyR{1?LOVD%+Z$Prlxq{Z{UjIuzqb*T+Z6#{uPB@YB82;?_Y5Hf+!%gg`Jc-zp} z*fY*sDb$&0b~SBpCJe0wbQf1nsxl!oreqNECfGs~etoue#$UALFMIj&<pvCDF=vR& zbxPXNS~II>9L?P1R=@EaWM78#hHXFb9s6caUE{X`Jth_H7Cm<~ARs^*9U%c(0tWT{ zI&I5qe+Al3i)QpjDYusIu6rfGUqA+tdPDv|HR%Xk|NAv@Jo*Uq2zjQ9c>5PQ(4A8# z2q1qe4kJ}LtIAkf77i^Uqdyd}^BN|{pTpf6FGJXG#eI~DH!9fJ0!MYoJ6h^4kN<L5 zEDo)<_G8C}P}R+pT4KMKYX0NymC)+oUNSDE{c~X;)B)+F8-1&nPK3E6mxsv<D=Sa3 z0vqOQ#$LU@@5Vg5m%W)hAALsw^BWMSo_c~My*?3|2%ovrf>3VEnf|$389(HP-F54t zxA8&W+Xbz+CaJ9%JyqG>Z@lkb!7@C4x<UT%$FrdpI3}dqz)8>YT*#(-%`Q8Q;??D! zr*@`Nn-kodJiq*~4~Sf^ra(-+um8DpVTC}HSJ?BVOIOSO@@qFOISjo2t-1j!clg|* zZR6xG%bkPwb^d7ZPP*`uq~oZSU`Sdc5{8>!oVpJWlgF2pQ(I#jIxhkt&FeF;kPB6F zP>1%&<6k_(9yhxzU4uTtuNO-LdyRqFoGhor+Fx~b_+&IxVCE|$Nd9$>cV%>Kz6;cW zRr+?(ANt-!N<~+!8nk=>M%T$SM95@dH-#pWyrt}lS`G~NWLV(FC@ItrwW_iv4u5Pc z6-`o4y_j#hBLwrYAThH_vu6-Zk*#9HzBcp?qE1}5&s5D?hl%}Tk%8y9VD`tjE(3%5 zV{ydR_vVjf1x5?`V@&e+3*Y^HL(X&<@jQRr5_W>H9SnUz`_BgHPb2L8@Zm#}e>^ZK zK5yubcKn??cQ`G^kQck4+ce*_ww{`s>@J*7yI|=7HYcHuGBx|!_)k6jIG9G8bqlC( zk*?!;A4_@~AxpRvQ_{ay6LL`UU!Fv8KL1WE0pI`o$M|0~-VhKJbhZY`D?4atxCfkV zv&w76gG+TxAk@6+6R%3$$Hn>4mZ7OBTt!utdT~j~E?K`_eFKG#C6ebrpYL5~VnZs; z)DsiA=Q9YH5}hVqXE&2se5Zwz@MvDAuoKa1O4L5>Sgu+hIi7jJwNCo%#cS~~&&`8T zC|74^XHwV?pqH0ACWuoi35~jl!^GJRqPg;~GO~UKeP-eZq=-?YCdS^xOu6(L4_w)I zSwar4b%)h%gD2pGl@U!BO*Yp8RiWK#Gga2h0@pd8)#_Q5<KRasD8>?7xtqJMypC|r zYl^i;;U;7*>aVCzCLt1v_{2nqhB4n#ElU64e3cg+?cPxtt#aK}ZIj5#GIIwLL_>Ld zU)z$PYVtdc%2PQqEeJ6<e#uu<!8=(V4Ds1$$%^ep=CG%&mWJl?&G5Qc)o$43M^XE! zP5m=VvBmS3TK4Znr&(w|B8kEF%~=D`W&K&PXI%0U%oumG=ZRAv?StJWDU~NfAFFHI z;U+s5%0G)fT`2xKNGV;!(U}<g%yi?;8bRoKr~_~OMQC?yH+z4$l;)$x)o$58K^>OL z0GnT<Z8c@QxzO{yZ{21&F|LPCs$3uy2*ZT6g+pvW>wIsv`d+4O(O9@NmmAmz=%a}i zz)T1vvkENfBvpJKv9h6S3$8ga%!U~amJaq5`N#(mXyfge8)C8UdY)f6X|krxuIrLq zuPMS8Ra=RY%dE0IqPM2olXsVvBfS?W!FjJ$9HU8&fiy<v$mq=h=$*<Hg>SYC=w5H4 zzYa`{>#NT;0w?DBYVQCaHe6U;<W*E(nZv)l^;%${t+R`Z+HmLg_2r6ws^IRi_n?c} zB_<VEtfu_qP3_Ce5n>NRQv*M~j|aB&1-P^D<#|uTgUXY!II*?6)<)V7{BCPMOP(5x z%?DOEtKx8WL-`iJw(H`}TV2rq%u#{|{Er_`(C5E&(aq8fF1PC5s+2pH`fn#fLNRbR zq-!*{X;;Ip5N*PH=S#tE+qBIhY@$=rQO~D&ORM_*;`Uxc1d_F!m-b!ZR0Foj)8e&! z{j`@y)eIH8suD~1kYic)bIW-wX}Gp)mwAt}<rAJt${#(vRZzhj)t?E^ANXjszWjz` zcU}YCt(%VgEP0__+9i$Z@3K^;?e<FRfypD^G;(_wuQg<N0Vb&76tF%SSf(MlPr}=y zCEGn$r@A<(poG^SK5e?rlbl=1eA8W|k~busUwIb~b-46KA%w@oZ1;*HIV|ZkkyjH& zPo=uw#J)Byo$PEQ7M!Lg9PP(W`C2|^P6*8H7*$Y9+}M%<1{!Af=?k;GgldG))D0fR z=&Z{49WgjGsd>}Ml)3RpV<X>~Cns+}J3++d7v#!6s8dcvrd(L;cylFzQJcOxyh}DS zvB}6dm+ICx4-F9-j+Z<X0AF|2f*W{~;>j<@OTQ}VPa`P0hz9?TOdn&D{+avmB66vG zijL(?Pd{Q<df<-L1XstCW(?eP*tR?Lkheu)Ulc;E{>-%g`I&Rci8igV$?`ZS%S*YG z7Mk!mn<RGY;vuw_PQ||V>H4g+C)rR(T}wHom(m|Va*W>L@NAH3O*8kQzWK6qH9>MN zSsvd3O-|Cc{N**K>je23$DhlnX>*`KLZh;pq7X;1Ka{6M5exaua#jDankCk^e85Z1 zZ>hE83u2xme(-;lc>C7&pXL(W04V^*4%z3v0t)~8j_p6398HqgCyQ}mWCWxa_?3Wu zMhyCda(a~sx7R>AS6rO|vBb4j9XR&*!otG;9)qRR=?x7HNBN`5kWUX*JeAU0X)!Z; zIjd(9y;lPAY(Jo<H`(2>L@|wM+4K9gKPc-e>V2bHt8n-`akNMP#Idv6CLp-W&pw@i z(GGRO8DYK3wX}?7U1Tf^JAWp`JvQ;DAWiSJgzy7KV42*G2JTW#2qR&VYl<PF2))=C zGqy3JR>Kvxf#`_2W6%^)UTa7&ojEthbr~}`o^(K6%;JD^aw%?Uza&$%uk~Y>A@ah* z{Kj<V>;qMNDqd3|Hd3YDe79=Y{J}H~OeK$Nf#ds1n!5cM^_w)KY}jC8S!~riSEw%6 z5~mEc(i?fTHt%gqm_%k@Y`1}2@>+kMP}20-V$HA88U}U9$Cx<J$QLVZ+yB%y(h}GA zu}j+GHx_fb_4~D!Dc)baZl{lwNtB#FZkfX~2+wMApO(k_m7o=r;~W$MkXKCJ#fI>! zxb&BlhU%r|N@+$vW9Xb|Wb#o;1e<#<qBm`}t#wq#93E|434IGT{ahAu>D(NP;<hU< zrn4?$ZeqK5^57`iYcs79RTPpEboRDK0J1>v*vB?IyVqSS=)w)C!-4ms7SEZi!iB`% z%bUQwBfz{{FWE&dar>9};Usl*Kj9=&&~wi|5uRbAUVAdqEv4mH(t($C$7BeNNd6o- zW4i`_=9<$%ZIE3P6Y5Nm)4XCauI$;tu8OzBjpW7|j>gImrMg{il3xxJyn(MbS=@LR z-b(&tL}V}jt?R~JcsUUjq@=9ZEsw9l_S;F>wpvLS0^Xj(xgx1Cvr7f{gnEC6m)|Y? zWDdq`Qt}-0JB@U#@d*&i0Mc!M==Lui@C!<bd>GfJedqRLDPx2T%e_AU-Eh$o=kZ<_ zfsct%!WWm&wvq?ie0BGQuy5!9kGfh5(3m$_^WnZz3iXQX=})3k(jfJ?HFk%WS%Y~` z@pl>?;s__w0vG<cDeiW$sYOaSNr7eic0cyBd7y_~<7}*q6tda^hcI5ewShSo{kA?4 zPU*)=UTVx+JeFU57vA*6MVzy5tzEkJ+UL#sZ|kG`X2+(3h`SZj#pF(58iZV4h2#su zjKZ@<-ThSM^${RCn44OP#8$&DUFq{A_10+HpEXhUZBBqwT3glwLr<C8qnuJ@dFHM% zzJn^Su1x6Ie=6x|Ord;f=tlVJz8fQ$Dv!WZWR~AvcE?av)Relr!`$|oWA>Q(1H)As z?cx83dVz_vWNJZsIP*}4ume@~QHYI+aMSY6sHeaKE@&n=R<Fg~6NjP<Rs7$^OkWJ; zdM*sWi?D3w{sW^Re5=?}>+yn6GKkfm9$rHA%pvKcmd|_I?J{&56X6YGl{$$1Ju&k5 zVgqfBleBRp$6uz;6yb7N7+RNU5QW__A-%G|w=HqD?04A%(Ab?Ac=A|nL0N-)d;J7D z4l!L@xg>{=XZreUXSu2>s9q&`fAGOrXGdP|<)_3J8+((Q`%gzJA5T&_4$$>CKR`#L zuK-8@n9W-W$^J3?`8VRG)2C01@p42F^mjm1N12^{tpxcEaMKOf0s?H(Gcwd@TLGLc zhXKZq`i6*oeSKTC-3Xe*A3~3aadCHa>n6AA`ad<6CM<6h$r#iqZLcZ04GwPD3R?TV z`OEeCeSaj30nGnz$3XwVRe-PmOa}p1#q{p&FXEw#13>Y->1|nHYALJH+n~?EuOdhE z0uO|Le+rsFnD~B!+sk^&^sHXrJ#ZdZ{0+KcBkiwbn$ow`5ywMr1K(XYUHP>|TIpBN zPG^H#eLW=*azO#`<U`?ZcRAvPewAML?b`J}0^n7q{Lh6Ez}zFzPPoLx_?*zf&LQM< zAftuTRoud2vM3FSR;(&#OANGg@<4>g?Cz7Q_yL)ctOoR@OqmkeQEU{uD*Vy%%kE(Q zv#4bQ@`PtWB5)(__jXK7fSmsI2>|(l!A9ysz6A;odfmIkS>h<C=(ka<?bBP#(vL%X z(uU{T=3i1~jPi(40!`Ce6+95^qL!y;0baJb%FaA#aTtEI9jwF76*M+RB)i*(?f?<L zB{L_}jP!VMr6Xeud`*tsbA@M4?wwyo899}Sw5z8XiueL*lhOoOsx4yut`m?HcgrW< zAA1QmcPnMvyM!UDkb4jjx*6Cl4wUn5p(QZk==EhXTNo^(tmcr}TQ$YuF$vKD_9WQ} z)#Wd<(?*D7sJ)+u_j>ovIpBsq9XN={&9Ub*J}?!4P=tBaX2!#DxQvnqo%LRWHJruO zqc4w7J^Wn$*=^DdTLB}S)06<uz-si&5R(-j+Rh>McR7}~8&(GOR`5=_>U>`4I1#=( z42&F_H-wemqz_;Ywpk;cKoOisdUa3iG_?7gVT`f41BW*F>YA(HI~}oVRSR`^p<G&) z3q5PHyMb5?u*JsGc671Na%^$hH?e}&_oG8sy~Fe==HPdIzNE;rN~%o5of{M2wKH)t z0%OEkA5g+Hf#2F#fHC7f=Q~mU-bVmXJKx%Fe~Oud8ybAh4bce&MKIyJ3)Vhe%#F(D zn4PBwTNH8vt7po?j-_$RHR`rXDB~v$BK<+4_Y3XxZv>MUGskdar-p;vf7@}~N?YZ3 zm^BC_dFNy7;w=j~6jg81WM62YUH3GvRT)_Zbf%bqa%rFUEkERBYlQ7^XruYbO)BC8 zwM`%HnAqR_M<?Z?SbLIo(H)80AD|8qDfv(b0mrY+3RBRFBu<2UsjsHS>K)M0yDNt; z=3#J?L?n=RCg#8#zoByr2Hqrn(xso6qOJ0<5d)uFXTRxK&On$tq3sybjWOc?qf!9T z)V!BNUK<lekuLOq*sJeH>P@h<BsZk>OaKqo*M2@}hv~Dr@Za4OKi0m>-2T%0<8Je^ zQYWGk;LPl+<ZC@Lw9A@7JY?SGX@h0z54zZ2V}j|@8eKIK4$*d9W3_mvdb=4Ak@&x- zorWt{b}QHHI3C%&;`aum3+*;pcaOi^6Lz3uEbwBV0t``f+S(w;*685I&w2>Y+s`Mv z+S%t_h$5Z-oc1rMQwsRzRA_#cntS)h*pOP}xr;$J?M1ZHSKcJ;$X^jifnG6vN_VGP z(5GJ)?>e)Q#A~o;7{E~{%vTPt3OzQtW&|J5#@@gt{UMNHu9BK-==Nk}zjmMYA4(bW zvGj&dG5;Clq^GBEb#!!WG7zhW!doSSgFc3keRsv7_t4OjgT}^Iggs(KZHCXU;X7@D zoOA~|T}5T(9#=y2In<V^Sh2Ee^G#p=z46b{3yMMwzi`7}!re9kPcyS3s!>639&_;@ zMC-3${d-*z`2K&doA@7i@@Q-b66tbmwE!!q_1})NOrbs4hC9|~d(6Bd=RDc`5;JWx z-we?N-A&EF1YRM`%aV0#$Rqns(>sS2N_6O}wQm#05BQO|BS+^v8K8yeRmeal=tsMN z@p}bj>3yg})Ddn0hu^sr!9Msk>O4*XLbWxlD6y({lYMJM)<7l}AmV*>-RljO*Yqg; z>B5OSLq~P*-MX(~xVcd8v9IgUr$`(x!E1GXPA82mak5zyb6Z^nJ!toxHiH`-mrPEq z#XXxGjRil24hoZ`3z4ebUT%cv+B5G!4niDqT2iN_87*Vzu$br8Fp-WJgC`oWET-h$ zGezzBK%pw8h6#EER~ItRtv&}+DGf%S?(O<P)*^>##p}S%HO!>x1(M=1&nD&ZL+q&& zGj3mR&9{N}jExt{Y8Tk#E2VWvYw$|ngx@p*wUuTH8m87??<xd$g`O<Xps8wzbwNwL znXF{R>`nU-dgbj~-M-yb5CC;poUfgHb%oR{d727+sRQ6k<$Oj<gS*|Bel?p{NlZDj z(&NMr2LegWwbA}xj^Up6#oDunT517@+_z11H^$XrRnS<3E1Dv5&Ci06%~IPKXOVk} z@2$G0dztz@TORLJP86J%Jn#Rrs@u1jJjwi~4y9Uul^_1E6!QIU0=#DFLU5!Y*X93I zyZ1kM#x894^Ye=@_or>!wQE-c$b9Jy*U@)J7uV4x!9xN610nVPk?umrhR>hR1%!my zJG;60G~Q~n;W*!FOW6*T$}js?5=YN7_r;Uk<Hq{G%7ADia4;*@tT3sFROpLGj-2#c zZJ=cED<k7+Hmr#Q;L`_gTgg`e-KcLxiv=Jf&L-?N5X<v#E-wBamcLRzO(WBNU5e{H zdm22W8#iGYgH+#Xv|e;}eWmjZ|6nsFB*f{eYP%=iPZUY=edEH^Mbt(Krk2<U&dYNl z{GGK4Dq5?(N@C!J_V`J~OU><Ln}Cz6b%FNqLCpl;2fB^z1qzqPI7{romqV=TrIL;3 zRCRuD#R$O@1mA^cXzC8~?eVT9OR9cg{^bGCp6VgiODYXZ_6O9<@U(Sj{YrZ9V1hEV z$5XF|q|w9cM7%cIt7WYVjD20vGv);rp@zRyGdcP<Y=e>W*sDs{ifG>G%|ZT^eZ4h( z`wbL)Re4{$2HmfyoWFFvz*YTRSQITUt-YXfW_;Mk56b0KOXY-Qy^w(R1g;o|QsV~@ z@z37euP%AAdv~{ycF;rndBV9S&&m4*L8|Rhh~(k6&>st?%h8hRZT=Wn7Ap#q9&gsj z+3(+2o?(gb)Ow)YdjU3Vf%DPcm3~ny4_&YSWQyp9b}q#}nasU;@eqigr)<v8U6B!0 z5d_m|6?y(sgvyf0dkWE=>~XUKn?jz@HG|x%f`9TB*HL5nsaRS=p{KO`dmcDNw+3pp zGJO-*Uft-#{RwzrP(|-fij}F|s-2+63g3c(`(|K=0jCJeu?c(bo%kufF$Xv8dz)NJ zxSF-CpZ><?+}-e3@#u`&OzAso<N<NjRyHxx8aR;GeWM2u-lUevi-5X8AWDs~(uIae z`3hI-!aEbJnqs?ao)()rH;9R4_!)IT<;H|VEn~izSL@5&OdDI>waK}h07v3!vu95H z%}1fzq`bOf?WG*%tR!f)s2=6A#m8Sq3ohT?e=)p(cC*&iuj+>NSZn7E@sLbIN!|mL z0!`%<L|S`3Y76(8RjU_vF6xru<~u2hFodV8nH<sjk;;KpD@strPiA|)o=k-GgZ;AT zc5fSzE)-<iv0By-8^?FoQzKn!e?aCFX6#Mwy_R@BHG5#m6rTX^!^}Y)B6m3GAq+P& z%)c5J@DREdteVe}tU{0R{M#9mkyO(uV9?PS+|U?uHg_&qi&9hKu()=r9b%8fQQa^i z>JN88UjR#Avq`BdBH;CUIa7q1xow5rywIk|z)k!7Wug9CX2nAhRjM5OnSi!mgvVdH z65sgzn2CjFOxaJmhxBq>bX_wVbL<(Tce`Wm4_N3Rd|e-XCj2<1A4*zpKlAHrfxzbt z_r>bU<p8;A%mchZ03=Kx@n4f$$q9Zl+uMM!{HxP1w~{Vw5r-SA&8|Oq@L*_iQeFNS z;3ag;=xJa_zln9dZy_*r6@!*5*MI_OvBbBMBLtbXz^wsCdiWc%a%L;nXT6;L{r4ks z=5;ovgQH%9$VUfgE9fUFE}M>V|364}{&q{u(*_90^J0<*YQ`uDUq`MhJ~*H{dc%*6 z_Z&-HWyEy=-QD&9NMw<`teNFtkc`>o+bc(R1-x@2>vnI(sHKK|(@!V<3NU-q3TBUb zCBAWT9SquL76v*!DbC`qn|ZlaYKN1>V2}g=Uva?!<ac=a`+aH$*b35(mJRLg1qYF; zS>+*>o3Q6(v2*gq&c!hxQW15}-dcOI7ByT7S5=l_n3}y|=M@fJ32~aLqW8Cbcl8@M zw|V|6aL(7Fu%wzy>FhlvVYD?LvMq3ey9#)f5yLP0<xLSlSryc>aN&Ytfsc7l3`j?b zO#~DWMD_>musw*j$5Aw(4y4!yq@2NuCR;5CisC;D;-(ER9x!$O3UB)nE)LrA363~W zzTh3=<b3<>PLNo$yrSnzP7VCxmEm~z<e*wqIo8m(SXPUsl3jpZ42j7e8%;#6aS9T& za05e90`{Oz_Dku3Wa9@i#bkQiz0bseXCg6&tbZi!Q~4D;=m0zP`|-Oa_g{?8Uz^es zkpfLfVz-{qI*YN(;Ke3BU7vH#XC!|*Z2Z`>OC#PJ%~`&$Fdt6%?W#O^K&t_R)V<<q zQNUEDXt!S7cx8_HX45~wbc6Y6fo<KsH^7T6JueD>5r=l6q1d_TiI(pS*vXQo44Gu2 zy&0kPw};g<j=MK{YQkMz+a@u1E;bpYTgDBqU(B(@eXOQ5ybN^S_<HSL<h@mQydOb| zUz@$}O_%wZ&=>jk!>2nxUf+W8IPAAi4AP0-&CM<_1$+|OM#HjnY_Z4vPU2c>tY2P) z;YIqTVO~6Xqj7>Vz8SkoMOoHAwR7??<1-_y$&<D3cNfsDe5vlot_1U@*w+yeE<P3U z5@{R?7|RMwkCbF3f>3X-L6toIw-_6!gDJd0TR9pi&h7GlM&{S1MgV!2mM*-M$IojI zTCD|rxLe{Pj}%xu<F~t=PhrS{w^=CnJV*!?5Rs-}r5a}*<Vt)67O<FOf*gnbU!REt zIb}oagcB0!eXJqr0+h)plA^7VF!LNrK;`NJInuTg<Ml-!K<LYV0mnUyD{$QN@l~a5 zM8*dz$b;`L13%}MN9gys-YX}Uo+Pb>)TA<wVv6ViuP~CjhyYcPQl<=S@k#u;CX2Dj zimpj)l6PWK??WE-uMFxYI<}nXPV#oOklX7pCw;~RjQDXxR?)NR5FJdB-uq-#H~PDx z`_P`}bVwP{I<qHDUz8E^KpnsSs?z~9Dj`|9=*t`Mg4ThOZ$wLBFWc35u0?7PC5L~M zCQc2D=^SsIzcH>7t6C@cgNFSB5dS?cd;!TGP_}Sl?dI0%S;Gxk#sE-O>V<&PwiQ5B z)3GNJE3)Jtcr7l6h+ZyLI;wPEPxO^^{t3^e8}D7Svks4N3eQq&EuS@9pQW)zOb7>8 z(%S!r(!>8im;Wp`0xeeTh<+q2BUzL70imG|AZ0E?p-@0{K6b0*^Po={N5StMQ1MpK zmpF9W|8K+oiJ%L<F$|`yrKL5bJp*}@xr)u}5`nDXmGbAP{->G}3;srN3DxP}gZ2Mr zp$$m8{MTr`6Ucx-u>6TVD|`hnVk5WN&R9D(v}dcFomg@=F;d?&`;qfzS_dHSCbU^h z)DqVvu(q20?4TK-VK+qrK$(}aWJ+ia*w5u*4UEgJ!$p3)e#Yg7xin57NII;PFoEP( zkwZg)|I;dG3JkuKPRpwqD3)djlh^beUYo<MOdYlLAVq3|r-T%e9}gR(ENrrqD^8`t zKE}$dExc5tZY`EbLwQlXAWV010x13)&|95KqAc!R6BfWr94#~fgS!BPE4g%i%TRG3 zHMt_{hbF+W-JiCU{4_Wk1SY9d!xvXjh=E?BaDFtfXrTbR;db`ul1^SLt8SF4y$g5y zx9KlkHGKgW4sF2T7Y?Sj=u=Lqx<zJ8L+s3itcfKqgI26^K2SA(Ecb8SL63-H^4=QM z9WlwEmkD%QIEGAA!4v61KF5rI{he?+h*WU<33DcU+DfwC>aX=z>;$^#l(D7rIo+S6 z3srLU*|f;$xt8r&$OYmAA5<$JOIrL9x%ByR1H}!Uk*;!j1HB<H1{~ad{U4+Y6;5~H z)g<?HU+?%wn%_NatJ`SDHs05G1S>TJEg5p77jL0i>&k`D3Vr(S!_)A4P?AL$V^D8C z?T*XJ>k*JJCChSUn6~?HOat;Ry!%X-LfWK_m$9ucxv;g}8blDCnYCI2dPEgngj)Go zSYr?K;AX3&1Lb1<R15V_l5YJ_2c4UC+G>)<$4wBPnBEmZlEtLo&R&eoq4G}LPE8mw zvz-I^s$;CUlsQeaUhgbv4d6#HrbtQZ!th%Sf?p0#Zn#a^DnuLV(DqZ8a^fTiCWuJ^ z`2rNYwInP7K6<@Jh44$e`-$m1`hKgV#WVjj9|t0eC--+s9?8JgG~}GlRd7iK<rw|h zYRdT3mIh1RQD1FEjLF?_k~dXJ4;10xlNeL`5o(koRZC=lpJy*7H%PW=0nVraNy@&` zBWxW6YvZYm?B~F}P3wR+*$x*3r4XnCcKv=r&p2x5U3k({!);Q(E1`<}5h3K{eO1AU zN+(>^<u*FbecCKCGJZ7zgoekueh=elJa5kEtyUYyjFz!P(uv#8dCGYG8_v;@^8@b8 z1URNua2H<m>vK>`ui?D2Dg*F+ZdAFr5Fj;*xn1MHfeW`*Oyaq;PgJnA+|eO+thWU& zbN?=tq9M1-F^}HIcFU*CTcTM$Ym1nIMiAgKI+QJNoZZDAY<%2{6<wYokDRA3AIl`C z_XV|V?x%rLht#BB)pZqKmnafd9imb5@UrqWmAG!PES4J7`bXX{0P3(Hv?`o_*P)D` zzj0iz?j+Et$!7<`kRG<tmc}77dB#o+Y{xhZzxnRTiJ)Z1eg_ky5Y@ARJXX8IAb*6L zV(>&enIbPte_<kCR>@y-Xj=+Zit9wD8=q%D9meKfO}9k>(d&_|T*<dIBG9*cRiqyx zU$Q10i?Y3fa_5bh+s99f1D>9W2QqGiSXCbrgr2G!V_iwleK&!BjcaDAiKAf}^wkhA z!Sd}DICa2}%ime=psVkf_58hf&MmParcD1`IFz!Vfvy8n2_MK#CVZ|2Le3(5B^dy? z$o~2>x~W&)PGf;LPQxzgm1ikBIf2+~=TWPZfj1pBBif#imloYGsG8^*?sX<abvdF) z>Q3x#QFtmHykY$Emv-OR{xII0XXc&OgAUjzT|RSD52`cl(Fnl;cSdikFIp-@;>nmN zy2N<q;_KRzV}cjIjK+2g7rF`r9rck9n={KJuJ%()ZkI2X0w^^EPF<Wz54bY%MPm4r zDt@}Rf?W($t$M&9K-AN-W<O&8tv_qWQh*3=6)RGIl=4Pbh_x!^pT&LsV+H3okN!`J zGG%3D#d6U6DFCjiXb@P8e#?-3i?#k=P>%@+%AX6q{-08|^0#%go!@E!{_PSLP#M5( zn3#Ni(8x(9Z)SL*Op7w8!x+*rbB}3Z%`)}bL<Pdf$CG&0E2F*BsFs+mW*-(S!_igo zDhtB4x$T+tyM_a67uejGPzorz2pD6dJH^!=??ZMR?-*RE<_6)Fw>^%#_TjvQ$XHTS z>VVuss6!}DTrnI_!j9}>4-35TlO~N^{83D`{OhHtcNVyIm2vjS)&~~2DLCud!A(R; zB5eod{*L1@;>!5WjTks1#IWG$@bQqpwnr*ACg<LTH{3A2ol!S@#kA5K6CuhONPy?G zj<V~o*JI$~f*L`Em}Yo>0Ci(41iq6A%2W&IcDUjvp|M&m(3?*#dIsHe=nPegb=&E< zQFCxShuV^^PuYO=m)cjE^B@&#yo50_zj0=n^B|y@kaenv`r)opN~ckqJyP{EweVJp zzl!<N{@2c~J1K3jthAtNsKau24*AFa%L|-p?FL+Nr(w~;Pla?}q`WD*U1Bq_CMeul zv8r|2t7$<7Hd9GklR?XAov9sPP^6s>wj2%0s%Az7Y6FcBL|0S{lXHr<$X!=-3S_&+ zYWl{L4U1~p#@3Z^%}UF69q;&sH}$eDzJw?=GBi!!_Ti4Tl=x6r0Z8=YuY<jbk$$3J zbDNwwvhK-<PV4S=0_Mu~xW-45s2EJTyb^wh{84gSQT7vFMVgIg(9)%cpEG+R-=`c_ zN16=k57X6@tGIUTER-ZQU_232x#~NapN{TbLZ!C3G4Neb8+s^JHEL{m;)H*Y@u!Bo zT(%-iB7>KxLS1t26F4skQIQY;)(vaybPv9EMZjzG9CS_W*EmKkdJhEoMD>bA(3~L< z;eEb;b$0Gp(yQxYim>$0>T<*s;R~P$xU$sg*kn_04V8o;H%d7ye5=jD+{zM<3-7FM zKVTYmAKEPC(Bw(Q6bhmb(2L^jbzXI=I?nIEbhD*=S{J1y!AdyPPpx3YCMU*y&iP{0 zc9g$-#cd~nFE>Hot^BAg&t8^MnI(;lBfprMiOHn%vz1V!6QDE~{dqEQbho{f9hGr& zAycL;wOu{kVUr_k-!_Z~$UXk84$f+~R1LX}Te>dup+z|tC~ns$K#^Fxl<=ZtKKhNS zf@_twD%BJ?_+Nuby^@OA;TPV;x)FNvgDx*$gkHhOXJ9eiYwVT-oBNiF$h`(-dX_I= zqx;#;JCo=y9?4%_0x~IGUwP*+y->73alRC_wfh}L+c?2<I&Xm!MA@U=6{(p*U1!ur zpJhJHgC!gX-kV3vUwAe>cSxq+!qg9F+gFW)Z@rydLKD3*dJKuI4pQqo5KlmN|B=i! zK#(Rk9k|$a1$EE*HkO;~WN&Jz)<FEQX~Xi{$MWV$(mz9$Jti@G<Zb8KGQoa1Ay2z6 zU01g*^eYk6*roEQWyrq4nkzSf4@Yvfj60<ZyOwM34_G_;9c%8hz64$>_J5^fMQgV! zYV!>;Zu)W-%R|opxbrSNBd2f@uO8uF(9;5m5qE1Zhbz-o#QAAEmqjVI3Vay^2~gD2 zf;08Fb^B{okD?yJ7yV8O_Qju!?Q5YVK~sm?)rBFU(eEU!SP&az&OP~SKUW^Uq<dzh zv4|5OJ9qshGJSAy`dSiCt~d2?q3J_OsS|Na%S}O_2q%NM?=5g;mp)D!qw9cioMh6s z2PwXN4#k_{>hHp{x$E-#D!M@$oUV4W`$w76C2RA?UM-rwtkS#j2rG9YNyYL%aGe{1 z0zpz`IH_6cuiY)&XNhpu@Sd4!l_x{S@gr+fxCw!Wyf9mrTb{XF=#Asfudx#xtY6qH zbtJBbEU#idHb+;r%#BoG@W$n90&@`Hy+&mL3%r*61cftI^_i}08?YXG_j1I{()k%L z6TaNyF(dj;Ih0gYOe-mf>ar7-GJzc6GR@&EEsk9&=I$=O+!nvMuB5`nT)c?te^f>( z8Y1+dC&J+G?(WRE_=L5&lsP7i*;5&CfehJlSKF}i@U#1pKCL#cO=QK5XIse+BqQ3# zrC|fDqh;Er?_o=kkMF32O?y5>s+ybdeNh?dZZt<mXi(edMQIH}^gYG=-az{0>0K%d zNxzng*dt>`X;A*{%ocvo!o5vq2t7KJRlcRCdkvfy+QP1jFHVbcXHN!J-v(Jk6}OdO zZ4s2r{+6%(O5UQNCxv+G1%Y`D6~Rjhcw+j-W9_q_<O6=L&oN&(D4`NHUDZUkeVTJD zm|M1V-%NlpzOuId!-AaK^DCJm=4fPAy#;;$E%Ha?^vdW8S&Sv}Lz9cXVM=(Xyp03a ze3SHN#PSE!rj2(hX;Aiv8KB&XCFPd6%rrc9wD>&6C4)^Uh$$LbS9oc*cO>^_($hTf z3IwPvlgD2-tYiSbn>2P`eBtlkd-_j{NX4=H-?Oa$e<kVvLAM6hsjL09<m}q2Ab*H6 z#{T<^;-4$KDnL?kWyNob;uQ%$BoYn3l`vFPRKyZ%)<B|k#92u!^x$7WJI`%|+c71h zkT(ZbUXCLu%&k;I7~cAJ?LU3@=#Sz%m$q0I;h>B1xA)lwdPa?$FS$53UY@#EsY2)< z6FSz*_GT~3O_IYa37zhyujUQUX9z`8{ndUuJ|lK|o1I~wzk27i841o*$qPt4ytQ$A zufl~Zk_CsdnD4e6JM*Je-K)31{&ei%HpRy`*N!~2yrKPLy$tp}9Q*F%r5$%P;4}&T zr?h}`_@7JTj|-LWcL!e%rKJ<!&+v^;PExzQgVWue-3WQ+RygX*!I?vuoh>m}d6?vw zvH3;IgVxg0=YDwzv;o@EW}nyI4rd#z&#zZLgLutjs^iBt<eoZEu5N{!8KHK!FgVC& zoq<N&X2xP^#4(Dgvwj}z$bGe+f3~&!+5v+fJ#;$z1*$teYuC|svxo2#ny$=owH_-K zE$dyBxY*ct0Xe`IE{8sZvt1^V%2czro^#P-d)aKo&3sfS-Gi$_c)cu+O5bZ@%Pwv0 ze&O~B#jiNee&^!Mm&B}pWR*X?pFDE#*5*Q!tk702-|{@Yr8n?O)OOj{(NU%1GLzGv zKG6Bz3vwgl@HxZe#LsSdA>5!-ZkW*b9m6-b@Jbxn6m5BJVa}XD1;cNzITsfa*wa_$ zM$^B%D-U#WPSi`_i(=+N(<n8;Y=^~9LoIV!Im4$hrhU?71MDe%6=N4-=8PG`60>EA zn$h35F#QNK*7-rt4BPQ~i}Za}W1^7jvj9{V&zAbq7g{bVPgZ982!3|ddiSB`Fyn^r zt(Gd!ebzUR&@r>HE!`2eIfT4d#!zvz(w8tjrl*htYrOV8R1^@<Q-XOUQ``!VoMv=f zJs+o+TK|*s<=xMEJZ*H?e(mG@m&W*Jih*|PynA9BjC$K(VVjymjo)tnp`_;;dGj4! z&K|jBxU7?L;|KEOi98nS*3cfKo?=$}WdzH8m)f~#11DHpyMBM=j)iSt+(y|?*UtpO zMEoE-k6R+uN4G+9f3}MI9<spH!k1S2R9XIDF1o+%XhU^bM~AwgN)@K%H*b8ahpfI; zUu~lAN!=ce5TkapCX;Gg4PnBIq2*2S<na<l&t{E1x8jEv$<ySf_2qW@7SYHS%)y-{ zR!dcSw*n$GEVc1|)zwe*zqfV#awP1W%!w!W#y1sDoqpB|_cDAq@YX(^%K43{)QPwJ z{Mu~!0-N*UC9)^xAzka|pJ9H#oMUxb!(PwinBUjadQn%^;o@`xD0=>w%^DF2S`X!i z=XdONiF|+|dU_snO8Pz`PVXvqVB-O`G-?H@dF<nz6Di@YgV7&m$So%pR8lIeG_(@d zt2qSveU6aq8J1NEI_c@z$>E-!QEh!4Z1%aLCi$FN4|nEbdPVwVbLy4PcE=B>r#3fO zJDrhf%+!o&Z0HzkCq!4b%5^dxpfmRE9euK(LCcrv$h5jx85_&5IDQA`^1Vas<_(ZB zY7QyBCHc(NBbYwVqwTX+fo_{~Z`p7|@RI7u@cOw9-<IYeMJ)UlV)q_T{V=CnhN0Aw zHe!F-J_~JQVfb>P6|Uy`c<CN|hmTBC^RpU~I<tgSK*nv>sHNur_Dg%$Ba?{3A@4V9 zh;;kaqDa?XX{lVMa-Wh;#20kr#7vm<*dXF!k0k}%mnkiJv)%@jEJjBq!(Glv$LF1? z+JX60bmwlIain;kBWas`IDOCbBMculpLmKRrB-dxK;E1!Sl;$%7iPL&c75Kl{6#O> zETuDu(c!Bno!NNY)n+SPhp>G(DR-f%akQw$Elw|FmqU59Uz|PRhPS$TyWMYR1CUOL zyYw^_H21WowDkRa$)i2Rf6+LyVs4HImS>B%3|2GXt*v?v_h*mLxbC(*(@+uoV&vl^ z4#EVh-{R)gsCnA2KeSa#mHM+5+;Y{<7lbFwMf|ne3dfHOX{0`ab$ahevjWD(W0yn( z51hcU=e5)vxEz-(bJ&)`a0z<{h2%2RV5BResBJ=1d%T%au<tg&rrp^!z4jMw?FJze z!PE+uoe+N~Z72gitn+lQS(QK^33qCqvO(nX7Ki;btV@4U-*d4vut?iu2vGpb8;2v~ z9Ckml?cc9Yc7`c%Qa2Yik(-)xI{L^I&3?05LcNRMXND<K;3T%Cus!(O0x1FI2g>*M z5mOoNGSh#(v;LI}<IeY8<M_8zRg0t4=kT<u&XY%ujJ#gmA}sve{jFsu?mP*3t2<IN zTk?Zne0D4SRPNDt&pq~R)jaI*i&|-=%!%JZ^1Jfv8a+Hu=i{h|-J;v`latAqEt{SM z#0Q-!K}P%b@XCkt!m3`MC-L$Yb~_V+{nS2Ess|>p-R1tv<(D?SJGqeMm(-E^k9lO3 zcpQr`;mkuH4R|n8TvEiaQtKIu?id}e^lLnOAr8R#3c&3=q4{`c%p>^BgTRO#KmR-r zwG?mW9*}@9*o)^HXD@LNg@c_|Jt#h*)^Xo&IO7|~dI<A-{${hZbkmAQcnH{!9v1%d z&p($Mf4l233H*Ex_zK9rtj(*Hi4oD!?@>Q(1D$cV4Aj?0fuco>_^0XV;z|PH18Vom zPeDOJodod0|H5uCgv_k0G>`=^hyAr0YIWp@hx`vSp9gD=Yhq&9pkP}?ZJXv1&Y*$# zmG^_caGW<vOH1b)51Ja+glW8hd^rdn4nB5Z(BRJ@*8c~-_HJfOOyq-Uu72|MPJmPR z_1|Xy?!ULF^{BS`qj~2S%C{2*(j}q=_87LE>xL5PDux@S;n6&(i}3sc`2#a_^rL`) z7V-ty+G3Ya#kD;|{s8|R-0f%*Y)b=w9+qm|<nuB%Xv^wI?uWIZ)Ew-z?#9QM@wV>I z#Z%Net02n(CvY$nRn)up$+#HBRzB|(FSTuEV8__7m=Lr+QM4JmWu-+q79R6#AL>@b zskqlQSA_{vMliKUt4(639%QKXXcL3g>YpXZ^$6xmwY1c4BX&meueqGrcoc4{BbYmH z7wfy!*7AIg!w{)%micKJH8CHZWvfqL=4A~d7Zzfz2p+|s=jJzG`-Bcc5q%p`hLol! zyJ|xx+_S8gU4qWxvHgc%k2<d(#_HN5MoU_|DjO);S)FFU;jVn{W5k2-C$c@?p1B~| z(Bx0NeDo-OD*Vpo!iOP0B+X!DRsI)yZywjw*{%!QzO}7bwM7s`gjz+JsRJN$9Z(4} zLkP2kNoJ9G2x)B*K>-;8%2;F)2!t@tQ3yoF6p%!QkU|865W+kK!g*Fu+jpP+p0m&S z?Qehk_x-;7qaj((TI+e%bKlo}-`92LY87n*lW5b650iXcea!7%1}lhVh>Yeh@hEt& z-C3}Hba)CcmjoQD)z^Zy)Z%BxNKA=-1G(vMr=WoaYT04KQnGy4C)PB}o<B$U&r0E+ zdsLy%Q1TLwVFa1{?!jAq*&(@(#?<en=c79N7+yW%@~#~u`3zg{o$isvD~0rGU)_Gk zmXZB?`<DF%&l)q{;dK2y2h;dE`*3Gt&w^bGy~M;r5)rBQCaN_blzlHC9^^ewgJIvt z{O&6{9cDTAqN6RP>C5_L!MV?2?4v`~MA&4apn5A)(0Ng>c)_Z=%gd&Z>VU|wB`lBR z&51JmGTEu!me+P)uH81k{mvE9!<ZevR$YAkC<?i6=}U2VaJ6oO8qMoQq=Na+i5&%~ zBwfve0Tujis5NSqI6UiG3IdH-)I4t8M?Iri%>u@&j?mqpwL4}GW!4nw7|?V&leOHa zgT2Zo23x<1OEM0TvlP13uhqS7bx;Z)MU~d8B5NG$-ZtepYTG8*1#vBMmeT6JwDhS6 zdbImE-7Fr&5n*#qGf5L#t#v<3Br0$)h}?TG43N>)mO@AS8B<FgQyI>&&4r~hvX0MH z%VE^q<;%16Fl?`~=VWHu+KWId+o_exC{4PIR9L*nBC||Cuf&Tx<lyt#h8&u@%=Dkl z?)qygGQ{BpKS>D)GE|Xew~}uSrrUTZ$9Yw+7?%4jB(RgC2|ZQK_5pULR#hzFL>N}X zu7s0}=#TC9P;Gl+w19Dpz2~74u6ewD;fxMeHrBqxmaIM{ySs!xh@A~dMhtg6@HYG| zS(<Q>uoE}xh>1;SRTmLAS+O<0M@BsgB`BK5RTjS#jxEnEO+hH4<Z`zaebS{KExOUq z%69dw=m*7N=s`(BSEdz>ms0dL$k(SUB{MB;9JFwb=P7SK&i^}x!*gQc1)RL`hef{j z?$otN5KipA25$WA|IUV=_U^;2r=Rxz!<#Grk^j5sV4-Hbd!+JsysY1YfrkOF!u<b~ zw}^+Jjxouk;<|yzbZNT(Y{8{51wNc<U^h6&rGvo1{3LO;DRiR`5MY&JV`IDf`x8vk z=7qzlQVmW~5Z{Vn0EMOX!B-^Xlf;bz0IxQszP^5W0^(ckfkB;H0#j5=lal9C!l?(r z_ctJKIp&kpcmG;a-24#4gM}RAPmz@)0KDwk6LS^#*x!j3o;-I&GL*s3k@Zs&5?JQe zD7Pl-;*^8|)1~6!B4xCBSXkya@JC)|-L6ybn%K%jD(;=7Pi1iJC}W@2RB!Pi++MNa z%i@$4N1tF2D&=)f)L(~O;a!nderdRbQB;%HXUi&_jH@1fLCFL-5*3OApgy&{>Mk7F z7_fW#EMlRB3VV?X!^W~r#VM@8_a)lmln@9bfN{!U*!0-L4{p%gVox4vdss1yODW<6 z5~^|{+kywrOna2w_&y=XgOaXfcZ4-U#?|>)l0AG6wk$kXUb7bz`)rod8g67axE-Vx zaR<w_IOKC;QYpnURP<`3pBOv2OJ4J!PI*A&fDj@-`A~PugiAItcxQKx7%UjJ>5CzO zOWT)*I}-g22QX@{^3q_*;<h&!tKsB#CvI(z^xv0MkEpskB;YjdZOqzS@N-?07pcy4 z3*BC1mTRoFFTG8)>8Ga0-e&W=35df_0H_97q@+{~A_)HmyFaPfAl>M*exb_?2Miha z3hsV|sBd3i-%$1yhg;m7urDS_cAtuiIkswDy!hPp65;)(c(}Q<*|Fp>nxsw05#YBz zEGHuxhHbX@Ev_N9C&Eg`zH3>KYi-WA{!a5A*p?kp84bjtkrVKyFXQf%j6H41j@vGK zXO+k95YAbWL#Ny5i&IG1pB{#VJYWTvQpa<0JBNM|hc5>qwnJ9|u$K-7;SXXc##XA^ zDBDP~tNsMRk`i-lQe9;-@St(4@zz6RuqX^G7S8Wh`|&oD5H7W4{U^oYE}8xbr$F#B zWf9F+=0V9dev1>kgE%5&v>?*4q&;QLRcY)2%YWma?x+C8C*F%Fcrs*)jOJDndcUNl z-!9j|_BtD3G;l>ZndFTPr?fdl(d<af$}_}tS|UO$_OFv4#~@f8*yTa<5)mV$?uq=y z5Lb!nMW46%MAzzLf(|sQOK+mEXs(C{m3&TicwBkeN2J>Y1>Hf$UxN%|5VS8*LH*8V z_<J`aE4jhGY000JHM=zGR=Yb#4tR+PUE8jFJ+~#?+4*8Crch5K!ftC!tz^+nES&`K zNtj5|^-s5C4}fT(S41L$mkrsohm-|Kkp_T_4jG%>EiQpiIxY?|k-Q;bnuzF(2Js*d zWR~uMVJAN9ENH`nPBoJY3+JS7=FI&@m1*z?o4P9>j8{`%?*{t2l*eD2=>cMS&ZoWq z=f+0u#@2?9WmL_nBJOWgi3a$X!hRgYnumb+$t%bB=VtcB=7*Eb<AV>|WY1ejf+k;k zVtBjo{~chve_?BDBy@YTvbLt?js|M;wBXr>>tmICxMSeLc(eDl<LhL3+Y}~~2_^#{ z6dW8M#k=%y>a94Q@qni4u9?1sR$tlfg!lvmBsZmj<3)Y~Ch%KPeV?x=i~Kg_e;LW| zLwk%Yp1eNKZvzp{CXIpR{a4EpB~IDi(Du1kre0L!)m>d=>Qh$d+T<6aFeTqfW+%LI zU0@ZOv(iRJe4f^$+1#xO;Y=mYp{3$l3qM>tJjD7RuD%A5D|ZLeGSU>Pr|)f)?CzTz zcw&^_-uCvMMaIp&J*jWkL?(lAZl(H>D~%<ed5x`zQ#^bqN5Fnri~0C?+*q-p{uH^= z+gM1fQ$J2qC?E#2cdeK`JhF1hyLo<nX#E_q`DmO!$J7T{K5Ej1UWEMcX_W5j*AC}# z-F0*48vW;{%xJa6Q;I4PV}ZSC96ZH7|G{>Gz0*`WR-YuTrgt=*-nnWv##{*l){~%| zd1qu%0b$EtY&VDl_^9cnN@M69kjOhOPT_no-d-SH7yn~&?)R{?iqd12LZ+#oI~$MY zbjIVdy*YhO7oN?E4AtIP+8^(8r!z;lJwa4SDN!pM`Qn7V)m*NR^yAb-#PminPTL5n zMS51p4X4I!vaFHO02Z9u-8F&b{L->E7AU;Y(ZU2ldEKlpgp&?v8IBz+^-s9co`6BP zoW#UdisoO8y;Y62dfZAH^&eRYWAGORR+|LhK!k;{;Ho8`b!Po#{;mV?)V1#cX|!*m z(Wu>2$~#^)=eqP6(f&^I$qdf-@_5C72n_BrwiN9<8!Gy1)m`DFSQz%+w5i;SKBmP` zp0E2%{$Ha(#`MC|@f=5<G2IL@v|A|o+?mZUE#pCw$2b-AaY3^3uI}^rTaj8<KA8%J zt`4@sWN`Wke^G^gefuhOL=pP&U8^U$(zCWw_`deMM8xU8?8E2_V#-jy$>QTgz5;7; z_?YeD@tE@BmjHFnkoN6|Wl}NPYlp_|g*2sQWU~%#-NO3DMSM2@kqh7nEbrC7&JBEt zzaxAzaerFeRT#E_Q4yejU;-X?kOS7j+5p(itcz9k#Hc8|-J@mCBGiswb9XCn?05e% zP+-;lj=O6JsMq=2X+8;XIkVT>=F8W7`74UFvUG7c0kvQ&+y$(rK*{BW%@r+*N_${< zedlxXcJQ&H?M+j0c>VWvU$(mGVE($rRSEnH{o0CghDr`GUIk<oc+d&X+N{qXKVBQJ z+Pgmg*OwC!`~OfERu0=T_+=&A@IP!~0r{kx!LWxvxk=lHGY@2e{m;ur+zkkz0&M0i z9{DCcH8pj$65{`B0NnO+X~}14V`-{N!21S#dmqj)u(;Xn$S1>b<+t;vM+Ody>hI4i zKfQ7WGG0cvApih80T}z|8A)E>z84w)g>R3HLyll`#m&dtyEk-mSsP$$Dg8k5K{jnn z9negn?8~=d>)VSHIzA{AO-(~XQD0vlAa0|e<`Dlt_CfX-fTX)$14_>Ilb5!~5MYcM zGH^FM>)QB_J-8f*?;m@r<{wZ(<=H;=*jOVN8yJQC-)fkh+WrMPA}L|s=HQ;LY@Qbc zvAWE^%Io|D;ry~$UfK;A>4y&MOG|Sn&&*gZv0Mkzuq7#8G@I^?&c!8;L#aK-e*hcf z`-HP(>NB9rwVu`BR!_PPSi6O}1J7ISyg?tn2$0@jSj1G7vZ}J1XUh&jJ>=L<MQ!NK z>L3r%l+J#;CfeIW$@$%b9(CytAKs+#(rW<CQUoQ>sy@nQ8zNb%$?7ASge{|nqHDod z*{IMX6HoZ1^=!XPryZf3kj$zPZqqc16yz()YH&@4svz=o=R}aYDyx9*K?7i0%uVPh z$9>{(i8M-pza$>a$8+8df-G_mX<th=nn6nDvv(M}=UkzGp6f&ly6`wjom(?{_WdL} ztnyjs&KljUceOv3d0;A0q+UHX(A?j3x;D1T1!w8M_2Xz^ZJltBrhwG~<2PDRTPyWP z%8&l_x{Ak==45rSB@#nhL661GeG~ijgT5CW`l4dXdUl^HoxeyvmqHTjmPd&!F7Irk zpW}3<z{)SGFEViiMfCQHS(Td1erDgqNnm`RvLSp-92B^=eaY}u;_Ep*SZsP2Em^Vm zDXKPcE@5;f@kEh>M4{ra2j2_dK>)r-NXat8plR=2tgf<BmwNq!R7IKEwonr<Q>33( z?+f=Com^e*N=Y0gK+|z}xl>O*HDZj3f??g$!eX+$N1&&mQasUQ47D(oiH?cF&hLO4 zN{NXB*hROSl%(;C_X;GFRPC*MFUWZtO<VB=pu=-}@%<>uah5Hz)x*R_M0`rnHhEET zW1-%@HQdAk8LriGDJ1cJ=us~K5e2Szd%sCWXm4OJIt+4)aMP$EvU2ZG%{rg<Wa0^D zWDl4Mx^xzHb2>ls`44VZw?Pr4z5;|WKhgo#%)N3(BJsR^_KkVI2)C+kN1wCCnK{Ic zm}i)q;<-x_0?sa%1&gD^PK=l$TkR94nu0>_QMWcEMstWMQYp`$-w8}Bt>|{58{E_y zz7^f5r{uYTCwAY1g4#DvD_(y}J1fcJ+a|g%xkw(?S);86j@A63Y);PgJq!2m!d{b7 zE(N`q4;5KwcqW`6{5bb!Bw}GdZl72`fU(*4@4N<;fl}S`Js>@>*=YBWAM8z6a?NYL zLHLK9HW<8Yabn=X6}LcQ>DDuY={E-@@nwf1yuOl6zmeq*o5WMI6TeDEY%9E<dX}Ne z8#ny9r1T5E+}=R?@=|Hv%Al1ZV=@5Q%BvxCAB*}_)CkGucXQ1&GAzGp$^FJr|GcN= z7rB{P146bq8GHvgO$SM5NAT6wdbsy~`)JMYo1{nkmZnYxC-A#H|8|IT0lzsewY7tN zJY<d(oV=itK?bScxZKl;X7zm7ZvkZPS_6K&{yb;T^7skZsoX>U@-$P-Xe8#usja^B zkw#1sEGW_hKzLJ$<m<6QC8UlR+oMXUAu5?orP2+Gp)%kBQ19kY_toQCYQoE0og+<E z;9NU4l<wS+;8_5kQ@fUV07`7+i2at4WMRE=IB9L~ADc`K`NK!)#fd_ff9<so3in~= z<n}t5Ppc_)j^E(c)#ij72X8gk^o~TZI;r+g?Ja-T%{Zj90vCthG!yXPHni>SoqtPr zTs{U*_2A2l5bR4rFbMz1ek`Uwt5Yyuw=y!mP(Ln9hhMvvGs!a%>M)r<8@uK42fM>E zt)X-XC>Vj7DHQWV*Bj>ufiGTm9WpvUbV4YRhhsst1^POPS7q7-wvZh@0nHyTcmOzC zR7|W~>><d2<#2ynoBw2?KgJbeQM`{p`;-bcsEn&Y02|6~0C_L#(5t!EP(uFtM@R9= z=zkZs4z+<%iviaED&#Emcn*gTbjk$j58w*-3>fp;!5FCj7rvDtLhgHoNu2~O4K|ji z6F|1kBx63~#Atm>$fezs$@g3HoQcllNzkMZlos4GGBUvB=PdrVHakChVzfmNbi{=+ zE4+@lSMP4N;K3MgG66`KoSTzFg?zQgMw=IB+_?J{*vhZZ|Gg;jeQ3$`&3`~g$ejH& zRsW`@@i*TG0gj)cP3tiD!6h-dTRF<ggBb$@)sw>mh035*POocBSxTOmT5G?JTLgi| z1j)jA^v@dtJu3~7&i(1=;Ak5bcgvCP>kb>z%x7w%#fGy$%Ef$)-TS1!b26(m7F>>q zCS>1n2xRLf(#07t(D;ikzOF8E^1E}+*FEcwa5r9dsmzD1Q%p^gfnggZ@&5U;_$bE# z51%94&<vUr2aNH0f%i}*86y?0nlE$r>OUpb-C}lDjwc?H98E-o7$aFdzL6{O!{y1E zZlJb))ebn@ha#ZZ0BW?mF$-`mJKis+?JI}wI}cn-Hwb>b5(={yOseF>wz<a|3VSuS zbRJD*RSQYdQ#hPZ-OU=Oi>)t+Gn1)Fw-?SuFf-J8-X0W|f23a@!kXjMzpgt?^{=rx zZ13>EEl7-ThP9PVl~mW$%=FE?=1a4g3^T1+U8wAi?JuDR^ZNnI!yGG9M%C&$S2HHI zPgpQPjMh?TG;NBYi2BsD6lq@fRs)+Yd=gaiJ-DEgjC&B`2qm}kD$gSTi#uq2bNf<4 zxc-kQ?DzGDi{#VtV!k8etp5;{WH>VVB&6H<miF17)-o@+D|sB2wIxD{xKv6MCWjb* zoeQ$&q^YDPjc^}wi9XWW#G}W{SPJ^<4Tclie-TAl5^GGFRvfIfE>!|`-p^en(yqrI z_0KF&5YV@Nr6AY%fIKoJ6LLpRUq1zqIgr{_ei~ro@4qQg&>TW1Ywm~$nvd;7INDhk zyf%Ugyk2mmAlqPQ^}V&*CP+=4!?V_pYESod2dtE7NE&ROD~rdT-c-ZRrS-?V^j+I0 zU|j^rA{BRZrZ85V@!IQ4ArrNGa~VldISbxrxVNq?NqZ(FdbWD>xm8+`<nfDSqLkOL z2Q|qEb-8lzELPP+FQQLM#_ds2(@`Cr^I#SaJu!f9FZb&k{!^`<4MLHE&vUFg+`kEs z!W?E-Zy#llrrTPF=HJo+GnmH5)feHHXmF*r&7w%<M8QYdx2<MG5TM4P>w7R4#DxLz z@g684(>hwBQQR9jov8ZR&?Th2uyoy-;|yl$_Rx_e`7SKK+j4*eY&mPr<uc}RZ?YwT zeyPu;1>o{KJN^|i7Mj5qy{+#7cpCb1&R=!tMwdv;cHhWZSw}?}X@=Ahm3YOlKZ^8r z#6_@*-SM~-n|{?YF=y`$l{N2IWyi9O<(}mUJj(uF+HXbzf4@6B61BL$$@^|3rs+%F zixiW~3K|ja8HS6fWG8r}AkBIp*>up^I9l`{BZ_VB^@<D-9-_x*+x8E)*?&VCKF$3` z4l?piRu19r(xto9oK%o$+bA0*;vcBy@PT0Mam~6p`P}1ka%wi*9aO>V$Zx_a@9|X* z9P8Mk#!b(x4j2}nB>|f%_rDuydTBC{5c%8<=f=4#f+O-xv!6&|ER6$@TCv~yYndQM z1&vzDwl0*9e-oZ`;~TAO@9Z5U%KQZpyC4u+A{5^Q%)ynQ`%9U*0^Y+SXW8-f#)hkL z({gKjp~1I~*BxO`uU4Ug8}MP)!6Uv8turG9GwlhpCt%pyKF*exr!7Fi3C5{-bR*Zq zJN2E)t**wvjQzeN{LF%#hQjrdg2gHZnJDZL;J;cHT9aBtc*I<;XlKvE%8TAZ{sw*} zsIuq-Q^CswSt-r<{H!~kQIhLHvcMgud-NX>V%X>GCEqbOx&KW70wbFKh&?&jrTjP{ z`SfL*(!JZ~qI}xPc8y;5sD^8`CaJgx`&{bwx;Wf!1o`Zukp-cM=t{U{^Qb^m)e?8L zN!MFrzuz*y8)B^xonESM`*SqOLvz3MVD<8=Ihucc6tp_ALOe|3FAlH1Z21FL^UzsY z-Shn<*8_}bl6I`&TP10wC`U7blf(_mvDN)k)f3*8zM^Mc@D;t?&NmDGl<e~J4a;SQ zZSfab|B;NUCl{DXMS}?V{&Jm=P1|~1W7l?}K~x)6QOuc{?jRWQh~I7L6_a7)vSc^w z0pqMXnk^5Sq3{@*oq~W3GceKM+O@E*zp%pz3#c}F6Us)v3<Vy14+Jw`m;DD(gaj0< z{Qscg|D&LR65TKAyh2FX0Zk-UN}8+{iWX{VnSd+U@C;QLQln|BklL?FQE+lOD2w+b zFB0mn>dA|hu{7aO=qxs-rghC>-^Yk~6#$UNt-ktlWo5lreMjyvkyurKKXJ-hUy>t( z|B=|hzhVkz^1F$_WJU*jb+E~5RvCIFpz0sTfYRSf-BNge4ZXL?n#>zd`Rv`7Nyj|U zVYYJkKGF#WX)C@jzZ6SD4_n0tW!id#q?M*JN_8)0qIxuGd4vpB<q27K$tzK6;C66@ zG=~`=W;=W*b=fcHI`Dt#z`wJo)!l>bE<Qm)lpW=ujh#abmLfU~7T~27E88T(KCd#j z{I=zU9TP?NWZ?T(m>YBDVau272(&>DHMZx*9SxQh!$;Cu6$B0VrGFVSTMY^rY+q9C zh-U>L4`@-}FTEJL;&RE;X7QVFs*|~j(+{a@lNai$K<?5oDc1PX&YiiI=e>&NpCzZ+ z5_Xo)DYpK(%xvaw(25kq9q&l3IX%-+(BLa9WIlb45>AQ1FX8L@TpDe&0;6Io-B8QV z5ZiCHwU5xFDP*4t-2l0EP+ol(p$CuvXXM{U0<DfFUa_Rbsw9MY!37!7RqZL^$qH9E z<J^$)JNs{<mh?LFj3O~<Cf;f9wgN`KOG;<23n#}O7t3zY_4YJ@=$sw_W^eL-n&C@( zFIRL$TY#VT3PWqJI3_I{(WhDy<#SxDJl$SpRid79R%}+39#lo%e6lzKE{miqQ4|K^ z>ld$ug%Ebu({i#rGYUexwVkDUl>f-yft<ZM4XCw;)?>DNMKJ2UX;-qA7I)Y;I;%8Q zl+F<<LZuTC3mTlXoi~c7EOoF2+a#Qsi|4e0(>^B*BFjMPv|N5&*%=E(Q~v0vyn71? zM@+);XFIdJ@fAT8@^sG&ZOfbQY|q}(seQlI5#SnLF=d3{u?hQra5MWwkVj@3tpLgd z7t#16DSK5NtkK4KxsdCCg~u934Le#-3$$fwa81sc1V8o)h{R+BgmT-TLbQhsF37Up zfk$FSSthr#?zrk?H2kjO6p7)|j>fAaFIfo1mV2O#km6dV)4eUeqD;ujo^Jm)(RtsZ zgBUnxyDI*{L~77)`0-}v!u4Z`I++Ywq(T)*k#`=(M&e|WjeXLe+rTxe;_D`Sbg+vj zOpK33<u#{8G5h)5)ac9W{Q-~<xaIh7UAaHzrpv4N#2=xhkI{KHSDx2n8-o$hEsErK zKYgOe_AOVaYFh`3>Os4v#?6MVy(P>)Lx9w8NHV`PYO92tl^JQ;@T-(`G;CP3PD36~ znet5%@||!qJqiLpheQJ#medE#0+J@Ij#=AR!})517RUoW&$g)h05Z1s3-HE}PsMlF ztKz5_gq^pFUa%+YzWZD+%?Yfi9cpazmJLBq@lfHKoH(U)Cu;}%rpxbAv5h|1=JeZ! zzf`%Q@IMQyD?YVOZVEjv=w=*{0&cWH@ng!$^Vh1^=ID|x(bjfAXs+lE9@*-_8vSA- z_4thVk_I7|#rUlevKMFSjNK(zdYeoFNg>AU$W&4iA|X@Zy25A?fJjkk-I@44#on)8 zXVT7yJ<w2JHE<|i)14aHk&a3|9f0z%23dN=sRTJOvfqV_&q2@@a~OJ*t3hbqPz|v2 zns%)kz%CncpPcSM5@I{uAO!V&1MtO%M4)d&G5L!sVsM9;k_jNwJ$(1kVgH<>197qj zKSk~a&|?0TKm`qJdO_yaN%LF4K)Jd7_x$U}T(+hF@1xq<S{FL_iIyNJdq5_WyFoM5 zVX^x(h_zkz_+yy+iAVRt);zC&pUBD362ORj_$HkfE(;<+p&m>yc>O1FCjMIt1xSd? z%WuGK?!Mj#|HUye5&J*<e`X{<Gj<Ymbt~Q&z81zgHOeK^(bIrh7P925Na@<z2wBnz z8L>^F@5o?<b_rl0EXw>9hJ6Caaz2fXP~^Y+8a)qez;a2EX4vs4EZanimp$fv6t-R= zPC;)|(c;p1I@tVt%~U!%lHDdnkHpZs1!EO7t~apO<!}Z3ZpL{l=3*hib1fRZ>mV}Z zy^K(R`ZqRq()^tD7vVX%rkj2RFFPJ#r#+rOFEBtl?xj4Tb01Do(I>>nC#*jnq@!br z-0mc7>69Tuz;uzkthFziB8wm8(^E7zQIyvHI)pIDKC0GGh8^t>O!Sx1on}!ngbW`O zcksyaUa$E<$_w<e=tgs=&@u2X89*t=UU%#(v4<{VCGhb|od%QPB^o5sCfb1?-}rFY z!<z$uw}alyN4s*z#JF}9$mh3b5|ZH4RF?nMUW~(1kcn~Zns{e9xLX6qV<$9&b4q=k zKQjCt%A5hq3;o<tH+^TDuC%j7-Wk~<p|@_77ZG8a-!~$V(T8d06a=&nlWyu1Ei(<3 z6=%)VxG!op8`qDSf4u#&L@?uo9S%WhXA`$Gw8hZm+Ajs5*8;kCHZ;+6Fz6~hWxy4K zK`@)|_yT6}55<r2deik?j`{uRjC3Rk)1L`q?o6MsoIYXu_c7shKknQrQcER$9w4CO zaz;~0x~EP}rxO=R5@6stkE?YdvBd7|A@BVJmbW)C8F4cF2kGE6udPdVp$)~cLNT$` z8j~etYLt%BhX)G8N@rkLc3dQxsN%%8_vy!(l#v%JC&I*(mw%c2coC0!NHX}g9pUHX zW?-jyFZ0k*JjA%&eGSS($;RDR!GDMs>Jd2rZR?*}d9<JZY|iZe#1;T|f;rpZ9I-Yx zFAC~RkTLyQb1Q6PF&8j_Jwcu`H9!9>xc&k)9-B8}?XK1boBK7$Rc?Ko#=R>8##osG zzco@@U#~+4O`Xk*AR-p&yOCcY``GpO4C&XIMRDAppd&i91LeQkGik_U4uF06SFH4J z%=F)KeRPKpg{@l-egmO80dHF%Izd>b9Bpjav|N}a&~|Bgz0?G7sH>gF*t0G^8&7Z{ z!8PuBwp@)&P<1kmgVZ`X%8j8CSOAvI;k+!=Dt{5;2u*1!>vgclalwuk$=f#7!=N7K z_Y(i-ug}bojqi9u9cd_{YqI1W@|igNFuZ9C+2C3dC4E)`|0hJbNw{(>2U__JPo4*g zz#v+$6cVnwr7t-(*2y+rXI@uzij^&iH5bJJIIMEr#ReoG1ADKxC}wLJ#DS95w4={p zlDTs?D-eYz)_L?iCj_)>R6A!c)ZxX3y!BE$hdmqY=vARJvAwdLVs0YI?#u-W69dxM zM$Tc|E7VCKS?)-J5>|C;JR!gdI5IZ?xsnUF(Tk44URl71okE$MBOI2N!*8yHH@la2 z8rVcnrh5FtFVzyM{>{XjL6#Gc6&wifzmr<xAS`H}MNB#B+(7$4=*l%!xxuToBpVoo zuhnFtxyn*y%{zxWo9m3?a-r<{K?!`{a~IcP&-#HsL>$H88*}-ASkQXfB5!5<TzpW) zqIZ_l60o_GV~Z8ruT*4<AK;dZBy*&bC|X9ANbvxZ6~;A3V_Sc%fFLc7KO-;pe47vS zINU_-a~#mu+!hctXM8S=m8RwLPFIzT$ihmAOQG}jXT7)urEA_95`gAlbtjhHEPQPO zULey+3QswaO%#S@t<Ve%BL_gL!_HJVTlV>Cpp17Q@vfCWhObny{nTS<pBAXO#C=MV z4C`Ru&lNUjhh$GIr0b=7&;JZI=I(C<0QP`M;>vL2q#m|!%DyrY5&9!Z5}z@C<IDYk z7x80o5x+FZ1BPuGO~X?_zWjBFvz5aqL?;cH11<q1lY$W`fh(+|EsFpt6XqK0h#j!X zJb8dwVKPbVJK~i7dBoV{uW#4t4!a@3uz=%0zAFRGzRc;Xe_bS~3k?af&>q6{Ak$HQ zk~30EtN(l1_QkU4KgdKQB;EnoC&gGn|DbJW<cTbzRP+Tk_zS2iv{(FZRiRD(qG@V3 z5K?e(<>#^6t-){Q<x>xW_ZWoCpf^~rUV_9^^dFo#bo%_)fSEw9`F%*u=F(#vG*T=N zvjrGLRyNs7)g`#jv<xay#7%wA4&2FH;&8uvWq7%2G|v*gDS~}pURkDEzAA}_4gaJb zV}m@v>|1nMyh`DS6cH`Z>ME2$)}$fH|2TA;p=rESOgsPn7o;p6jCk|iN4WQ|EyON? z6EZuzO8CF62K<c_#^IIMXY>OP9r{$G0d!GN!%*R5eX7-SJ{I2t!@@i@(A*L3x3e+4 z^3mxJMpJb312Ft{EQ0q#XN<4Md=!AG0Gu<Z{!#q$bBMME2n~DwOY1g}69M(2S69?D zHI-}$VIH8pRf>M52JnbCCq9ZdfVczFmoy(D*fxc_07_gciA0*5p8hAkgB4(j?S2h( z@z?w!UsL20D4v^}>#Gjf^CzI704lBb7Xc6e2c22f)fzquN1CTxb9e~*^*#QNQ}w^8 z!2K<EX7+c|txkaIOO#JjoomcFqgjYwyDdThG~6YQ@AP#9VQGX-9`>k;E>8wL+?k_{ z`IB8d674(o{4^+>)HB|#&H@6%(Wbc=lz*z%nrKjsTCtN{{n9-aR77{*cmkY*@3O^c zMq@*jbGJtoD77>|<l7%@A*xyUAMM90Bt6Vm&xlh#Ta}2e<98dt!i|T4<3L?Du-V}Y z>532|rSVHADvpsItVWh|DU|!~URG#z)DR0L4kdTH_{+|8vj$735)c&48G;^fz;d`9 z+xJ2m-;=uZBfI&5-S*5@=+vc<L3@p@O9$ofRT#zXx@@8EVc2XfP?cQV6$*hMy@la- zwJr4<=5yNS4Hn#N2dy+2OgA+Sy@HdyXG5U{gzHUTqS5r_hpqhV1MJ0P4_A@Yz2-O! zXU6GHohjjO#NkRkojYxAwlTHO+*Gb@K6I)JlPIPzaWIDa+_Gze;Lo&8clRUgKlt53 z_AUM~GMYDWWAm-u;+>)S8Ve2~mG!{rP7TxTrdbIQj6K}YHLW<L2r4Qb&x4XX@J)#p zu|EE(Y5H~Opy9=a{q~Qm>D~uDs=9E25muU{{>~j*lCdSpvz+DKY)A7@g9lsR@HtkN z7_WcrUE{w`qxh5GEwIAVT4P1LYkdhw{);z1ce>cqql%}r_PoC|=&X03wWr1eNdFe_ zbw(}~WYGYPVvu(*7g#+6ZhD#O6^dOJDRVOmmhm3nbaWIJ>$MZ7NVEHn@g*Df_9fkB z{NN^W|GL)ApwwwH(L(49li|B05?gB)iJ@sH#U|w5JquUb@nB32PKhjfFM5o}<K@5Y zXA)SUebgEQq*ktpV*Z$wO#l~&D(_v<7Hq2KZY_}w;{>^AQ18M-$v~zH?2Z9Jsp+rM zykHrxoa&9n%Df^mqWLB<t;0ZI@Xixg;SM9n9nG{=jp%J-W&bv|XZljEef1-yDT9WC z+PxUtVgKyr+NJM+TldR--Q;+!_DAiun~!pyR2=Q7k_7Au)doe*tT9q>Dz!&kw@zcb zPTxDGo+5UU(7n>#@v`9Db0EAE56H(vl`oTTE^L9P@IxwTb*dukpR!2-h)4y)F5kU+ z4WV1F?JT|(>`cWs2Nu8gZfdqR1T-JXpZm%rx9e_Ooo>xF+PP_e$?CjbZK&&Y>fLc$ zqsMKM4PQ1^++x@VbNGv_0)M-fd&4AtS^Lp5z*DJs8srD$jGn4<8pF!eNLIXvPZ;CI zMjr!sY1q^gLWc2_EtF02_**i`DG@=Fw+`y-D?oo!VgQ$|B}PpiX%p+oHbG)~yseSC zG+hM^+*lkj(mnN}ShJltyp|~896a2x{34&&!IfK<OeZZ{?GF&i9Tr!f+uHQ#U&v?z zOH0N*0s*6gWt$fKb=3#)WVZyKZ^G!+`ain+pHKe5FHP7lC7aoFHBv$4`lZ+vJPfF1 zW^b$K2L&J(>@Q)7L)Q1*DeM~Hqiv*6ea%y<pvH8${DSI~%4kVx1Nqz(RsH%~aatIa znJj4f6$a5iB?+hq7X-{dQZk^KHeJtg?0xT(UUuldml@j_Ik8uN>uXvF*ydYi-n~gN z7Yx@MS1;hBhI6LcBmC|}Vlax~eplNK<!-?;BUjSFvvY}7W|vyfC#wNZ@-3OB_Tu>h z?nG0))FafVsPuh;O)+Gg&W6G<XQxO7Z*D8q{MxmseG>y81*71B3ePo{#AqBzo};4E zx%+=HKX;)|=*k8`@2S|DIt-h2C#vV<apypRAL;VytCK^lHQZsRrLh*38e;HJ=%kUA ziGZjbbAR-#E$MjjvD|y7WUs^k-A-rv9Z!ZwJin(p-FMczul68k_NY>~&6L5>vl+G) zzALt|ZL}Z_7sC}0QWuzHu+T!!9zL8E<L#BZkpm^iP<KK$Yi_R{wY&FKp8@QEeX&kq z<l-HP-%1ogoGc0|P7jnbZyj+9a!EWAz`8zI^J*R6u_co7-lBq<tvMB#rdvB8E?Wwt z-jBVl7dhZ${keycoMb%t9&CRicoef9@8eYO?fwiT$Y{ZG@+2Ac@#G9M70;7Q(puRM z&KLCjosHsAWV_+5vPJiXZ3Fk{Re7>YSfpTl2D%PV0J<QCA|yl(zHvDG+pRlJJmuvg zL{R?URg4C#k)O#zsODc6lpuc%yz%T;NGSZ${JT#DZWp3+&qnNiq@<+8`lR9fz+mTG zEmbXp!m79rRE@xo;ntPk#KKyDCyzb#8+qVcP%@}HJX+ooQvLaUp5g_HJy-r8i9P?< zBmYm4>3=sKJCJ#KnH5d)B2P2-IJOTxEw-tL%3dtnY1f8=P&TUG6+TSS-=tU->!l0~ za4)#bky8^AmYk?r&B{$-8l|A?ArS5WE`0EyS`O2bY{ON{!~#djmL|0~iNiVDc(nR+ zwk~Tequb5z?OO6&$h1?MX+jw1xEMNNJ!F*PvB@UoZi9)88G9iPpW$vfOdbWqz!SGK z`I#X-5n>&e#VH0Rxq#%g1)$E;b&Hr3kR5Jcd%DW$d2ts;7}c@89o=-!j}%36A=t9l zCo9Q{txI6MOP`BVni3HW+0<kNsP5b~yJdn@znGja-`V4t%^Fs%ig&!1CSrs13wWHD z+pD2vl(XI_eIg{Y-gs>=&sP+TK*FOV6}En;nCMOF*4UQ6$z;{-jAup<E)$+aw{?o% z7=iO0$n70iKbPdo`LV5Y0rwy%qE;a6*dx*K!N;|tZq$vlo%OZ{BR0;)E(+*LG#%VX zKQiqHL&uFYg^~Pnf^o9=2S!rpv{LEnGSXMW_4uBY;bz2n`G{o1VYJty+&9ctN5l^5 z{6^E^VdvDoAaF?{Bxw+p-!V5!a}P7uUejh1hbqI?b7i@$h4VTix2@H3V}~EF9plT{ zIvC;Cn=pD=L8_uGUMhVjaKtxl1z+8b`%$k<*FQa;F>66y1gZgHb<w971cc?LdoRZd zG?@d4HbfwW_r3r92A?r)EpKJ*WyNpgCg-_YUE@oK0D1XTkYglfYdkSgd|Jb$mLDfC zWU`<!;X&DC2(e+XwujY`K<Up=rpY5+A}hDI%5l{qA*crT%$`Y+K2n%bJ!R>;SzDxE z?EVZJjS5?7{HUfv5`u<Tw0EGhQ@9}pn_`mw?uQ+wKzMQYGzbRcZEpc|Xy4B8$4TM& z2whq}veD<{@Gvdow+`dp%^t%!wqDAs1}eJTW+j!;`A&Q9dZ)GEBriJ1X)a!rDo#YO zGiP8}ZcO29h>g>Di2Z5$8P(kzq4F1TaO>XQrge{I7|Doi=C_W%4a<fZ72k|hW@rr; z5v2r7fZ9SIh|@;*!b{2485@d&yk%(TU=ZeG{mR!P1$X#C@Lk2v#1Q5Wgb%z4AFRx1 z9Ry+{5UvY7GkkEr<13&65wSuF641Z3hO@Oefu_F*zT0amM?a$pT?QkN0BBY=J37Nm z7&df!?uS_r=MIH&2dS1ZjT)mwYr*NtTiw>=G5~`x@wCVRv=e+id4D<U!}B|_*U(@y ztg=7mbLnjxntXH<npLj*Bopej?hS~418h}puIp0ZSXKRt>zn7Qc9`hgbL0Hd>ao+_ z)tTtkl_dLE^uBHl5oO`C^suAVsXHYrp<j@s@fn--CD#M&gA(U;eF7r~-qFctVC-T( zy4!_8#qBlBLdZ*v;fhqj9>9tJ^J`EW8%n%PQyknJ!&je_Kki4^bAXV8f&Cumzm@F4 zRwA{dUr9&DB_deQ9Ul94nI$2*Up#ap`)t0QP8aB%`c;>eU{$nDO`d!eFH#BWERV1! z2N~h_D!Qcb_up|GHrFoIUvOJ*dW&Ym2-Vk~t%s!-hqNjtKo7}}{SJ{UEz%hHydEe` zzuUf0PqcU%dk<{jpHPX2)*Hx<0G(GMe-{H(ZXQY$yYY*b77z|}gGry`kSSzbq3QCA zEQpYQX*a}ns~xO{)CRXzdHlPN;<kvtH5}mM2OR<aCZ_uAgBQb|j;rIf8u%p7`WR~` z{V?~sQ1gQdwAl?>B#4Od(BJ`3c{Vd#fOa!ylqb^S<B7w7-vzt=zeSX--TFc202H&k zI<+guz)v9jog$et{y|@6>;NuX1e&Vvfer!|S0S@IAtN+euKZbWM_=)Tt)%{uUn(2^ zNyqkeW_jX~)1U(Nm!9=6eF=}ULb(S@XJD0LKw$+$%qlK=dhqUnYF}F0cF^0&hFX2I zuK5r80NDuZr<}>HcR9*zd85jy0CdyJisuyS54RJUI~uF?*X0>=Ba@7`1Y$5?%(c)v zb$dMfJ%C8Hck?9B3Z#07%BA)<D{dglq&dJu(eZOCI2ign0^mmc%02icjo#Aj_H4&m z4Dw`wmenp(W}{$3|9KST@QMbO<#j!#$C5F$uw{Pc%4+R(k6-HSQ)3;#W|uF8qI0`J zmN{qbqEzP4{TWDwuqKvEV`FP|lRJx+KqNlHers?=x0s$s4|sDrfE2aURE^H}ujuBu zmv5_q89Z3sNL10xta)?>YpXCd6=puD8@Xb^u{tFVKY4iK4a>aX?U0Rux>ZIS=k=>+ z*2v<WUta-PXFa-(KCd2z7(!V${KMTN)1xX4dI)c+!myl0bkL#LXrQa$^vO&2%3Gbx zMmhwJoEF9rbbgmV{rvN68rN}$vtTc^EpOPHEzMZW-FgJK3jU_mXz`)0DlX7Gc&2u& zx6?Q6)f|6Oh)lU}mnVJQ3bX>SHOh8N=*bsq)RU*OT?zcm!fm=8q1kQco~K#MM#YqQ zVA@?0KEmzI_J*(rwL~8mKnSh*vK=Tb-Xu`fq?`K|`p@}e#kgI1R-~&eQ>5-`*_<I9 z83fyH`&!MG1G7ZZ%*Ek5Q_5Q?`I5|&+)+`k&FrR6Jz4QE&y9Qm>SoyQ_qo}IX-jgA zOlwllaz?NYsZgVrR;E(8ex3Vz@D9JUv|dza)plRfX!o~A{Cq}5(4f7Nzz@?agYKD_ zhgY>PSitL?QW<Ncqsa>G=M<?yn^sh+^F_VQA<Se_26}T7x7J?52~67(DFbzS?>>*` zn)TaEjTGByvR+tY!sj0MwuhA)h%;j6tdijy&Q9UPaMO(o<)NY!yJtY@I%~0`qJ1nQ zkzm~sK1A_Iu_qq}#>XCz36j2L)y*ZZE+=EKcc+hVZCB?qNFFjCLY3%0Mt7Ry4)4T# zmd5US-}V0WFAHDN-j5_G-6k9yY5zh`mHC;7d&A4m()|A1cknKM`gk&N1?wDVqU~s0 z!u;H`EAg7)qeqER4VF@3<62z&&kr3t?24Z#i^%76WaP*RD`F56hpA+R(IZOJ65DTd zWmJy9unwLNQuXb-C)YQY>b_2Gv&N`y|FFb*$Vfe6E;qZ#Dc?U9`fS4|pOYtrFWdjV z|NMZz6ZyodZQUsHc)WhCAY~4HX-y7aNQhK8VzPwei$N2&5e~ZOHz=-4v8#HSLWm50 zoEan)(-~GJQ&1(-UpsjT*pf-bL`2r|`;Pn9U!7O78oAZp8P09O-U2!r{7twBt(+*8 z9O+0qiRLCvnyn9s!+p4u!^ZAx#P?w-H26rS2X(oo>_tJ9r1URNQQPN@1(LT_##g&C za0;1Ywf$2=CdlxqQG-#x$>F<do{XhfaFr5k;0DeY#&M+|NTbgdZ4O(MN!Ck)%GkFC z1pRBpYYDZ%&x)eK5`F*H0Ex-HvZMX`!u{Mj#4-7psPRI>7@|J?mS+)Bc*<pHGOJ*4 zOB-8(ovx_LKdw*Mx@$@3F)z5JPIVDWR4zF+oab)iY+>J6%P;*bxxXn@lyZW)fwG)K zf9;%%a27zIHuWtA&;nr@vRcV+22CR?YhTU~*UD}+cA2*A+q37%TN7kDUrfo9uN_+! zkhx7yrya#94YPcXt-64WTxGgcYJ_wY3dwq+d_;@JVnpQ)NAXM2N+bq*xRdUddVNSq zPdE5!Rxz<KBXrONQ90?$;<_mp5ml;R&O9dum(J!9Rf=BDxCeE=>9kVQ1CZr`hd9L~ zMgaXt(gyo(;^uZ_(L(<f+I{<W1C-zdP>TnRDUAA003xns8;Mw(8YUy!FA-z0x4X#9 zTb<mpUgp8>B0Z76Fxwd{ld#o%vCAHQTAX}B{yF1Zd=Il#9KQI}F3b0pkE0>NvVKQc zF&W{umlBBH8iuzLZoieN*u)*KqDXhoJ|_aL@*?&6#%QJEvmPx5=!$?S#S>Ga9^~AO z$|M#>g^zh_ZJe)v89C8DAx^nSSr=KtTjvu~s&G<q@l#S&JAw3yt=aoH3uiRLV5_@2 zM5=SV6>0PhTqtuvIfiK=jqg|?2I)P@xrD>lsEVGlL$^Mfa2GQhP9(Rw$T{zw@s8VA zcq$^)sscUM!!YbZY!yyG7j;Zw=bGutjbRe{)!o%K+yi~Pfz~AKRDCj{J>*KR#hD;Y zdf6?)TXhmxy;7u4q@d1kVFfctM=8s^5t<TVUR(2k!4YMu1YVCR;!}OU?5K9fLqwHt z+0>z!iJqsP>5jGKCddPM_wU|>pLP^_<ag4?S0=ZOc;&?f>7$&f(Bo637o$1-p&^Xm z@*gBqspGZmq(iZtlP`uy<sP%tboGF`op^iSumB*bOS{M>$B?Dp8UaR{v2vAh2kx_j zS`^8J1as04%$moaGn<0m^A~NNzJ2M-&b8zxIXN)4s{Jzxv?t{TK$UP<TSuDD5+*a~ zTw;o(MTt2A@$}EzhRB5jj+vsJ8iF@+h;=lO7v8g{<Z5JVwICrT=jG6~NWXez9I<YU zdTn6{4nZ6$sL~$)9emYY7WytC@59@VNA6YnvpZEO0<>!~+Z#EnO4DGjLJIa|Pz^Y+ zzP`X1qtyqPYX89L;jFPaD9EEtBqHwqqbY1Vczq(-cGHM>wrn-iQ_PQ3IP6Sof-vhn zm`u%g*2nr#h54Ldi?x6x2g3BKVKq(wYV1ViVT?Vu*LKqevmcb2v|Y7IX~-_;#ecW^ z)62PCJ?GmGB9{8y_96e*2j4%w0K_RRV(2aJz@^FVvHZ-i_!IfVH)u^WtB?eq3K|F; z{{wRp^b}-5Hx5mU7?;cO8uYG1y<ru3W=fWUuYn2QtMog^MBglmSaxkSeT_{Q(+Jx- z8UO*XwcnvJQ0m=hOFiZPX*%C?dyHgmzEkXDK{|N3j|=nHO8f*?kB3XGZj=)@muK3? z+7sY5Cp22WvU=Y+JQZO^wV8facTO#cyE^Z<K0Uv>k<hYK-J(CQP6NGSnAI)iXXOux zjk6YY%PWa9badO=+hx>L=Wxr?SAp!}18kIjRny5eMsN-N0JwmJ34SKxy;|wQ4|kXf z{Z}P*WZuStdh4NxWK_ZL#LZFg9JykC$~=f`GSv2!>F)`>Y9p$-yZ#qoGOIIyYTD8{ zn12R?psNZcBQkB&-{;@nzoc)PzVTp01o|e%Dwh~#t1g2>J<$KQVe=v?{(GzM1%>W( z3h6Bb&EQ6Un|df@(n__N!OMlEmx@i%Hk$*B#*VCMYBr#Tw?o$m{RW(KU11Ln07GT} z%gSsu;UIc@brxJ4xAp~5n66*9mNm;AQ^$vDKGV=PZB!~w8C}u{#~qGg7qzl~U676_ zUvOZ6N3tewzYccuic{Tt73-gLTl;3ONXwOvB_IX@$L-rPr&{6OhJwkOqiA7jaHMIB zUCqyrhi$x^8(#nB;~|H40`k;TLKwt_jqNeEnK=7b%XCWSmM(UldyKBCU){O@c9|6! z6tHDHVwA{Ys)>jREz_{E0Xcm9qr%&)qMxU?2g3)Ek%Co~fuY=pKg;!DFKdBvHZ=n3 z)Yi6^wSYR`MD{q3LRN8hHaM(>jpJJ8KA~WR%*w2gE15q;?aQ?4kh6$tb`JBts9a4< z$tVipzS|hzgr`vy96}-mGeR`xD2fgfLTTFI2@0C$Xa0yLG|@wJch(uHX3TBhRX<ja zgrzX}-TIdbGQd`bcUWys=k@#}5z#om_97+R*eNvTd5sDu0dx;-It21glYqKFTC1Kp zaOc;V#$tdA?Qf1w#jGi`0RwP%Z*nqXP)o<#(6^P}%~Pu4!IuR=y$afZiPsu!fTVef zHi5O-ncTa5Y$&sibv~qNT=R=Jj61OqgjbQ1!dvXsT~)%D*dR}I^tl8zY@Dqe&*uYw zA74C$KK#gyH$)v#*i&rOz7Xv`Zd0}+@#83kpc!K;{f*b#V%~gr0#Cefcu)EM<b}gV z`OH+eL~u!_>%T5ARHFD@;AN&l0p<FFw_<BS55=Tsf^ZT}v#ykJ9)=z6Zb?Eci1obQ zpSN_HT^+qvweiEoI+*N|sb+pRgRm3gVKa9?Glr+d*&AsSW=@+XLaybSYF5$W8cp@M zhCl0Th%+LOisS-1Nu-t7NS`k{c}ppckKcLt$1(b^d21z$u~lM<4PQ;{#GP!Sx4~lP zfb4yj3!wju!h0M`oFZHO5?haskWs+E-v9=lMJtX4%kx%KoHF2G%ZRjH`GsQ$=8|V6 zfmy1{8@FW(KYuwc44rNXhCLoiM{Jnw2hU!K7O+N;=>VKh@V4~Uhqt?y1cZv7FH@Dg z4rXeiOZfN)1L{zezwFQa0)y02AHXh*-!)@v9H`k*rzHN*FF~7-mHAG2!gB6IeFv5% zO=D)&w3=M^$pxIMJD&qg;Mz*X99yP6te=(bY0GPHQo`$0vFAVAc7w?D-}4%;qSrT9 zm}9Y;+)E8XOOx}UL#cI|r#fx3ZUr3iaum81U#)(5!q&aOwK>`tkX1$ycDUfT*qPIm zHNYsBf-L&m#slJ%{Fb7#`Umx$fO*wHyc?jgaC1o`kK`k&$?UdGSCQTUk`k7X5^>|y zAXnb&5IKKia;8rImS4EB%=41Ck3Jxi9}MU3h$n6?t_Im!U}!{yt2#R568xx{e59Np z3|piFOS{3!no6B3LQ^-tfZwVf^@OstrOqsnG;`23y&c`gi4l+CXU2uR-^k+}hvP%* zoa$D98GD(bpo7)NHRl)e*&fW)=$_MtVW*9)jLX8Z(J>olf{&(-N5z?WMKoh8V_qSi z-(m)>_)jo@v)d@03$qGP5@6`G!BOd+O|q>j5&AgOTr<s*sffTOt2ENR6D`5EC_dW_ zcl|foBJA07(`V;5@p@!UI(OZ#-!6mWcQID12k>aX7RH0UrmbCmI`P`oednc}$In(D zG}l&4I!T&zkV;9?$za?o_dC&<511+%3IZKDGYbPgzinu1R34f7eROoIs@6_KXX%pQ z&2q=KG8a6lkaD<MK1P<VG{6wbOw{2y!@yZ#aX2I4s;riFqNcxuUxy=d%J9h9<B#H& z`)_6W4*u9wo2ABQ8!Ho4SVq*=^b>eg?3yOcco?fWYDKoMjadoO=`5ew&|{WNU5#8R z=3$7y*%Di%sblvGdF}Y&{AL#zvtRFk%P#^tn0akH<7{yu=|CRtaMC2hB~~_UTV6W+ zf!Oh-i!L<VL|yY^HE@Z_RgXs9C6D$DFe2-(tCW$1n}}1eiBj>Qj<`<58OKbb#qq0~ z1<$8fuSX6<I`%jGtXxmzL)#Xj@2s@vEhzVU=$^Kpvo0VOu5~}T*F<tG@@_+wucleS zpypgJ?EyBW=p>DE3&HeVzL+eamd*j4n>S9wFA7@p`v9=Lb@<lA+rHY4s)coz3QB&K zlf@Du^f`+wP8s)!oz$|g4INQ(Be&=BEQgwZHwYH&&MX}Im8|oe!YF($odjDj*2GJ= z-0aNowmz<d?P;hf-1+j&$;2D`Gdon|GPd@k`^#`P3QZQu{ZC1=UPwoBuUw+VT7+M8 z<_l(63_7Q2bdsV{djwS8_UwtZt|zKgL_I|)`YB<=4XuNJ)88TTV=c$m3o>2Q!D)`| zPaF)4VZwB<?-Fii{a7e!i@Df-7C)Iwon?l5Z;^24+VnleAFT9D;!~=@twuPgGkn57 zKj-NMQmmh5`iKs86#Jx|VB!A)hSl3jHQumyVxm?g6K(Ml=I4_nNPdm7IvCf`6?%9F zUwU;pt{<~kSHv=qJ81T05%R3$lO$qL7hfwN-sz3tO!pntkW`eV<CHvi?5Z>)NE5b8 z??6EV+>V+*Q=D=tksDp)rcK~}4QxB_k1#CpY7$~YEIPuGhfhUS#o^;8VOSsTkt5eW z{^iKXp4}-)2PXGtDBt-rNsniXc?-J>_jnr!!qz<e35=2HhHtbllSKi}aZd;Y&gV&D zXpzyz5Hmpo>T3YH4~c1pJ=O>D%%1w^(8myf1=g%jNRPUC4PKq$iGn&{6T-k3-d+$t zGV-wG&Wy&n0n`c(n2zK;OZ{q%z0gWkgZ50|pZ{~ST=N}Z1gV3c4HJt{@){KZY7&U! zIT%z&AEdG8<^nG5xvLD$`}5qpH6YwoZwLYOP|(4pg^u2VS{$nCuc_8^XteEvW)7e2 z1`l;RQN!t9kP_^nanPd#G#W%2_FF3l_W%F`A#0WU`Vcv2#Ho%xMq}UG^XGXGQhY|E z4?H|e1Vi3aoel$(p=7`ZJ;0-PjX)i1c~`M3yz_uu5HE!J+sCyPA29V&b%gxNiHNiM zb8{gplA}KBi>n(n6z<@P`mbE>h6<rUT}_|jW81Q%`7BpGNz6v6I>4v&QlsT0fliMN z6b*Rios1AWD4)6Qzg|?QF5?r>McDe*3sB4lp{DG2!FgN-jZn3iBiC#XdSy;cz~@FL zl0#J*X4(W`)dg?rI*dnB2KbpNOXTYLrvPxvvttGZcrtW4R1Kc!<Cm7d{9v3hke_u? zihbNOgzIl}O19P}vTy6nTRSNla%}bM9FEsqFc=^U5cfb+;N2VU)B&VM30OhX(V(zE zj(9DgPn!qW?zD`VuI<ocY}G})G*Rhyx89koRub@`%A?irGAu?RQ^RyGd~3+gyg_%b z^-=qsFD5*ere-_K>W}MXny7l1d0UFy85u1dWl%TraNbUxzRkfljn*m2p<GT7a4-_p zdH6H7XJx9UJkd?MFk*SKvZyL4#4IL@G!-UJv5lZ-s4J^+SXXxlqzyg3EJ9d_;;`5T zb#e22L1mXM;Y5adkpDXC>KY;6F=Km`8c6pYrkzL2;?^!U*=^->9*|b;Q5(b4P03;h zTdDi<r<h)u8O}AD!~UQg?X!gDl6RE1=sO&A(Qy569cP?n&0B=)k(kit0_lrwnfA{N zxN4ZwjvIz@38DOVWRQBfeKlQ1E^&!6IuFJj;7?7+%F){uT?NZg)#+gwe9sucPPs-6 zvRo^@%eA9+oDSs|8rDass?r6E{6)s(or-in<)Gk_z*{1ZUIbchDO)-<9boupJV+3` z8apTs$Wqm$W*3>j&3i6Zo)V=_6GoL?6&cA9hx+R@8*Wim{|9yN9oAIdwu|b_I7J+p z0R@z10a02+kWMl>V?huUl^Tc;5Rn=poe*^f5s+jA>5$j}rH39$VgVvGBM1QkL<k`R zp%_9ELP)X~yx+{c-@eYi_WrK3_u1E3e^}O9S-;-y=YH-7Hha~fgZ`F!hG3F)vGxmH zL*u<6yx^D8BhC=gplJtt?~gwcLz~k}#Wt&CnNVh!QobaMYK##2oyh{`6hoRm;GGV? z1<1~*$~{;cdRwocm!;YE;?LYb$ztVIxF^f9bH$ecwVH^`!?-s2?tl{e2;ZuO>Qh|f z-x|P<6gHObNtqWpvcpMuF}n|JbTUrb*Ygps*LWCmU!yklLix0!En(08ZhXxTc`45b ztKTJFYQ~kW<!LB`3D?T?Wbg$-T?#}QZdL3><03}Q0ouS)Ze{s83^0H3$sWar0==#S znZ*xmdcm^*!0_^UdsuD$Qh}`XHlr&%c}UkFy~?ovMTec8^S2QxPTH#HYHU<fUet_m z+JkWu$c;MM?=|f^=`Pk$@Pz$mKG@o1)m_cEK?hc{=?PsYSPe&z()XTDJ{|W;k0$Ql zF~sHE9i$0M2aZ}t0yR^m(odU+CCw?iUKzenJ|B2DBKcZ;n$eyZVAjaiQgRF2;k@Zb z46XF^>61$*?Kzg31h>6{T0a6h(D2xmcgP=C`Xbj?+tDs?bQwU7IY(2<T)}>DFZJa) zL6f}0^ae#@99ykWHc0_Q2@K>td^#k@{hWQS6@6G8=>h6)**lH;qg~k=5{!G%ZdnP@ z>jUb?u&4F?e9hJC5nH1hKzgtIn6X!lLT`Tdya}|GaKygaLs{St8`2I(pG>^D7>Fz& z$Z4A7D{#J9*K$6X%R9H^ZCB1p_ZMZjG8ct_gbZcFGuxTV?gQ}1CuLc{+(Wd!@~GbV zuQUKZz4mB+>9xnZgqeO9y?z1?eO$IJsghW?Yd>FjG12z<$T7Q2fDOQ64Xz$5TGV!y zj=y8h2iv@2$5piN$C+i_c{i@6+31&hHrEx5KEcM0|C;HVcIeg7m;2Aq=3{}%6(QBG z$n@?B^$0i62f*UEP5%{_3oc$2dtLuE0$B=yx(5bMKaGHGr7!scWnm189Jp7ka3THj zwQtos`N3<n?=(s6d7UTpUUo)A!ogtKeTB06?-6u6{zetxy@h2(?xtU=^yi)EYQQVm z&Tc%4t5)DF1O9~N(h;!$U>E}${Kv8#V4xtG+<lJ=<!f_<SXDqzg%rFs31lh+>Rb6d zI#GJz>C|xDotGEV0XWs|)$NU)m-MeGsr978SBxB4!;j1F098I55K?lRcU<XG$zB@$ z@?LNW9YbF=bvv??2V2B5Pq28(ym;YP{K!do?yd5!0?qyKcrA^Z_W2W!txF_7Y9iyu z5xJMXohWIylv;Z%_sB;~nTWq!oLG0UD@PQvOtsDw01O_phns`A5pa4)-w1qEWYAMR zo3KS#UeE^i5lsaOslhem+PyN;P?lel@)qgmuf>euwxN5&*&*2NK0vSqx>d-gx)<<^ z&CLej$u!fj>G-yFblc*@{`2_n<DbK(3XQL9E+Hw33=olf0F?3T_>DF0=cS33`4^i! zW&s{J#|Zy<_}3Xw=M8w%e=S^fF2O&F+|u%I%kqyCU7<o4qNVEaZS<BDji7KTDpJ_u zad*cip7uXDwgCs#ZU3jiK2I_4^ZMN2yFq0#(92pZ(Il`nYJK{1T&#c3grx_kWhDFE zGH9ujo)**Hh6{A1rt(aKhVWIiS>4{gY=%5&sbPwb=lL~NPN~51m>@Fw=#q@bM`6pJ z(8)cH@r^PXCbw<u^L}@_)PN)o)KY^;;-)$8qE!3k{oWbX6*DxmHw;~Wz%mTT@|rVi zN3n0DlDRz4gZu=|FYa)FT_7$^`9Xyuj|ZBq3cEaDQt&>TgS${+4BD^p>1~tV=`6Nx zZvHpKPfx2Or`#5Q^@U9I#KuGpI>UZ;8I#_U#lxr8EMzv1iihAgCx+w-p9Aq0&{*_= zz-4dc`9@A0sdL+PKqajjKG?-so{%{!e*r&rb%OK)%q3?DcKqTTQW1S8^&UU<Rcy!@ zy}iEN^U09-$)uxj<vF_9d-3G$qQxp9wegw;L>S}vB4AO)JpwC~R-`kdBsNm-^0p+; z3r2F=w6&EMMz}Ne5O1tbSJ#fW+zb!+tj;R0D&jW^pNed)BHbJfS7^I^2<8dZe^_*- zN-yD}Q5=q2mVE`o44wdIVEiLbS>tIlhXR77C*GOjG+Zi7)dzbQt|*kSHQ9dP$rsz^ zha+O80j<246rL)ZJlP4){Sd#@zhQAdq7GZJR=~`;p*&o&SV>W2hmsi1Y*O}~Lv~eF z_Re2i#fP{-z%*=Cc;)?{O-c71#^{V3Ua^>TcHV;A&&_DnscgfX2*kSC>|PRD>M@pk z*f=UIzPX;L-cS-(DL_(Cc#WUS=qLp&VX#JzGGa2!L=I8npu+0;Q4)TU9L^Y`P}T$W z+%3M&plu8w)v#ibkxMV<zVPXc4QcFTSJSpn&H!t^aaO15oebn)Psx~M26NeSzHx#l z%<p(}S=@Wmw+~+SYzm67CU_+*+}<AET%4@TXWGgF-rZl!Noz3#Pj}dwbC>aO(N`o~ zKB5qGqtON4#@M*l^PAkmDd}i5g<S#ahiQ6|ah=93=DU>nEGW4tt~YgNI(k2~8aE4# zY;5Oh-rxi%?d+lg{T*iQauxRbMI_Hh5c?97G=I+kEL_W(zYuDe-?Gjh(uj++SI3Bh zT`xk<6>tnFE`pq?Cf6}ite7KA^~M{j_jq_6_7G54p~@PNsR$CQtyqDgq**(K5~R~c zQ)yMpvq-N8yRiArn%Gwc$T(e8H@gy3TLeGa|8qU$7NUF<+5r!WwimANuF8L6nNT8p zzvNmFf<^v_!J0?$1NBnqP|aTv`7|6e8v0udhJq5S^b0)4L5O|Znu0Irk5sJuMudn8 z3xCVfdB>fJy$U@}(~(|t8we~9OyzzR*K|FFV>6*i^Thp`tuw_v<nQ{z`Vp3Xaxyv= znv-N-j|uQd;U5vd80*gz$tgQA(@KIX4V^l*Yf_&t_#7eL)Tel0DsYUjHyM4N_22V5 z0-817B?eqO@yig;p4n$O;K6$RWSlHIk+?SAW!;W)>ISK$#yp@J>4(MRfZA$3s-d*6 z8!HeD(eaD;IbxR3alA8Z!=DZW>Apar#%l)0RwYk2b$Vba4$OLWOj=x9e=)Iq=c{n* z4(X&x<EZ#;e7>p1&;FV+7E%penFXSFP_Gn&6Uw-P)I{L`VC{{#igfAj)Wp8w3jvGp zjJP<5R*hvA>`v7ptIqbcpOD`c0xSyxUECdio!Y_V!0@{t^fVM5U-D8HVu@lE&;@aO zYD;VZ-&R~Vk(SyyefqlS?Q=!PmB20_DwDKhWXTL22oIRVL+==5eNz~=Ye?B!m8RH1 z>@qA)Rd`CkPRBl*Z|d*N4|dt3NmHRh<Ck9fp2skt0yXYPj+f4;TDwtpqdeyUCtvBi zW%W$+hBe*`g4DJ_=8P9#0wIf-{t0S9o3#MOx(h*VX7X}c;uEd?>BQcKr(RJ%uuThF zxJ{hUpao_VE>1(nb*&P3hg;Jq@mH(#^2^Li5DfW5x0=OQ>lR7*Z0cnyYXv#ODZm;} zR36Y!WJM0czqsQ89JdQg9lhu}Vy>3prTLrPI=z(CbZeT$Tm>j=nx}SUPdGD2EW_(t z6~ltVxysjMe$7rW`*t}TGk6e8q-|7qzNlXYVUuE8N3C~Z17O#$DVG)^`mv2Cg>Noc zxGhqAHR~_jz1$|BzNirj9FxT6R)!gwM^3Hh=?Y@v#@mAOYehJ(!>AiQp%$b8{za_k z2q_wEIy{9r-dGeX)1sV4TAe2Tz~(J5{iS08nqQ)(6V!{u@x?K+3y&Txm3+1=W1olv z<&g1_spZsQ%P1b#7Y-x=35mvJG9i^_s+2Iwf=Z7UBiT1-G%lV<t`Vta?`wP&Q6O|@ z;x|VSHq`|8oGUehC`}ug!CW4RGWu!s=-u0z02E{7RrHGGr1_+?7xaeC=fdXO$;w?_ zwxZGW)P~$am8|UiJ<3QAhu1FIqn}&5puR}=g^U>^&T!`di5$H&b5B?Ai+S!1<pDWP zmj?1BwlAnMg>NFb40XI(VFtLTblxsRSnX$8bb+F=7-imK#0#ct{N$_N{f!{{@JoVy zr2d|1^J!{^dFZKnbTP2eD$Kr)h#!sZha}AII4_Q<(^92CInp6o?-)nlW-^_qH(WT* z06Fysdt%hPx#Mh=v9Jvn`uIpvhiQFQaw)4uqRuwKSJ{$7m6xjU$mW>HU7f+Zr;#&A zXf~mzM~6N{4QPa#g0_VL7*n+!_pA7U!s^Mwg8Lb))zjJq<HI_yMQFYQh~!ddxMayA z6!jzqAIq`@RlgngRo=~`_$g<e3Jht0?&;tgQejZabyDA)T4L~fL6oF*>Wd@9Z_663 ztkEkuu_4pc!tcd5<DvBx=lHR;+$>H%Xl$A}PfY1XscJ$do5G-eOck~-_g)mKPZd*j zd)HKq!jPb(s@9iyx(!__!Bv`(zBVoQ_pWrOW|A-i`~qLP6}rN&s^!*3SKtw=gl?|3 z*plAJiwMo5ukk*O!;h+>rA-;PDhIe(@K+jxmljKI>wA;;Q1R->u2}W}yu|uzfI<s7 zCzB1v7*Jwj_k9%C*i^RA6RNOhwypgL2%~4OD1MUSS`<g6u<LpF0%sjAKQSos?hlS* zNvWC9r&~{<4;4O)YL(osP;zLZAn+Q>ASoxcdc7UeKeW;jT%4DG3v9)W0p<<vz3N!| zg6B;(T?M}IRQeB;<^Y=^>xbA^S;=%YP`4^@2l{~XzTqj3dMlT!Ql6Ep{3{ZXpU$)b zhaOwP`o>X+2Aw|&P~%ziuDQcj9yg*<`k}Bk37>EY;&Mq{wXkV|%l3^&R3;SxeZ?nc z5A57f+{HuSBP8@S`go2E3G?U1$cwnwD&yXbJM%^YS}C2uIaTZhCK^h~rMOCRp!Lub z=pm9W20ORrwr-<Pq4_JTX&46|m#+fWQ2g$u8HupYbEv>^`5=OxLD>Ep3%JL|?Qwj~ zE>2wuGeTQF{a*P%2D2j`Q15NMKBow}P?P#3i>pOG4}~?3m|zaFA{-hfN)%Uax5TlK z**Z%l;yj&IM9B0GgihOtS3Y?>%&6vb&hc}jf<29Xye!YUOgWR`3{QJ}=gK;D<xo>| z^}IgxDsDDraU^e1nD8{3YxC0ZCKEBD4)R9h8jj_P9U5fsz^|6DDXirNAvHFnj26@? zt7fg~HkvKr?MafUh%7M8-t=4-SCL(zN{h#Pa@Jn;JePJ(6X}#O`|(i3ekNFt@p_4G z*)#iO66Z^<>|GqN&O#EVR4h4bjv9~_8`wFHQGN7=08%0bx6WpW9`YJ*a#eae$*XE5 zlzs-Bjjh6_Hj!GyHMDW>Sca=r@wQK<n@Ia7kFK4aWwt3-wyoXW#K}LYzJlzFw2>!< zY#aG<6CjO0%%?p8DU)w}w+*7Zg_v&pe{0wOzjw&^PbquBd?XSf;~N0h+`1mMo!ycL z1y06?4z*za(VK|;H?50>fAjPo1$ebvF9Uznh|9BGW$U8Pt8;^gWNU0PhgDgCmhm*@ z*RAE-68=hq=mlWoXbCjS<&2a|eMioqKo1Y{z*oCg|KR+sdci4n^NGM;-M_O8ttJ&M zF9?$K?rJpq#{S9wk9ax{-bV}`B}gOIV)RQBq%N(?j3l)5Fz60o+?hT>5u>Fpm+#x4 z)_GH~+6XG`a@Nff1phny*Ddjqzq3o3*_3UFSvz-GTCS~^<d8T}2h}I0tR`M<z!7{c zF~??2I#Y*X!JC?(Ti1eiOmf5qd<kIptd=F!4g{>5&|djk8f4p;iklf(bVE1t->;gv z0F)hkNJ`Nk8ywUq6@~GmId$zJomD|{*MT$b*5ym>vMaA8IYa}NWCqnTVdwmGdO%V8 zewpd8ga-O6pK%UeJ_b^6A>k`ar85jchU;jwJGBw@PdV5o7s@w6Z8ID37oOZ6Eg~n^ z6MQeoj&5*aTID^p3kZ*Yz9qg`+wQ)h{7veKS3PfOlA1%e0=rC#L2vp+wC|Q{rMJX? zXAR_bl+dXrdoMm#Q8m>Oe$=qB-Z!Oagy376Qoa%z>Dl^sdye`IZz<9Is{<{oZGi*- zs;~cHN7*{>|Ems!{{-iGzx4cXZHY${{}$S(#S!MS$?@5CodTdF!1ceIg!BJfi$P%4 zCXL0yI%c4|>|M#)wzHc6KBMnLSyI8%DGMA~qOknw8~y?9;iT-SDi(n0as?fJU^OqW zc=59f)B$J$r7aM~AlsG7(D<mucJe`>7!~b1MW0ueMx1>V#<KzH&%d|;fPJH2Q*8+9 zkQ@<lLBG;*bE*iZZ()R$0KQqJktONdG)YtCLm8y~%Ve>Pd4b%DB7JT;MObR#wi<K} zc?l=F<*97gUHt}a(B1A}T$ae>vC~|vLy!70njh(rTyIXQ7uRy5kVYQh1Qu_wY;dD* zm=?+#a}_NCfG63eg`N$9^oEGbNQ+gB-Bg^l)rNq^C{ZYrF$M{|m3KjHlxKlZ8iI&W zmxKdG4>kpt4uDNBQZ`|%DDUKxd(CU#zR<J7^~$|^1qCq0r>{%xN@9!@DPj6`DGFs? zLX-Q0&7BD69oL8vZpqhz>`rzzO^&K$r#!udd5gqbNnd@=s|Zs$*9KFfbc6&SBS_a5 z-P{iF6NfTZ8bl>k#VfZW(K6dIQAzFFlKOc^pR^sr<wwhg4*~;v6aTsgz^){f+`X46 z`E0CuO7X&#p9#P0PpKe8&!y%zEfMP6p+eWS_L>{|vG?<-M+t9Z=WAXWb*^m~_uvz{ z@lgRABGOJ|1}4*k0L&FTO9pjb+;`%PPPyqnEq;4UpW&}h!r(jIj}g|{F9G@akyrs8 z##aFbwno4f#K=-8(}S0`SABUz=Hz`jXP4iF4_$RTGu;qF?orOaXQCXPgCb^Ge*nT* z0l5heuf=>k`V`~N%&%JtO(RR<Bc`0GI*r~}l22xxyRv;~uLIB+p?b^M9oO(cl%^R@ z3Xhde-%Jd!xdWCZATiyWfbKSO1W*zV59*G%P~JQkkol7iJIl4g!d?2}T3~#}u%v>^ zW&)B132MO98WZzzuk+8Mj}yaa-BQrYG1%S(BwnE`_IvEsOrf^bUp>8i{5sBG&e1Be z=VZ7VS44yw5ayly+tvWKQMX;IK<D|_72J#N!p2TU0_mCk6`zT^3V?sJ>=WVl(be=~ zBkBR#nB%UURdWHr7dHimo5s&*JC{9lH^@sNFPj*H-22z^U0JdFiyT(Win{$e>HS9u zD~p;G6};?d+!C=<(zRAXV2O1fdtWHeZ>Vq2lk(qWgYbpYBSUMARX7_tbjkd*LYXw? z{iP65{^lB40_-h5g=c5FUYSbY(2FkFeMB#>+2P0r=QqObxsdPRf1(X{K8v3iRB_;> z>=>%69BfMB7P$GGq~$-pgd9@4NQGehBR0H)@?{aHwTCOlpgw)1=_vhY#pqMVr9TSw z06r1m&?+ND0ahl;);L`P_(5U%A?q`E`)<oZIKt$J(%C|vi735eq(hC>OK^g5T#)N^ z{Z9_UY?%DGlTXBS?Bp!|MauM=&zn8VpyBMa;Ek_F9ycum<OU1;!Vu6U^z#6+l77Rq zPVv%ZpNqmMimPY(#mk$f&-Sh2^(h46YgWEah-Yu@3u?$)cf|&T^s4di8#^3h-(dfJ z+7Nj7sLxla>Q+aWZ@u5RmG2Omw$kx`vx9CLYyW#Q>0j39q3<@uvlk!}%b%B`EVhO1 z+cfNAH6a?C2I<00fwT8go>U^1{{65DM%G9Wv9hIFBRZQtq#=hVmKT<yqJ&nhV$a>% zpn$}r*)uEAA`sa^81dWE@-5)|?@5D_{-uPiaG#d{XO^JNW$k}XA`Lsd#bae+A-h8- zTP-#Ky=0(k)$neUYg-r-6U$-$BC~Fv=voHka$^6TK(rYfFcP<gbhn7rE8qVI^nP2m zx6$f5j1Fb<JF-@^Ou9+2TH~m1GtU5!`k#amU*R`HuoC-jli#&40Ks>^O*(Bex$H;B zO>}-HazJAE%{D_Ih6ljf-F$JAY_dhE-M*<h^N7BwJ-=xM1h>V8N3Ur001H*q=R{H~ zN_v1JSt0?(YjS?Ai+r;;z}(c>uvnV}WG{h<dl{4HPnKkko3X0ig;IyJEI^uGlWict zF#Fjh91k?guC0|P%dVUqDi5onS3%8>5e%QU$L{*KuC%nE5P0+kPIJ;ZY8>z)Rk%=2 z*^*QLYuUQ$gR*EvX^<ja>vew~O-C6J3<<@4{*7sgf2^*#g#LVLb?zEuvT=}hz#oo< zrRgVSW&Xqz*qcRimO2Myp@B9@d?QnRZ0MrYcf(r^0TJ*d^NRs^zP!WmyO07GAIY$6 zxlY#eR(ETe_#BkbI?iGxRWCL5me-YDC=YP!*z}S%+M0kywVk8Hyk~EACOV=AFFjMs zPK5}~3RB8z+V{%=#w&`WN#BLMXYKPLdh`Oq%iK(FW_U?Q&B_sgnr?IrR#x7?y*gH( z`ji`!M~}sFu|j<3WeDXs0|BY=2S($W?@lURC>hXw?8=nz2Ii|6xQPnp=u{)QlMZgx zr-`E6pnCx-|Mj+w-yb>x&C1=BTFv$_By`G6>t6F7TJs%lg2M8&5=UmP`V1x7m1x@C zyjOgvSU>cwc@2FXfVBvKw;t!a4tMwUYl&BW@1L+2v`YFaxH^eGXr#sPdPeBN1mK!; z^!NKt^Q@_#Wk@$4zOcj5KGCNP^h)W%t1HQwkj?$`X7AY#w5n^jTKdXO!-TX7*vrf1 zy}LN^3DFvmh>xll^5(Dn%pG(abdjc<+3$Dp^6p>*V3kaFw6DMz-Nb}`Y$aPrJE4Vc zx-}4>;3AjpC63P8Fda4H$DSp$<!T(CTzm4dD>Xh5&_wp#l(23Z2kKt`7YxKKwe0L0 zW8=MWM;t`+LiIC#z#e15feR_cH{1sG?;Zgbtu&)z4mjXH5*Y^US|JmFopCDElaDn3 zCl9%@^-;+~HVOJQSvx_S6Y>7d4b#$!f}W(?1Ms{;15;>nY1OBbJD*hmN#ZR#YTURP z!Az&*p`-KDD!<OIo$V9nGedi?sQ}$o0KMwNM-S?P2&ItjN$q2Vtdv(G%TjU)u<<$s zoV<Vq7Kp@|n)rUT{w<*`pepcE)=BtX6ORNjqaEl)?$sS!-wtXRU7(;>iM+Zu{1iO? zTpF;uqW098yCBNvz;IgsF@n$3M``{hHM68@?`}XXpm%^l)J;8(RtC0BTB%#xrpV-L zD9e|+w{E~d1sag7qh~Ig=-n)h=wvZ<@-XPQK<CfCX9f}as-3EKwZ?Ykw|cMq=nP=? z5aDW*w~a@qCfL>#;3}V!r~!0VB(QzdeIoS&1elVlzHrz<3lN2<Qz%-1hG(lv8MrS~ zA2|A~jQq7NWp)JRy6(BC{V^c7@~3?o5SZZV{4R^Vm#!rb8B9PDoSoED0i4-!f*Pnj z{A4_9J>w!Gh{DBR@#zc6ALh*m*VrHGkJzyMw6c~__49p1yW<U(wsVa}B(p$)!%Di6 zJ5;2fF<nyC>FBPWy-eDf6Q8HMu~;6%y_V@piRkY(0vhq0#%3c{y7?@6IqScXzvZ!Y zMvmJI%x4(&rM9yqqKO#{Hf=xr^xx(`vrE8w>hj}WS8Kz6n+Br}Yb#lY{M(Ixk*xmn zw7EI6$4fVemIpT@RZB|5>XUy@v48VlGd9%`wzx<P*<bVT-&8C7SK?nbCzjwB;=&2Z z($c@#PtV@gAy1$?7D<>tB%Yg*tO0`UCNC;v2T(?UdkZW>cmBWeZTL?}1mIN>xk!D- zDRGo{gl#0ODJ;)#h}HopA@$wzT%kb}C#Yii&^uR{$=5uVP&o>YLN$Ig`-9pu=+<BO z{KJ;*Q#_*S2{GeICKhF*(#0it$|$~yE!KJwW1nELA@!lxyfbpHva&idNYLUKWR)#x z!ti};)n#;B<VOmve;o>b7*bh<Y?bFVY{V{Si;mDE<Rx+MO{82E=r~q2izpD=nstU+ zqu&JvHGDsza)UlT0V7SW(9TQT_tkm5`+1CVMG_kVqN_5<S)C`&Pomeg#Dw)W<0Bf1 zLvjA^n#Q?PWk{5tH)i_AFJ4snsa6{G!_R6A`6*rGNZ*Gd&bAPsM+p|952efQfn_fc z=H6Y7Hw^bUHpwxQ2i)Lo*ty@zTkqr=K3pNxqXwrJhugn6sbny9FHrRC34#%QSp`d* zx_6RvWIyLTwrA??0f2x{396A!zdia09QC;MhzongJLnj$!CdLb)GDEGOH^PFw}#Zq zXE+Yyd1KSd1+Fh{3$sDuMA}c`FsKX~%UHEKVf|(xE<q~&uqJ=DOC>3vgUZE(LPHS+ z6k-3>won)LdS0h+lDY0eS>SIR*iV5~As9ca17&ij4u&Gfzx|X1Fa*`}6W+)sC82yd zOX5qf`UIcI&{Q2_SMtV}??H#YwiDKmvyHH4&_RaK-bhF`WwhJq2f3%6UHk)90uPR( zVdXSZdmw}JxoHRh2dRn}0-xAQntIFLNf9q7ZsU`3;$91%1=3dn?tb56-7dCm>}SQ0 zir3ud6L6tOAySYRK(!O?@Aje@52-bJ@qP^=4bu2panyh`@_xIx1up7PT;DmaQU2`u zt(urLF?c05;fD%l=pJlFk`+m_b7;1jjtMOPrfDBwgCH<LYtr8i;c~Qe@@nPYgL$=? zTypshO#_J6Yr!i=XhXrxU7QDSHEkWoKq}E>@+!wSD1Cywrq*?)YhWX?cwo8-8faaj zC>2?^4|Q-m*j9zr7+GdSLvI+Y!BbM$LnpksRJVbMopdga(4qYF^k{rK5$kj6BNUC| z?seP<><TQanR-^C${hHj1JF3sY^bTL{E#I#<0NYBp|{@1%Sb~ShluA+{@&`9g&7LM zJNAIAMF`9+$8ffMTt=adZtzE94NSAUFmv1nreJ6p&!Zu-o80n+!s)n)AR7v6p0JDA zMn8xCO<1H=k}Y|AhJTQx<l+@I^){9-bZY&9ipf4eGBcrQ(%Oy-f(l2&&+&u}YgPxk z1_Zn2g|D^yg1x5s@y&}(D85={8}4~M>av>0=*EswLQW;wl4Q)Gx5VSJd#47t9|8*D z!TUj<4+FHwkUsPqc^P>P1;#<uLsKD+$|c<2ip+`m4yPS-H2X60&UAIX@2&0^bexOt zpZjIGskuVO-%i=&l-eMG?<z{d4w7OLVC6E&v(e<Sxeeo9@xrs~txucJ?{_#4)5M@5 z0S%MPaGu;VCY2u<()PM5O}VkdwFmw(Z~4gxdZ;1vk7)aoRf9VwQWH~?13bx8(1CZ& zl#E$rJsqyy3Oo{JnEkPetIb1^pGLczv|I{VNF~li|2Z2P+kXpes#eAl3|Dpaa^LD& zFEveuow^N`uKH9=Vu!Pnc~+Q+hBkz_3~rW7GZ44LE?!%Xc!v~LC1(=#ZgY~wWzidJ zaZfEs$CroVf?nldZza$=L=%V5_ABDblQ>_zf!*)~qt%pV2dve_Y+0NBQD<BaM`T&W z9*C*Juf==JU<1^CO^nSA_vDY137?uL4ROemvOZ*aHTJG1pcxohW_@Z79YcZ5QWT%9 z`-U|U^^dP-JiMjORYt=-Q?oQP3dbM!^gG;0mn%<5UiA%3uRxxPIBhv$ZFSesA!R>3 zyKnja+k=HdA5W3su{hNFO+Ex>8r6{;j&d4#<xoi-t}uIec%iIFVrDH1KnD?z112<e zBZN(tT8G3at)%%tZZJH)w~kuM4op!##iM7l!@E$kl~Ge?UdPKqEO7Tl_B(Sw;~HYi z`@MP)nyecBeVWIL`$MEVNy$t<!|Qw!;l8kFEx|Lbwne-DTpg>e(nxyk>G`?g+_ox; zknm=$U?{MZ0Qd`jx7@~=CwiE*QHGN_79{_x7XA;D=FKhK3pv{CAaOvxV^Wj^w=c#< z2i`{E5O4Q${DVDn7b#JXrMTQa+j>~ij&36_o?00f{LMxaV0d%kW`{=(m=yj}=kRAL zr9Gp7tMzidLNlBGWF2%9$>;6TIRqHAbs%XO#m}7&{vKEvXo~GH@6Tbxf&=+o3vatd zFT0|x!Io#dPrht?j<{R5Hm=u9=w%y2!_+Cb0)2nw*hSHI$;#?o<BgaSC(&9wEXcgG z1~o8{#~UJ+7a<38=vl$M$Enyp0qht9#*Z6ofb;7lT`QNJ6@E)yU6C9lH|cgZd*?3P z0~=~$32>vD<Jo<}n#(+?kA?@+ZMY&%niCS&lPx)3#W%7zLYE<O;pxKqYEOzNPiNuz z$}wK*+93S`hY!^xv$)3xEitM!i+Lfi0?q|eFr`jI%}cH%pNIH<Ui4?Q4PF*&SioP8 z8DX~6MPf!sXlcvSoOd(kD#~M#m`wF=Udvxh-eI*Dw5vz)*O_NlR&Vqj)ZW?lcYo&; z`Ne<}Hli5eWKF(qG12H0=}RB!aropurgNINm_wawn{7O1HI)XxMSaIbblJje`Vls~ z#q+}!F9<RvmQL51_2BLX3st}rP?TKmK;rS`8y2$%k)0?6)MpAP7Ow0HY)?pGj~_p_ z(XEh|H9uX4+Kx=`yJA81S1(Hw=Gd=$T?_hoM3$EN+=pbUe?^TW;dKOC`hh`bj4~GR z!+|&du*`aAZPLl8J0WG7UZtFsed^>K)eLMV7t{0U6Uo#Jb!5>zae#|W5i;Tzel@5{ z%9xL6il|gBG`inu>VmxTes-8+L5BoZu}?RHrV*Z#q`Gdv%E`y3^HQJB3q${CC8H+C z;x*~9nEE<{*YW^&+$vM*w488R*r=`Zpet0+A(y$v+c7|JaCR^(&Y*jH^qY?wmfM6R zpyNgdBOmt!<uQsfNW|Nd8IpZ$;{ui89$#gruGoylrmKyUgST1`zbyvhK4Lm9Ho+Ia zh{zE}>-%$-^$XTC`q;<vDS!)pA5xF94h@8r_p?&!i9Pi&#lT`(Xx^}S4eh7Mcpcsq zRqWFl^KM^`0ch#%8K3oLa8&Mb^4v-fMw#3(;z5~z(FS8LYYMGyG%w}{|J*2hYgw8) z3kdzfcDF<zz#(uo#+aHj^#d;Tl*GD^8<oNiO>3(av?43~XzW<Gz_#ShxRGh2X?}q| zSs!haokxL11Vs%CxZ0Gc-xrsOvyw%NUIE;nV=+A4unnRGkhPpR)4tZZ-|OUwzPl0Q z<19<3g1R~3z7t^w^9z4!UwrQ<U{iB(y(SLj>=g@@_FzZ+bMrYv_7Par3G&d1dh;wV z0!q|%Q`8ic>l^Z}%h$5A<BOZAA^JR&qG40B_Bw$r2DMeiC|EzB+_Wso@Co6;!5Xkp zE`bFYfdXv>Y96!U7n`v(X#B3;AXG)?;@Aq#ISm;PNVnIA_wGukosY-v<k&LkHB3K5 zZrFGcybybs6pFEHk13mdo~7Y0G*r3a^JpMAlz>@(7Q-d2zKwr8NsBhXmJ;(q>?niD zl(QuHBOQULxg16{)}cnoUz)8adJVdU9<ecHjz6v;Vvy<msFP;c4L<a|*I_+j5i))c zTUT??mmB3)&#>fKbiwjj0$|<>jPbam3E(!7$8cf2OGGQ8iqx;ZC^dIoOUG*a10CIW zwr8#P(XYo#R}U4tG8VM>P0*3y=u^ilt@2X`s&P$ea{!?`M}uz8oj5`E0DV=<nkFTS z{Zy8NCQG^YJ&);bg<39HIXVh7VfhwWuI8WEDOESrnkJZI%pMYnQs0T89o^=Q5hAnv zl3Tg4lPlZ?KgyddV*C$X1SE{>+V3mofGM{`W0PSA6=Aftus1{04in6rq;yg^)bVNH z#1L;7o<{LQSr1`HPtf?JG@g068A<A#c&JF#j)*aLELtN$7iFi_c-N!tTV276*w~O2 z#*c%X7N|?y2AzV#wp0*6&g}K(ZkoTqs%3@`#qz;bY$r9BV;aBynq)x=L@cE7p3bPv zuKuovgLg!1$KC_B-7nV@!N!HZw<~6HjRw0e@Oz}uhptF#G#x67+ZBhxPB-1OzMH3m zA(*wiSGiJnzR#h#Td^vFC8+BRdx?XC@6Ue~--Pf^P*v8<Txd7K{Sf&U8c9D6*;i#~ z&oe5~L3vwE=L}Nx=Z4K-U}zYN?vkRjQEQcgGSM=0(R8ekSSC}>Th<+S<e%V1W0~$* zN<Wk#MaKsSYMn884ALs;qX&alLAww;ZlG3n<?iKjofywvzp6)TIpKy5%V-|FSWUcs zVvg6zY&a?7!S!RX53XdnM^{+|+89rmW+vTorOXqYvQ&l$N+zIkrZ^n$OU%9HRYtTi z8P2bQc)|kP^lE5t=An=~KKV+5R2q*vEC-{$$*saq<JPQ4!~NA5#OgMLB*`4Z=Vjiq zXQ^I@Er^(h8(2}lNH75~6o(}TEtr)kE}G}0(Em|agBUE(D|iYbH9QV^jRmlz*T5kS zW_57mNVCj+VJ1KBPtf?DClD>MlIebMVP^cdyQ04W0F7PJ_{GC(j7!3k-}3t0;#WR> z!+xtaTu=7;)_OOP$o~>Xy7|`sE(774N=Zz#WOZ(8E|nn<oAxY(z%+4S6k^S$t(Fy1 zSi$$4?paP!o^XZ9_ASq$M3N5RpPI#SNqD?-3}UkLD`vcBD+!dufQ<_Y@{4x`j2n!A zkYZ-pqfT!#(%A-m4^69|9ViQ9HA4lz8M#pDBgMCfdSV`baF(+wy>CHWzqNhab)fp< zB3s}0rIt#4R?AN_x63_%yZ!FDDo>4T4#Pkk&E)B-p_4wk9VwK`J%JaMA2PjdK1u2G zaeaMG-uaVe8gOoOkh<cW<^C!{!svoIejiMpQer#I(5yvF$cG%wuT0pbO$R)sX<Mf? zaNBB}kj#D7a_uXF*d|9idu1`1+;8|hGZDEF6HZOPG51C694Sj|J)0lhBxxLt%FAD~ zB{`wSU$6$XM(@wAXS}^7$*>>gs#8?Z(z6;bf7<{jssXNd!1*?EA^PAXEV@%}Vdk_& zf=xg|(SDNiHP6qQ%VlyY9jBj|>3wWwC--#9vDbK)QQi!FWlVa^Q7s{;_e@Db|J)Uu zE7Q@%;d6E4)%~CAYt2E)YbSeFGOR^8*+N)gkmSpJj@o1TL|PFp{}=1s8H-*T$Y7Dm zF3LqGr_6a~IT7$ubO$LkQa=o+{5l+XB!n|IPGK>rg)_uq0WFpQRKcbbR!AQt;N*sE zdOt${fKL~~{f7Rf8}g+PgUe{vt-&49eqMVbWDxP=p6*266plLK>SA{ipvAW7nm8zW z^fALuK~&kU=UbzVG|%Z%hana&!RV2OS!w=6Rwzu3UN`PUP@&Kz8|$BAE6QCxspjaR zoNPf{oBYlW<S@0dlAqHgFJCKKz}!7%J0)5dKHFA4Jdxc7%91NN?TkxAgyx8&cXi<7 z&LA3DHqQ)qY~S|jAV7&~?3Vje`qs$np$14RBXv<ayK+T~JE(AN>H|PCwQY)C!j<SI z-casll~^`-wX+9OKWEJ!LN~{dFe~@0F{mGQCYJtW{gAqMwqgCM<FO_DZT%r>Dn~By zG%|<}#)SqpFCjd+2qfZRVUbAPcSoN+ocw*~Jx-G}Gs17WB>P4(=M~JDa9)jKj1D@% zxb~x^jUjmI@`=!=Gf=#^$=)+uJ^L8u*LvZD=BBT=-AMvOC)!e!m!9r9)}85W;beWp z>npZ$H9uUn-SKBX{ERCxY-zbGC1dYsVw_#;6G$GmF-Pcp(5e42c<EK|NCE;<UQ%y^ zAh+WkXOZb?1}%%xaS%va1O*=c-1RF5?Hl#dEP{1lk*lM#MzQuaYp+_#o}Rq>qE@ZM zq3ZL@k^Ddmyt?R4N;eTp&roOZP>fhiSo|tL<aGoD12##!ubOY(gh4ygKfP=^x?8z? zE)n%y#q}~own1ExW5-KI&+uyiFBHx_>t23*e_qjP;`fV21>nq#s**_kn&v&6ULj0U z*G0IjZ!(Er;DIL+f-0=^9^8BNq*TG#6lMrfa+s%`Ml=231?p9E>*w;jOGKmqHDfy} zqV9yiN8c9F21JhRuOS>sgw~Uq7|r~vRsdoKSlu`G*L4(C3cVroXh$Nl^(PF3;o-HL zPo0=h0u?Z+iGU_XeY!V)@Jv#8B`xKi7vX!4&iF(}zYfV>G&oOFb#!Em7xvLr=>B5{ zgM8H;my$g!DO{}&%fW###`IYt0@kZ^vw~b38P7M}gZCKDpfY;7(dDkbhtL1T1rT~m zM~(}pq8%FJNcK$g2hD7+F*Hzd20+CXwW{nlys&I|{9R&r!d<A>>tSW0s3RfPyXEC& zr`yV}qc|dC>rfj^?%D0tH|I`U?YR*!+E`}~pXgBY>v=){kW=DCBD0a#s2(I)3af^o zzMpqo6X|Y(fkVwrooV!(Us>=<!$OA@@c_cUG`NRi@~yb&@~uh@`O!ea*yM)F(Nzx4 zOU5!E2=<D{zf7%;)nrpfR-|75y$-NadESD#Mk)V3K{j!LwmU1&a(zs^UhkgnxGC+* z+B<~QTy9c*w^r5EhdT^re`vx5<<nL<51IYLE}3?OuacDo5rj*9mz|E<Q#~K=971N# z2Oq`9^+;85@CFc&*HFBT%SjhL*Z3jm*o7OV&w}%kn8-BF#qOrrgisCGuijAASu&ZZ z3d><9@@X6l#jb%donYHQJjp;<=`wjbyn3*Z+2ruexg24@E><(s$XQ*sZQJMX0Zu+v z$*{cS*&(I<C8@(k+&6>F8o4DVbNb9}sqMql`oG-36rDPn>_BxnBEEXQ)iu;Igz-4u z9zpbx%(YUCvXPI0nC9v%>CH6%;&Eli425zpM^VlSX?DcYTVoy-uWNr_+_-@Ctz3^e z-%T8CR;Cfd;`ybg|BODzx1K{@qg+%$6K@Oe_;{`Oy-ny6oU#Vj`03jDxr|Sm3kh}e zA$g(ViEwl$>ZCzKb=#11$5wU!_aHB@HveCOm;aBY%-0?UJcm($*zmuuQGogY*k`t` z8u5Rb>h!#Qoi@eZ#KD(Wc;snR?S>eigkJ5DFh5h#I>NvBZx5h=<?8PwQHEOqT(&4x zzmQG=|4VoDk#N{k2uHM(HpP%_P(I7V8}Vx{(eW{80ki~Bm;Kj|A8FdiyZHEtC=hv> zh9=#8NmI5Fb@F~rhY?`b-@4w*XMdwlaA+(9BLFq8`0<57H!eVtkDq|Z$~6AY&_;Dk zlR}`ENg`{S_HB<nXH$2Jj5+#ORbUTW=@V{HMOFARadQDF{GSI08GuBLB&~c%jrO6V zWYZ?Ub!l87*(IL@y_k3OOxtk{a9ed$+l)-Tb#46aW<YSC>nVA06;N#J%a*f1UHiOA z0ens(Q!VhH0E5cb^(dbjr3b{NrhG(mbdS|+^!)aBb_~=0p*Q+M{#RIN|7AYpDiBOz zb2l0ZD4YO){ntI&w|@MOveb17u=iZQ3E%yTAeXW-7Ozi_2_(P-ieeu;0TyEXI&u@C zUXxog>QH;IV2owei(DIc!#?B%9YF^eP9DE;XK~ZJimN;hPqFx6)L)|~kVgn&S9Bzd zIxeK5IunR}+vvbVLzxCOQT8AY)KIOnXtVIqeved14Sqyf{7@2}zr6w2Az?aTVc27{ zKl$Qg^sD+PHHD2zVm}B0B-kfrnSL1rShdts$)7Z?^xg$9a#yc>te;h=fuJYB2ex1= z=n4LM1kf3<QbND6DbD%w5o(suYO2{2IqANTEomo>_%CGBcU1$T1d;mEdvW$g-y9P6 z!efHLS&OapBOq}yia;F!HSXI~V_k6F*b&u@)|C1~XVFrtNwXfbBxcQ#{1Lqypn!(U zzGRWbZ_)sF=_vrIat}F{5#16`*<}?unk$YuHZf?R!C3J;k=*E?oYae!ZdBdMP3lMN z8YB?8D1<_&BW+?8k|cA`5MB~BROK!S|A=S|?OD^|3QQ;{8{$&5nYP7bDSYK2u(y}- z+2)Ee5$`jsOLC^!DAYAXA(U*cDx_yIS#Q!8Xl=d<p)!r+<wp!=)NA)8ab9!e-;HrB z&X6GG952wr>J&0Z-%Oil*aMPS>Wb8}#x54$6=0t7u&Oa@z&)dicPtNB`&H$mstjcy z8@DGeiaLaRUK-4pV$nJ*2-cKoO?nmSo<2g`&+F8pctqIa9*Mz`$mEkYZ^ptMsUym4 z-@ycWLaViFx}-T9_$0%!LP!afSY0;|qAq$`{oREgr)dvIb(uGCeXpBan9H<6QM+fv zvj?$n)S*w#8|QoF*UEhe(9{4uBO{V8c|HkhT`Op(E7K$sD?nxd+o!s)kMPi<%^x+G z`sYlvScB3Bs4vq6bODoPbOWf0;?WPwck1J@G`P|~?b!K+H)}?8`}7CKrNXO^g&>Fv zw4ovXjf!z{V~^JW_-iKN(m1;Lw1tK|D|s=XO@~i7#sFnR$32>9W8dy=7v5{4_DE2% z)Ok{?sYEu|adx9hLU{7h@X`QbD0ee^6Wy(=$G`z6LINW_@FGrmLCIibr--vbostEl z1^;aOBkWyA4dSg8g>9ZG$4BuNH>eX!1xg#T-LmC?xy#~{kmN>+uXwh})7xQMphUT3 zIXg<Yf(k$S(8gl2hLD-ND3n?BMG3v~APoh=kPQU!S-Wm$L7OtZoi=El0Z1GqGnbr} z8aJXL{W0U39oE4yHYbM_8K6>0o|-sg_2lp4QAL}rVluRG`xW||USSk>IK36p!8FFj z1$i7<C=v0%uSw=Q|Fl!&-Ah^)$?q#6m>W9ZSFlPI+l;vFPyep9bj@Eml)i<pYOK5q z3jdJjxDkJPw2ZTDZL=T2R;2zKeJbkq7<<&{q?#k$aDSQH;~A7ukJcpEv3|)pj~>H@ z$X+emffLjB%^vi);g!WI`ZT)C8qBFt9|%Rqq1Etug-O0*WiKAk2=+wvMO0z1gMUmf zbIn~I2Z4pRR%n`yg4H$fHVqaJ`<tLhvf%z=S5|<!j^`1sz^;bGs3E$IYWla~aHfJ7 z{{V6WR>mZ`t1}{iF^Q%JiPiteOP|bTzu@%fFFbdEKV<0sQ}EWGUOE-}_MyA{W&DU% zgO;_f5W5rQWGHpOHcSr~=L_0hMmg$-QycsC=wL~@HEf_>uMOy>v|h6CEH4m9R!NWA z{3BjXHa64!DZ{rHt}08q#6DTJtti}WMgN-A>A40`M=XkN;#e#9X5pS;ZsTC!k(OY0 zm>3oB9%Um4!e!7RO#5#w`8S@V<oPRvR%O7dmB`q1ChPV%hCZyu3u5>t4w%SyZCv9y zX)~7R;I+Z$JFOv;HLTJ_#-(x~KiPio66~<q28}G9`(o{_-SfhtAacJkI#dN`g(-@l zvw&Vpju|j}-?@B8WQ~h_FF+2gAtOB^TXm{3m-qfXaxOR>@U?ZQDOLRBOI#p#;%0P$ ze(qGP;kJjmQ>Rr_fv@<1USZ!LG5O)6(WfNGbp+vsK=Ls)aszX&BMtaLVfn(d8bbVr z1&PtY&IfA0ggR6m{iY=vAg%00UbQjB_b@p@V}gL!a>{|+2sO5urvLeZoFO8Wg7;Gh z4LyP>Qe?wlRR^SrZePzt{*aA@KrUjsbkig_n+C%72qH7V08m;gA&~TeQE;uMjsbwB zUT3xLGtEaQrwIsrS`G05Hg_U>@5dp_Usod{shguf$Bz8vJktbRoS(ghyE>LInMeNG z9lj>`dkHEracK8R&nREbj&KbT`5r*`*He6TV(tDaa6SA0`R1R?-*OxbFZr4QcU_Fh zM;C=Ls9k=xj9MkkBiHe(SjS1_S|ByvRZfVu9?EpWwC}Q7U~8L^X2<&eo~vDkmR5Gm z0_-t@rO<=Y5KNxQ4W+G|34S!3lkev^V%Ei^Ve<unhrtc?-*Y2=2W4ARWsJ#*)!q<X z(sr=yz=SUY|A*fl{q!>~V+DTbv!>gFOz!yjBIiv~U+?re|HG#nmkTaVZNnU#`YNmL z=8q9m?PurD$_<67>NqPX*C2eX!XD-9^}lZ{zs#Pc^oC9TOhS5gexFKJ?n){+7(+Hj zel0A+IOxMn=b2eJkfQA~iFG^eqH=`j4}Q59OeOHoG1EYCcW|?{C1E4;T*UY0g;b+t zmn?bpREIeG{#(Xe_n2$jdv%g`=qZ81O3sH^*Pailnf^X(IONaM5Tz?-KMbW!{&L%g z=xX<o{b_?&oN#^#PwDzH#r5KCpO}3=vro&sy(bY4jM}%bdCC}twU(evqn**o!d3(x zuX#Z&uUU^64mDf3L{5FSK}RgaTn0xC<8>|4BAUN`2n{V=T=Kao=KR^dlCZ1S!``{q zc4SvDFM#ber$e~!704UY=HwddBmvKR4v*rzMDInoUZnb$Oh^7A`C9=mU2sg1sK`D8 zrQG|F%#z<H5-C+}=f^Z-rDE|PuE=3p>RqH2<9?F-b+E0zD<S%>RmbZz*M~F3$J$&e zkrdWUr|D$Q-VYPMEQr+_xNr0CIp`|~CeNr9#7*w;V}QYHS?r;(d#791fed)<kw=vX zUruiafnV>D-^;bpHH><seX#~vJ+H}Fo^H^5rr6W-vQr~PYtFc;Jf}7YgYkP;mAm%M zeOCrHzTg%l!=ijli(<twYnarxB(!RtdDfcKIA37fpM6V}xq?vdl1k_^BU%y;G38M! zxszLF(I=StXo!CAIGoYuFaL{97EHq!>k&)ZgUUcwN5N{A&DUZtuyy<GBA}^!7k2mf zqQ?=Sl}|Cp1AnscFZuGshNZf-hJS;tmtK|b9g!B{ddKvRr9CW|IJ`yfc0@+z__ju) zVMCR;*CWC?#_fmonyFjm-<XYCZ?)jlvxm&;B}sQZduHzb)LOdPM(uD{U5vkI+lP!+ z<!kaPhnIhKb9x&4rzWHdDA2>FJc$<gw>0hYnwm$bpl+I1!E!jG+o)3*qkPyZ6TDUr zjvJ9xz56D<a~vCth5$cFc_cYc#oi3h=X^C~8;PM>l(f8Oz>?O7#h<Z@kXT|A0#N*X z6vO}n#VUQk0bTSwe1Ba-7_-C)cro!u%#Scdn<N@<Mqr>==qj!L5qtSqjDhc2D!0vK zRHHYb);PQp^2;`!t<Rg34!QATXG5xYS6=ktk7+#Ad9m9}e+rb#{W?Bmt8;6~Ly}ai zLNO6@u%=W(to&E}ch93EfKKJsj+|OMPD@=&F#QZR`F!U`+K-HqQt6k=QAU;oYxTHG z@vqhGT>bo5oN|aGH^NMiXA6shUtV;zacTRi-+SDvF_OfTKJ1gc7i0sU3(!hVj83S# zto{53RFks~XG<+`t5yA7x;I+Mf^~u7*TMLakVqh|6oqtXl!UtNBO1Eg7Z5&vzdt*A zY4_4{JLgp_Y$yE(Y+y~FPKSk2GpYyZ803@(Evhh0R*YrDWCx)XIh}6Gip_`s`~F>c zn?#Erd<qeus=kN?f1Iy52vAH5HXBAjo%fts(GuU9Fu;lgm=1-i5<Vph)8npiKJeSW z22D%J@o!F-8!xfyi5N-i>{F|RbS?3oaRJcbm(6BT!5k%^V4So-FGqT^fx5D7`IZ02 zWZ5U>C$2zD+WLT=B*y4JiV(vm|L4Dp8>LnxGHY;Q`osG$J*HpgI4a0F>wA4#I@Wvl z2hPK|nBd8tgb)L@Z2oU>LVp;vVc+Zcbk}Mh?iW#x-n)Nu^&bZgIbH%};8at&j#_HO zeP&JHw%LsKdwWxro8opN542k{y}a^;HFys>il5DtYq_yncJSB7@mfmduC1>puH<}q zaCo0^Wvn$@GVX3}$oY=qQ#jQWWc>Gl!o5}dmeAjnO`C07U=P1VxH+0DaduJs^8cPz zg?naydJxgs)@r)!2WeEo^u)d;xcZwL(sylE@#Z1VIrMlkf2vleFQbH-@95L<L8p&b z;+R)LP4d`${92*%{8spf*YAG+mp}<0xB=+KCajgmtjxIarj}%QHRfoN#H&w-nqP88 zlF|GoWc-a$qy%qD>i8D;L>K@#`tZdIoi`OdD2C#%hUcQ{c7Im}$G;2DtshI%3)noN zhEai+5`6~`1`M%Y3>d`)gM)DVbm(Rls-qRk);<nZb`^Ye4P789X)GSz)Z~3_6Z2Wi zS>)m3_qeM9V9hSlT*&!bhuy6Q65Dcw=V{LPrr6syYYq9F_6rGhD1ZETX^LD+@V>xp z<Mr7fnCUWEmcZ*&4K;zSy;c702mfEh%>gjTBInyrO3)Gz)`N7;%CIrjL&K~o3it%z zafdIRuhJ3KIjep7<c~?UR{pR@pVe~fU_2oD)(2=L>;7hbc#L*YydD5M7t(OIi0A-Q zZj8l7LPJy=Ekj;kRnXfAxh4~q8J_pq>qp_1{^BN~yG1zZZRkCCJ#kCcJv6D+p8w6k z_89I`%d+Wmo6svhc{{WtA~x4`-DV6CljFMHwEeKH{vCsxkjh2SgVRvWMb1l<&365+ z|NKt6>+8;XvegfvD!=`ZeMTJng=;!zHJmULSI1llBg`Pa)FRwTLn<C=4=1dq2?ikh zTZc8fgB#f*8tKDEKYGKdzE8PBnOvtD8Z0KB6oyMHJguU*ZD*lMi%`Q3L`;+GO4Ihu zM2O!h0&Dcj*%s6vXkMS0vgE_3lhR8eE$U>^LQh|nY}h3qCf&fBIf8`~WzW@1)R%d% zjg?!#xL9Is(7&L~v3$COHz}+spDyOt=Y8HhACx}d)rQ_R_2^%@n@JNGpiQDLLLSo- zd`d5xcl`2Efg6ZVqhqL|%`e<btsDe-h2mNTk-W?LWS;AaP3$Oh<uXt3->UoaxFplB zZ<}Unnwhk0(aCKp)Kb%I+!vU#jZDcMb0I;qatjT2v29Y^m@t>bbjs9Jl)!yuDv;bu zQ&dz+as$y6#T0?(w&u4y@B2J|ynj5O_w)P#eBkE3u5+DpuJ1Y5xvu-100yKpqo$to zmC{eoVi(u1N(`dGp-Q87x9#r*XclJz<1W%@mk127S1GVdj4MpZBaXz;Q}fr6j@8=l z{1L^F=*B3!1E5q*PC=HXe!{l{e1k2S3<7ieAN1R2#?vQP`}z=nfhYiz=>*f^TA&_i zeL3q&?Ln>l%#><iR(@$`N;MfjhV3ejI*n`-22;4bSPOnzKo?tMk6+_mw?mEGze)W5 z#x|0FS3<sI{vjxH$N0+)5(mg#nzhUO2yp%lgDKA5PV2p1Pd+Xy<(n9I!w8zlx5D5O zF13uD)-UaYlba<D#$(p4f0K7w(e`_ElwMRp9G^8wU`MBF5`f2KA?x|2q~w3nmZh4k z=YAm5dOp)azmdu-yVK$b|8E-zNQcX2hz3Lr$t)r#UMS{}dBbo31-qJa<2|moQC<TS z4Q)_#0B5Xbt8V(6;*aV-L-qF4Cn$g%%MnD|V7_q$6j{BEWKVqE4!&QVDH+L$F_+c6 zC!p?Y+R~|0qmIl|iUAgxR>3zxd##QU;3pD0P;Dv#51L8V$UuN+4qay#ygb~z<|^vQ zSIrE1p~*a8o0;g>(^#063>vth7d0XW)r<7~A{OSq#G-r-DUrsD7v8&lJEip;MA47f z;HYP)9@Q5I7d3hC>OT9d%=|5j*JqL2_Uq#{L#jd~!=9lY<olYG29S%$!)*%mU)(!e z*A&?dAY%2T0G~v~j|F=t`$ee!cPv0EmPx$IG-Q1=Res0Gf%<KFP*TU}hROlrFmgYz z7Z3-aZDe`%j<}4Y|E)N(>DLPEE;3FIu%x`=Q{<@s)QlA%Rjc_-YyAXzf4a@npgGg8 zJbjMN8Ugfw@!yooT~XK8H)HZ&JQ-Pok2vW?jhX8!D19BnpqZ)92|Xp-u`8Ul>iUm0 z-l#*keoZP?+C!VJmKn&n+AfWhf2jf=g@#c+MoraOd483~B`(k@1^Dt$Wu$;yRb+Dz z*(gOITcgRyrTIz!RLWZL-j&_9c@b$HufEQ;Z%n%FvUhYa{w2)pbI9tqTGW>1S_rv) zihl8LK)LOqksOnx*<<-nMA@V=rFA|LK$(B)P$v}WwJQKH@AX;2kROBN^yUr&oKnq7 zNY=!w{DS)~a6~1f>Foxj_iw+mW4!4K;*5ZQ^>8irw~HM%w?G3HUnEu0*Fo={e+!UE z@7;idZ%pQzSH=RyqNX14ijIGe_HGi-H8!&P9OpD~zu>Cv0Spbg#a}u`S=zwhqm-qu z7#y>@=qH>chRg*kuAg#96c)sdR*~~Xn0GCCnV}uDMe>XRn<ilx7}M5QA!Gu~_N3+9 z{Q6whxX!~5-rck#*B`a$2QRA&>PAe0F&ldSe&>}C`C(dUwZa|&g8BQ7zgsK}p#qx) z5~3s{-Y$L!E3FPOqDegv<%$<<>Et+*U`sGi8$uYO`^D@vpQ%;NVl$55RYoiUKj9L( z_OovMN|vB@EIPngVT&MqeX`PEUeVq*?m*f90qL7>#vBBK&Li~R_z46bQNtEog&6i@ zmkol2ns2eEfQ_oZ4a%m!tndHrQh+w<Ey%&G|8_|LM+^9Rvp@ZR&E;kz9N-CrY}<c# z$BFO1ye*s?hsl;;s0JMvvN>|$$tv)`-0%Omxc_dX=FY;eqlNGKUomQvaiGjrmw2AW zX<BGi=~8O>^c`jV3f>`xG>qCP#&rx><ZT}IeeDs_+}|YZw(J6O^Nz%>%@hMJrFww~ zUd=pz0FdgXp8*$nlb|?y`03g6nTZ%?<9rLdX=N;C;X1HkcYPC7Z}6swe-(VIy7>y; zJ!TfrgStG>-oW3)mbQk+57g`wP&VpjL~pc0fU~!6@b0D`;5GoRLy+kgJ<2r9rmuZm z?VD`to9fc0AYUf*<eBvJ2yX1kH|og;U(KsPq2BBGYf`+M#;gFuRwmQV4kvC+u7{FF zW9B|&TX%{Fq}EiAsY(S@oZyxJP)*#Rm2P*fSLe@xzsdGdHN;6D^o^$09J)D`muKu| zyIv*q6tN78yRu<<rZ6tLX=c^TKdt9o_lxgVj>yRcGO0krc2%IgdO_ie0a<@Vmq&>U zZuu>|M|&&slR)%B`L^V?lMb1`3^q?OSBCWK!(OzICifkSlhn;DBnhtv-M*IgLiqlV zrzBn1!?3Dv<UYYS#@lI&jC<E48TMBol4;W!w8&=tT?$J0gFrIZ1J|A)i023AjD6SE z(0$xJQy((4C^-ua)k8u2)TtljZn|B@DwZ|k!0Qv%*zXG0b<VGMtk3yO!j&{G3?~%y zwC6=|!9mz5&XfYA5uMaHEv=)#V!wx~zr1vC65yK=83Jtq*NKe=_`u1a=E%f49pEu7 zMj6%&Ki@nQ;~7h~(*C(R9ps>u?(8!%m$T>-5(7iEN(N~W+VgC*{Y#UNd>rf1<a5|W z(}SS#<pP6l|0dvoUc_`AyJpHu<}2-u%C3{n(NVjn4hP#Bq1Anvmcao-rUCJKt;{K? zoSX_Cdh)n4$GCGc5-CN-9m9h4fm1$=hftE#jw?OgQrDIeZ>=8aG&UP<T1c^rot}nt zzB7HjpsNt<8)bD_lL7|Zx+7xVpXA*wy>(`|4A7o&@mLFN!8>X?ESh5(TTPB7r*K;* zPOfi$*|fsK5>YR?q=2($k!lqhC~<@*tZwf+RwX5%e@VJsjl8CC1T7o))EXCcwMf-7 z(^30+9-Zqg-n|mBIFc-WZlIUupUoYNcXO`z)tj4cZuV>rAtx7U)O{ZLyGn0lp9-74 zc1PN^ByBYk2LzHyD{hk?$-+jhiMl?8{m=IRdY+n`4quQ|5t?8oKDnbYp9Yn?-iw!@ zHF+dG3lLs@vl|ru=%{^l52m-^oZRmM@+4(XYk7JorE6*VV1+hJ(N4g*IjFB+JC4>R z-**=uMmHU*-@;sNBiO%UEr8nGyExF?`DS0W#_>>VV7a8_uSI!j=hHN^-L!kv&Od$Z zC#K4j-hLPB8?&lX3-<4zz4$*s1L53pkn6%&W($71rcM&w#rpDr7W|p3lHV5p)P^E8 zp-J8+N`{LU*N#?o|I9CGJyMp$XELCq4*|~e7c;%i{ECjL#4gl<Sp6@;w0AL+CqZo| zdT*>-cz2^o$@lnucR%KS1m+KMNe)U{-1InQ0puD&s>}1j7!LSYR;o-6nSOeX+~7?| zI=r!0@+xLwY$%?VI$!3s8%oN4gCnf4@~W`iVtx~BIG0E-trgw|T9}icXg28+XK7NX zBC-~)I^byRobPz#@sN1`+!)IO)`A5tql@F+Y|xyj;#K}5keGZN02(LLSsMkdVp@Y6 zm%gli7P$cLI)_~KS#fE_KuL}(zvOFrh4!IL?#vgT*}S~Un)=}}0%JFnC4%@k37j6$ zOF4c1pbo;fE*YQC4!`4Dv=QL_*<C()(PC4y)kU;A72tz!P}<A-bR74)Wo$|c#wb(` zMt~2k3+(#0f&p{->B^`P&gF>45>x#gQY|<q9~_X!AhH5I<hcMf%3c2e1M)2vVyPX` z<eh~}NS+|T%f}_hT4d_P-Sha(^DnGzxT@Phc&#-Ch=rAn*W6u^U5n{hyLGZP*VjE{ zWId-+c4NK}N{WtGD3sLOlD%+d3hp#BnL9BrmWCgXEQBj%S+<${<js7gIwg!CuoP5_ zeStI`k*dK&`tY7=g)OIOz$R*Iw5c~6@=l}mP>3fCVK6&jd_C+(6(a-O^2`S(H%2if zHse#qhAMoN7}b>QvN8N{<Lvs9y3~fqv#uWy@3yBQBU+X@{*5rn5?M(cBnYw1$bKd= zw+&65M_>fkmRrlk?^roA{4-X2N3Al2&R#Mq|B6<(&47V=E!A$87685vO697lNq^g| zQ`FO3Vb&d_-H8tMnx8+@tY#yAkO$Zhs~<YFC}|1?L#gYB*G#Dgp`^JY<BAA3OoQRv z0E<?Vrm!Eyzl9+_qF>|w@tXH!E&6ff8vrW$ljg(vwI4QMi%nb<AD3|M!~~VDESwZc z<KH#IRyg>AU|C)k+e35TxG^Y-Ge<bJnO|DrRjyOAt9G?Aj<4we;9aIV*(|t0jRMo^ z{6h2K<<|PXT~pPGkE61~=C&i4mF8(o&EPN+9#um{Z<34D+ma6dD>^rWu2_~-Mu02q z*RpYh9-BE&4wTgyGzy2Jwg6TEh&Fz)g6d}!%ZB2q+F0uJPaA*G6%@<I{qUpQ`vn61 zHsGiZ2j^zd_lYkK^d^x>T~Hv=gXZ@jN?pC~u5vj!5)gh0ya`NhRPcrub`$-7TiP!U z0ASudHP6x;3al^xn@QdXSOCU<-WjS$nTuQ*jfh}wR7v4)kk%BtN{s>{1QF1k`L8d= zS23Siy9x{g@EiGcSU^}T^-B8w4ab07TurM44X6kVui-Pk1+rlM75e|zKfH8M`jLzs zUgv2@gM?(PIHoJTCvIh~;88+2csS}|hiab2<f;j}t?3)NznX!8Z2!!iUw<0?{odj$ zQ~pWjP2f&p5V9M%DhKd#8*OoGyp#3kB&RCjuMAc1jav=<y@Asjfa`M?u~<!d`(NF) z@YwC0p=OOz7URL7cjty9m9ya$#lGKzIgb-C{5Gx$fgZB8aNnuy(1;`_XLX(NS=WeL zNsyRu)>r)tAt5b}%U&VCzYWsJ64I)J>bgH90DG{8n8^7&2QjUE$dxQerisN=^11|K zsu6pnrctkmE}CL05EZa{&sf)8%3}|9EkBH7gC|tSEC8`y-O!DNTPwYT+V*SP(ol|N zv9Gh}?I=?Nv~(Ec;1N9*JF1V{gRJdRIS-`!>L{HfL<MtaK?D08e#Q%r0F&?^<QgPV zwhC=V7k0T5;8$k}hoGT_w%@wuUs2fxB|TQQN2ap2Cx8G|u#*3~OTwV$r7apC;|F6W zh^M~Mf&w|a#(B=$h`fMs%x$eSiZ9{Pxj>+@-2LC6lLlI+8$bhFo6Ui&*p(<zhBq<p zM5$?3GdFt8!Y6m0m+iH~2`Lt$ka?9)J*`$waP)B1GH179<@rxn8w-#mvwVdp;0)gv z=>el%AJpD*S=;c0;$_)i2&-u(P?ICy69=t~`{t5wiY^N17Me>?#@wz@s!WI5g`|zM zCenh^a1X{;I+5;huzIrIOxP(v3_W-p$kmEfDx7`;$%{EC^o+AJswhz5?#ZJ8yal9t zBKEyCq<g)=<KbPX`ZRkwPA&MD1A$C4ZOs70O*0xVMqfnJCbcQ!xyw_B1DrH3HBeE6 z$@|)rmr{oBj6St~ZuqC%o@R8Z30b-hghl}ueb@Nr`PKW7y9%ct-u?O9?IrakSpJT4 zEJKUaj@aV>QDppQ@-&0|wCgOA@v&n{zU_g{H`=xYU&)*)&iID+3M2~N?QT-ssBAkT z-}Pbhe<HQwvxQIQA6E~8r`@2BvcFYcJPN%zh<$6;$uL|XbUg$ObY`DLZU@1BeFY`$ zM***nPQbn&wNw1j<QMQKZ^ao_#XVjb$aV2g@Y>-A`j0WsfW+Z1vK83|YIlSz1_|T} zxpfe?hu@+y89tp3mpn^{Lmg{UjBwQ>s+WNYbbe#*B`P#2or*mQ<E6FTq>x?JkQP5* z06A@GJ)3T=)cRmhI;%XKVDljV&vWVO2{7RjV2E4%X*f-sv8Pg2<8;sQknSy$1uQLf ze%%P;--p+1)IfGz)@W5gwCU_R_~ApW3^mTU6Q8rh)82yo<}%H*=HbfWocayHfJ&pL z4`6kUbi)>^YXL`lrYmOst;j5aNwu^?GFFF98MDw}o_Sd-4q93_lDhCi58w>~kusD0 z02lToY+Z6({v|K=<;UzB=C2_cj-|V_(J9xO-RJ=I<IhBuC4_UB#&G>b*w(nh-1MW} z2LSh|ww*wKv(Y&O!sEDFwolflM%w!ev%B2)=k+kxvVYRG`nU?92C#6@qHpzfU;-%O zxz`C9V`%WNdHnx?FrRE`l4jmxx7;U>@()w+bsIo|^ag;uZ(|vVoluY#MNjYff`2F9 zFB@vRU&-sin+t#VO2PU<1lI9y2t0M*(^_`Ao>9*fGdJq1j{f@Za2wm}rzEhd629&3 zP*uFeV&?ijjsim_J9U8r!MN{6cH;gLaz}i9I;>z!&5ia~?Efc%2hE7}aV5f+3~(gk z1`x@~l>s}~z{g)a=$HMG=fIM5<7X1ETHW~kAH2*K4Q&sKakAV;>3K?(J@%c93}bJS zo4QIaC&1l4e_X}qXv4rkd0<&F9P>yazDZ@JtuG5$3D2F^0E=%x1`M$yvC1mt&b5M` zEhcqDnRXALq;fZ7cJ6Yu*(pxd5v!lOoMv3><s1~E_}In;QS*!!?O>GaxNLVo^g*Y8 z-8BJwO^T8=*tsA~m7n1!4BL+nPoDB}*(092<AbiCey>)#mdw#E;zigMu{+aKcQWS$ zZP!Off^^s^{l6RbV)72FM6|o}kJL6Jc8UVV!p~QedE)-ISl1(^YZXv22bMFL&{f$J zR~zNXSTRkXonGx;iD1i??!>1UTWUxh8bde%d9pZ?IfnoxnfQdAAJ8Mv*PudDRuhkT z0Xcn5P-F1Gxj_%N3<EZ^AlLE`V6;kj<Pq7JLWNlfP|uh^9C63^?`z&~&>5uEZ#s+F zom$pV*In9_)OWq06bq$;JxMw2>rK4H$e#!eZ;Esvt(4=AtbQg{Il)l0d70l{3U{Ng z`HDr?==JSSu6XvVp+u2RD2%R(3jf{Zil%tg6{UhHNlTr6Pwmw!BXvhGMCz>LE4Fc< zG+HPabJG+XQ`9hQY<|P~j^a(c2AkZRcNp;?>k$Dyac7<*`!i}^M-4Iz7~PB_!8pGu zFweE^p->fatKatS9$a~uqHn!b$&GqpI($?LMJ{`H#4o*~?v%6A|FFf>*%dRiJ<R&F zr@U!@ah_yR8A{wAHhhCuGZCFIoRX!WGu$)#f-#QP%VOWAtOX}tZ)%^Yg4H)^_+B$_ z=Zm>>Po4?-SK3)cBMI=8PmA^4{XzV=686Ulr;e!<>yl}=G}CB%#-dGe$%M^R={!&$ zxhFHB)e5E>mKMd|F77`~j_y`2tdmJ7OuoWFI%aQ2LV?k-R`4RowK9-8b-er-ZVwo6 zTYh<@2$wX(i9<(#;v)snXTfo8Zd)U^Q5)8?ckrHMCF->D6$2Bd70<iKY!1w1Cq`p= zri0obTDL7yGvCVN(8C&cuVWV#f4s>gMTA*8M(9~&6bed-lMM(H*L~2&jWJU(C+~2( zrh&{aVyeI}dOKl_`>i(r=Y9TXt;0h)frNb(nEW??mO@UkK$-sBltW^*<Ro+vFMZ;g zyf*WD!OHeh@R_S#=BHgbCQx3yLn`?3975jEJF~0D93!D1z0%)38m3d7Y7fseY*`xE zsjIMsNu2gr?igm8RPN@gq8cjndsyx)mLwd_J8I!wwy)CEl_vOO5Ujt_A^II%?;3n& zr(ZI>Hu=f%2Pu8*w34+k6SaL0{KWDFs4DbnMcr7zr$MO(af;@Kl|1*51`B5`#d-O$ zpPI+uVhY#HZsCnY@~S}|6+V$L-8yPn9#Wg8a9N8YF9?5Y{ZV_{^JsN@AYeoIcuu7e z^zMRU8Ts5LJI$*NC!LPDUcSDLlHH0MWPta(YCb)o7yzgu!-S)QtA=PKbQeDsHXZK9 zYwQjJTbi~w<>fP2*L#8xnvY%v2;s6jQgaPNL8E9P;3X%d1v@z3Cv9cv%LQJjtM4iZ z#Om}g2lqI~#c&0-1j?EpW1rUYTH#wDH=<I%SgW|feB#b{G$A{%HsnIqO6#Glbc{w) zYd<&b4C_c{K60$iDM<cR?vWISl&EWj2N~^xM2sccvQp&kerVohx8G(yWVsBL*MJzw ztQ#?42YL2JG+>{tJJUQIT)_K^?NnWs%bu|6Dhx_j?CddN?PYNa)rB{RTFz`XU!$W@ zP}U)uD7=8ksFgi@r_EJoYY=nW#R6DR5gm-KN7NXkbW|f#o&+_|yXT(%S!r!IDmMq@ zS6H(4JWV7Mf?Ss|F9(ZcpV%<RN9uViZGYOZZ8%uR={GeoS0Gwt_cUfvCrGwuXEi!u z+sYR}10`Sqq>d98Mu0E7jUhv|RxNyvW^|V13W*mP+GY0Ke8m%DYTqInftT1LMpf9X zv6{|{Q%hJDpD4BPkwq%x;x|u4Wj(MMi0GhzL8ts{^NIANw$Tz11$#YC?)h=X_D@$- ziQ1-}%{7g;pO4JfhB)FM)euWq2C1bsy_4?_WwIPnjEi_~XY?y{^;zTD=%|ZSFUDfY zvp^@-N;}{fbwn5OikEA{+}<G6bu4qn?p;$ubGCL2kKbDC{f&67d9z@PrhuDWJVEss zDpE#WFN6}2DKDsXs@+|24)DCkrl<G0Bs}dZanK_dC<ky*Pq1W`maF{XwWmVw@))Z% zWZbjhjAeKCJznW>@KI^vputz|k8-XLDt>v*+COy&B;YPyaCgjdsU5c%mT3SvXFu*b z)C?m%@JmSe;Dwz2{O4Gz1K5lSI-Ye>Ir<PeUA`H^0NLoS8o89L`S!yJfk=`$l=K3o zswTG6rldhj4s2o9bOWn`pjXA2i!k$yw#UJZQ<{|MFr$D+wP%r<Q?^%mR{7^F7!zS^ z;OJQN!%}>Qi&)Apj}F@O*WT2zZ?iB5O{M+H=z2~F2c#EquU-2o+t?<gF-b}xY54qM z=tqNRCGjoF$@&WHUJur9L<ea8Shm;O5<Sk?QG0Tnb``XvaxE%a0{eYA+}BT>G^YIU zhMFJkE!7OaxfkP`6wciqF-fviF%aoyRf>kf8HQ;`Iu=8lNLYkp^+QLzA#8{|tI@Hx zbIaijL22oS1|JHnM$L~%mF^DWa^wBmMPWPwb!_eB;^Br(lQ_wED2?Pj|1^}1^tu|{ zc=^4VKl?$(?~CyMwt=_O2q~2GOWdG9Gtxf)QZzR5EVhL&9C{UMV0iS8qkO{YHk*ib z9?NhG0qKM**1_#z9wPW+*ezRakr?E$fTK`jLMM)fGuD0lK+-x81tpEObX}bKjdLOp z(!jB7TXoE~>fzS!>0#By28-)dYa>d*`fdW^fy1Wv-)z2Fo?W+7Kje1hgpH5#L49r0 zKJ@CJ*G!!ny!;a-+(pLZ9IU?rF0a-R#1BDvf$M=J+mG7JB+FWS{;Bws^fyJG_WUV+ zISt{EkrkADZ}Wuq9Uv>ZWe~BdqjQd!v0b+|{_KF3Zt{d=ExM6s0*x|vb%~#KsD5~? zYOWqBtIO4``IRkt5@0?yn3zH3{6=3*S{7?<7HHSRAo?{RnSKIM@<cXN{EJ7tUPmj= z4;|(F)`VUAmU^;&&b#rc)o3?$^sl6Q18?;qs|$G9%Jdyc_d9LpoIdUByc&g8flb(o zTyyf=adYsEtpFc$;AZF4>8SBvo+&!@TQuGsSrJXxu!n(geLpU9*qK^nl0iC5@NYip zwxHtawMrt3fZ&~9TgeU1<?^sULmua`eTmToVWANwj~S+$XNg`N5uwdnyo-3;(EgUd zFf&>V2AKB+rmy_G;<)*vzVk%J1PNgsu2*K_f6{v3k7#yy;p2GEmcdR*$$*<kg_oV; zl@=xyY4da8XNI+TK`?LEkdR*gd!e}v9;(0UGpW&c2R>Wy;&2@aFW(xbZ5eh!$ycd7 zsKTRKC(Of~@E#)Q@J|^o+z0HiLx-4iNm{wB*}VIKD35(>%!&OjjmXt1%T){indPp6 z9P*&n1A&sbqZuqFq*qnwC!<7J$)f%rL`WH_Cz2T0yep|@re%9Yt!qt*2g8sXs#kXA zN@{t*k(fnRyadABWox<MV-DT28(Jo@iCHKq8$TYkWSU4#n7gny{o+i>MYY<;;p+~o zw-(x|6!b+V=-fW91DdNZ7QEv=SGg|FlzwD#wz4zt4K(7985(`QO5r7p0>SL?x3Wzu z*@-#cQ`b4&*A@9YpyNl?=f_xQxU0%N!mxD5sTw>VvZR5HqYKpF^0?AP4cFJ{ujHQZ zpXi#q(iubxa9-wDo6GMJ-#a_Jy=3jOVOh}Vq)z{5_s*dr_yGRH@}trsO-VZ??UYY* zzXdA)X_L|}ROe_yDFPz0<1KorCY<G^8HT963X<2|7IZp8lF*(oV5lQ1V?OH;8-iQW zr_&c3NIbVp%t5sd`R^voyx!iet1!A;UCvG^U1MS~QKOTpezK>5waNp#+C^Txpr1#I z%myfRbB*{0>4iVi!kkl`YRT<3bdz)fW;U5mK@sx?_3158FYh$>45kT152qc!nk9=n ztyty)D(n?`NoJhvM_+};UeMQg(svTRe&g)@Upf?Rix*l<#R%<K(V2s|QtsM4+PT4; zEc!LZUB}N)FBq&kX(ie7p2EiTbJ*nJEbniwTvpVb^(V&evpty#<S+{<1CDVSZY9Jn z=$1-^VIQp^riU@XVlAx;3bN7<K*;yg@O1ZtzPZT~&PZ;M@Nr9R+MwnDvj%Ox^w83^ z_ww0((`0NyL(7$;{*Nl1`LB_zqlfYA3t96|;G-4&XGiNoM=GAFmyK1t(f5jQj86$p z#73D<s#4-pUW6CtG*l=-IXf8VN?Qu6U`47ZlD<2$YLKR0Pyt~)KIPJqOfkIIjz`Vu zoEg?oaRE&Ja^c(g3#=6rp)<H-pZ}%!bTdRv^C@@FxqXa@3$Fbc?ItcRst3s`y1@Pg zv9enVSkHIn{B6sHr9p{bI@GT!YbQi5jx&-cHKZRj(q8rE625bJBCmc62z;e8<m7ZO zfJvki^P8?c{plug7}$9F{Qk})kog{ui6|EvonPK|B=XyP;Qia=MzTJ$1V+eW50!KB z48guc_A^#r@}QN&a@&FM2B-ce-<_60-c-ChJ(&2%?3uk370__lL>pqAfiObI)>uS{ zxDpZ|otu~H*VO-7%z3wXSWi8FJ%T59Q|xSg^72m0(F^gTE`H5H&=LFQ3NQNQ&81j( zx_v}xPL>|BxXV^#m^>J?iy(P@ApFkBm<p@af!db-SRs)U*s_ocoR5?6+=wCZVs_UG pO(vNvhDfdkZWLmbQveROO5zEW8Km))ZOz6n&{Os&D^6Ux{U2fQUSj|N literal 72611 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 diff --git a/docs/source/Plugin/_plugin_substitutions_p13x.repl b/docs/source/Plugin/_plugin_substitutions_p13x.repl index 35f6c544b..b6a5fc50f 100644 --- a/docs/source/Plugin/_plugin_substitutions_p13x.repl +++ b/docs/source/Plugin/_plugin_substitutions_p13x.repl @@ -2,7 +2,7 @@ .. |P131_type| replace:: :cyan:`Display` .. |P131_typename| replace:: :cyan:`Display - NeoPixel Matrix` .. |P131_porttype| replace:: `.` -.. |P131_status| replace:: :yellow:`DISPLAY` +.. |P131_status| replace:: :yellow:`DISPLAY, NEOPIXEL` .. |P131_github| replace:: P131_NeoPixelMatrix.ino .. _P131_github: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P131_NeoPixelMatrix.ino .. |P131_usedby| replace:: `.` From d087c0e346fc9c0dcf1222c0e49ff89a048c3486 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 17 Jul 2022 17:32:18 +0200 Subject: [PATCH 55/89] [ILI9341 lib] Extend supported ILI9481 sub-types (CMI7 and CMI8, borrowed from TFT_eSPI) --- lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp | 108 ++++++++++++++++++---- lib/Adafruit_ILI9341/Adafruit_ILI9341.h | 2 + 2 files changed, 91 insertions(+), 19 deletions(-) diff --git a/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp b/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp index 73c1cf790..474babf1e 100644 --- a/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp +++ b/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp @@ -74,15 +74,15 @@ # define SPI_DEFAULT_FREQ 24000000 ///< Default SPI data clock frequency #endif // if defined(ARDUINO_ARCH_ARC32) || defined(ARDUINO_MAXIM) -#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 -#define MADCTL_SS 0x02 ///< ?? ILI9481 mode -#define MADCTL_GS 0x01 ///< ?? ILI9481 mode +#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 +#define MADCTL_SS 0x02 ///< ?? ILI9481 mode +#define MADCTL_GS 0x01 ///< ?? ILI9481 mode /**************************************************************************/ @@ -284,6 +284,8 @@ static const uint8_t PROGMEM initcmd_9481_CPT29[] = { // ILI9481 CPT29 variation 0x00 // End of list }; +// clang-format on + // clang-format off static const uint8_t PROGMEM initcmd_9481_PVI35[] = { // ILI9481 PVI35 variation ILI9341_SLPOUT, 0x80, // Exit Sleep @@ -308,6 +310,8 @@ static const uint8_t PROGMEM initcmd_9481_PVI35[] = { // ILI9481 PVI35 variation 0x00 // End of list }; +// clang-format on + // clang-format off static const uint8_t PROGMEM initcmd_9481_AUO317[] = { // ILI9481 AUO317 variation ILI9341_SLPOUT, 0x80, // Exit Sleep @@ -393,13 +397,65 @@ static const uint8_t PROGMEM initcmd_9481_RGB[] = { // ILI9481 RGB variation // clang-format on // clang-format off -static const uint8_t PROGMEM initcmd_9486[] = { // ILI9486 - ILI9341_SLPOUT, 0x80, // Exit Sleep - ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, 0x66=18bit - ILI9341_PWCTR3, 1, 0x44, // Power control3 - ILI9341_VMCTR1, 4, 0x00, 0x00, 0x00, 0x00, // VCM control - ILI9341_GMCTRP1, 15, 0x0F, 0x1F, 0x1c, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00, - ILI9341_GMCTRN1, 15, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00, +static const uint8_t PROGMEM initcmd_9481_CMI7[] = { // ILI9481 CMI7 (TFT_eSPI INIT_7) variation + ILI9341_SLPOUT, 0x80, // Exit Sleep + 0xD0, 3, 0x07, 0x42, 0x1B, + 0xD1, 3, 0x00, 0x14, 0x1B, + 0xD2, 2, 0x01, 0x12, + ILI9341_PWCTR1, 5, 0x10, 0x3B, 0x00, 0x02, 0x01, // Power control VRH[5:0] + ILI9341_VMCTR1, 1, 0x03, // VCM control + 0xC8, 12, 0x00, 0x46, 0x44, 0x50, 0x04, 0x16, 0x33, + 0x13, 0x77, 0x05, 0x0F, 0x00, + ILI9341_MADCTL, 1, 0x0A, // Memory Access Control + ILI9341_PIXFMT, 1, 0x55, // Pixel format + // 0x55=16bit, + // 0x66=18bit + ILI9341_INVON, 0, + 0x22, 4, 0x00, 0x00, 0x01, 0x3F, + ILI9341_PASET, 0x84, 0x00, 0x00, 0x01, 0xE0, + ILI9341_DISPON, 0x80, // Display on + 0x00 // End of list +}; + +// clang-format on + +// clang-format off +static const uint8_t PROGMEM initcmd_9481_CMI8[] = { // ILI9481 CMI8 (TFT_eSPI INIT_8) variation + ILI9341_SLPOUT, 0x80, // Exit Sleep + 0xD0, 0x83, 0x07, 0x44, 0x1E, + 0xD1, 3, 0x00, 0x0C, 0x1A, + ILI9341_VMCTR1, 1, 0x03, // VCM control + 0xD2, 2, 0x01, 0x11, + 0xE4, 1, 0xA0, + 0xF3, 2, 0x00, 0x2A, + 0xC8, 12, 0x00, 0x26, 0x21, 0x00, 0x00, 0x1F, + 0x65, + 0x23, 0x77, 0x00, 0x0F, 0x00, + ILI9341_PWCTR1, 5, 0x00, 0x3B, 0x00, 0x02, 0x11, // Power control VRH[5:0] + 0xC6, 1, 0x83, + 0xF0, 1, 0x01, + 0xE4, 1, 0xA0, + ILI9341_MADCTL, 1, 0x0A, // Memory Access Control + ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, + // 0x66=18bit + ILI9341_INVCTR, 0x84, 0x02, 0x00, 0x00, 0x01, + ILI9341_CASET, 4, 0x00, 0x00, 0x01, 0x3F, + ILI9341_PASET, 4, 0x00, 0x00, 0x01, 0xDF, + ILI9341_DISPON, 0x80, // Display on + ILI9341_RAMWR, 0, + 0x00 // End of list +}; + +// clang-format on + +// clang-format off +static const uint8_t PROGMEM initcmd_9486[] = { // ILI9486 + ILI9341_SLPOUT, 0x80, // Exit Sleep + ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, 0x66=18bit + ILI9341_PWCTR3, 1, 0x44, // Power control3 + ILI9341_VMCTR1, 4, 0x00, 0x00, 0x00, 0x00, // VCM control + ILI9341_GMCTRP1, 15, 0x0F, 0x1F, 0x1c, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00, + ILI9341_GMCTRN1, 15, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00, ILI9341_INVOFF, 0, ILI9341_MADCTL, 1, 0x48, // Memory Access Control ILI9341_DISPON, 0x80, // Display on @@ -409,7 +465,7 @@ static const uint8_t PROGMEM initcmd_9486[] = { // ILI9486 // clang-format on // clang-format off -static const uint8_t PROGMEM initcmd_9488[] = { +static const uint8_t PROGMEM initcmd_9488[] = { // ILI9488 // Set gamma ILI9341_GMCTRP1, 15, 0x00, 0x03, 0x09, 0x08, 0x16, 0x0A, 0x3F, 0x78, 0x4C, 0x09, 0x0A, 0x08, 0x16, 0x1A, @@ -513,6 +569,12 @@ void Adafruit_ILI9341::begin(uint32_t freq) { case ILI_TYPE_9481_RGB: // ILI9481 RGB addr = initcmd_9481_RGB; break; + case ILI_TYPE_9481_CMI7: // ILI9481 CMI7 + addr = initcmd_9481_CMI7; + break; + case ILI_TYPE_9481_CMI8: // ILI9481 CMI8 + addr = initcmd_9481_CMI8; + break; case ILI_TYPE_9486: // ILI9486 addr = initcmd_9486; break; @@ -563,6 +625,8 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { case ILI_TYPE_9481_AUO317: // ILI9481 AUO317 case ILI_TYPE_9481_CMO35: // ILI9481 CMO35 case ILI_TYPE_9481_RGB: // ILI9481 RGB + case ILI_TYPE_9481_CMI7: // ILI9481 CMI7 + case ILI_TYPE_9481_CMI8: // ILI9481 CMI8 m = (MADCTL_SS | MADCTL_BGR); break; case ILI_TYPE_9341: // ILI9341 @@ -593,8 +657,10 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { case ILI_TYPE_9481_AUO317: // ILI9481 AUO317 case ILI_TYPE_9481_CMO35: // ILI9481 CMO35 case ILI_TYPE_9481_RGB: // ILI9481 RGB - m = (MADCTL_MV | MADCTL_BGR); - break; + case ILI_TYPE_9481_CMI7: // ILI9481 CMI7 + case ILI_TYPE_9481_CMI8: // ILI9481 CMI8 + // m = (MADCTL_MV | MADCTL_BGR); + // break; case ILI_TYPE_9341: // ILI9341 // m = (MADCTL_MV | MADCTL_BGR); // break; @@ -623,6 +689,8 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { case ILI_TYPE_9481_AUO317: // ILI9481 AUO317 case ILI_TYPE_9481_CMO35: // ILI9481 CMO35 case ILI_TYPE_9481_RGB: // ILI9481 RGB + case ILI_TYPE_9481_CMI7: // ILI9481 CMI7 + case ILI_TYPE_9481_CMI8: // ILI9481 CMI8 m = (MADCTL_GS | MADCTL_BGR); break; case ILI_TYPE_9341: // ILI9341 @@ -653,6 +721,8 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { case ILI_TYPE_9481_AUO317: // ILI9481 AUO317 case ILI_TYPE_9481_CMO35: // ILI9481 CMO35 case ILI_TYPE_9481_RGB: // ILI9481 RGB + case ILI_TYPE_9481_CMI7: // ILI9481 CMI7 + case ILI_TYPE_9481_CMI8: // ILI9481 CMI8 m = (MADCTL_SS | MADCTL_GS | MADCTL_MV | MADCTL_BGR); break; case ILI_TYPE_9341: // ILI9341 diff --git a/lib/Adafruit_ILI9341/Adafruit_ILI9341.h b/lib/Adafruit_ILI9341/Adafruit_ILI9341.h index d95c8f3f5..8f88b85c0 100644 --- a/lib/Adafruit_ILI9341/Adafruit_ILI9341.h +++ b/lib/Adafruit_ILI9341/Adafruit_ILI9341.h @@ -134,6 +134,8 @@ #define ILI_TYPE_9481_AUO317 5 #define ILI_TYPE_9481_CMO35 6 #define ILI_TYPE_9481_RGB 7 +#define ILI_TYPE_9481_CMI7 10 +#define ILI_TYPE_9481_CMI8 11 #define ILI_TYPE_9486 8 #define ILI_TYPE_9488 9 From 0dd77f4b5c7dc9b6e45ee12e66ef5a339aa9f7a7 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 17 Jul 2022 17:33:04 +0200 Subject: [PATCH 56/89] [P095] Extend supported ILI9481 display models --- src/_P095_ILI9341.ino | 11 +++++++---- src/src/PluginStructs/P095_data_struct.cpp | 10 +++++++++- src/src/PluginStructs/P095_data_struct.h | 8 +++++--- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/_P095_ILI9341.ino b/src/_P095_ILI9341.ino index 3e617fbaa..0a96ef996 100644 --- a/src/_P095_ILI9341.ino +++ b/src/_P095_ILI9341.ino @@ -13,12 +13,11 @@ # define PLUGIN_095_MAX_DISPLAY 1 -# if !defined(LIMIT_BUILD_SIZE) && !defined(PLUGIN_095_FONT_INCLUDED) - # define PLUGIN_095_FONT_INCLUDED // enable to use fonts in this plugin -# endif // if !defined(LIMIT_BUILD_SIZE) && !defined(PLUGIN_095_FONT_INCLUDED) - /** * Changelog: + * 2022-07-16 tonhuisman: Add support for some more ILI9481 sub-types (Again cloned from TFT_eSPI library) + * WARNING: ILI9481 does *NOT* support changing rotation and keep writing on the display! + * Display memory is restructured by the rotation change, but the content is not adjusted. * 2022-06-14 tonhuisman: Improved Splash handling, non-blocking delay, default 3 seconds * 2022-06-11 tonhuisman: Implement support for getting config values, see AdafruitGFX_Helper.h changelog for details. Code optimization * 2022-05-17 tonhuisman: Add setting for Splash during plugin startup, default on, when compiled in @@ -232,6 +231,8 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_AUO317_320x480), ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_CMO35_320x480), ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_RGB_320x480), + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_CMI7_320x480), + ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_CMI8_320x480), ILI9xxx_type_toString(ILI9xxx_type_e::ILI9486_320x480), ILI9xxx_type_toString(ILI9xxx_type_e::ILI9488_320x480), }; @@ -244,6 +245,8 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) static_cast<int>(ILI9xxx_type_e::ILI9481_AUO317_320x480), static_cast<int>(ILI9xxx_type_e::ILI9481_CMO35_320x480), static_cast<int>(ILI9xxx_type_e::ILI9481_RGB_320x480), + static_cast<int>(ILI9xxx_type_e::ILI9481_CMI7_320x480), + static_cast<int>(ILI9xxx_type_e::ILI9481_CMI8_320x480), static_cast<int>(ILI9xxx_type_e::ILI9486_320x480), static_cast<int>(ILI9xxx_type_e::ILI9488_320x480), }; diff --git a/src/src/PluginStructs/P095_data_struct.cpp b/src/src/PluginStructs/P095_data_struct.cpp index 7bd83fa0e..b7267b810 100644 --- a/src/src/PluginStructs/P095_data_struct.cpp +++ b/src/src/PluginStructs/P095_data_struct.cpp @@ -16,6 +16,8 @@ const __FlashStringHelper* ILI9xxx_type_toString(ILI9xxx_type_e device) { case ILI9xxx_type_e::ILI9481_AUO317_320x480: return F("ILI9481 320 x 480px (AUO317)"); case ILI9xxx_type_e::ILI9481_CMO35_320x480: return F("ILI9481 320 x 480px (CMO35)"); case ILI9xxx_type_e::ILI9481_RGB_320x480: return F("ILI9481 320 x 480px (RGB)"); + case ILI9xxx_type_e::ILI9481_CMI7_320x480: return F("ILI9481 320 x 480px (CMI7)"); + case ILI9xxx_type_e::ILI9481_CMI8_320x480: return F("ILI9481 320 x 480px (CMI8)"); case ILI9xxx_type_e::ILI9486_320x480: return F("ILI9486 320 x 480px"); case ILI9xxx_type_e::ILI9488_320x480: return F("ILI9488 320 x 480px"); case ILI9xxx_type_e::ILI9xxx_MAX: break; @@ -39,6 +41,8 @@ void ILI9xxx_type_toResolution(ILI9xxx_type_e device, uint16_t& x, uint16_t& y) case ILI9xxx_type_e::ILI9481_AUO317_320x480: case ILI9xxx_type_e::ILI9481_CMO35_320x480: case ILI9xxx_type_e::ILI9481_RGB_320x480: + case ILI9xxx_type_e::ILI9481_CMI7_320x480: + case ILI9xxx_type_e::ILI9481_CMI8_320x480: case ILI9xxx_type_e::ILI9486_320x480: case ILI9xxx_type_e::ILI9488_320x480: x = 320; @@ -373,7 +377,11 @@ bool P095_data_struct::plugin_write(struct EventStruct *event, const String& str if (validIntFromString(arg2, nArg2) && (nArg2 >= 0)) { - tft->setRotation(nArg2 % 4); + if (nullptr != gfxHelper) { + gfxHelper->setRotation(nArg2 % 4); + } else { + tft->setRotation(nArg2 % 4); + } } else { success = false; } diff --git a/src/src/PluginStructs/P095_data_struct.h b/src/src/PluginStructs/P095_data_struct.h index 7db8c1787..46a7e135f 100644 --- a/src/src/PluginStructs/P095_data_struct.h +++ b/src/src/PluginStructs/P095_data_struct.h @@ -25,9 +25,9 @@ # define P095_CONFIG_DISPLAY_TIMEOUT PCONFIG(3) // Time-out when display-button is enable # define P095_CONFIG_BACKLIGHT_PIN PCONFIG(4) // Backlight pin # define P095_CONFIG_BACKLIGHT_PERCENT PCONFIG(5) // Backlight percentage -# define P095_CONFIG_COLORS PCONFIG_LONG(3) // 2 Colors fit in 1 long +# define P095_CONFIG_COLORS PCONFIG_ULONG(3) // 2 Colors fit in 1 long -# define P095_CONFIG_FLAGS PCONFIG_LONG(0) // All flags +# define P095_CONFIG_FLAGS PCONFIG_ULONG(0) // All flags # define P095_CONFIG_FLAG_NO_WAKE 0 // Flag: Don't wake display # define P095_CONFIG_FLAG_INVERT_BUTTON 1 // Flag: Inverted button state # define P095_CONFIG_FLAG_CLEAR_ON_EXIT 2 // Flag: Clear display on exit @@ -75,9 +75,11 @@ enum class ILI9xxx_type_e : uint8_t { ILI9481_AUO317_320x480 = 5u, ILI9481_CMO35_320x480 = 6u, ILI9481_RGB_320x480 = 7u, + ILI9481_CMI7_320x480 = 10u, + ILI9481_CMI8_320x480 = 11u, ILI9486_320x480 = 8u, ILI9488_320x480 = 9u, - ILI9xxx_MAX = 10u // last value = count + ILI9xxx_MAX = 12u // last value = count }; enum class P095_CommandTrigger : uint8_t { From cabf72bc4cc7a53d515fb5c6fe6ab23124ccc5f0 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 17 Jul 2022 17:33:26 +0200 Subject: [PATCH 57/89] [P095] Update documentation --- docs/source/Plugin/P095.rst | 3 +++ .../Plugin/P095_TFTDisplayModelOptions.png | Bin 42661 -> 55576 bytes 2 files changed, 3 insertions(+) diff --git a/docs/source/Plugin/P095.rst b/docs/source/Plugin/P095.rst index 0e7439e99..b11b6d2db 100644 --- a/docs/source/Plugin/P095.rst +++ b/docs/source/Plugin/P095.rst @@ -90,6 +90,9 @@ Available options: .. image:: P095_TFTDisplayModelOptions.png :alt: TFT Display model options +.. warning:: + The **ILI9481** display controller does have issues when rotating, by using the ``<trigger>,rot,<n>`` command, to change the display orientation after some content is already displayed on the screen (content may move, rotate and/or mirror unexpectedly). It is advised to clear the screen after changing the rotation setting. + Layout ^^^^^^^^ diff --git a/docs/source/Plugin/P095_TFTDisplayModelOptions.png b/docs/source/Plugin/P095_TFTDisplayModelOptions.png index 9871ddae0fe7e299d05b9cecf9958de6fa89ed22..e574d54ea21291d1fa2d8a8d237ec0232bc95492 100644 GIT binary patch literal 55576 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 literal 42661 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 WXLVJajQI-iQhTVWRH9%W{Qm&UpXf~h From 0d917c31269b894dd7ae7713b515639567bcbdb3 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Tue, 19 Jul 2022 21:22:15 +0200 Subject: [PATCH 58/89] [P129] Fix build error, apply code suggestions --- src/_P129_74HC165.ino | 3 ++- src/src/PluginStructs/P129_data_struct.cpp | 2 +- src/src/PluginStructs/P129_data_struct.h | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/_P129_74HC165.ino b/src/_P129_74HC165.ino index 3ed76bc42..7ad78d3f8 100644 --- a/src/_P129_74HC165.ino +++ b/src/_P129_74HC165.ino @@ -125,7 +125,8 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_WEBFORM_LOAD: { - addFormPinSelect(formatGpioName_output(F("Load pin (<SPAN STYLE=\"text-decoration:overline\">PL</SPAN>)")), + addFormPinSelect(PinSelectPurpose::Generic_output, + formatGpioName_output(F("Load pin (<SPAN STYLE=\"text-decoration:overline\">PL</SPAN>)")), F("load_pin"), P129_CONFIG_LOAD_PIN); # ifndef LIMIT_BUILD_SIZE diff --git a/src/src/PluginStructs/P129_data_struct.cpp b/src/src/PluginStructs/P129_data_struct.cpp index c48b06635..bcfdeda3e 100644 --- a/src/src/PluginStructs/P129_data_struct.cpp +++ b/src/src/PluginStructs/P129_data_struct.cpp @@ -37,7 +37,7 @@ bool P129_data_struct::plugin_init(struct EventStruct *event) { } uint32_t P129_data_struct::getChannelState(uint8_t offset, - uint8_t size) { + uint8_t size) const { uint32_t result = 0u; uint16_t sft = 0u; const uint8_t last = offset + size; diff --git a/src/src/PluginStructs/P129_data_struct.h b/src/src/PluginStructs/P129_data_struct.h index 6687e72ef..ab68b78f8 100644 --- a/src/src/PluginStructs/P129_data_struct.h +++ b/src/src/PluginStructs/P129_data_struct.h @@ -79,9 +79,9 @@ public: private: uint32_t getChannelState(uint8_t offset, - uint8_t size); + uint8_t size) const; - bool validChannel(uint channel) { + bool validChannel(uint channel) const { return channel > 0 && channel <= (_chipCount * 8); } From b298321bf461fec61ee6f6a27a28ecd6c01169c6 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Tue, 19 Jul 2022 21:55:37 +0200 Subject: [PATCH 59/89] [P128] Fix compiler warning (cherry picked from commit acd3c5073fc289acbb0adf9a65e1f1cb13aeb0d0) --- src/src/PluginStructs/P128_data_struct.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/src/PluginStructs/P128_data_struct.h b/src/src/PluginStructs/P128_data_struct.h index c5e34f318..eef56761e 100644 --- a/src/src/PluginStructs/P128_data_struct.h +++ b/src/src/PluginStructs/P128_data_struct.h @@ -2290,7 +2290,6 @@ private: uint16_t difference = 0; uint16_t fps = 50; uint16_t colorcount = 0; - int8_t gpioPin = -1; # if defined(RGBW) || defined(GRBW) RgbwColor rgb_target[ARRAYSIZE], @@ -2312,11 +2311,12 @@ private: rgb_s = HtmlColor(0xFF0000); # endif // if defined(RGBW) || defined(GRBW) - uint8_t maxBright = 255; + int8_t gpioPin; + uint16_t pixelCount; + uint8_t maxBright; int16_t fadedelay = 20; - uint16_t pixelCount = ARRAYSIZE; int8_t defaultspeed = 25; int8_t rainbowspeed = 1; From 7942ac9ef93ba992d4724bd17b34abc234547659 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Tue, 19 Jul 2022 21:56:28 +0200 Subject: [PATCH 60/89] [SDcard] Remove unused variable in handle_SDfilelist() (cherry picked from commit bc5d83996e3a5397c662c80ebfab773a678ee615) --- src/src/WebServer/FileList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/WebServer/FileList.cpp b/src/src/WebServer/FileList.cpp index e3952c824..e9197c67c 100644 --- a/src/src/WebServer/FileList.cpp +++ b/src/src/WebServer/FileList.cpp @@ -401,7 +401,7 @@ void handle_SDfilelist() { while (entry) { html_TR_TD(); - size_t entrynameLength = strlen(entry.name()); + // size_t entrynameLength = strlen(entry.name()); if (entry.isDirectory()) { char SDcardChildDir[80]; From 78e4f3f814afcca440fd3ca8f142ef0b8ff335a5 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Tue, 19 Jul 2022 23:09:34 +0200 Subject: [PATCH 61/89] [Build] Leave SD-card support out for any NEOPIXEL ESP8266 build to make it fit again --- src/src/CustomBuild/define_plugin_sets.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index 263b61cde..f5a96d04b 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -1329,7 +1329,7 @@ To create/register a plugin, you have to : // Collection of all NeoPixel plugins #ifdef PLUGIN_NEOPIXEL_COLLECTION - #if !defined(FEATURE_SD) && !defined(ESP8266_1M) + #if !defined(FEATURE_SD) && !defined(ESP8266) #define FEATURE_SD #endif #ifndef USES_P038 From 35d8d2528aa8f0eef450dfbd7b97816cda9148bb Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Wed, 20 Jul 2022 21:32:32 +0200 Subject: [PATCH 62/89] [P095] Disable unavailable displays (ILI9486/ILI9488) --- lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp | 79 +++++++++++++--------- lib/Adafruit_ILI9341/Adafruit_ILI9341.h | 14 ++-- src/_P095_ILI9341.ino | 15 +++- src/src/PluginStructs/P095_data_struct.cpp | 6 ++ src/src/PluginStructs/P095_data_struct.h | 29 +++++--- 5 files changed, 93 insertions(+), 50 deletions(-) diff --git a/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp b/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp index 474babf1e..0a6d3a28a 100644 --- a/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp +++ b/lib/Adafruit_ILI9341/Adafruit_ILI9341.cpp @@ -448,14 +448,16 @@ static const uint8_t PROGMEM initcmd_9481_CMI8[] = { // ILI9481 CMI8 (TFT_eSPI I // clang-format on +#ifdef ILI9341_ENABLE_ILI948X + // clang-format off -static const uint8_t PROGMEM initcmd_9486[] = { // ILI9486 - ILI9341_SLPOUT, 0x80, // Exit Sleep - ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, 0x66=18bit - ILI9341_PWCTR3, 1, 0x44, // Power control3 - ILI9341_VMCTR1, 4, 0x00, 0x00, 0x00, 0x00, // VCM control - ILI9341_GMCTRP1, 15, 0x0F, 0x1F, 0x1c, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00, - ILI9341_GMCTRN1, 15, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00, +static const uint8_t PROGMEM initcmd_9486[] = { // ILI9486 + ILI9341_SLPOUT, 0x80, // Exit Sleep + ILI9341_PIXFMT, 1, 0x55, // Pixel format 0x55=16bit, 0x66=18bit + ILI9341_PWCTR3, 1, 0x44, // Power control3 + ILI9341_VMCTR1, 4, 0x00, 0x00, 0x00, 0x00, // VCM control + ILI9341_GMCTRP1, 15, 0x0F, 0x1F, 0x1c, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00, + ILI9341_GMCTRN1, 15, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00, ILI9341_INVOFF, 0, ILI9341_MADCTL, 1, 0x48, // Memory Access Control ILI9341_DISPON, 0x80, // Display on @@ -518,6 +520,7 @@ static const uint8_t PROGMEM initcmd_9488[] = { // ILI9488 // End of list 0x00 }; +#endif // ifdef ILI9341_ENABLE_ILI948X // clang-format on @@ -575,12 +578,14 @@ void Adafruit_ILI9341::begin(uint32_t freq) { case ILI_TYPE_9481_CMI8: // ILI9481 CMI8 addr = initcmd_9481_CMI8; break; - case ILI_TYPE_9486: // ILI9486 + #ifdef ILI9341_ENABLE_ILI948X + case ILI_TYPE_9486: // ILI9486 addr = initcmd_9486; break; - case ILI_TYPE_9488: // ILI9488 + case ILI_TYPE_9488: // ILI9488 addr = initcmd_9488; break; + #endif // ifdef ILI9341_ENABLE_ILI948X default: addr = initcmd; break; @@ -630,14 +635,16 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { m = (MADCTL_SS | MADCTL_BGR); break; case ILI_TYPE_9341: // ILI9341 + // m = (MADCTL_MX | MADCTL_BGR); + // break; + #ifdef ILI9341_ENABLE_ILI948X + case ILI_TYPE_9486: // ILI9486 // m = (MADCTL_MX | MADCTL_BGR); // break; - case ILI_TYPE_9486: // ILI9486 - // m = (MADCTL_MX | MADCTL_BGR); - // break; - case ILI_TYPE_9488: // ILI9488 - // m = (MADCTL_MX | MADCTL_BGR); - // break; + case ILI_TYPE_9488: // ILI9488 + // m = (MADCTL_MX | MADCTL_BGR); + // break; + #endif // ifdef ILI9341_ENABLE_ILI948X default: m = (MADCTL_MX | MADCTL_BGR); break; @@ -662,14 +669,16 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { // m = (MADCTL_MV | MADCTL_BGR); // break; case ILI_TYPE_9341: // ILI9341 + // m = (MADCTL_MV | MADCTL_BGR); + // break; + #ifdef ILI9341_ENABLE_ILI948X + case ILI_TYPE_9486: // ILI9486 // m = (MADCTL_MV | MADCTL_BGR); // break; - case ILI_TYPE_9486: // ILI9486 - // m = (MADCTL_MV | MADCTL_BGR); - // break; - case ILI_TYPE_9488: // ILI9488 - // m = (MADCTL_MV | MADCTL_BGR); - // break; + case ILI_TYPE_9488: // ILI9488 + // m = (MADCTL_MV | MADCTL_BGR); + // break; + #endif // ifdef ILI9341_ENABLE_ILI948X default: m = (MADCTL_MV | MADCTL_BGR); break; @@ -694,14 +703,16 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { m = (MADCTL_GS | MADCTL_BGR); break; case ILI_TYPE_9341: // ILI9341 + // m = (MADCTL_MY | MADCTL_BGR); + // break; + #ifdef ILI9341_ENABLE_ILI948X + case ILI_TYPE_9486: // ILI9486 // m = (MADCTL_MY | MADCTL_BGR); // break; - case ILI_TYPE_9486: // ILI9486 - // m = (MADCTL_MY | MADCTL_BGR); - // break; - case ILI_TYPE_9488: // ILI9488 - // m = (MADCTL_MY | MADCTL_BGR); - // break; + case ILI_TYPE_9488: // ILI9488 + // m = (MADCTL_MY | MADCTL_BGR); + // break; + #endif // ifdef ILI9341_ENABLE_ILI948X default: m = (MADCTL_MY | MADCTL_BGR); break; @@ -726,14 +737,16 @@ void Adafruit_ILI9341::setRotation(uint8_t m) { m = (MADCTL_SS | MADCTL_GS | MADCTL_MV | MADCTL_BGR); break; case ILI_TYPE_9341: // ILI9341 + // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); + // break; + #ifdef ILI9341_ENABLE_ILI948X + case ILI_TYPE_9486: // ILI9486 // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); // break; - case ILI_TYPE_9486: // ILI9486 - // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); - // break; - case ILI_TYPE_9488: // ILI9488 - // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); - // break; + case ILI_TYPE_9488: // ILI9488 + // m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); + // break; + #endif // ifdef ILI9341_ENABLE_ILI948X default: m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); break; diff --git a/lib/Adafruit_ILI9341/Adafruit_ILI9341.h b/lib/Adafruit_ILI9341/Adafruit_ILI9341.h index 8f88b85c0..81fc609b3 100644 --- a/lib/Adafruit_ILI9341/Adafruit_ILI9341.h +++ b/lib/Adafruit_ILI9341/Adafruit_ILI9341.h @@ -43,6 +43,8 @@ #include <Adafruit_SPITFT_Macros.h> #include <SPI.h> +// #define ILI9341_ENABLE_ILI948X ///< Enable ILI9486 and ILI9488 support, MUST reflect a similar #define in P095_data_struct.h ! + #define ILI9341_TFTWIDTH 240 ///< ILI9341 max TFT width #define ILI9341_TFTHEIGHT 320 ///< ILI9341 max TFT height @@ -126,7 +128,7 @@ #define ILI9341_PINK 0xFC18 ///< 255, 130, 198 -#define ILI_TYPE_9341 0 // Must match with enum class ILI9xxx_type_e in P095_data_struct.h +#define ILI_TYPE_9341 0 // MUST match with enum class ILI9xxx_type_e in P095_data_struct.h ! #define ILI_TYPE_9342 1 #define ILI_TYPE_9481 2 #define ILI_TYPE_9481_CPT29 3 @@ -134,10 +136,12 @@ #define ILI_TYPE_9481_AUO317 5 #define ILI_TYPE_9481_CMO35 6 #define ILI_TYPE_9481_RGB 7 -#define ILI_TYPE_9481_CMI7 10 -#define ILI_TYPE_9481_CMI8 11 -#define ILI_TYPE_9486 8 -#define ILI_TYPE_9488 9 +#define ILI_TYPE_9481_CMI7 8 +#define ILI_TYPE_9481_CMI8 9 +#ifdef ILI9341_ENABLE_ILI948X +# define ILI_TYPE_9486 10 +# define ILI_TYPE_9488 11 +#endif // ifndef ILI9341_ENABLE_ILI948X /**************************************************************************/ diff --git a/src/_P095_ILI9341.ino b/src/_P095_ILI9341.ino index 0a96ef996..3d38c05f1 100644 --- a/src/_P095_ILI9341.ino +++ b/src/_P095_ILI9341.ino @@ -15,6 +15,9 @@ /** * Changelog: + * 2022-07-20 tonhuisman: Made support for ILI9486/ILI9488 optional and excluded by default as these are not available as + * regular SPI devices (3/4 wire SPI) + * NOTE: Renumbered enum with display types. * 2022-07-16 tonhuisman: Add support for some more ILI9481 sub-types (Again cloned from TFT_eSPI library) * WARNING: ILI9481 does *NOT* support changing rotation and keep writing on the display! * Display memory is restructured by the rotation change, but the content is not adjusted. @@ -233,8 +236,10 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_RGB_320x480), ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_CMI7_320x480), ILI9xxx_type_toString(ILI9xxx_type_e::ILI9481_CMI8_320x480), + # ifdef P095_ENABLE_ILI948X ILI9xxx_type_toString(ILI9xxx_type_e::ILI9486_320x480), ILI9xxx_type_toString(ILI9xxx_type_e::ILI9488_320x480), + # endif // ifdef P095_ENABLE_ILI948X }; const int hardwareOptions[] = { static_cast<int>(ILI9xxx_type_e::ILI9341_240x320), @@ -247,8 +252,10 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) static_cast<int>(ILI9xxx_type_e::ILI9481_RGB_320x480), static_cast<int>(ILI9xxx_type_e::ILI9481_CMI7_320x480), static_cast<int>(ILI9xxx_type_e::ILI9481_CMI8_320x480), + # ifdef P095_ENABLE_ILI948X static_cast<int>(ILI9xxx_type_e::ILI9486_320x480), static_cast<int>(ILI9xxx_type_e::ILI9488_320x480), + # endif // ifdef P095_ENABLE_ILI948X }; addFormSelector(F("TFT display model"), F("p095_type"), @@ -278,16 +285,20 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) P095_CommandTrigger_toString(P095_CommandTrigger::ili9341), P095_CommandTrigger_toString(P095_CommandTrigger::ili9342), P095_CommandTrigger_toString(P095_CommandTrigger::ili9481), + # ifdef P095_ENABLE_ILI948X P095_CommandTrigger_toString(P095_CommandTrigger::ili9486), - P095_CommandTrigger_toString(P095_CommandTrigger::ili9488) + P095_CommandTrigger_toString(P095_CommandTrigger::ili9488), + # endif // ifdef P095_ENABLE_ILI948X }; const int commandTriggerOptions[] = { static_cast<int>(P095_CommandTrigger::tft), static_cast<int>(P095_CommandTrigger::ili9341), static_cast<int>(P095_CommandTrigger::ili9342), static_cast<int>(P095_CommandTrigger::ili9481), + # ifdef P095_ENABLE_ILI948X static_cast<int>(P095_CommandTrigger::ili9486), - static_cast<int>(P095_CommandTrigger::ili9488) + static_cast<int>(P095_CommandTrigger::ili9488), + # endif // ifdef P095_ENABLE_ILI948X }; addFormSelector(F("Write Command trigger"), F("p095_commandtrigger"), diff --git a/src/src/PluginStructs/P095_data_struct.cpp b/src/src/PluginStructs/P095_data_struct.cpp index b7267b810..28aa13cf5 100644 --- a/src/src/PluginStructs/P095_data_struct.cpp +++ b/src/src/PluginStructs/P095_data_struct.cpp @@ -18,8 +18,10 @@ const __FlashStringHelper* ILI9xxx_type_toString(ILI9xxx_type_e device) { case ILI9xxx_type_e::ILI9481_RGB_320x480: return F("ILI9481 320 x 480px (RGB)"); case ILI9xxx_type_e::ILI9481_CMI7_320x480: return F("ILI9481 320 x 480px (CMI7)"); case ILI9xxx_type_e::ILI9481_CMI8_320x480: return F("ILI9481 320 x 480px (CMI8)"); + # ifdef P095_ENABLE_ILI948X case ILI9xxx_type_e::ILI9486_320x480: return F("ILI9486 320 x 480px"); case ILI9xxx_type_e::ILI9488_320x480: return F("ILI9488 320 x 480px"); + # endif // ifdef P095_ENABLE_ILI948X case ILI9xxx_type_e::ILI9xxx_MAX: break; } return F("Unsupported type!"); @@ -43,8 +45,10 @@ void ILI9xxx_type_toResolution(ILI9xxx_type_e device, uint16_t& x, uint16_t& y) case ILI9xxx_type_e::ILI9481_RGB_320x480: case ILI9xxx_type_e::ILI9481_CMI7_320x480: case ILI9xxx_type_e::ILI9481_CMI8_320x480: + # ifdef P095_ENABLE_ILI948X case ILI9xxx_type_e::ILI9486_320x480: case ILI9xxx_type_e::ILI9488_320x480: + # endif // ifdef P095_ENABLE_ILI948X x = 320; y = 480; break; @@ -62,8 +66,10 @@ const __FlashStringHelper* P095_CommandTrigger_toString(P095_CommandTrigger cmd) case P095_CommandTrigger::ili9341: return F("ili9341"); case P095_CommandTrigger::ili9342: return F("ili9342"); case P095_CommandTrigger::ili9481: return F("ili9481"); + # ifdef P095_ENABLE_ILI948X case P095_CommandTrigger::ili9486: return F("ili9486"); case P095_CommandTrigger::ili9488: return F("ili9488"); + # endif // ifdef P095_ENABLE_ILI948X case P095_CommandTrigger::MAX: return F("None"); } return F("ili9341"); // Default command trigger diff --git a/src/src/PluginStructs/P095_data_struct.h b/src/src/PluginStructs/P095_data_struct.h index 46a7e135f..2a7347885 100644 --- a/src/src/PluginStructs/P095_data_struct.h +++ b/src/src/PluginStructs/P095_data_struct.h @@ -4,15 +4,18 @@ #include "../../_Plugin_Helper.h" #ifdef USES_P095 -# include <Adafruit_GFX.h> // include Adafruit graphics library -# include <Adafruit_ILI9341.h> // include Adafruit ILI9341 TFT library +# include <Adafruit_GFX.h> // include Adafruit graphics library +# include <Adafruit_ILI9341.h> // include Adafruit ILI9341 TFT library -# include "../Helpers/AdafruitGFX_helper.h" // Use Adafruit graphics helper object +# include "../Helpers/AdafruitGFX_helper.h" // Use Adafruit graphics helper object # include "../CustomBuild/StorageLayout.h" -# define P095_Nlines 24 // The number of different lines which can be displayed +# define P095_Nlines 24 // The number of different lines which can be displayed # define P095_Nchars 60 -# define P095_DebounceTreshold 5 // number of 20 msec (fifty per second) ticks before the button has settled +# define P095_DebounceTreshold 5 // number of 20 msec (fifty per second) ticks before the button has settled + +// # define P095_ENABLE_ILI948X // Enable or disable support for ILI9486 and ILI9488. +// MUST reflect similar #define in Adafruit_ILI9341.h ! # ifndef LIMIT_BUILD_SIZE # define P095_SHOW_SPLASH // Enable to show initial splash (text) @@ -75,11 +78,15 @@ enum class ILI9xxx_type_e : uint8_t { ILI9481_AUO317_320x480 = 5u, ILI9481_CMO35_320x480 = 6u, ILI9481_RGB_320x480 = 7u, - ILI9481_CMI7_320x480 = 10u, - ILI9481_CMI8_320x480 = 11u, - ILI9486_320x480 = 8u, - ILI9488_320x480 = 9u, - ILI9xxx_MAX = 12u // last value = count + ILI9481_CMI7_320x480 = 8u, + ILI9481_CMI8_320x480 = 9u, + # ifdef P095_ENABLE_ILI948X + ILI9486_320x480 = 10u, + ILI9488_320x480 = 11u, + ILI9xxx_MAX = 12u // last value = count + # else // ifdef P095_ENABLE_ILI948X + ILI9xxx_MAX = 10u // last value = count + # endif // ifdef P095_ENABLE_ILI948X }; enum class P095_CommandTrigger : uint8_t { @@ -87,8 +94,10 @@ enum class P095_CommandTrigger : uint8_t { ili9341, ili9342, ili9481, + # ifdef P095_ENABLE_ILI948X ili9486, ili9488, + # endif // ifdef P095_ENABLE_ILI948X MAX // Keep as last item! }; From fe8d6c1bccb7f1e530801892dcad6b25035b18c2 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 30 Jul 2022 14:26:08 +0200 Subject: [PATCH 63/89] [P131] Remove plugin from DISPLAY builds, enable SD-card support for NEOPIXEL ESP32 builds --- platformio_esp32_envs.ini | 1 + src/src/CustomBuild/define_plugin_sets.h | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index b066ffeba..6c73f4460 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -260,6 +260,7 @@ lib_deps = ${esp32_common.lib_deps} ServoESP32 build_flags = ${esp32_common.build_flags} -DFEATURE_ARDUINO_OTA=1 + -DFEATURE_SD=1 -D PLUGIN_NEOPIXEL_COLLECTION diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index d1dd2ecef..c842907ad 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -1389,9 +1389,6 @@ To create/register a plugin, you have to : #ifndef USES_P116 #define USES_P116 // ST77xx #endif - #ifndef USES_P131 - #define USES_P131 // NeoMatrix - #endif #endif // Collection of all NeoPixel plugins From 0fd3280fde924a892aa5f380bcbbf4898a54123c Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 30 Jul 2022 17:31:31 +0200 Subject: [PATCH 64/89] [P131] Enable SD-card support for NEOPIXEL ESP32s2 build --- platformio_esp32s2_envs.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio_esp32s2_envs.ini b/platformio_esp32s2_envs.ini index 010408322..aadac31e9 100644 --- a/platformio_esp32s2_envs.ini +++ b/platformio_esp32s2_envs.ini @@ -40,6 +40,7 @@ lib_deps = ${esp32s2_common.lib_deps} ServoESP32 build_flags = ${esp32s2_common.build_flags} -DFEATURE_ARDUINO_OTA=1 + -DFEATURE_SD=1 -DPLUGIN_NEOPIXEL_COLLECTION From d37b5bbcc1eecc7fd830e220585e130c47af6011 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 30 Jul 2022 20:30:46 +0200 Subject: [PATCH 65/89] [P131] Add commands for scroll options, update documentation, remove Testing tag, improvements --- docs/source/Plugin/P131.rst | 8 +- .../Plugin/P131_DeviceConfiguration.png | Bin 72828 -> 73434 bytes .../Plugin/P131_TextPrintModeOptions.png | Bin 19653 -> 18532 bytes docs/source/Plugin/P131_commands.repl | 34 +++++ .../Plugin/_plugin_substitutions_p13x.repl | 2 +- src/_P131_NeoPixelMatrix.ino | 12 +- src/src/PluginStructs/P131_data_struct.cpp | 126 +++++++++++++++--- src/src/PluginStructs/P131_data_struct.h | 8 +- 8 files changed, 164 insertions(+), 26 deletions(-) diff --git a/docs/source/Plugin/P131.rst b/docs/source/Plugin/P131.rst index 8b997152d..f94984e54 100644 --- a/docs/source/Plugin/P131.rst +++ b/docs/source/Plugin/P131.rst @@ -184,7 +184,7 @@ Available options: :alt: Text print mode * *Continue to next line* Simply 'prints' all text to the display, with automatic overflow to the next line(s) if the text doesn't fit on the current line. -* *Truncate exceeding message* Display the provided message, but any excess at the right border of the display is discarded. +* *Truncate exceeding message* (Default) Display the provided message, but any excess at the right border of the display is discarded. * *Clear then truncate exceeding message* Clear from the current cursor position to the width of the display, then display the provided message, but any excess at the right border of the display is discarded. Default setting is *Continue to next line*. @@ -195,7 +195,7 @@ Default setting is *Continue to next line*. * **Font scaling** The scaling factor for the currently active font. Select a factor between 1 and 4. -* **Clear display on exit** When checked, will clear the display when the task is disabled, either from settings or via the ``TaskDisable`` command. This will fill the display with all black pixels, turning all NeoPixels off. +* **Clear display on exit** When checked, will clear the display when the task is disabled, either from settings or via the ``TaskDisable`` command. This will fill the display with black pixels, turning all NeoPixels off. * **Write Command trigger** The command to handle any commands for this device can be selected here. This way you can have different commands when multiple displays are configured. It is processing most commands via the ESPEasy Adafruit Graphics helper class. @@ -228,7 +228,7 @@ If the Foreground and Background colors are the same, the background color will Lines ^^^^^ -* **Line 1..n** Predefined content can be specified. The number of lines shown depends on the Tile height of the display, the font used and the font scaling that is set. On a 240x240 pixel display, with the default font, and font scling set ot 1, all 24 lines will be displayed, but when using font scaling 2, then only the first 12 lines are displayed. If more lines are needed, then they should be set from the rules or an external source, like commands via http. +* **Line 1..n** Predefined content can be specified. The number of lines shown depends on the Tile height of the display. The usual variables, like ``[Taskname#Valuename]``, or ``%v1%``, system variables, formulas and functions can be used. @@ -238,7 +238,7 @@ Per **Line** you can define if Scrolling should be used for displaying the conte * **Scroll**: Enables (horizontal) scrolling of the content. NB: Scrolling will *only* be enabled if the content length won't fit on the display! * **Empty start**: When checked, the display will start empty, and the text will be scrolled in. It will also scroll out until the display is empty again. (Default enabled). When unchecked, the display will start with the content that fits on the display, and scroll until the 'other' end of the text is visible. The display won't be empty when having this setting off. -* **Scroll right**: By default, scrolling will be from right to left, when checked, scrolling will be from left to right direction. +* **Scroll right**: By default, scrolling will be from right to left, when this option is checked, scrolling will be from left to right direction. * **Stepsize**: The number of pixels that each step will scroll. Range 1..16, default 1. * **Speed**: The number of 0.1 seconds before the next scroll step will be applied. Range 1..600 (0.1 second to 60 seconds), default 10 (1 step per second). diff --git a/docs/source/Plugin/P131_DeviceConfiguration.png b/docs/source/Plugin/P131_DeviceConfiguration.png index 452a21567b14f3731605295874849ce5ff6dca9f..49a528a6aa93f02f6bbb416c8492640e1c636eef 100644 GIT binary patch literal 73434 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%0D*dWmc883f8P<%<x!!>2t<vb#P>e72 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 Sm2T^ku{5_eD?WSW?*9Nz1@MUg literal 72828 zcmd?Q30PBEwl<t<yTnqILPcgME8+kM3IZ}l3k4MwL57G78bAdEWFC`P?Z6-sMKQ%J zA|epLpfZyv1R@|JW0U}qF+d1&NXYo@fL2xC?!Nc-|J~>R{vl7*gE={SpFOPou6Mm_ zowzfnEjO-LSPy|fHXc8A#1;biD;@$_o4jr<xI$8PaRGmRxOVJZ5CpP`B>w-qWQ|RV z;G%BuQF!nX&mi|euWP|x{(g|N?tz}3enD6KgUv5q3-%A(xPHIh-hBppb@u7#{G|Dl z&VC~u1Ec-=oVQ1^A&{RS$B!Jg3wNFBx4yd53qcE0Su>K9R&v|g=sm=2@_Btacb<D? ze8dXU+EjS#%@xOO<=-ER>|audd*6Sge=^x!;xF_I@WYSqb)NpD;i1{N?%{>K#?#Uj zb>Vj*dk;Z225eum_Ahpvt}J#@WM<xE5tfzYauj7&=lD_}q_<3OUrvjpnQ=!RSg${x zv;+L-RV-+5;~x#!nzeiNLhByrBk>Q%lP+aRTdmx4{AF9L+RCM;pD&YEFLg}mB32uC zEy?3o8yw(eF2=GNFn2Og{G*YzNZx=H+P43bH3}ZB9V9FsA}>EsMQK;QuORG3Mf1>Z zNAhB*G*tSaPO^FQ)M~de?_yuqZ@-<s2kJm`?~8iJ9gw;+Y4gewHzU(({`HAZ4cSjE zai`N>?>4pd@(xqM>(_UNp6TuDAz*?QzYg>OF#&$67TOa!{+Tl;o5Apl$#pv5kPCHS z=;u%;U&&{pZ27ZMtrM;HZJC|Dd6Ztv_OOE#jEFWpTDZj@wzPN*_hERZ&w(#D#H*^U zeT&HsISx%-nWn<K*zSkQc%3y4MG=N>Iv4buptfNo@BXn5(3el}dH%EB%J^=3v}TL~ zzSODBab|d3s<ejk3x(U7E9=#Tl`h<4fY8f1>2tN$6{qkp)y;n(M?Gl7CW^!zy!18> z!<pP;aOf!Il#2QEt9I>ON??LmAJgKoSFOh@>4gzyIv6PG^y+>Lfmv2cYeb=f@ZQ(r zFt*LLgOSlG7l=8DftEL!W~KRElIAIMS7xLOgGS)dm3_XiXUb>hmP}}?t6c<|f0ouz zady(T+&H@S*@Y<MN@*Xq)elkL7_U)xx$uO;K`^!%qJfyGO^LL|h5v{fU3+NN67GR% z=puZ{c}&PlMy@{-xsy#e2NV8mpfuWou`KG$k@lHgGV6*>R*LIpS2X(=sjnK7r!GRz z(*hU#!dsbTmszI#Yv7D!x3jkVuR84Hy$gi16YlS7W$niTJjqYrkLtMF&2yr(ux5$x zqY$HJOH=L-R`#Ix63M$cLE|&_JN?v)h4kEj!=iN$6)}OVTD$#MHk#F<H7@w=E@(iX zMT877eV+~6aXID_qe;AVsQCw19>>qT94*$yKV0bwV+M6Ndx^9@M89C4^Qh}1tmL_V zXnZO3%yekv2|u&2439%6v^(WTli1Db*6I3)TU8}_ngpzAv%0PatH$K)%1Z9>Aa%U$ zop!AJRa?1x^)NJEB6SR&kdmhcK22V^l6p_tDrT>Nhy06`uN|ZW`06gCA}v-;V@Ipm zzkT+Sp$^{xOoHfMBK-yYxv-P~7k_=9DZK&wx&B!fA^v$^l!YcF{1?=Wl;~-=(3sv} zfEu>{Y>*|gnBy-moNApI)DdyeJW4~Bi^wy23wwyh=fSiI%QR72gSK!Iwp-PbbD0xz zP#FUG3v?UAB=BMdw?Q<$5cq;yIZV?;jbTOS<{XL3F`lAsZ2@Cw{3WcvD_uovp&T`e ze!e!B%D7Ff&>k$Scjqah=~-K0tX9>B7${$t&rPEVSy8qA5XhtY*zX}2yMyr)bkP7z zix9wP-ysT%(5`&htXhVogZp~Q@`S$t6`?q|uE<<fo+W|it2Te9VM5>#%m)|udE9FG z4l?_Sl?cZ&a)!otQ>rQww4>Ky8N6y=NH{_`JtKU~$@LdS8Xjt>KT}N%<nL-A6PH8} zMG0+pHk8ZwEi_C>4OLgabPE?|418C(CtY-h$j#ssKp-aj>!Cf9ufkO`gu-BZCFP>{ zPL3qx!Zy?((R8ny{=wjpZnr4mOgsz5tsi2GCPaiie4}&~w=$QC)@#&3wcBSi_yeAE z2Ix^<6LMrdb^}%d@@1koinRXrhc%nrOLDeLp>_=OhJr)vaF_57j+k8bum)_YUWy@T zL-T8#w=t-lJ)b4Q3`WtKa-6WMEY&STWa&LwSb?fz1=EG{nZ*h9f|WC9u)Pi`^osL> zN;HvC+CFo?Z`2r5y<Ds3%!+=RMV}lVU#@keg)LR$U<MgaHk4)Mylo4zkb6-Vb$sJS zxT>g^$V_l#nu++#=i4><$X(kR{-VZ~c|rLQwM|BgeV5v@1~MDm??q}x2e~3|WC;#$ zk6IpE<VswBFE!XI<&C7hBh$&{FqXt#&ONSB((HZvy&xrghw7pg+YsTIDH@|)W-s?m zal;%JqAt8XA*yx!EaV+Tqc8-tqbhtRNKq1L#*T<Kg}Ul(Vo5$>Ej$wSE!~Bis#-1K zmo}ER(lyYL!nu)K(BwKB+d0TqwlR?>LCq;a(cQMfcxh-m;Y&j%ubfV%#Q7w?t75d< z47T>x^R70OM=cWhc|)*ASWa65EdIj=EPLk+1Y%9;x4?}kGPsJfJz<P~)vc5MeK}b> zjbP7@LLIm_EZAlbR7X_5NLYm*Ge@tD`Cy!ok_d0weWpt^JuYv$Q!X+w?C#04%qqbo z4b4C(tGLhKw4;~wFy6<OnumrP)@0K|XBR5T!x}TtsJ9%3BXxSA6zVW-ltMP*1YDjm z4s#;Hs)a4{8#{)HzWcP4Ji8O@MYCCa)r^I@lC*_T<-0QL*)jvcrhRMzK_FO|_dk^2 zzu*rnti1AlHEc3dR!g;50`jIam@Hk$TjRH|#-2^S)i>TnIJsyZc$stp4IghtyJrnZ zXi~mpz2!)ZaE>*Oc-l?;R71F$D10aQF;gC&M7=7KZxy8|DebWEv6$_g%$f^Is>X2e zV?xi(Zab^`v*|?MOll9YB$YbV=O!>I_tzlIWd90t4-(DMYmL}T5miVttxjpRO4`!$ zoK;`5Zk;=^wy1NgW-`JLM(}<&VJ7MxW{AQ#AA`~a(fUI)cI~`q(4#z)M$TPi*e(R5 z?-aG?zBB1r<l<XG!uMR}5n@!V)s>`WT!&;azXS|!>`Tj@q@x*bAs>8H@5;Ca%DEXh zR<u<s-DTY+vSHiAc(SA1Ab5vEMRa)O4zRJE-&x><s@sf2Y9_+lX2Qd{f_iwgD{h8A zZ>E!1|Cfy-`2<vjuV^_=giF3$?(bvl>Z^6u?J}=E@BqToPuEOAhaDc2$1GvZ{5BG> zZGtG3)Y3)qhb2b7kgt0G(Y?(y3n}s|w8#v;pj0)}4t0p8b*D6_I~xeo8;Dxg&8qDR zQrdHeI+4-sl<OnIRvS&r=N2gUO$eygd)r`37tM2QxXz$EZp5TnWlBi|&*agC@wumU zJS$Jj?2{KCI|*)xsyW)kkZwaH4T}F|(5xOg<CDd%_g;@Bwjcq}9qbDrd86H3M3A$> z7x%n)TkPl(86!&%q<y}m2{^I8o;HQ?-_-3uTNpjLzh`+tcai?n!kVyl6^mxK5I>l4 zfd~4SKWzpDyUuRmS3~9B#E@T2yEEknaxlB1jJxGWi9Thjls6SNZu(IJOHW4#FWbVb zctQ39u8d7}5u@&kL1}aJeZr77`o7AdR#wMhtzA5&14%T?y)3~~(LhOyFmu{<rx0E> zuj=plWx@ICOyNxBlyF(W2TT(+xEvNrc=)0u%T*LG*FqF%8?12%Z^LnPkhggJ1~<WJ z{<To97^}Hs3+TlxW9%{p&8257)Q{G;$bJV2Po36BB-7FjU>=M7L%&I@ntohvjLuT6 z3(Jtgya9%O#bc7c>}65FY5Qcstq<R`KsO2#gv*U9n`~O59}tF}6wK+houZ?3M1Ff- z!!ie3g2|=P{dBE`=rZ!75AyZw{`Aa*Blnkn>QJ_<V^Z3V>KyZBp*B5Wc$k&_EaH^4 zQKs9LzsxYRX$DQhiW)-9Uej_KZ~2D~`V(Hj0k#cV%i=D4ZrIy}cwjNywk->0z4qCD z0fokc84Pz5wAHSzXV;bx$W#>IRHQ1#>VA5W;@j?^U7Gkm_C=p1e&FBh5N?mANU0;~ zVW@jCo-LwE?~%1ROEZGSm|>TC(wA5n<?qhA8Z6LXnEFY=gh&$9!3JH!8g5B|_uE`J zA4NK0CLBjK!i0RLea>l<M+p&Niu?0)V_(7i2P>}>%c4<@(VK?d*wI%%lPP_u=)r`y z^d(md+@rT-!vhMrZAa$=UillNa7|h5c1FP)O*6Y(FeGn`<KQ|RQUZ4^YmmTBHr>p4 zIVi2+Z00Nlxt`|*m?n3pvGBVb;aeQ5AIWVEkC<GNU~tNE{AUYQA-b@K6!v|yL;>M* zOeKS-3!juceRQ6lSGXKRQI1T?8Z;h097bw3d&G%ZZ1oz{4;4iuVAh`SLql~DGDT=h z4+~s2k4bzVi!sz#i0*-&=LWF)!yH3*cuxp<A-sxu_rw@7;Eu3NPLQ0)h>e%2BvX`6 z4Y!a>F}VRWsKfqXk$G0uV&%L34`V)^qs4UnWK_RWq)9$<U`wG(6xad9&TQHipDU#K zOhBZpsk5=&{2zPrXCy`=-}MGmj!95P(&mA;Ym%yL4-?HT&-p%sU3nWgf;!~4gYGHh z2fs!`tS#w}dGuV<agW4;t6Id$*4F%PPYPrDo&IqYX;NsMXG~zZlo?ghb=)noaN&Jd zOo=RCzpUy^UZS5ng;+g=&xynpP6rJvhg$%n%T^P9QlA^9N*c_hl_;ANWy4I$W90Cm z&c!vNsgxBY8G$7V4{M{Bi#Q8L{BT=$QD|MowZ(42%#H5pk7(n;kFlfvyZ#CZ?~Sz7 z{8B&3`?cIu?kb3?-mm*87z{TSE@EU;a*}#s&J^s7GNwKvg^V&l)?3@4af1O*hfnbW z)Y?3ewI0siE;}nvm%N8`M;0fwQDVumm?L<OnSPr&&#2PIk3!$KjJ&tW;4pix!Q2Y9 z!}ktsAo2YS?e54NtI%xVJ@aAteZ$(VXieXVpmtust4!*&yYJd!j<CGmku662$+luq zX>@)+L3<BhgN(N2Px%XNmfJWrF1L8=+49p-ZZx4VVosOHZ%d*oDd6iy>sb(h1_|(e zXS<~aD|IX@NtTG$ZXX<agxQtLZ#lubmso-q83`sCREE5U4z%^a8W33S{-_|`94fid zvz^J_v^B1$;(mhr;RU&cHMY}pOjE>YW1`2bJln93PtcfwDf|76IouL`_3%=}CxvJ~ z%LF(Tv%P2m{s1PihJC)-1fw_+w0|++K$|<iFWCZCoK1cpn;0vm#qS9eJ2y0QnW%wU zG7y!_XU#>J-{Ns9htc7AIWPW3<JH6Vh*@rRxuSr1^KCV(H&gYiJNF>{ZP#UyY64s5 zz%PgPn+QLKmct4MM?=xWj>5clbBBe%I@S#T&PWZR&Nqhl8@Gc%U^g_63SI!Jk9hka zs9ZIHtS%8hHMr}{e#G4nHmvZX^LoqUcjZg#!euOQS)w9zayquq@Gm}-*JW<zR0zjP zqG6R7=fS`*)5#5x>*Tkw-&=p^NAFV!<gn|8@ZLnbo`Dn!Dsh^7nKdJvmTG1fa#P%d zwH`ml^EectZ=h3gmau1rHZbP@upGIYILkL~a1-^wtfvcI4#J!_0c>a$)B7&sG8^qG z+<TqISqh8K5{`;Oy6&F~7&IEJ8q}|AS+4U{=}_g*p?8zZ2-`K%RX#{z*Fe5_fhgt; zRCYkpw1%&paCk8H`rtT@$ZbWR+a~h8Jy@HEnmms_<2vTAEOLm*xYo~$HfI6ejjH2a zy~W#v8O|dt-<YQiF7j%=#TnMe<ZiAIs^<k~!czto=xr@^7sL_E7A@Xo3R<2<s$FLp zF6dyR{1?LOVD%+Z$Prlxq{Z{UjIuzqb*T+Z6#{uPB@YB82;?_Y5Hf+!%gg`Jc-zp} z*fY*sDb$&0b~SBpCJe0wbQf1nsxl!oreqNECfGs~etoue#$UALFMIj&<pvCDF=vR& zbxPXNS~II>9L?P1R=@EaWM78#hHXFb9s6caUE{X`Jth_H7Cm<~ARs^*9U%c(0tWT{ zI&I5qe+Al3i)QpjDYusIu6rfGUqA+tdPDv|HR%Xk|NAv@Jo*Uq2zjQ9c>5PQ(4A8# z2q1qe4kJ}LtIAkf77i^Uqdyd}^BN|{pTpf6FGJXG#eI~DH!9fJ0!MYoJ6h^4kN<L5 zEDo)<_G8C}P}R+pT4KMKYX0NymC)+oUNSDE{c~X;)B)+F8-1&nPK3E6mxsv<D=Sa3 z0vqOQ#$LU@@5Vg5m%W)hAALsw^BWMSo_c~My*?3|2%ovrf>3VEnf|$389(HP-F54t zxA8&W+Xbz+CaJ9%JyqG>Z@lkb!7@C4x<UT%$FrdpI3}dqz)8>YT*#(-%`Q8Q;??D! zr*@`Nn-kodJiq*~4~Sf^ra(-+um8DpVTC}HSJ?BVOIOSO@@qFOISjo2t-1j!clg|* zZR6xG%bkPwb^d7ZPP*`uq~oZSU`Sdc5{8>!oVpJWlgF2pQ(I#jIxhkt&FeF;kPB6F zP>1%&<6k_(9yhxzU4uTtuNO-LdyRqFoGhor+Fx~b_+&IxVCE|$Nd9$>cV%>Kz6;cW zRr+?(ANt-!N<~+!8nk=>M%T$SM95@dH-#pWyrt}lS`G~NWLV(FC@ItrwW_iv4u5Pc z6-`o4y_j#hBLwrYAThH_vu6-Zk*#9HzBcp?qE1}5&s5D?hl%}Tk%8y9VD`tjE(3%5 zV{ydR_vVjf1x5?`V@&e+3*Y^HL(X&<@jQRr5_W>H9SnUz`_BgHPb2L8@Zm#}e>^ZK zK5yubcKn??cQ`G^kQck4+ce*_ww{`s>@J*7yI|=7HYcHuGBx|!_)k6jIG9G8bqlC( zk*?!;A4_@~AxpRvQ_{ay6LL`UU!Fv8KL1WE0pI`o$M|0~-VhKJbhZY`D?4atxCfkV zv&w76gG+TxAk@6+6R%3$$Hn>4mZ7OBTt!utdT~j~E?K`_eFKG#C6ebrpYL5~VnZs; z)DsiA=Q9YH5}hVqXE&2se5Zwz@MvDAuoKa1O4L5>Sgu+hIi7jJwNCo%#cS~~&&`8T zC|74^XHwV?pqH0ACWuoi35~jl!^GJRqPg;~GO~UKeP-eZq=-?YCdS^xOu6(L4_w)I zSwar4b%)h%gD2pGl@U!BO*Yp8RiWK#Gga2h0@pd8)#_Q5<KRasD8>?7xtqJMypC|r zYl^i;;U;7*>aVCzCLt1v_{2nqhB4n#ElU64e3cg+?cPxtt#aK}ZIj5#GIIwLL_>Ld zU)z$PYVtdc%2PQqEeJ6<e#uu<!8=(V4Ds1$$%^ep=CG%&mWJl?&G5Qc)o$43M^XE! zP5m=VvBmS3TK4Znr&(w|B8kEF%~=D`W&K&PXI%0U%oumG=ZRAv?StJWDU~NfAFFHI z;U+s5%0G)fT`2xKNGV;!(U}<g%yi?;8bRoKr~_~OMQC?yH+z4$l;)$x)o$58K^>OL z0GnT<Z8c@QxzO{yZ{21&F|LPCs$3uy2*ZT6g+pvW>wIsv`d+4O(O9@NmmAmz=%a}i zz)T1vvkENfBvpJKv9h6S3$8ga%!U~amJaq5`N#(mXyfge8)C8UdY)f6X|krxuIrLq zuPMS8Ra=RY%dE0IqPM2olXsVvBfS?W!FjJ$9HU8&fiy<v$mq=h=$*<Hg>SYC=w5H4 zzYa`{>#NT;0w?DBYVQCaHe6U;<W*E(nZv)l^;%${t+R`Z+HmLg_2r6ws^IRi_n?c} zB_<VEtfu_qP3_Ce5n>NRQv*M~j|aB&1-P^D<#|uTgUXY!II*?6)<)V7{BCPMOP(5x z%?DOEtKx8WL-`iJw(H`}TV2rq%u#{|{Er_`(C5E&(aq8fF1PC5s+2pH`fn#fLNRbR zq-!*{X;;Ip5N*PH=S#tE+qBIhY@$=rQO~D&ORM_*;`Uxc1d_F!m-b!ZR0Foj)8e&! z{j`@y)eIH8suD~1kYic)bIW-wX}Gp)mwAt}<rAJt${#(vRZzhj)t?E^ANXjszWjz` zcU}YCt(%VgEP0__+9i$Z@3K^;?e<FRfypD^G;(_wuQg<N0Vb&76tF%SSf(MlPr}=y zCEGn$r@A<(poG^SK5e?rlbl=1eA8W|k~busUwIb~b-46KA%w@oZ1;*HIV|ZkkyjH& zPo=uw#J)Byo$PEQ7M!Lg9PP(W`C2|^P6*8H7*$Y9+}M%<1{!Af=?k;GgldG))D0fR z=&Z{49WgjGsd>}Ml)3RpV<X>~Cns+}J3++d7v#!6s8dcvrd(L;cylFzQJcOxyh}DS zvB}6dm+ICx4-F9-j+Z<X0AF|2f*W{~;>j<@OTQ}VPa`P0hz9?TOdn&D{+avmB66vG zijL(?Pd{Q<df<-L1XstCW(?eP*tR?Lkheu)Ulc;E{>-%g`I&Rci8igV$?`ZS%S*YG z7Mk!mn<RGY;vuw_PQ||V>H4g+C)rR(T}wHom(m|Va*W>L@NAH3O*8kQzWK6qH9>MN zSsvd3O-|Cc{N**K>je23$DhlnX>*`KLZh;pq7X;1Ka{6M5exaua#jDankCk^e85Z1 zZ>hE83u2xme(-;lc>C7&pXL(W04V^*4%z3v0t)~8j_p6398HqgCyQ}mWCWxa_?3Wu zMhyCda(a~sx7R>AS6rO|vBb4j9XR&*!otG;9)qRR=?x7HNBN`5kWUX*JeAU0X)!Z; zIjd(9y;lPAY(Jo<H`(2>L@|wM+4K9gKPc-e>V2bHt8n-`akNMP#Idv6CLp-W&pw@i z(GGRO8DYK3wX}?7U1Tf^JAWp`JvQ;DAWiSJgzy7KV42*G2JTW#2qR&VYl<PF2))=C zGqy3JR>Kvxf#`_2W6%^)UTa7&ojEthbr~}`o^(K6%;JD^aw%?Uza&$%uk~Y>A@ah* z{Kj<V>;qMNDqd3|Hd3YDe79=Y{J}H~OeK$Nf#ds1n!5cM^_w)KY}jC8S!~riSEw%6 z5~mEc(i?fTHt%gqm_%k@Y`1}2@>+kMP}20-V$HA88U}U9$Cx<J$QLVZ+yB%y(h}GA zu}j+GHx_fb_4~D!Dc)baZl{lwNtB#FZkfX~2+wMApO(k_m7o=r;~W$MkXKCJ#fI>! zxb&BlhU%r|N@+$vW9Xb|Wb#o;1e<#<qBm`}t#wq#93E|434IGT{ahAu>D(NP;<hU< zrn4?$ZeqK5^57`iYcs79RTPpEboRDK0J1>v*vB?IyVqSS=)w)C!-4ms7SEZi!iB`% z%bUQwBfz{{FWE&dar>9};Usl*Kj9=&&~wi|5uRbAUVAdqEv4mH(t($C$7BeNNd6o- zW4i`_=9<$%ZIE3P6Y5Nm)4XCauI$;tu8OzBjpW7|j>gImrMg{il3xxJyn(MbS=@LR z-b(&tL}V}jt?R~JcsUUjq@=9ZEsw9l_S;F>wpvLS0^Xj(xgx1Cvr7f{gnEC6m)|Y? zWDdq`Qt}-0JB@U#@d*&i0Mc!M==Lui@C!<bd>GfJedqRLDPx2T%e_AU-Eh$o=kZ<_ zfsct%!WWm&wvq?ie0BGQuy5!9kGfh5(3m$_^WnZz3iXQX=})3k(jfJ?HFk%WS%Y~` z@pl>?;s__w0vG<cDeiW$sYOaSNr7eic0cyBd7y_~<7}*q6tda^hcI5ewShSo{kA?4 zPU*)=UTVx+JeFU57vA*6MVzy5tzEkJ+UL#sZ|kG`X2+(3h`SZj#pF(58iZV4h2#su zjKZ@<-ThSM^${RCn44OP#8$&DUFq{A_10+HpEXhUZBBqwT3glwLr<C8qnuJ@dFHM% zzJn^Su1x6Ie=6x|Ord;f=tlVJz8fQ$Dv!WZWR~AvcE?av)Relr!`$|oWA>Q(1H)As z?cx83dVz_vWNJZsIP*}4ume@~QHYI+aMSY6sHeaKE@&n=R<Fg~6NjP<Rs7$^OkWJ; zdM*sWi?D3w{sW^Re5=?}>+yn6GKkfm9$rHA%pvKcmd|_I?J{&56X6YGl{$$1Ju&k5 zVgqfBleBRp$6uz;6yb7N7+RNU5QW__A-%G|w=HqD?04A%(Ab?Ac=A|nL0N-)d;J7D z4l!L@xg>{=XZreUXSu2>s9q&`fAGOrXGdP|<)_3J8+((Q`%gzJA5T&_4$$>CKR`#L zuK-8@n9W-W$^J3?`8VRG)2C01@p42F^mjm1N12^{tpxcEaMKOf0s?H(Gcwd@TLGLc zhXKZq`i6*oeSKTC-3Xe*A3~3aadCHa>n6AA`ad<6CM<6h$r#iqZLcZ04GwPD3R?TV z`OEeCeSaj30nGnz$3XwVRe-PmOa}p1#q{p&FXEw#13>Y->1|nHYALJH+n~?EuOdhE z0uO|Le+rsFnD~B!+sk^&^sHXrJ#ZdZ{0+KcBkiwbn$ow`5ywMr1K(XYUHP>|TIpBN zPG^H#eLW=*azO#`<U`?ZcRAvPewAML?b`J}0^n7q{Lh6Ez}zFzPPoLx_?*zf&LQM< zAftuTRoud2vM3FSR;(&#OANGg@<4>g?Cz7Q_yL)ctOoR@OqmkeQEU{uD*Vy%%kE(Q zv#4bQ@`PtWB5)(__jXK7fSmsI2>|(l!A9ysz6A;odfmIkS>h<C=(ka<?bBP#(vL%X z(uU{T=3i1~jPi(40!`Ce6+95^qL!y;0baJb%FaA#aTtEI9jwF76*M+RB)i*(?f?<L zB{L_}jP!VMr6Xeud`*tsbA@M4?wwyo899}Sw5z8XiueL*lhOoOsx4yut`m?HcgrW< zAA1QmcPnMvyM!UDkb4jjx*6Cl4wUn5p(QZk==EhXTNo^(tmcr}TQ$YuF$vKD_9WQ} z)#Wd<(?*D7sJ)+u_j>ovIpBsq9XN={&9Ub*J}?!4P=tBaX2!#DxQvnqo%LRWHJruO zqc4w7J^Wn$*=^DdTLB}S)06<uz-si&5R(-j+Rh>McR7}~8&(GOR`5=_>U>`4I1#=( z42&F_H-wemqz_;Ywpk;cKoOisdUa3iG_?7gVT`f41BW*F>YA(HI~}oVRSR`^p<G&) z3q5PHyMb5?u*JsGc671Na%^$hH?e}&_oG8sy~Fe==HPdIzNE;rN~%o5of{M2wKH)t z0%OEkA5g+Hf#2F#fHC7f=Q~mU-bVmXJKx%Fe~Oud8ybAh4bce&MKIyJ3)Vhe%#F(D zn4PBwTNH8vt7po?j-_$RHR`rXDB~v$BK<+4_Y3XxZv>MUGskdar-p;vf7@}~N?YZ3 zm^BC_dFNy7;w=j~6jg81WM62YUH3GvRT)_Zbf%bqa%rFUEkERBYlQ7^XruYbO)BC8 zwM`%HnAqR_M<?Z?SbLIo(H)80AD|8qDfv(b0mrY+3RBRFBu<2UsjsHS>K)M0yDNt; z=3#J?L?n=RCg#8#zoByr2Hqrn(xso6qOJ0<5d)uFXTRxK&On$tq3sybjWOc?qf!9T z)V!BNUK<lekuLOq*sJeH>P@h<BsZk>OaKqo*M2@}hv~Dr@Za4OKi0m>-2T%0<8Je^ zQYWGk;LPl+<ZC@Lw9A@7JY?SGX@h0z54zZ2V}j|@8eKIK4$*d9W3_mvdb=4Ak@&x- zorWt{b}QHHI3C%&;`aum3+*;pcaOi^6Lz3uEbwBV0t``f+S(w;*685I&w2>Y+s`Mv z+S%t_h$5Z-oc1rMQwsRzRA_#cntS)h*pOP}xr;$J?M1ZHSKcJ;$X^jifnG6vN_VGP z(5GJ)?>e)Q#A~o;7{E~{%vTPt3OzQtW&|J5#@@gt{UMNHu9BK-==Nk}zjmMYA4(bW zvGj&dG5;Clq^GBEb#!!WG7zhW!doSSgFc3keRsv7_t4OjgT}^Iggs(KZHCXU;X7@D zoOA~|T}5T(9#=y2In<V^Sh2Ee^G#p=z46b{3yMMwzi`7}!re9kPcyS3s!>639&_;@ zMC-3${d-*z`2K&doA@7i@@Q-b66tbmwE!!q_1})NOrbs4hC9|~d(6Bd=RDc`5;JWx z-we?N-A&EF1YRM`%aV0#$Rqns(>sS2N_6O}wQm#05BQO|BS+^v8K8yeRmeal=tsMN z@p}bj>3yg})Ddn0hu^sr!9Msk>O4*XLbWxlD6y({lYMJM)<7l}AmV*>-RljO*Yqg; z>B5OSLq~P*-MX(~xVcd8v9IgUr$`(x!E1GXPA82mak5zyb6Z^nJ!toxHiH`-mrPEq z#XXxGjRil24hoZ`3z4ebUT%cv+B5G!4niDqT2iN_87*Vzu$br8Fp-WJgC`oWET-h$ zGezzBK%pw8h6#EER~ItRtv&}+DGf%S?(O<P)*^>##p}S%HO!>x1(M=1&nD&ZL+q&& zGj3mR&9{N}jExt{Y8Tk#E2VWvYw$|ngx@p*wUuTH8m87??<xd$g`O<Xps8wzbwNwL znXF{R>`nU-dgbj~-M-yb5CC;poUfgHb%oR{d727+sRQ6k<$Oj<gS*|Bel?p{NlZDj z(&NMr2LegWwbA}xj^Up6#oDunT517@+_z11H^$XrRnS<3E1Dv5&Ci06%~IPKXOVk} z@2$G0dztz@TORLJP86J%Jn#Rrs@u1jJjwi~4y9Uul^_1E6!QIU0=#DFLU5!Y*X93I zyZ1kM#x894^Ye=@_or>!wQE-c$b9Jy*U@)J7uV4x!9xN610nVPk?umrhR>hR1%!my zJG;60G~Q~n;W*!FOW6*T$}js?5=YN7_r;Uk<Hq{G%7ADia4;*@tT3sFROpLGj-2#c zZJ=cED<k7+Hmr#Q;L`_gTgg`e-KcLxiv=Jf&L-?N5X<v#E-wBamcLRzO(WBNU5e{H zdm22W8#iGYgH+#Xv|e;}eWmjZ|6nsFB*f{eYP%=iPZUY=edEH^Mbt(Krk2<U&dYNl z{GGK4Dq5?(N@C!J_V`J~OU><Ln}Cz6b%FNqLCpl;2fB^z1qzqPI7{romqV=TrIL;3 zRCRuD#R$O@1mA^cXzC8~?eVT9OR9cg{^bGCp6VgiODYXZ_6O9<@U(Sj{YrZ9V1hEV z$5XF|q|w9cM7%cIt7WYVjD20vGv);rp@zRyGdcP<Y=e>W*sDs{ifG>G%|ZT^eZ4h( z`wbL)Re4{$2HmfyoWFFvz*YTRSQITUt-YXfW_;Mk56b0KOXY-Qy^w(R1g;o|QsV~@ z@z37euP%AAdv~{ycF;rndBV9S&&m4*L8|Rhh~(k6&>st?%h8hRZT=Wn7Ap#q9&gsj z+3(+2o?(gb)Ow)YdjU3Vf%DPcm3~ny4_&YSWQyp9b}q#}nasU;@eqigr)<v8U6B!0 z5d_m|6?y(sgvyf0dkWE=>~XUKn?jz@HG|x%f`9TB*HL5nsaRS=p{KO`dmcDNw+3pp zGJO-*Uft-#{RwzrP(|-fij}F|s-2+63g3c(`(|K=0jCJeu?c(bo%kufF$Xv8dz)NJ zxSF-CpZ><?+}-e3@#u`&OzAso<N<NjRyHxx8aR;GeWM2u-lUevi-5X8AWDs~(uIae z`3hI-!aEbJnqs?ao)()rH;9R4_!)IT<;H|VEn~izSL@5&OdDI>waK}h07v3!vu95H z%}1fzq`bOf?WG*%tR!f)s2=6A#m8Sq3ohT?e=)p(cC*&iuj+>NSZn7E@sLbIN!|mL z0!`%<L|S`3Y76(8RjU_vF6xru<~u2hFodV8nH<sjk;;KpD@strPiA|)o=k-GgZ;AT zc5fSzE)-<iv0By-8^?FoQzKn!e?aCFX6#Mwy_R@BHG5#m6rTX^!^}Y)B6m3GAq+P& z%)c5J@DREdteVe}tU{0R{M#9mkyO(uV9?PS+|U?uHg_&qi&9hKu()=r9b%8fQQa^i z>JN88UjR#Avq`BdBH;CUIa7q1xow5rywIk|z)k!7Wug9CX2nAhRjM5OnSi!mgvVdH z65sgzn2CjFOxaJmhxBq>bX_wVbL<(Tce`Wm4_N3Rd|e-XCj2<1A4*zpKlAHrfxzbt z_r>bU<p8;A%mchZ03=Kx@n4f$$q9Zl+uMM!{HxP1w~{Vw5r-SA&8|Oq@L*_iQeFNS z;3ag;=xJa_zln9dZy_*r6@!*5*MI_OvBbBMBLtbXz^wsCdiWc%a%L;nXT6;L{r4ks z=5;ovgQH%9$VUfgE9fUFE}M>V|364}{&q{u(*_90^J0<*YQ`uDUq`MhJ~*H{dc%*6 z_Z&-HWyEy=-QD&9NMw<`teNFtkc`>o+bc(R1-x@2>vnI(sHKK|(@!V<3NU-q3TBUb zCBAWT9SquL76v*!DbC`qn|ZlaYKN1>V2}g=Uva?!<ac=a`+aH$*b35(mJRLg1qYF; zS>+*>o3Q6(v2*gq&c!hxQW15}-dcOI7ByT7S5=l_n3}y|=M@fJ32~aLqW8Cbcl8@M zw|V|6aL(7Fu%wzy>FhlvVYD?LvMq3ey9#)f5yLP0<xLSlSryc>aN&Ytfsc7l3`j?b zO#~DWMD_>musw*j$5Aw(4y4!yq@2NuCR;5CisC;D;-(ER9x!$O3UB)nE)LrA363~W zzTh3=<b3<>PLNo$yrSnzP7VCxmEm~z<e*wqIo8m(SXPUsl3jpZ42j7e8%;#6aS9T& za05e90`{Oz_Dku3Wa9@i#bkQiz0bseXCg6&tbZi!Q~4D;=m0zP`|-Oa_g{?8Uz^es zkpfLfVz-{qI*YN(;Ke3BU7vH#XC!|*Z2Z`>OC#PJ%~`&$Fdt6%?W#O^K&t_R)V<<q zQNUEDXt!S7cx8_HX45~wbc6Y6fo<KsH^7T6JueD>5r=l6q1d_TiI(pS*vXQo44Gu2 zy&0kPw};g<j=MK{YQkMz+a@u1E;bpYTgDBqU(B(@eXOQ5ybN^S_<HSL<h@mQydOb| zUz@$}O_%wZ&=>jk!>2nxUf+W8IPAAi4AP0-&CM<_1$+|OM#HjnY_Z4vPU2c>tY2P) z;YIqTVO~6Xqj7>Vz8SkoMOoHAwR7??<1-_y$&<D3cNfsDe5vlot_1U@*w+yeE<P3U z5@{R?7|RMwkCbF3f>3X-L6toIw-_6!gDJd0TR9pi&h7GlM&{S1MgV!2mM*-M$IojI zTCD|rxLe{Pj}%xu<F~t=PhrS{w^=CnJV*!?5Rs-}r5a}*<Vt)67O<FOf*gnbU!REt zIb}oagcB0!eXJqr0+h)plA^7VF!LNrK;`NJInuTg<Ml-!K<LYV0mnUyD{$QN@l~a5 zM8*dz$b;`L13%}MN9gys-YX}Uo+Pb>)TA<wVv6ViuP~CjhyYcPQl<=S@k#u;CX2Dj zimpj)l6PWK??WE-uMFxYI<}nXPV#oOklX7pCw;~RjQDXxR?)NR5FJdB-uq-#H~PDx z`_P`}bVwP{I<qHDUz8E^KpnsSs?z~9Dj`|9=*t`Mg4ThOZ$wLBFWc35u0?7PC5L~M zCQc2D=^SsIzcH>7t6C@cgNFSB5dS?cd;!TGP_}Sl?dI0%S;Gxk#sE-O>V<&PwiQ5B z)3GNJE3)Jtcr7l6h+ZyLI;wPEPxO^^{t3^e8}D7Svks4N3eQq&EuS@9pQW)zOb7>8 z(%S!r(!>8im;Wp`0xeeTh<+q2BUzL70imG|AZ0E?p-@0{K6b0*^Po={N5StMQ1MpK zmpF9W|8K+oiJ%L<F$|`yrKL5bJp*}@xr)u}5`nDXmGbAP{->G}3;srN3DxP}gZ2Mr zp$$m8{MTr`6Ucx-u>6TVD|`hnVk5WN&R9D(v}dcFomg@=F;d?&`;qfzS_dHSCbU^h z)DqVvu(q20?4TK-VK+qrK$(}aWJ+ia*w5u*4UEgJ!$p3)e#Yg7xin57NII;PFoEP( zkwZg)|I;dG3JkuKPRpwqD3)djlh^beUYo<MOdYlLAVq3|r-T%e9}gR(ENrrqD^8`t zKE}$dExc5tZY`EbLwQlXAWV010x13)&|95KqAc!R6BfWr94#~fgS!BPE4g%i%TRG3 zHMt_{hbF+W-JiCU{4_Wk1SY9d!xvXjh=E?BaDFtfXrTbR;db`ul1^SLt8SF4y$g5y zx9KlkHGKgW4sF2T7Y?Sj=u=Lqx<zJ8L+s3itcfKqgI26^K2SA(Ecb8SL63-H^4=QM z9WlwEmkD%QIEGAA!4v61KF5rI{he?+h*WU<33DcU+DfwC>aX=z>;$^#l(D7rIo+S6 z3srLU*|f;$xt8r&$OYmAA5<$JOIrL9x%ByR1H}!Uk*;!j1HB<H1{~ad{U4+Y6;5~H z)g<?HU+?%wn%_NatJ`SDHs05G1S>TJEg5p77jL0i>&k`D3Vr(S!_)A4P?AL$V^D8C z?T*XJ>k*JJCChSUn6~?HOat;Ry!%X-LfWK_m$9ucxv;g}8blDCnYCI2dPEgngj)Go zSYr?K;AX3&1Lb1<R15V_l5YJ_2c4UC+G>)<$4wBPnBEmZlEtLo&R&eoq4G}LPE8mw zvz-I^s$;CUlsQeaUhgbv4d6#HrbtQZ!th%Sf?p0#Zn#a^DnuLV(DqZ8a^fTiCWuJ^ z`2rNYwInP7K6<@Jh44$e`-$m1`hKgV#WVjj9|t0eC--+s9?8JgG~}GlRd7iK<rw|h zYRdT3mIh1RQD1FEjLF?_k~dXJ4;10xlNeL`5o(koRZC=lpJy*7H%PW=0nVraNy@&` zBWxW6YvZYm?B~F}P3wR+*$x*3r4XnCcKv=r&p2x5U3k({!);Q(E1`<}5h3K{eO1AU zN+(>^<u*FbecCKCGJZ7zgoekueh=elJa5kEtyUYyjFz!P(uv#8dCGYG8_v;@^8@b8 z1URNua2H<m>vK>`ui?D2Dg*F+ZdAFr5Fj;*xn1MHfeW`*Oyaq;PgJnA+|eO+thWU& zbN?=tq9M1-F^}HIcFU*CTcTM$Ym1nIMiAgKI+QJNoZZDAY<%2{6<wYokDRA3AIl`C z_XV|V?x%rLht#BB)pZqKmnafd9imb5@UrqWmAG!PES4J7`bXX{0P3(Hv?`o_*P)D` zzj0iz?j+Et$!7<`kRG<tmc}77dB#o+Y{xhZzxnRTiJ)Z1eg_ky5Y@ARJXX8IAb*6L zV(>&enIbPte_<kCR>@y-Xj=+Zit9wD8=q%D9meKfO}9k>(d&_|T*<dIBG9*cRiqyx zU$Q10i?Y3fa_5bh+s99f1D>9W2QqGiSXCbrgr2G!V_iwleK&!BjcaDAiKAf}^wkhA z!Sd}DICa2}%ime=psVkf_58hf&MmParcD1`IFz!Vfvy8n2_MK#CVZ|2Le3(5B^dy? z$o~2>x~W&)PGf;LPQxzgm1ikBIf2+~=TWPZfj1pBBif#imloYGsG8^*?sX<abvdF) z>Q3x#QFtmHykY$Emv-OR{xII0XXc&OgAUjzT|RSD52`cl(Fnl;cSdikFIp-@;>nmN zy2N<q;_KRzV}cjIjK+2g7rF`r9rck9n={KJuJ%()ZkI2X0w^^EPF<Wz54bY%MPm4r zDt@}Rf?W($t$M&9K-AN-W<O&8tv_qWQh*3=6)RGIl=4Pbh_x!^pT&LsV+H3okN!`J zGG%3D#d6U6DFCjiXb@P8e#?-3i?#k=P>%@+%AX6q{-08|^0#%go!@E!{_PSLP#M5( zn3#Ni(8x(9Z)SL*Op7w8!x+*rbB}3Z%`)}bL<Pdf$CG&0E2F*BsFs+mW*-(S!_igo zDhtB4x$T+tyM_a67uejGPzorz2pD6dJH^!=??ZMR?-*RE<_6)Fw>^%#_TjvQ$XHTS z>VVuss6!}DTrnI_!j9}>4-35TlO~N^{83D`{OhHtcNVyIm2vjS)&~~2DLCud!A(R; zB5eod{*L1@;>!5WjTks1#IWG$@bQqpwnr*ACg<LTH{3A2ol!S@#kA5K6CuhONPy?G zj<V~o*JI$~f*L`Em}Yo>0Ci(41iq6A%2W&IcDUjvp|M&m(3?*#dIsHe=nPegb=&E< zQFCxShuV^^PuYO=m)cjE^B@&#yo50_zj0=n^B|y@kaenv`r)opN~ckqJyP{EweVJp zzl!<N{@2c~J1K3jthAtNsKau24*AFa%L|-p?FL+Nr(w~;Pla?}q`WD*U1Bq_CMeul zv8r|2t7$<7Hd9GklR?XAov9sPP^6s>wj2%0s%Az7Y6FcBL|0S{lXHr<$X!=-3S_&+ zYWl{L4U1~p#@3Z^%}UF69q;&sH}$eDzJw?=GBi!!_Ti4Tl=x6r0Z8=YuY<jbk$$3J zbDNwwvhK-<PV4S=0_Mu~xW-45s2EJTyb^wh{84gSQT7vFMVgIg(9)%cpEG+R-=`c_ zN16=k57X6@tGIUTER-ZQU_232x#~NapN{TbLZ!C3G4Neb8+s^JHEL{m;)H*Y@u!Bo zT(%-iB7>KxLS1t26F4skQIQY;)(vaybPv9EMZjzG9CS_W*EmKkdJhEoMD>bA(3~L< z;eEb;b$0Gp(yQxYim>$0>T<*s;R~P$xU$sg*kn_04V8o;H%d7ye5=jD+{zM<3-7FM zKVTYmAKEPC(Bw(Q6bhmb(2L^jbzXI=I?nIEbhD*=S{J1y!AdyPPpx3YCMU*y&iP{0 zc9g$-#cd~nFE>Hot^BAg&t8^MnI(;lBfprMiOHn%vz1V!6QDE~{dqEQbho{f9hGr& zAycL;wOu{kVUr_k-!_Z~$UXk84$f+~R1LX}Te>dup+z|tC~ns$K#^Fxl<=ZtKKhNS zf@_twD%BJ?_+Nuby^@OA;TPV;x)FNvgDx*$gkHhOXJ9eiYwVT-oBNiF$h`(-dX_I= zqx;#;JCo=y9?4%_0x~IGUwP*+y->73alRC_wfh}L+c?2<I&Xm!MA@U=6{(p*U1!ur zpJhJHgC!gX-kV3vUwAe>cSxq+!qg9F+gFW)Z@rydLKD3*dJKuI4pQqo5KlmN|B=i! zK#(Rk9k|$a1$EE*HkO;~WN&Jz)<FEQX~Xi{$MWV$(mz9$Jti@G<Zb8KGQoa1Ay2z6 zU01g*^eYk6*roEQWyrq4nkzSf4@Yvfj60<ZyOwM34_G_;9c%8hz64$>_J5^fMQgV! zYV!>;Zu)W-%R|opxbrSNBd2f@uO8uF(9;5m5qE1Zhbz-o#QAAEmqjVI3Vay^2~gD2 zf;08Fb^B{okD?yJ7yV8O_Qju!?Q5YVK~sm?)rBFU(eEU!SP&az&OP~SKUW^Uq<dzh zv4|5OJ9qshGJSAy`dSiCt~d2?q3J_OsS|Na%S}O_2q%NM?=5g;mp)D!qw9cioMh6s z2PwXN4#k_{>hHp{x$E-#D!M@$oUV4W`$w76C2RA?UM-rwtkS#j2rG9YNyYL%aGe{1 z0zpz`IH_6cuiY)&XNhpu@Sd4!l_x{S@gr+fxCw!Wyf9mrTb{XF=#Asfudx#xtY6qH zbtJBbEU#idHb+;r%#BoG@W$n90&@`Hy+&mL3%r*61cftI^_i}08?YXG_j1I{()k%L z6TaNyF(dj;Ih0gYOe-mf>ar7-GJzc6GR@&EEsk9&=I$=O+!nvMuB5`nT)c?te^f>( z8Y1+dC&J+G?(WRE_=L5&lsP7i*;5&CfehJlSKF}i@U#1pKCL#cO=QK5XIse+BqQ3# zrC|fDqh;Er?_o=kkMF32O?y5>s+ybdeNh?dZZt<mXi(edMQIH}^gYG=-az{0>0K%d zNxzng*dt>`X;A*{%ocvo!o5vq2t7KJRlcRCdkvfy+QP1jFHVbcXHN!J-v(Jk6}OdO zZ4s2r{+6%(O5UQNCxv+G1%Y`D6~Rjhcw+j-W9_q_<O6=L&oN&(D4`NHUDZUkeVTJD zm|M1V-%NlpzOuId!-AaK^DCJm=4fPAy#;;$E%Ha?^vdW8S&Sv}Lz9cXVM=(Xyp03a ze3SHN#PSE!rj2(hX;Aiv8KB&XCFPd6%rrc9wD>&6C4)^Uh$$LbS9oc*cO>^_($hTf z3IwPvlgD2-tYiSbn>2P`eBtlkd-_j{NX4=H-?Oa$e<kVvLAM6hsjL09<m}q2Ab*H6 z#{T<^;-4$KDnL?kWyNob;uQ%$BoYn3l`vFPRKyZ%)<B|k#92u!^x$7WJI`%|+c71h zkT(ZbUXCLu%&k;I7~cAJ?LU3@=#Sz%m$q0I;h>B1xA)lwdPa?$FS$53UY@#EsY2)< z6FSz*_GT~3O_IYa37zhyujUQUX9z`8{ndUuJ|lK|o1I~wzk27i841o*$qPt4ytQ$A zufl~Zk_CsdnD4e6JM*Je-K)31{&ei%HpRy`*N!~2yrKPLy$tp}9Q*F%r5$%P;4}&T zr?h}`_@7JTj|-LWcL!e%rKJ<!&+v^;PExzQgVWue-3WQ+RygX*!I?vuoh>m}d6?vw zvH3;IgVxg0=YDwzv;o@EW}nyI4rd#z&#zZLgLutjs^iBt<eoZEu5N{!8KHK!FgVC& zoq<N&X2xP^#4(Dgvwj}z$bGe+f3~&!+5v+fJ#;$z1*$teYuC|svxo2#ny$=owH_-K zE$dyBxY*ct0Xe`IE{8sZvt1^V%2czro^#P-d)aKo&3sfS-Gi$_c)cu+O5bZ@%Pwv0 ze&O~B#jiNee&^!Mm&B}pWR*X?pFDE#*5*Q!tk702-|{@Yr8n?O)OOj{(NU%1GLzGv zKG6Bz3vwgl@HxZe#LsSdA>5!-ZkW*b9m6-b@Jbxn6m5BJVa}XD1;cNzITsfa*wa_$ zM$^B%D-U#WPSi`_i(=+N(<n8;Y=^~9LoIV!Im4$hrhU?71MDe%6=N4-=8PG`60>EA zn$h35F#QNK*7-rt4BPQ~i}Za}W1^7jvj9{V&zAbq7g{bVPgZ982!3|ddiSB`Fyn^r zt(Gd!ebzUR&@r>HE!`2eIfT4d#!zvz(w8tjrl*htYrOV8R1^@<Q-XOUQ``!VoMv=f zJs+o+TK|*s<=xMEJZ*H?e(mG@m&W*Jih*|PynA9BjC$K(VVjymjo)tnp`_;;dGj4! z&K|jBxU7?L;|KEOi98nS*3cfKo?=$}WdzH8m)f~#11DHpyMBM=j)iSt+(y|?*UtpO zMEoE-k6R+uN4G+9f3}MI9<spH!k1S2R9XIDF1o+%XhU^bM~AwgN)@K%H*b8ahpfI; zUu~lAN!=ce5TkapCX;Gg4PnBIq2*2S<na<l&t{E1x8jEv$<ySf_2qW@7SYHS%)y-{ zR!dcSw*n$GEVc1|)zwe*zqfV#awP1W%!w!W#y1sDoqpB|_cDAq@YX(^%K43{)QPwJ z{Mu~!0-N*UC9)^xAzka|pJ9H#oMUxb!(PwinBUjadQn%^;o@`xD0=>w%^DF2S`X!i z=XdONiF|+|dU_snO8Pz`PVXvqVB-O`G-?H@dF<nz6Di@YgV7&m$So%pR8lIeG_(@d zt2qSveU6aq8J1NEI_c@z$>E-!QEh!4Z1%aLCi$FN4|nEbdPVwVbLy4PcE=B>r#3fO zJDrhf%+!o&Z0HzkCq!4b%5^dxpfmRE9euK(LCcrv$h5jx85_&5IDQA`^1Vas<_(ZB zY7QyBCHc(NBbYwVqwTX+fo_{~Z`p7|@RI7u@cOw9-<IYeMJ)UlV)q_T{V=CnhN0Aw zHe!F-J_~JQVfb>P6|Uy`c<CN|hmTBC^RpU~I<tgSK*nv>sHNur_Dg%$Ba?{3A@4V9 zh;;kaqDa?XX{lVMa-Wh;#20kr#7vm<*dXF!k0k}%mnkiJv)%@jEJjBq!(Glv$LF1? z+JX60bmwlIain;kBWas`IDOCbBMculpLmKRrB-dxK;E1!Sl;$%7iPL&c75Kl{6#O> zETuDu(c!Bno!NNY)n+SPhp>G(DR-f%akQw$Elw|FmqU59Uz|PRhPS$TyWMYR1CUOL zyYw^_H21WowDkRa$)i2Rf6+LyVs4HImS>B%3|2GXt*v?v_h*mLxbC(*(@+uoV&vl^ z4#EVh-{R)gsCnA2KeSa#mHM+5+;Y{<7lbFwMf|ne3dfHOX{0`ab$ahevjWD(W0yn( z51hcU=e5)vxEz-(bJ&)`a0z<{h2%2RV5BResBJ=1d%T%au<tg&rrp^!z4jMw?FJze z!PE+uoe+N~Z72gitn+lQS(QK^33qCqvO(nX7Ki;btV@4U-*d4vut?iu2vGpb8;2v~ z9Ckml?cc9Yc7`c%Qa2Yik(-)xI{L^I&3?05LcNRMXND<K;3T%Cus!(O0x1FI2g>*M z5mOoNGSh#(v;LI}<IeY8<M_8zRg0t4=kT<u&XY%ujJ#gmA}sve{jFsu?mP*3t2<IN zTk?Zne0D4SRPNDt&pq~R)jaI*i&|-=%!%JZ^1Jfv8a+Hu=i{h|-J;v`latAqEt{SM z#0Q-!K}P%b@XCkt!m3`MC-L$Yb~_V+{nS2Ess|>p-R1tv<(D?SJGqeMm(-E^k9lO3 zcpQr`;mkuH4R|n8TvEiaQtKIu?id}e^lLnOAr8R#3c&3=q4{`c%p>^BgTRO#KmR-r zwG?mW9*}@9*o)^HXD@LNg@c_|Jt#h*)^Xo&IO7|~dI<A-{${hZbkmAQcnH{!9v1%d z&p($Mf4l233H*Ex_zK9rtj(*Hi4oD!?@>Q(1D$cV4Aj?0fuco>_^0XV;z|PH18Vom zPeDOJodod0|H5uCgv_k0G>`=^hyAr0YIWp@hx`vSp9gD=Yhq&9pkP}?ZJXv1&Y*$# zmG^_caGW<vOH1b)51Ja+glW8hd^rdn4nB5Z(BRJ@*8c~-_HJfOOyq-Uu72|MPJmPR z_1|Xy?!ULF^{BS`qj~2S%C{2*(j}q=_87LE>xL5PDux@S;n6&(i}3sc`2#a_^rL`) z7V-ty+G3Ya#kD;|{s8|R-0f%*Y)b=w9+qm|<nuB%Xv^wI?uWIZ)Ew-z?#9QM@wV>I z#Z%Net02n(CvY$nRn)up$+#HBRzB|(FSTuEV8__7m=Lr+QM4JmWu-+q79R6#AL>@b zskqlQSA_{vMliKUt4(639%QKXXcL3g>YpXZ^$6xmwY1c4BX&meueqGrcoc4{BbYmH z7wfy!*7AIg!w{)%micKJH8CHZWvfqL=4A~d7Zzfz2p+|s=jJzG`-Bcc5q%p`hLol! zyJ|xx+_S8gU4qWxvHgc%k2<d(#_HN5MoU_|DjO);S)FFU;jVn{W5k2-C$c@?p1B~| z(Bx0NeDo-OD*Vpo!iOP0B+X!DRsI)yZywjw*{%!QzO}7bwM7s`gjz+JsRJN$9Z(4} zLkP2kNoJ9G2x)B*K>-;8%2;F)2!t@tQ3yoF6p%!QkU|865W+kK!g*Fu+jpP+p0m&S z?Qehk_x-;7qaj((TI+e%bKlo}-`92LY87n*lW5b650iXcea!7%1}lhVh>Yeh@hEt& z-C3}Hba)CcmjoQD)z^Zy)Z%BxNKA=-1G(vMr=WoaYT04KQnGy4C)PB}o<B$U&r0E+ zdsLy%Q1TLwVFa1{?!jAq*&(@(#?<en=c79N7+yW%@~#~u`3zg{o$isvD~0rGU)_Gk zmXZB?`<DF%&l)q{;dK2y2h;dE`*3Gt&w^bGy~M;r5)rBQCaN_blzlHC9^^ewgJIvt z{O&6{9cDTAqN6RP>C5_L!MV?2?4v`~MA&4apn5A)(0Ng>c)_Z=%gd&Z>VU|wB`lBR z&51JmGTEu!me+P)uH81k{mvE9!<ZevR$YAkC<?i6=}U2VaJ6oO8qMoQq=Na+i5&%~ zBwfve0Tujis5NSqI6UiG3IdH-)I4t8M?Iri%>u@&j?mqpwL4}GW!4nw7|?V&leOHa zgT2Zo23x<1OEM0TvlP13uhqS7bx;Z)MU~d8B5NG$-ZtepYTG8*1#vBMmeT6JwDhS6 zdbImE-7Fr&5n*#qGf5L#t#v<3Br0$)h}?TG43N>)mO@AS8B<FgQyI>&&4r~hvX0MH z%VE^q<;%16Fl?`~=VWHu+KWId+o_exC{4PIR9L*nBC||Cuf&Tx<lyt#h8&u@%=Dkl z?)qygGQ{BpKS>D)GE|Xew~}uSrrUTZ$9Yw+7?%4jB(RgC2|ZQK_5pULR#hzFL>N}X zu7s0}=#TC9P;Gl+w19Dpz2~74u6ewD;fxMeHrBqxmaIM{ySs!xh@A~dMhtg6@HYG| zS(<Q>uoE}xh>1;SRTmLAS+O<0M@BsgB`BK5RTjS#jxEnEO+hH4<Z`zaebS{KExOUq z%69dw=m*7N=s`(BSEdz>ms0dL$k(SUB{MB;9JFwb=P7SK&i^}x!*gQc1)RL`hef{j z?$otN5KipA25$WA|IUV=_U^;2r=Rxz!<#Grk^j5sV4-Hbd!+JsysY1YfrkOF!u<b~ zw}^+Jjxouk;<|yzbZNT(Y{8{51wNc<U^h6&rGvo1{3LO;DRiR`5MY&JV`IDf`x8vk z=7qzlQVmW~5Z{Vn0EMOX!B-^Xlf;bz0IxQszP^5W0^(ckfkB;H0#j5=lal9C!l?(r z_ctJKIp&kpcmG;a-24#4gM}RAPmz@)0KDwk6LS^#*x!j3o;-I&GL*s3k@Zs&5?JQe zD7Pl-;*^8|)1~6!B4xCBSXkya@JC)|-L6ybn%K%jD(;=7Pi1iJC}W@2RB!Pi++MNa z%i@$4N1tF2D&=)f)L(~O;a!nderdRbQB;%HXUi&_jH@1fLCFL-5*3OApgy&{>Mk7F z7_fW#EMlRB3VV?X!^W~r#VM@8_a)lmln@9bfN{!U*!0-L4{p%gVox4vdss1yODW<6 z5~^|{+kywrOna2w_&y=XgOaXfcZ4-U#?|>)l0AG6wk$kXUb7bz`)rod8g67axE-Vx zaR<w_IOKC;QYpnURP<`3pBOv2OJ4J!PI*A&fDj@-`A~PugiAItcxQKx7%UjJ>5CzO zOWT)*I}-g22QX@{^3q_*;<h&!tKsB#CvI(z^xv0MkEpskB;YjdZOqzS@N-?07pcy4 z3*BC1mTRoFFTG8)>8Ga0-e&W=35df_0H_97q@+{~A_)HmyFaPfAl>M*exb_?2Miha z3hsV|sBd3i-%$1yhg;m7urDS_cAtuiIkswDy!hPp65;)(c(}Q<*|Fp>nxsw05#YBz zEGHuxhHbX@Ev_N9C&Eg`zH3>KYi-WA{!a5A*p?kp84bjtkrVKyFXQf%j6H41j@vGK zXO+k95YAbWL#Ny5i&IG1pB{#VJYWTvQpa<0JBNM|hc5>qwnJ9|u$K-7;SXXc##XA^ zDBDP~tNsMRk`i-lQe9;-@St(4@zz6RuqX^G7S8Wh`|&oD5H7W4{U^oYE}8xbr$F#B zWf9F+=0V9dev1>kgE%5&v>?*4q&;QLRcY)2%YWma?x+C8C*F%Fcrs*)jOJDndcUNl z-!9j|_BtD3G;l>ZndFTPr?fdl(d<af$}_}tS|UO$_OFv4#~@f8*yTa<5)mV$?uq=y z5Lb!nMW46%MAzzLf(|sQOK+mEXs(C{m3&TicwBkeN2J>Y1>Hf$UxN%|5VS8*LH*8V z_<J`aE4jhGY000JHM=zGR=Yb#4tR+PUE8jFJ+~#?+4*8Crch5K!ftC!tz^+nES&`K zNtj5|^-s5C4}fT(S41L$mkrsohm-|Kkp_T_4jG%>EiQpiIxY?|k-Q;bnuzF(2Js*d zWR~uMVJAN9ENH`nPBoJY3+JS7=FI&@m1*z?o4P9>j8{`%?*{t2l*eD2=>cMS&ZoWq z=f+0u#@2?9WmL_nBJOWgi3a$X!hRgYnumb+$t%bB=VtcB=7*Eb<AV>|WY1ejf+k;k zVtBjo{~chve_?BDBy@YTvbLt?js|M;wBXr>>tmICxMSeLc(eDl<LhL3+Y}~~2_^#{ z6dW8M#k=%y>a94Q@qni4u9?1sR$tlfg!lvmBsZmj<3)Y~Ch%KPeV?x=i~Kg_e;LW| zLwk%Yp1eNKZvzp{CXIpR{a4EpB~IDi(Du1kre0L!)m>d=>Qh$d+T<6aFeTqfW+%LI zU0@ZOv(iRJe4f^$+1#xO;Y=mYp{3$l3qM>tJjD7RuD%A5D|ZLeGSU>Pr|)f)?CzTz zcw&^_-uCvMMaIp&J*jWkL?(lAZl(H>D~%<ed5x`zQ#^bqN5Fnri~0C?+*q-p{uH^= z+gM1fQ$J2qC?E#2cdeK`JhF1hyLo<nX#E_q`DmO!$J7T{K5Ej1UWEMcX_W5j*AC}# z-F0*48vW;{%xJa6Q;I4PV}ZSC96ZH7|G{>Gz0*`WR-YuTrgt=*-nnWv##{*l){~%| zd1qu%0b$EtY&VDl_^9cnN@M69kjOhOPT_no-d-SH7yn~&?)R{?iqd12LZ+#oI~$MY zbjIVdy*YhO7oN?E4AtIP+8^(8r!z;lJwa4SDN!pM`Qn7V)m*NR^yAb-#PminPTL5n zMS51p4X4I!vaFHO02Z9u-8F&b{L->E7AU;Y(ZU2ldEKlpgp&?v8IBz+^-s9co`6BP zoW#UdisoO8y;Y62dfZAH^&eRYWAGORR+|LhK!k;{;Ho8`b!Po#{;mV?)V1#cX|!*m z(Wu>2$~#^)=eqP6(f&^I$qdf-@_5C72n_BrwiN9<8!Gy1)m`DFSQz%+w5i;SKBmP` zp0E2%{$Ha(#`MC|@f=5<G2IL@v|A|o+?mZUE#pCw$2b-AaY3^3uI}^rTaj8<KA8%J zt`4@sWN`Wke^G^gefuhOL=pP&U8^U$(zCWw_`deMM8xU8?8E2_V#-jy$>QTgz5;7; z_?YeD@tE@BmjHFnkoN6|Wl}NPYlp_|g*2sQWU~%#-NO3DMSM2@kqh7nEbrC7&JBEt zzaxAzaerFeRT#E_Q4yejU;-X?kOS7j+5p(itcz9k#Hc8|-J@mCBGiswb9XCn?05e% zP+-;lj=O6JsMq=2X+8;XIkVT>=F8W7`74UFvUG7c0kvQ&+y$(rK*{BW%@r+*N_${< zedlxXcJQ&H?M+j0c>VWvU$(mGVE($rRSEnH{o0CghDr`GUIk<oc+d&X+N{qXKVBQJ z+Pgmg*OwC!`~OfERu0=T_+=&A@IP!~0r{kx!LWxvxk=lHGY@2e{m;ur+zkkz0&M0i z9{DCcH8pj$65{`B0NnO+X~}14V`-{N!21S#dmqj)u(;Xn$S1>b<+t;vM+Ody>hI4i zKfQ7WGG0cvApih80T}z|8A)E>z84w)g>R3HLyll`#m&dtyEk-mSsP$$Dg8k5K{jnn z9negn?8~=d>)VSHIzA{AO-(~XQD0vlAa0|e<`Dlt_CfX-fTX)$14_>Ilb5!~5MYcM zGH^FM>)QB_J-8f*?;m@r<{wZ(<=H;=*jOVN8yJQC-)fkh+WrMPA}L|s=HQ;LY@Qbc zvAWE^%Io|D;ry~$UfK;A>4y&MOG|Sn&&*gZv0Mkzuq7#8G@I^?&c!8;L#aK-e*hcf z`-HP(>NB9rwVu`BR!_PPSi6O}1J7ISyg?tn2$0@jSj1G7vZ}J1XUh&jJ>=L<MQ!NK z>L3r%l+J#;CfeIW$@$%b9(CytAKs+#(rW<CQUoQ>sy@nQ8zNb%$?7ASge{|nqHDod z*{IMX6HoZ1^=!XPryZf3kj$zPZqqc16yz()YH&@4svz=o=R}aYDyx9*K?7i0%uVPh z$9>{(i8M-pza$>a$8+8df-G_mX<th=nn6nDvv(M}=UkzGp6f&ly6`wjom(?{_WdL} ztnyjs&KljUceOv3d0;A0q+UHX(A?j3x;D1T1!w8M_2Xz^ZJltBrhwG~<2PDRTPyWP z%8&l_x{Ak==45rSB@#nhL661GeG~ijgT5CW`l4dXdUl^HoxeyvmqHTjmPd&!F7Irk zpW}3<z{)SGFEViiMfCQHS(Td1erDgqNnm`RvLSp-92B^=eaY}u;_Ep*SZsP2Em^Vm zDXKPcE@5;f@kEh>M4{ra2j2_dK>)r-NXat8plR=2tgf<BmwNq!R7IKEwonr<Q>33( z?+f=Com^e*N=Y0gK+|z}xl>O*HDZj3f??g$!eX+$N1&&mQasUQ47D(oiH?cF&hLO4 zN{NXB*hROSl%(;C_X;GFRPC*MFUWZtO<VB=pu=-}@%<>uah5Hz)x*R_M0`rnHhEET zW1-%@HQdAk8LriGDJ1cJ=us~K5e2Szd%sCWXm4OJIt+4)aMP$EvU2ZG%{rg<Wa0^D zWDl4Mx^xzHb2>ls`44VZw?Pr4z5;|WKhgo#%)N3(BJsR^_KkVI2)C+kN1wCCnK{Ic zm}i)q;<-x_0?sa%1&gD^PK=l$TkR94nu0>_QMWcEMstWMQYp`$-w8}Bt>|{58{E_y zz7^f5r{uYTCwAY1g4#DvD_(y}J1fcJ+a|g%xkw(?S);86j@A63Y);PgJq!2m!d{b7 zE(N`q4;5KwcqW`6{5bb!Bw}GdZl72`fU(*4@4N<;fl}S`Js>@>*=YBWAM8z6a?NYL zLHLK9HW<8Yabn=X6}LcQ>DDuY={E-@@nwf1yuOl6zmeq*o5WMI6TeDEY%9E<dX}Ne z8#ny9r1T5E+}=R?@=|Hv%Al1ZV=@5Q%BvxCAB*}_)CkGucXQ1&GAzGp$^FJr|GcN= z7rB{P146bq8GHvgO$SM5NAT6wdbsy~`)JMYo1{nkmZnYxC-A#H|8|IT0lzsewY7tN zJY<d(oV=itK?bScxZKl;X7zm7ZvkZPS_6K&{yb;T^7skZsoX>U@-$P-Xe8#usja^B zkw#1sEGW_hKzLJ$<m<6QC8UlR+oMXUAu5?orP2+Gp)%kBQ19kY_toQCYQoE0og+<E z;9NU4l<wS+;8_5kQ@fUV07`7+i2at4WMRE=IB9L~ADc`K`NK!)#fd_ff9<so3in~= z<n}t5Ppc_)j^E(c)#ij72X8gk^o~TZI;r+g?Ja-T%{Zj90vCthG!yXPHni>SoqtPr zTs{U*_2A2l5bR4rFbMz1ek`Uwt5Yyuw=y!mP(Ln9hhMvvGs!a%>M)r<8@uK42fM>E zt)X-XC>Vj7DHQWV*Bj>ufiGTm9WpvUbV4YRhhsst1^POPS7q7-wvZh@0nHyTcmOzC zR7|W~>><d2<#2ynoBw2?KgJbeQM`{p`;-bcsEn&Y02|6~0C_L#(5t!EP(uFtM@R9= z=zkZs4z+<%iviaED&#Emcn*gTbjk$j58w*-3>fp;!5FCj7rvDtLhgHoNu2~O4K|ji z6F|1kBx63~#Atm>$fezs$@g3HoQcllNzkMZlos4GGBUvB=PdrVHakChVzfmNbi{=+ zE4+@lSMP4N;K3MgG66`KoSTzFg?zQgMw=IB+_?J{*vhZZ|Gg;jeQ3$`&3`~g$ejH& zRsW`@@i*TG0gj)cP3tiD!6h-dTRF<ggBb$@)sw>mh035*POocBSxTOmT5G?JTLgi| z1j)jA^v@dtJu3~7&i(1=;Ak5bcgvCP>kb>z%x7w%#fGy$%Ef$)-TS1!b26(m7F>>q zCS>1n2xRLf(#07t(D;ikzOF8E^1E}+*FEcwa5r9dsmzD1Q%p^gfnggZ@&5U;_$bE# z51%94&<vUr2aNH0f%i}*86y?0nlE$r>OUpb-C}lDjwc?H98E-o7$aFdzL6{O!{y1E zZlJb))ebn@ha#ZZ0BW?mF$-`mJKis+?JI}wI}cn-Hwb>b5(={yOseF>wz<a|3VSuS zbRJD*RSQYdQ#hPZ-OU=Oi>)t+Gn1)Fw-?SuFf-J8-X0W|f23a@!kXjMzpgt?^{=rx zZ13>EEl7-ThP9PVl~mW$%=FE?=1a4g3^T1+U8wAi?JuDR^ZNnI!yGG9M%C&$S2HHI zPgpQPjMh?TG;NBYi2BsD6lq@fRs)+Yd=gaiJ-DEgjC&B`2qm}kD$gSTi#uq2bNf<4 zxc-kQ?DzGDi{#VtV!k8etp5;{WH>VVB&6H<miF17)-o@+D|sB2wIxD{xKv6MCWjb* zoeQ$&q^YDPjc^}wi9XWW#G}W{SPJ^<4Tclie-TAl5^GGFRvfIfE>!|`-p^en(yqrI z_0KF&5YV@Nr6AY%fIKoJ6LLpRUq1zqIgr{_ei~ro@4qQg&>TW1Ywm~$nvd;7INDhk zyf%Ugyk2mmAlqPQ^}V&*CP+=4!?V_pYESod2dtE7NE&ROD~rdT-c-ZRrS-?V^j+I0 zU|j^rA{BRZrZ85V@!IQ4ArrNGa~VldISbxrxVNq?NqZ(FdbWD>xm8+`<nfDSqLkOL z2Q|qEb-8lzELPP+FQQLM#_ds2(@`Cr^I#SaJu!f9FZb&k{!^`<4MLHE&vUFg+`kEs z!W?E-Zy#llrrTPF=HJo+GnmH5)feHHXmF*r&7w%<M8QYdx2<MG5TM4P>w7R4#DxLz z@g684(>hwBQQR9jov8ZR&?Th2uyoy-;|yl$_Rx_e`7SKK+j4*eY&mPr<uc}RZ?YwT zeyPu;1>o{KJN^|i7Mj5qy{+#7cpCb1&R=!tMwdv;cHhWZSw}?}X@=Ahm3YOlKZ^8r z#6_@*-SM~-n|{?YF=y`$l{N2IWyi9O<(}mUJj(uF+HXbzf4@6B61BL$$@^|3rs+%F zixiW~3K|ja8HS6fWG8r}AkBIp*>up^I9l`{BZ_VB^@<D-9-_x*+x8E)*?&VCKF$3` z4l?piRu19r(xto9oK%o$+bA0*;vcBy@PT0Mam~6p`P}1ka%wi*9aO>V$Zx_a@9|X* z9P8Mk#!b(x4j2}nB>|f%_rDuydTBC{5c%8<=f=4#f+O-xv!6&|ER6$@TCv~yYndQM z1&vzDwl0*9e-oZ`;~TAO@9Z5U%KQZpyC4u+A{5^Q%)ynQ`%9U*0^Y+SXW8-f#)hkL z({gKjp~1I~*BxO`uU4Ug8}MP)!6Uv8turG9GwlhpCt%pyKF*exr!7Fi3C5{-bR*Zq zJN2E)t**wvjQzeN{LF%#hQjrdg2gHZnJDZL;J;cHT9aBtc*I<;XlKvE%8TAZ{sw*} zsIuq-Q^CswSt-r<{H!~kQIhLHvcMgud-NX>V%X>GCEqbOx&KW70wbFKh&?&jrTjP{ z`SfL*(!JZ~qI}xPc8y;5sD^8`CaJgx`&{bwx;Wf!1o`Zukp-cM=t{U{^Qb^m)e?8L zN!MFrzuz*y8)B^xonESM`*SqOLvz3MVD<8=Ihucc6tp_ALOe|3FAlH1Z21FL^UzsY z-Shn<*8_}bl6I`&TP10wC`U7blf(_mvDN)k)f3*8zM^Mc@D;t?&NmDGl<e~J4a;SQ zZSfab|B;NUCl{DXMS}?V{&Jm=P1|~1W7l?}K~x)6QOuc{?jRWQh~I7L6_a7)vSc^w z0pqMXnk^5Sq3{@*oq~W3GceKM+O@E*zp%pz3#c}F6Us)v3<Vy14+Jw`m;DD(gaj0< z{Qscg|D&LR65TKAyh2FX0Zk-UN}8+{iWX{VnSd+U@C;QLQln|BklL?FQE+lOD2w+b zFB0mn>dA|hu{7aO=qxs-rghC>-^Yk~6#$UNt-ktlWo5lreMjyvkyurKKXJ-hUy>t( z|B=|hzhVkz^1F$_WJU*jb+E~5RvCIFpz0sTfYRSf-BNge4ZXL?n#>zd`Rv`7Nyj|U zVYYJkKGF#WX)C@jzZ6SD4_n0tW!id#q?M*JN_8)0qIxuGd4vpB<q27K$tzK6;C66@ zG=~`=W;=W*b=fcHI`Dt#z`wJo)!l>bE<Qm)lpW=ujh#abmLfU~7T~27E88T(KCd#j z{I=zU9TP?NWZ?T(m>YBDVau272(&>DHMZx*9SxQh!$;Cu6$B0VrGFVSTMY^rY+q9C zh-U>L4`@-}FTEJL;&RE;X7QVFs*|~j(+{a@lNai$K<?5oDc1PX&YiiI=e>&NpCzZ+ z5_Xo)DYpK(%xvaw(25kq9q&l3IX%-+(BLa9WIlb45>AQ1FX8L@TpDe&0;6Io-B8QV z5ZiCHwU5xFDP*4t-2l0EP+ol(p$CuvXXM{U0<DfFUa_Rbsw9MY!37!7RqZL^$qH9E z<J^$)JNs{<mh?LFj3O~<Cf;f9wgN`KOG;<23n#}O7t3zY_4YJ@=$sw_W^eL-n&C@( zFIRL$TY#VT3PWqJI3_I{(WhDy<#SxDJl$SpRid79R%}+39#lo%e6lzKE{miqQ4|K^ z>ld$ug%Ebu({i#rGYUexwVkDUl>f-yft<ZM4XCw;)?>DNMKJ2UX;-qA7I)Y;I;%8Q zl+F<<LZuTC3mTlXoi~c7EOoF2+a#Qsi|4e0(>^B*BFjMPv|N5&*%=E(Q~v0vyn71? zM@+);XFIdJ@fAT8@^sG&ZOfbQY|q}(seQlI5#SnLF=d3{u?hQra5MWwkVj@3tpLgd z7t#16DSK5NtkK4KxsdCCg~u934Le#-3$$fwa81sc1V8o)h{R+BgmT-TLbQhsF37Up zfk$FSSthr#?zrk?H2kjO6p7)|j>fAaFIfo1mV2O#km6dV)4eUeqD;ujo^Jm)(RtsZ zgBUnxyDI*{L~77)`0-}v!u4Z`I++Ywq(T)*k#`=(M&e|WjeXLe+rTxe;_D`Sbg+vj zOpK33<u#{8G5h)5)ac9W{Q-~<xaIh7UAaHzrpv4N#2=xhkI{KHSDx2n8-o$hEsErK zKYgOe_AOVaYFh`3>Os4v#?6MVy(P>)Lx9w8NHV`PYO92tl^JQ;@T-(`G;CP3PD36~ znet5%@||!qJqiLpheQJ#medE#0+J@Ij#=AR!})517RUoW&$g)h05Z1s3-HE}PsMlF ztKz5_gq^pFUa%+YzWZD+%?Yfi9cpazmJLBq@lfHKoH(U)Cu;}%rpxbAv5h|1=JeZ! zzf`%Q@IMQyD?YVOZVEjv=w=*{0&cWH@ng!$^Vh1^=ID|x(bjfAXs+lE9@*-_8vSA- z_4thVk_I7|#rUlevKMFSjNK(zdYeoFNg>AU$W&4iA|X@Zy25A?fJjkk-I@44#on)8 zXVT7yJ<w2JHE<|i)14aHk&a3|9f0z%23dN=sRTJOvfqV_&q2@@a~OJ*t3hbqPz|v2 zns%)kz%CncpPcSM5@I{uAO!V&1MtO%M4)d&G5L!sVsM9;k_jNwJ$(1kVgH<>197qj zKSk~a&|?0TKm`qJdO_yaN%LF4K)Jd7_x$U}T(+hF@1xq<S{FL_iIyNJdq5_WyFoM5 zVX^x(h_zkz_+yy+iAVRt);zC&pUBD362ORj_$HkfE(;<+p&m>yc>O1FCjMIt1xSd? z%WuGK?!Mj#|HUye5&J*<e`X{<Gj<Ymbt~Q&z81zgHOeK^(bIrh7P925Na@<z2wBnz z8L>^F@5o?<b_rl0EXw>9hJ6Caaz2fXP~^Y+8a)qez;a2EX4vs4EZanimp$fv6t-R= zPC;)|(c;p1I@tVt%~U!%lHDdnkHpZs1!EO7t~apO<!}Z3ZpL{l=3*hib1fRZ>mV}Z zy^K(R`ZqRq()^tD7vVX%rkj2RFFPJ#r#+rOFEBtl?xj4Tb01Do(I>>nC#*jnq@!br z-0mc7>69Tuz;uzkthFziB8wm8(^E7zQIyvHI)pIDKC0GGh8^t>O!Sx1on}!ngbW`O zcksyaUa$E<$_w<e=tgs=&@u2X89*t=UU%#(v4<{VCGhb|od%QPB^o5sCfb1?-}rFY z!<z$uw}alyN4s*z#JF}9$mh3b5|ZH4RF?nMUW~(1kcn~Zns{e9xLX6qV<$9&b4q=k zKQjCt%A5hq3;o<tH+^TDuC%j7-Wk~<p|@_77ZG8a-!~$V(T8d06a=&nlWyu1Ei(<3 z6=%)VxG!op8`qDSf4u#&L@?uo9S%WhXA`$Gw8hZm+Ajs5*8;kCHZ;+6Fz6~hWxy4K zK`@)|_yT6}55<r2deik?j`{uRjC3Rk)1L`q?o6MsoIYXu_c7shKknQrQcER$9w4CO zaz;~0x~EP}rxO=R5@6stkE?YdvBd7|A@BVJmbW)C8F4cF2kGE6udPdVp$)~cLNT$` z8j~etYLt%BhX)G8N@rkLc3dQxsN%%8_vy!(l#v%JC&I*(mw%c2coC0!NHX}g9pUHX zW?-jyFZ0k*JjA%&eGSS($;RDR!GDMs>Jd2rZR?*}d9<JZY|iZe#1;T|f;rpZ9I-Yx zFAC~RkTLyQb1Q6PF&8j_Jwcu`H9!9>xc&k)9-B8}?XK1boBK7$Rc?Ko#=R>8##osG zzco@@U#~+4O`Xk*AR-p&yOCcY``GpO4C&XIMRDAppd&i91LeQkGik_U4uF06SFH4J z%=F)KeRPKpg{@l-egmO80dHF%Izd>b9Bpjav|N}a&~|Bgz0?G7sH>gF*t0G^8&7Z{ z!8PuBwp@)&P<1kmgVZ`X%8j8CSOAvI;k+!=Dt{5;2u*1!>vgclalwuk$=f#7!=N7K z_Y(i-ug}bojqi9u9cd_{YqI1W@|igNFuZ9C+2C3dC4E)`|0hJbNw{(>2U__JPo4*g zz#v+$6cVnwr7t-(*2y+rXI@uzij^&iH5bJJIIMEr#ReoG1ADKxC}wLJ#DS95w4={p zlDTs?D-eYz)_L?iCj_)>R6A!c)ZxX3y!BE$hdmqY=vARJvAwdLVs0YI?#u-W69dxM zM$Tc|E7VCKS?)-J5>|C;JR!gdI5IZ?xsnUF(Tk44URl71okE$MBOI2N!*8yHH@la2 z8rVcnrh5FtFVzyM{>{XjL6#Gc6&wifzmr<xAS`H}MNB#B+(7$4=*l%!xxuToBpVoo zuhnFtxyn*y%{zxWo9m3?a-r<{K?!`{a~IcP&-#HsL>$H88*}-ASkQXfB5!5<TzpW) zqIZ_l60o_GV~Z8ruT*4<AK;dZBy*&bC|X9ANbvxZ6~;A3V_Sc%fFLc7KO-;pe47vS zINU_-a~#mu+!hctXM8S=m8RwLPFIzT$ihmAOQG}jXT7)urEA_95`gAlbtjhHEPQPO zULey+3QswaO%#S@t<Ve%BL_gL!_HJVTlV>Cpp17Q@vfCWhObny{nTS<pBAXO#C=MV z4C`Ru&lNUjhh$GIr0b=7&;JZI=I(C<0QP`M;>vL2q#m|!%DyrY5&9!Z5}z@C<IDYk z7x80o5x+FZ1BPuGO~X?_zWjBFvz5aqL?;cH11<q1lY$W`fh(+|EsFpt6XqK0h#j!X zJb8dwVKPbVJK~i7dBoV{uW#4t4!a@3uz=%0zAFRGzRc;Xe_bS~3k?af&>q6{Ak$HQ zk~30EtN(l1_QkU4KgdKQB;EnoC&gGn|DbJW<cTbzRP+Tk_zS2iv{(FZRiRD(qG@V3 z5K?e(<>#^6t-){Q<x>xW_ZWoCpf^~rUV_9^^dFo#bo%_)fSEw9`F%*u=F(#vG*T=N zvjrGLRyNs7)g`#jv<xay#7%wA4&2FH;&8uvWq7%2G|v*gDS~}pURkDEzAA}_4gaJb zV}m@v>|1nMyh`DS6cH`Z>ME2$)}$fH|2TA;p=rESOgsPn7o;p6jCk|iN4WQ|EyON? z6EZuzO8CF62K<c_#^IIMXY>OP9r{$G0d!GN!%*R5eX7-SJ{I2t!@@i@(A*L3x3e+4 z^3mxJMpJb312Ft{EQ0q#XN<4Md=!AG0Gu<Z{!#q$bBMME2n~DwOY1g}69M(2S69?D zHI-}$VIH8pRf>M52JnbCCq9ZdfVczFmoy(D*fxc_07_gciA0*5p8hAkgB4(j?S2h( z@z?w!UsL20D4v^}>#Gjf^CzI704lBb7Xc6e2c22f)fzquN1CTxb9e~*^*#QNQ}w^8 z!2K<EX7+c|txkaIOO#JjoomcFqgjYwyDdThG~6YQ@AP#9VQGX-9`>k;E>8wL+?k_{ z`IB8d674(o{4^+>)HB|#&H@6%(Wbc=lz*z%nrKjsTCtN{{n9-aR77{*cmkY*@3O^c zMq@*jbGJtoD77>|<l7%@A*xyUAMM90Bt6Vm&xlh#Ta}2e<98dt!i|T4<3L?Du-V}Y z>532|rSVHADvpsItVWh|DU|!~URG#z)DR0L4kdTH_{+|8vj$735)c&48G;^fz;d`9 z+xJ2m-;=uZBfI&5-S*5@=+vc<L3@p@O9$ofRT#zXx@@8EVc2XfP?cQV6$*hMy@la- zwJr4<=5yNS4Hn#N2dy+2OgA+Sy@HdyXG5U{gzHUTqS5r_hpqhV1MJ0P4_A@Yz2-O! zXU6GHohjjO#NkRkojYxAwlTHO+*Gb@K6I)JlPIPzaWIDa+_Gze;Lo&8clRUgKlt53 z_AUM~GMYDWWAm-u;+>)S8Ve2~mG!{rP7TxTrdbIQj6K}YHLW<L2r4Qb&x4XX@J)#p zu|EE(Y5H~Opy9=a{q~Qm>D~uDs=9E25muU{{>~j*lCdSpvz+DKY)A7@g9lsR@HtkN z7_WcrUE{w`qxh5GEwIAVT4P1LYkdhw{);z1ce>cqql%}r_PoC|=&X03wWr1eNdFe_ zbw(}~WYGYPVvu(*7g#+6ZhD#O6^dOJDRVOmmhm3nbaWIJ>$MZ7NVEHn@g*Df_9fkB z{NN^W|GL)ApwwwH(L(49li|B05?gB)iJ@sH#U|w5JquUb@nB32PKhjfFM5o}<K@5Y zXA)SUebgEQq*ktpV*Z$wO#l~&D(_v<7Hq2KZY_}w;{>^AQ18M-$v~zH?2Z9Jsp+rM zykHrxoa&9n%Df^mqWLB<t;0ZI@Xixg;SM9n9nG{=jp%J-W&bv|XZljEef1-yDT9WC z+PxUtVgKyr+NJM+TldR--Q;+!_DAiun~!pyR2=Q7k_7Au)doe*tT9q>Dz!&kw@zcb zPTxDGo+5UU(7n>#@v`9Db0EAE56H(vl`oTTE^L9P@IxwTb*dukpR!2-h)4y)F5kU+ z4WV1F?JT|(>`cWs2Nu8gZfdqR1T-JXpZm%rx9e_Ooo>xF+PP_e$?CjbZK&&Y>fLc$ zqsMKM4PQ1^++x@VbNGv_0)M-fd&4AtS^Lp5z*DJs8srD$jGn4<8pF!eNLIXvPZ;CI zMjr!sY1q^gLWc2_EtF02_**i`DG@=Fw+`y-D?oo!VgQ$|B}PpiX%p+oHbG)~yseSC zG+hM^+*lkj(mnN}ShJltyp|~896a2x{34&&!IfK<OeZZ{?GF&i9Tr!f+uHQ#U&v?z zOH0N*0s*6gWt$fKb=3#)WVZyKZ^G!+`ain+pHKe5FHP7lC7aoFHBv$4`lZ+vJPfF1 zW^b$K2L&J(>@Q)7L)Q1*DeM~Hqiv*6ea%y<pvH8${DSI~%4kVx1Nqz(RsH%~aatIa znJj4f6$a5iB?+hq7X-{dQZk^KHeJtg?0xT(UUuldml@j_Ik8uN>uXvF*ydYi-n~gN z7Yx@MS1;hBhI6LcBmC|}Vlax~eplNK<!-?;BUjSFvvY}7W|vyfC#wNZ@-3OB_Tu>h z?nG0))FafVsPuh;O)+Gg&W6G<XQxO7Z*D8q{MxmseG>y81*71B3ePo{#AqBzo};4E zx%+=HKX;)|=*k8`@2S|DIt-h2C#vV<apypRAL;VytCK^lHQZsRrLh*38e;HJ=%kUA ziGZjbbAR-#E$MjjvD|y7WUs^k-A-rv9Z!ZwJin(p-FMczul68k_NY>~&6L5>vl+G) zzALt|ZL}Z_7sC}0QWuzHu+T!!9zL8E<L#BZkpm^iP<KK$Yi_R{wY&FKp8@QEeX&kq z<l-HP-%1ogoGc0|P7jnbZyj+9a!EWAz`8zI^J*R6u_co7-lBq<tvMB#rdvB8E?Wwt z-jBVl7dhZ${keycoMb%t9&CRicoef9@8eYO?fwiT$Y{ZG@+2Ac@#G9M70;7Q(puRM z&KLCjosHsAWV_+5vPJiXZ3Fk{Re7>YSfpTl2D%PV0J<QCA|yl(zHvDG+pRlJJmuvg zL{R?URg4C#k)O#zsODc6lpuc%yz%T;NGSZ${JT#DZWp3+&qnNiq@<+8`lR9fz+mTG zEmbXp!m79rRE@xo;ntPk#KKyDCyzb#8+qVcP%@}HJX+ooQvLaUp5g_HJy-r8i9P?< zBmYm4>3=sKJCJ#KnH5d)B2P2-IJOTxEw-tL%3dtnY1f8=P&TUG6+TSS-=tU->!l0~ za4)#bky8^AmYk?r&B{$-8l|A?ArS5WE`0EyS`O2bY{ON{!~#djmL|0~iNiVDc(nR+ zwk~Tequb5z?OO6&$h1?MX+jw1xEMNNJ!F*PvB@UoZi9)88G9iPpW$vfOdbWqz!SGK z`I#X-5n>&e#VH0Rxq#%g1)$E;b&Hr3kR5Jcd%DW$d2ts;7}c@89o=-!j}%36A=t9l zCo9Q{txI6MOP`BVni3HW+0<kNsP5b~yJdn@znGja-`V4t%^Fs%ig&!1CSrs13wWHD z+pD2vl(XI_eIg{Y-gs>=&sP+TK*FOV6}En;nCMOF*4UQ6$z;{-jAup<E)$+aw{?o% z7=iO0$n70iKbPdo`LV5Y0rwy%qE;a6*dx*K!N;|tZq$vlo%OZ{BR0;)E(+*LG#%VX zKQiqHL&uFYg^~Pnf^o9=2S!rpv{LEnGSXMW_4uBY;bz2n`G{o1VYJty+&9ctN5l^5 z{6^E^VdvDoAaF?{Bxw+p-!V5!a}P7uUejh1hbqI?b7i@$h4VTix2@H3V}~EF9plT{ zIvC;Cn=pD=L8_uGUMhVjaKtxl1z+8b`%$k<*FQa;F>66y1gZgHb<w971cc?LdoRZd zG?@d4HbfwW_r3r92A?r)EpKJ*WyNpgCg-_YUE@oK0D1XTkYglfYdkSgd|Jb$mLDfC zWU`<!;X&DC2(e+XwujY`K<Up=rpY5+A}hDI%5l{qA*crT%$`Y+K2n%bJ!R>;SzDxE z?EVZJjS5?7{HUfv5`u<Tw0EGhQ@9}pn_`mw?uQ+wKzMQYGzbRcZEpc|Xy4B8$4TM& z2whq}veD<{@Gvdow+`dp%^t%!wqDAs1}eJTW+j!;`A&Q9dZ)GEBriJ1X)a!rDo#YO zGiP8}ZcO29h>g>Di2Z5$8P(kzq4F1TaO>XQrge{I7|Doi=C_W%4a<fZ72k|hW@rr; z5v2r7fZ9SIh|@;*!b{2485@d&yk%(TU=ZeG{mR!P1$X#C@Lk2v#1Q5Wgb%z4AFRx1 z9Ry+{5UvY7GkkEr<13&65wSuF641Z3hO@Oefu_F*zT0amM?a$pT?QkN0BBY=J37Nm z7&df!?uS_r=MIH&2dS1ZjT)mwYr*NtTiw>=G5~`x@wCVRv=e+id4D<U!}B|_*U(@y ztg=7mbLnjxntXH<npLj*Bopej?hS~418h}puIp0ZSXKRt>zn7Qc9`hgbL0Hd>ao+_ z)tTtkl_dLE^uBHl5oO`C^suAVsXHYrp<j@s@fn--CD#M&gA(U;eF7r~-qFctVC-T( zy4!_8#qBlBLdZ*v;fhqj9>9tJ^J`EW8%n%PQyknJ!&je_Kki4^bAXV8f&Cumzm@F4 zRwA{dUr9&DB_deQ9Ul94nI$2*Up#ap`)t0QP8aB%`c;>eU{$nDO`d!eFH#BWERV1! z2N~h_D!Qcb_up|GHrFoIUvOJ*dW&Ym2-Vk~t%s!-hqNjtKo7}}{SJ{UEz%hHydEe` zzuUf0PqcU%dk<{jpHPX2)*Hx<0G(GMe-{H(ZXQY$yYY*b77z|}gGry`kSSzbq3QCA zEQpYQX*a}ns~xO{)CRXzdHlPN;<kvtH5}mM2OR<aCZ_uAgBQb|j;rIf8u%p7`WR~` z{V?~sQ1gQdwAl?>B#4Od(BJ`3c{Vd#fOa!ylqb^S<B7w7-vzt=zeSX--TFc202H&k zI<+guz)v9jog$et{y|@6>;NuX1e&Vvfer!|S0S@IAtN+euKZbWM_=)Tt)%{uUn(2^ zNyqkeW_jX~)1U(Nm!9=6eF=}ULb(S@XJD0LKw$+$%qlK=dhqUnYF}F0cF^0&hFX2I zuK5r80NDuZr<}>HcR9*zd85jy0CdyJisuyS54RJUI~uF?*X0>=Ba@7`1Y$5?%(c)v zb$dMfJ%C8Hck?9B3Z#07%BA)<D{dglq&dJu(eZOCI2ign0^mmc%02icjo#Aj_H4&m z4Dw`wmenp(W}{$3|9KST@QMbO<#j!#$C5F$uw{Pc%4+R(k6-HSQ)3;#W|uF8qI0`J zmN{qbqEzP4{TWDwuqKvEV`FP|lRJx+KqNlHers?=x0s$s4|sDrfE2aURE^H}ujuBu zmv5_q89Z3sNL10xta)?>YpXCd6=puD8@Xb^u{tFVKY4iK4a>aX?U0Rux>ZIS=k=>+ z*2v<WUta-PXFa-(KCd2z7(!V${KMTN)1xX4dI)c+!myl0bkL#LXrQa$^vO&2%3Gbx zMmhwJoEF9rbbgmV{rvN68rN}$vtTc^EpOPHEzMZW-FgJK3jU_mXz`)0DlX7Gc&2u& zx6?Q6)f|6Oh)lU}mnVJQ3bX>SHOh8N=*bsq)RU*OT?zcm!fm=8q1kQco~K#MM#YqQ zVA@?0KEmzI_J*(rwL~8mKnSh*vK=Tb-Xu`fq?`K|`p@}e#kgI1R-~&eQ>5-`*_<I9 z83fyH`&!MG1G7ZZ%*Ek5Q_5Q?`I5|&+)+`k&FrR6Jz4QE&y9Qm>SoyQ_qo}IX-jgA zOlwllaz?NYsZgVrR;E(8ex3Vz@D9JUv|dza)plRfX!o~A{Cq}5(4f7Nzz@?agYKD_ zhgY>PSitL?QW<Ncqsa>G=M<?yn^sh+^F_VQA<Se_26}T7x7J?52~67(DFbzS?>>*` zn)TaEjTGByvR+tY!sj0MwuhA)h%;j6tdijy&Q9UPaMO(o<)NY!yJtY@I%~0`qJ1nQ zkzm~sK1A_Iu_qq}#>XCz36j2L)y*ZZE+=EKcc+hVZCB?qNFFjCLY3%0Mt7Ry4)4T# zmd5US-}V0WFAHDN-j5_G-6k9yY5zh`mHC;7d&A4m()|A1cknKM`gk&N1?wDVqU~s0 z!u;H`EAg7)qeqER4VF@3<62z&&kr3t?24Z#i^%76WaP*RD`F56hpA+R(IZOJ65DTd zWmJy9unwLNQuXb-C)YQY>b_2Gv&N`y|FFb*$Vfe6E;qZ#Dc?U9`fS4|pOYtrFWdjV z|NMZz6ZyodZQUsHc)WhCAY~4HX-y7aNQhK8VzPwei$N2&5e~ZOHz=-4v8#HSLWm50 zoEan)(-~GJQ&1(-UpsjT*pf-bL`2r|`;Pn9U!7O78oAZp8P09O-U2!r{7twBt(+*8 z9O+0qiRLCvnyn9s!+p4u!^ZAx#P?w-H26rS2X(oo>_tJ9r1URNQQPN@1(LT_##g&C za0;1Ywf$2=CdlxqQG-#x$>F<do{XhfaFr5k;0DeY#&M+|NTbgdZ4O(MN!Ck)%GkFC z1pRBpYYDZ%&x)eK5`F*H0Ex-HvZMX`!u{Mj#4-7psPRI>7@|J?mS+)Bc*<pHGOJ*4 zOB-8(ovx_LKdw*Mx@$@3F)z5JPIVDWR4zF+oab)iY+>J6%P;*bxxXn@lyZW)fwG)K zf9;%%a27zIHuWtA&;nr@vRcV+22CR?YhTU~*UD}+cA2*A+q37%TN7kDUrfo9uN_+! zkhx7yrya#94YPcXt-64WTxGgcYJ_wY3dwq+d_;@JVnpQ)NAXM2N+bq*xRdUddVNSq zPdE5!Rxz<KBXrONQ90?$;<_mp5ml;R&O9dum(J!9Rf=BDxCeE=>9kVQ1CZr`hd9L~ zMgaXt(gyo(;^uZ_(L(<f+I{<W1C-zdP>TnRDUAA003xns8;Mw(8YUy!FA-z0x4X#9 zTb<mpUgp8>B0Z76Fxwd{ld#o%vCAHQTAX}B{yF1Zd=Il#9KQI}F3b0pkE0>NvVKQc zF&W{umlBBH8iuzLZoieN*u)*KqDXhoJ|_aL@*?&6#%QJEvmPx5=!$?S#S>Ga9^~AO z$|M#>g^zh_ZJe)v89C8DAx^nSSr=KtTjvu~s&G<q@l#S&JAw3yt=aoH3uiRLV5_@2 zM5=SV6>0PhTqtuvIfiK=jqg|?2I)P@xrD>lsEVGlL$^Mfa2GQhP9(Rw$T{zw@s8VA zcq$^)sscUM!!YbZY!yyG7j;Zw=bGutjbRe{)!o%K+yi~Pfz~AKRDCj{J>*KR#hD;Y zdf6?)TXhmxy;7u4q@d1kVFfctM=8s^5t<TVUR(2k!4YMu1YVCR;!}OU?5K9fLqwHt z+0>z!iJqsP>5jGKCddPM_wU|>pLP^_<ag4?S0=ZOc;&?f>7$&f(Bo637o$1-p&^Xm z@*gBqspGZmq(iZtlP`uy<sP%tboGF`op^iSumB*bOS{M>$B?Dp8UaR{v2vAh2kx_j zS`^8J1as04%$moaGn<0m^A~NNzJ2M-&b8zxIXN)4s{Jzxv?t{TK$UP<TSuDD5+*a~ zTw;o(MTt2A@$}EzhRB5jj+vsJ8iF@+h;=lO7v8g{<Z5JVwICrT=jG6~NWXez9I<YU zdTn6{4nZ6$sL~$)9emYY7WytC@59@VNA6YnvpZEO0<>!~+Z#EnO4DGjLJIa|Pz^Y+ zzP`X1qtyqPYX89L;jFPaD9EEtBqHwqqbY1Vczq(-cGHM>wrn-iQ_PQ3IP6Sof-vhn zm`u%g*2nr#h54Ldi?x6x2g3BKVKq(wYV1ViVT?Vu*LKqevmcb2v|Y7IX~-_;#ecW^ z)62PCJ?GmGB9{8y_96e*2j4%w0K_RRV(2aJz@^FVvHZ-i_!IfVH)u^WtB?eq3K|F; z{{wRp^b}-5Hx5mU7?;cO8uYG1y<ru3W=fWUuYn2QtMog^MBglmSaxkSeT_{Q(+Jx- z8UO*XwcnvJQ0m=hOFiZPX*%C?dyHgmzEkXDK{|N3j|=nHO8f*?kB3XGZj=)@muK3? z+7sY5Cp22WvU=Y+JQZO^wV8facTO#cyE^Z<K0Uv>k<hYK-J(CQP6NGSnAI)iXXOux zjk6YY%PWa9badO=+hx>L=Wxr?SAp!}18kIjRny5eMsN-N0JwmJ34SKxy;|wQ4|kXf z{Z}P*WZuStdh4NxWK_ZL#LZFg9JykC$~=f`GSv2!>F)`>Y9p$-yZ#qoGOIIyYTD8{ zn12R?psNZcBQkB&-{;@nzoc)PzVTp01o|e%Dwh~#t1g2>J<$KQVe=v?{(GzM1%>W( z3h6Bb&EQ6Un|df@(n__N!OMlEmx@i%Hk$*B#*VCMYBr#Tw?o$m{RW(KU11Ln07GT} z%gSsu;UIc@brxJ4xAp~5n66*9mNm;AQ^$vDKGV=PZB!~w8C}u{#~qGg7qzl~U676_ zUvOZ6N3tewzYccuic{Tt73-gLTl;3ONXwOvB_IX@$L-rPr&{6OhJwkOqiA7jaHMIB zUCqyrhi$x^8(#nB;~|H40`k;TLKwt_jqNeEnK=7b%XCWSmM(UldyKBCU){O@c9|6! z6tHDHVwA{Ys)>jREz_{E0Xcm9qr%&)qMxU?2g3)Ek%Co~fuY=pKg;!DFKdBvHZ=n3 z)Yi6^wSYR`MD{q3LRN8hHaM(>jpJJ8KA~WR%*w2gE15q;?aQ?4kh6$tb`JBts9a4< z$tVipzS|hzgr`vy96}-mGeR`xD2fgfLTTFI2@0C$Xa0yLG|@wJch(uHX3TBhRX<ja zgrzX}-TIdbGQd`bcUWys=k@#}5z#om_97+R*eNvTd5sDu0dx;-It21glYqKFTC1Kp zaOc;V#$tdA?Qf1w#jGi`0RwP%Z*nqXP)o<#(6^P}%~Pu4!IuR=y$afZiPsu!fTVef zHi5O-ncTa5Y$&sibv~qNT=R=Jj61OqgjbQ1!dvXsT~)%D*dR}I^tl8zY@Dqe&*uYw zA74C$KK#gyH$)v#*i&rOz7Xv`Zd0}+@#83kpc!K;{f*b#V%~gr0#Cefcu)EM<b}gV z`OH+eL~u!_>%T5ARHFD@;AN&l0p<FFw_<BS55=Tsf^ZT}v#ykJ9)=z6Zb?Eci1obQ zpSN_HT^+qvweiEoI+*N|sb+pRgRm3gVKa9?Glr+d*&AsSW=@+XLaybSYF5$W8cp@M zhCl0Th%+LOisS-1Nu-t7NS`k{c}ppckKcLt$1(b^d21z$u~lM<4PQ;{#GP!Sx4~lP zfb4yj3!wju!h0M`oFZHO5?haskWs+E-v9=lMJtX4%kx%KoHF2G%ZRjH`GsQ$=8|V6 zfmy1{8@FW(KYuwc44rNXhCLoiM{Jnw2hU!K7O+N;=>VKh@V4~Uhqt?y1cZv7FH@Dg z4rXeiOZfN)1L{zezwFQa0)y02AHXh*-!)@v9H`k*rzHN*FF~7-mHAG2!gB6IeFv5% zO=D)&w3=M^$pxIMJD&qg;Mz*X99yP6te=(bY0GPHQo`$0vFAVAc7w?D-}4%;qSrT9 zm}9Y;+)E8XOOx}UL#cI|r#fx3ZUr3iaum81U#)(5!q&aOwK>`tkX1$ycDUfT*qPIm zHNYsBf-L&m#slJ%{Fb7#`Umx$fO*wHyc?jgaC1o`kK`k&$?UdGSCQTUk`k7X5^>|y zAXnb&5IKKia;8rImS4EB%=41Ck3Jxi9}MU3h$n6?t_Im!U}!{yt2#R568xx{e59Np z3|piFOS{3!no6B3LQ^-tfZwVf^@OstrOqsnG;`23y&c`gi4l+CXU2uR-^k+}hvP%* zoa$D98GD(bpo7)NHRl)e*&fW)=$_MtVW*9)jLX8Z(J>olf{&(-N5z?WMKoh8V_qSi z-(m)>_)jo@v)d@03$qGP5@6`G!BOd+O|q>j5&AgOTr<s*sffTOt2ENR6D`5EC_dW_ zcl|foBJA07(`V;5@p@!UI(OZ#-!6mWcQID12k>aX7RH0UrmbCmI`P`oednc}$In(D zG}l&4I!T&zkV;9?$za?o_dC&<511+%3IZKDGYbPgzinu1R34f7eROoIs@6_KXX%pQ z&2q=KG8a6lkaD<MK1P<VG{6wbOw{2y!@yZ#aX2I4s;riFqNcxuUxy=d%J9h9<B#H& z`)_6W4*u9wo2ABQ8!Ho4SVq*=^b>eg?3yOcco?fWYDKoMjadoO=`5ew&|{WNU5#8R z=3$7y*%Di%sblvGdF}Y&{AL#zvtRFk%P#^tn0akH<7{yu=|CRtaMC2hB~~_UTV6W+ zf!Oh-i!L<VL|yY^HE@Z_RgXs9C6D$DFe2-(tCW$1n}}1eiBj>Qj<`<58OKbb#qq0~ z1<$8fuSX6<I`%jGtXxmzL)#Xj@2s@vEhzVU=$^Kpvo0VOu5~}T*F<tG@@_+wucleS zpypgJ?EyBW=p>DE3&HeVzL+eamd*j4n>S9wFA7@p`v9=Lb@<lA+rHY4s)coz3QB&K zlf@Du^f`+wP8s)!oz$|g4INQ(Be&=BEQgwZHwYH&&MX}Im8|oe!YF($odjDj*2GJ= z-0aNowmz<d?P;hf-1+j&$;2D`Gdon|GPd@k`^#`P3QZQu{ZC1=UPwoBuUw+VT7+M8 z<_l(63_7Q2bdsV{djwS8_UwtZt|zKgL_I|)`YB<=4XuNJ)88TTV=c$m3o>2Q!D)`| zPaF)4VZwB<?-Fii{a7e!i@Df-7C)Iwon?l5Z;^24+VnleAFT9D;!~=@twuPgGkn57 zKj-NMQmmh5`iKs86#Jx|VB!A)hSl3jHQumyVxm?g6K(Ml=I4_nNPdm7IvCf`6?%9F zUwU;pt{<~kSHv=qJ81T05%R3$lO$qL7hfwN-sz3tO!pntkW`eV<CHvi?5Z>)NE5b8 z??6EV+>V+*Q=D=tksDp)rcK~}4QxB_k1#CpY7$~YEIPuGhfhUS#o^;8VOSsTkt5eW z{^iKXp4}-)2PXGtDBt-rNsniXc?-J>_jnr!!qz<e35=2HhHtbllSKi}aZd;Y&gV&D zXpzyz5Hmpo>T3YH4~c1pJ=O>D%%1w^(8myf1=g%jNRPUC4PKq$iGn&{6T-k3-d+$t zGV-wG&Wy&n0n`c(n2zK;OZ{q%z0gWkgZ50|pZ{~ST=N}Z1gV3c4HJt{@){KZY7&U! zIT%z&AEdG8<^nG5xvLD$`}5qpH6YwoZwLYOP|(4pg^u2VS{$nCuc_8^XteEvW)7e2 z1`l;RQN!t9kP_^nanPd#G#W%2_FF3l_W%F`A#0WU`Vcv2#Ho%xMq}UG^XGXGQhY|E z4?H|e1Vi3aoel$(p=7`ZJ;0-PjX)i1c~`M3yz_uu5HE!J+sCyPA29V&b%gxNiHNiM zb8{gplA}KBi>n(n6z<@P`mbE>h6<rUT}_|jW81Q%`7BpGNz6v6I>4v&QlsT0fliMN z6b*Rios1AWD4)6Qzg|?QF5?r>McDe*3sB4lp{DG2!FgN-jZn3iBiC#XdSy;cz~@FL zl0#J*X4(W`)dg?rI*dnB2KbpNOXTYLrvPxvvttGZcrtW4R1Kc!<Cm7d{9v3hke_u? zihbNOgzIl}O19P}vTy6nTRSNla%}bM9FEsqFc=^U5cfb+;N2VU)B&VM30OhX(V(zE zj(9DgPn!qW?zD`VuI<ocY}G})G*Rhyx89koRub@`%A?irGAu?RQ^RyGd~3+gyg_%b z^-=qsFD5*ere-_K>W}MXny7l1d0UFy85u1dWl%TraNbUxzRkfljn*m2p<GT7a4-_p zdH6H7XJx9UJkd?MFk*SKvZyL4#4IL@G!-UJv5lZ-s4J^+SXXxlqzyg3EJ9d_;;`5T zb#e22L1mXM;Y5adkpDXC>KY;6F=Km`8c6pYrkzL2;?^!U*=^->9*|b;Q5(b4P03;h zTdDi<r<h)u8O}AD!~UQg?X!gDl6RE1=sO&A(Qy569cP?n&0B=)k(kit0_lrwnfA{N zxN4ZwjvIz@38DOVWRQBfeKlQ1E^&!6IuFJj;7?7+%F){uT?NZg)#+gwe9sucPPs-6 zvRo^@%eA9+oDSs|8rDass?r6E{6)s(or-in<)Gk_z*{1ZUIbchDO)-<9boupJV+3` z8apTs$Wqm$W*3>j&3i6Zo)V=_6GoL?6&cA9hx+R@8*Wim{|9yN9oAIdwu|b_I7J+p z0R@z10a02+kWMl>V?huUl^Tc;5Rn=poe*^f5s+jA>5$j}rH39$VgVvGBM1QkL<k`R zp%_9ELP)X~yx+{c-@eYi_WrK3_u1E3e^}O9S-;-y=YH-7Hha~fgZ`F!hG3F)vGxmH zL*u<6yx^D8BhC=gplJtt?~gwcLz~k}#Wt&CnNVh!QobaMYK##2oyh{`6hoRm;GGV? z1<1~*$~{;cdRwocm!;YE;?LYb$ztVIxF^f9bH$ecwVH^`!?-s2?tl{e2;ZuO>Qh|f z-x|P<6gHObNtqWpvcpMuF}n|JbTUrb*Ygps*LWCmU!yklLix0!En(08ZhXxTc`45b ztKTJFYQ~kW<!LB`3D?T?Wbg$-T?#}QZdL3><03}Q0ouS)Ze{s83^0H3$sWar0==#S znZ*xmdcm^*!0_^UdsuD$Qh}`XHlr&%c}UkFy~?ovMTec8^S2QxPTH#HYHU<fUet_m z+JkWu$c;MM?=|f^=`Pk$@Pz$mKG@o1)m_cEK?hc{=?PsYSPe&z()XTDJ{|W;k0$Ql zF~sHE9i$0M2aZ}t0yR^m(odU+CCw?iUKzenJ|B2DBKcZ;n$eyZVAjaiQgRF2;k@Zb z46XF^>61$*?Kzg31h>6{T0a6h(D2xmcgP=C`Xbj?+tDs?bQwU7IY(2<T)}>DFZJa) zL6f}0^ae#@99ykWHc0_Q2@K>td^#k@{hWQS6@6G8=>h6)**lH;qg~k=5{!G%ZdnP@ z>jUb?u&4F?e9hJC5nH1hKzgtIn6X!lLT`Tdya}|GaKygaLs{St8`2I(pG>^D7>Fz& z$Z4A7D{#J9*K$6X%R9H^ZCB1p_ZMZjG8ct_gbZcFGuxTV?gQ}1CuLc{+(Wd!@~GbV zuQUKZz4mB+>9xnZgqeO9y?z1?eO$IJsghW?Yd>FjG12z<$T7Q2fDOQ64Xz$5TGV!y zj=y8h2iv@2$5piN$C+i_c{i@6+31&hHrEx5KEcM0|C;HVcIeg7m;2Aq=3{}%6(QBG z$n@?B^$0i62f*UEP5%{_3oc$2dtLuE0$B=yx(5bMKaGHGr7!scWnm189Jp7ka3THj zwQtos`N3<n?=(s6d7UTpUUo)A!ogtKeTB06?-6u6{zetxy@h2(?xtU=^yi)EYQQVm z&Tc%4t5)DF1O9~N(h;!$U>E}${Kv8#V4xtG+<lJ=<!f_<SXDqzg%rFs31lh+>Rb6d zI#GJz>C|xDotGEV0XWs|)$NU)m-MeGsr978SBxB4!;j1F098I55K?lRcU<XG$zB@$ z@?LNW9YbF=bvv??2V2B5Pq28(ym;YP{K!do?yd5!0?qyKcrA^Z_W2W!txF_7Y9iyu z5xJMXohWIylv;Z%_sB;~nTWq!oLG0UD@PQvOtsDw01O_phns`A5pa4)-w1qEWYAMR zo3KS#UeE^i5lsaOslhem+PyN;P?lel@)qgmuf>euwxN5&*&*2NK0vSqx>d-gx)<<^ z&CLej$u!fj>G-yFblc*@{`2_n<DbK(3XQL9E+Hw33=olf0F?3T_>DF0=cS33`4^i! zW&s{J#|Zy<_}3Xw=M8w%e=S^fF2O&F+|u%I%kqyCU7<o4qNVEaZS<BDji7KTDpJ_u zad*cip7uXDwgCs#ZU3jiK2I_4^ZMN2yFq0#(92pZ(Il`nYJK{1T&#c3grx_kWhDFE zGH9ujo)**Hh6{A1rt(aKhVWIiS>4{gY=%5&sbPwb=lL~NPN~51m>@Fw=#q@bM`6pJ z(8)cH@r^PXCbw<u^L}@_)PN)o)KY^;;-)$8qE!3k{oWbX6*DxmHw;~Wz%mTT@|rVi zN3n0DlDRz4gZu=|FYa)FT_7$^`9Xyuj|ZBq3cEaDQt&>TgS${+4BD^p>1~tV=`6Nx zZvHpKPfx2Or`#5Q^@U9I#KuGpI>UZ;8I#_U#lxr8EMzv1iihAgCx+w-p9Aq0&{*_= zz-4dc`9@A0sdL+PKqajjKG?-so{%{!e*r&rb%OK)%q3?DcKqTTQW1S8^&UU<Rcy!@ zy}iEN^U09-$)uxj<vF_9d-3G$qQxp9wegw;L>S}vB4AO)JpwC~R-`kdBsNm-^0p+; z3r2F=w6&EMMz}Ne5O1tbSJ#fW+zb!+tj;R0D&jW^pNed)BHbJfS7^I^2<8dZe^_*- zN-yD}Q5=q2mVE`o44wdIVEiLbS>tIlhXR77C*GOjG+Zi7)dzbQt|*kSHQ9dP$rsz^ zha+O80j<246rL)ZJlP4){Sd#@zhQAdq7GZJR=~`;p*&o&SV>W2hmsi1Y*O}~Lv~eF z_Re2i#fP{-z%*=Cc;)?{O-c71#^{V3Ua^>TcHV;A&&_DnscgfX2*kSC>|PRD>M@pk z*f=UIzPX;L-cS-(DL_(Cc#WUS=qLp&VX#JzGGa2!L=I8npu+0;Q4)TU9L^Y`P}T$W z+%3M&plu8w)v#ibkxMV<zVPXc4QcFTSJSpn&H!t^aaO15oebn)Psx~M26NeSzHx#l z%<p(}S=@Wmw+~+SYzm67CU_+*+}<AET%4@TXWGgF-rZl!Noz3#Pj}dwbC>aO(N`o~ zKB5qGqtON4#@M*l^PAkmDd}i5g<S#ahiQ6|ah=93=DU>nEGW4tt~YgNI(k2~8aE4# zY;5Oh-rxi%?d+lg{T*iQauxRbMI_Hh5c?97G=I+kEL_W(zYuDe-?Gjh(uj++SI3Bh zT`xk<6>tnFE`pq?Cf6}ite7KA^~M{j_jq_6_7G54p~@PNsR$CQtyqDgq**(K5~R~c zQ)yMpvq-N8yRiArn%Gwc$T(e8H@gy3TLeGa|8qU$7NUF<+5r!WwimANuF8L6nNT8p zzvNmFf<^v_!J0?$1NBnqP|aTv`7|6e8v0udhJq5S^b0)4L5O|Znu0Irk5sJuMudn8 z3xCVfdB>fJy$U@}(~(|t8we~9OyzzR*K|FFV>6*i^Thp`tuw_v<nQ{z`Vp3Xaxyv= znv-N-j|uQd;U5vd80*gz$tgQA(@KIX4V^l*Yf_&t_#7eL)Tel0DsYUjHyM4N_22V5 z0-817B?eqO@yig;p4n$O;K6$RWSlHIk+?SAW!;W)>ISK$#yp@J>4(MRfZA$3s-d*6 z8!HeD(eaD;IbxR3alA8Z!=DZW>Apar#%l)0RwYk2b$Vba4$OLWOj=x9e=)Iq=c{n* z4(X&x<EZ#;e7>p1&;FV+7E%penFXSFP_Gn&6Uw-P)I{L`VC{{#igfAj)Wp8w3jvGp zjJP<5R*hvA>`v7ptIqbcpOD`c0xSyxUECdio!Y_V!0@{t^fVM5U-D8HVu@lE&;@aO zYD;VZ-&R~Vk(SyyefqlS?Q=!PmB20_DwDKhWXTL22oIRVL+==5eNz~=Ye?B!m8RH1 z>@qA)Rd`CkPRBl*Z|d*N4|dt3NmHRh<Ck9fp2skt0yXYPj+f4;TDwtpqdeyUCtvBi zW%W$+hBe*`g4DJ_=8P9#0wIf-{t0S9o3#MOx(h*VX7X}c;uEd?>BQcKr(RJ%uuThF zxJ{hUpao_VE>1(nb*&P3hg;Jq@mH(#^2^Li5DfW5x0=OQ>lR7*Z0cnyYXv#ODZm;} zR36Y!WJM0czqsQ89JdQg9lhu}Vy>3prTLrPI=z(CbZeT$Tm>j=nx}SUPdGD2EW_(t z6~ltVxysjMe$7rW`*t}TGk6e8q-|7qzNlXYVUuE8N3C~Z17O#$DVG)^`mv2Cg>Noc zxGhqAHR~_jz1$|BzNirj9FxT6R)!gwM^3Hh=?Y@v#@mAOYehJ(!>AiQp%$b8{za_k z2q_wEIy{9r-dGeX)1sV4TAe2Tz~(J5{iS08nqQ)(6V!{u@x?K+3y&Txm3+1=W1olv z<&g1_spZsQ%P1b#7Y-x=35mvJG9i^_s+2Iwf=Z7UBiT1-G%lV<t`Vta?`wP&Q6O|@ z;x|VSHq`|8oGUehC`}ug!CW4RGWu!s=-u0z02E{7RrHGGr1_+?7xaeC=fdXO$;w?_ zwxZGW)P~$am8|UiJ<3QAhu1FIqn}&5puR}=g^U>^&T!`di5$H&b5B?Ai+S!1<pDWP zmj?1BwlAnMg>NFb40XI(VFtLTblxsRSnX$8bb+F=7-imK#0#ct{N$_N{f!{{@JoVy zr2d|1^J!{^dFZKnbTP2eD$Kr)h#!sZha}AII4_Q<(^92CInp6o?-)nlW-^_qH(WT* z06Fysdt%hPx#Mh=v9Jvn`uIpvhiQFQaw)4uqRuwKSJ{$7m6xjU$mW>HU7f+Zr;#&A zXf~mzM~6N{4QPa#g0_VL7*n+!_pA7U!s^Mwg8Lb))zjJq<HI_yMQFYQh~!ddxMayA z6!jzqAIq`@RlgngRo=~`_$g<e3Jht0?&;tgQejZabyDA)T4L~fL6oF*>Wd@9Z_663 ztkEkuu_4pc!tcd5<DvBx=lHR;+$>H%Xl$A}PfY1XscJ$do5G-eOck~-_g)mKPZd*j zd)HKq!jPb(s@9iyx(!__!Bv`(zBVoQ_pWrOW|A-i`~qLP6}rN&s^!*3SKtw=gl?|3 z*plAJiwMo5ukk*O!;h+>rA-;PDhIe(@K+jxmljKI>wA;;Q1R->u2}W}yu|uzfI<s7 zCzB1v7*Jwj_k9%C*i^RA6RNOhwypgL2%~4OD1MUSS`<g6u<LpF0%sjAKQSos?hlS* zNvWC9r&~{<4;4O)YL(osP;zLZAn+Q>ASoxcdc7UeKeW;jT%4DG3v9)W0p<<vz3N!| zg6B;(T?M}IRQeB;<^Y=^>xbA^S;=%YP`4^@2l{~XzTqj3dMlT!Ql6Ep{3{ZXpU$)b zhaOwP`o>X+2Aw|&P~%ziuDQcj9yg*<`k}Bk37>EY;&Mq{wXkV|%l3^&R3;SxeZ?nc z5A57f+{HuSBP8@S`go2E3G?U1$cwnwD&yXbJM%^YS}C2uIaTZhCK^h~rMOCRp!Lub z=pm9W20ORrwr-<Pq4_JTX&46|m#+fWQ2g$u8HupYbEv>^`5=OxLD>Ep3%JL|?Qwj~ zE>2wuGeTQF{a*P%2D2j`Q15NMKBow}P?P#3i>pOG4}~?3m|zaFA{-hfN)%Uax5TlK z**Z%l;yj&IM9B0GgihOtS3Y?>%&6vb&hc}jf<29Xye!YUOgWR`3{QJ}=gK;D<xo>| z^}IgxDsDDraU^e1nD8{3YxC0ZCKEBD4)R9h8jj_P9U5fsz^|6DDXirNAvHFnj26@? zt7fg~HkvKr?MafUh%7M8-t=4-SCL(zN{h#Pa@Jn;JePJ(6X}#O`|(i3ekNFt@p_4G z*)#iO66Z^<>|GqN&O#EVR4h4bjv9~_8`wFHQGN7=08%0bx6WpW9`YJ*a#eae$*XE5 zlzs-Bjjh6_Hj!GyHMDW>Sca=r@wQK<n@Ia7kFK4aWwt3-wyoXW#K}LYzJlzFw2>!< zY#aG<6CjO0%%?p8DU)w}w+*7Zg_v&pe{0wOzjw&^PbquBd?XSf;~N0h+`1mMo!ycL z1y06?4z*za(VK|;H?50>fAjPo1$ebvF9Uznh|9BGW$U8Pt8;^gWNU0PhgDgCmhm*@ z*RAE-68=hq=mlWoXbCjS<&2a|eMioqKo1Y{z*oCg|KR+sdci4n^NGM;-M_O8ttJ&M zF9?$K?rJpq#{S9wk9ax{-bV}`B}gOIV)RQBq%N(?j3l)5Fz60o+?hT>5u>Fpm+#x4 z)_GH~+6XG`a@Nff1phny*Ddjqzq3o3*_3UFSvz-GTCS~^<d8T}2h}I0tR`M<z!7{c zF~??2I#Y*X!JC?(Ti1eiOmf5qd<kIptd=F!4g{>5&|djk8f4p;iklf(bVE1t->;gv z0F)hkNJ`Nk8ywUq6@~GmId$zJomD|{*MT$b*5ym>vMaA8IYa}NWCqnTVdwmGdO%V8 zewpd8ga-O6pK%UeJ_b^6A>k`ar85jchU;jwJGBw@PdV5o7s@w6Z8ID37oOZ6Eg~n^ z6MQeoj&5*aTID^p3kZ*Yz9qg`+wQ)h{7veKS3PfOlA1%e0=rC#L2vp+wC|Q{rMJX? zXAR_bl+dXrdoMm#Q8m>Oe$=qB-Z!Oagy376Qoa%z>Dl^sdye`IZz<9Is{<{oZGi*- zs;~cHN7*{>|Ems!{{-iGzx4cXZHY${{}$S(#S!MS$?@5CodTdF!1ceIg!BJfi$P%4 zCXL0yI%c4|>|M#)wzHc6KBMnLSyI8%DGMA~qOknw8~y?9;iT-SDi(n0as?fJU^OqW zc=59f)B$J$r7aM~AlsG7(D<mucJe`>7!~b1MW0ueMx1>V#<KzH&%d|;fPJH2Q*8+9 zkQ@<lLBG;*bE*iZZ()R$0KQqJktONdG)YtCLm8y~%Ve>Pd4b%DB7JT;MObR#wi<K} zc?l=F<*97gUHt}a(B1A}T$ae>vC~|vLy!70njh(rTyIXQ7uRy5kVYQh1Qu_wY;dD* zm=?+#a}_NCfG63eg`N$9^oEGbNQ+gB-Bg^l)rNq^C{ZYrF$M{|m3KjHlxKlZ8iI&W zmxKdG4>kpt4uDNBQZ`|%DDUKxd(CU#zR<J7^~$|^1qCq0r>{%xN@9!@DPj6`DGFs? zLX-Q0&7BD69oL8vZpqhz>`rzzO^&K$r#!udd5gqbNnd@=s|Zs$*9KFfbc6&SBS_a5 z-P{iF6NfTZ8bl>k#VfZW(K6dIQAzFFlKOc^pR^sr<wwhg4*~;v6aTsgz^){f+`X46 z`E0CuO7X&#p9#P0PpKe8&!y%zEfMP6p+eWS_L>{|vG?<-M+t9Z=WAXWb*^m~_uvz{ z@lgRABGOJ|1}4*k0L&FTO9pjb+;`%PPPyqnEq;4UpW&}h!r(jIj}g|{F9G@akyrs8 z##aFbwno4f#K=-8(}S0`SABUz=Hz`jXP4iF4_$RTGu;qF?orOaXQCXPgCb^Ge*nT* z0l5heuf=>k`V`~N%&%JtO(RR<Bc`0GI*r~}l22xxyRv;~uLIB+p?b^M9oO(cl%^R@ z3Xhde-%Jd!xdWCZATiyWfbKSO1W*zV59*G%P~JQkkol7iJIl4g!d?2}T3~#}u%v>^ zW&)B132MO98WZzzuk+8Mj}yaa-BQrYG1%S(BwnE`_IvEsOrf^bUp>8i{5sBG&e1Be z=VZ7VS44yw5ayly+tvWKQMX;IK<D|_72J#N!p2TU0_mCk6`zT^3V?sJ>=WVl(be=~ zBkBR#nB%UURdWHr7dHimo5s&*JC{9lH^@sNFPj*H-22z^U0JdFiyT(Win{$e>HS9u zD~p;G6};?d+!C=<(zRAXV2O1fdtWHeZ>Vq2lk(qWgYbpYBSUMARX7_tbjkd*LYXw? z{iP65{^lB40_-h5g=c5FUYSbY(2FkFeMB#>+2P0r=QqObxsdPRf1(X{K8v3iRB_;> z>=>%69BfMB7P$GGq~$-pgd9@4NQGehBR0H)@?{aHwTCOlpgw)1=_vhY#pqMVr9TSw z06r1m&?+ND0ahl;);L`P_(5U%A?q`E`)<oZIKt$J(%C|vi735eq(hC>OK^g5T#)N^ z{Z9_UY?%DGlTXBS?Bp!|MauM=&zn8VpyBMa;Ek_F9ycum<OU1;!Vu6U^z#6+l77Rq zPVv%ZpNqmMimPY(#mk$f&-Sh2^(h46YgWEah-Yu@3u?$)cf|&T^s4di8#^3h-(dfJ z+7Nj7sLxla>Q+aWZ@u5RmG2Omw$kx`vx9CLYyW#Q>0j39q3<@uvlk!}%b%B`EVhO1 z+cfNAH6a?C2I<00fwT8go>U^1{{65DM%G9Wv9hIFBRZQtq#=hVmKT<yqJ&nhV$a>% zpn$}r*)uEAA`sa^81dWE@-5)|?@5D_{-uPiaG#d{XO^JNW$k}XA`Lsd#bae+A-h8- zTP-#Ky=0(k)$neUYg-r-6U$-$BC~Fv=voHka$^6TK(rYfFcP<gbhn7rE8qVI^nP2m zx6$f5j1Fb<JF-@^Ou9+2TH~m1GtU5!`k#amU*R`HuoC-jli#&40Ks>^O*(Bex$H;B zO>}-HazJAE%{D_Ih6ljf-F$JAY_dhE-M*<h^N7BwJ-=xM1h>V8N3Ur001H*q=R{H~ zN_v1JSt0?(YjS?Ai+r;;z}(c>uvnV}WG{h<dl{4HPnKkko3X0ig;IyJEI^uGlWict zF#Fjh91k?guC0|P%dVUqDi5onS3%8>5e%QU$L{*KuC%nE5P0+kPIJ;ZY8>z)Rk%=2 z*^*QLYuUQ$gR*EvX^<ja>vew~O-C6J3<<@4{*7sgf2^*#g#LVLb?zEuvT=}hz#oo< zrRgVSW&Xqz*qcRimO2Myp@B9@d?QnRZ0MrYcf(r^0TJ*d^NRs^zP!WmyO07GAIY$6 zxlY#eR(ETe_#BkbI?iGxRWCL5me-YDC=YP!*z}S%+M0kywVk8Hyk~EACOV=AFFjMs zPK5}~3RB8z+V{%=#w&`WN#BLMXYKPLdh`Oq%iK(FW_U?Q&B_sgnr?IrR#x7?y*gH( z`ji`!M~}sFu|j<3WeDXs0|BY=2S($W?@lURC>hXw?8=nz2Ii|6xQPnp=u{)QlMZgx zr-`E6pnCx-|Mj+w-yb>x&C1=BTFv$_By`G6>t6F7TJs%lg2M8&5=UmP`V1x7m1x@C zyjOgvSU>cwc@2FXfVBvKw;t!a4tMwUYl&BW@1L+2v`YFaxH^eGXr#sPdPeBN1mK!; z^!NKt^Q@_#Wk@$4zOcj5KGCNP^h)W%t1HQwkj?$`X7AY#w5n^jTKdXO!-TX7*vrf1 zy}LN^3DFvmh>xll^5(Dn%pG(abdjc<+3$Dp^6p>*V3kaFw6DMz-Nb}`Y$aPrJE4Vc zx-}4>;3AjpC63P8Fda4H$DSp$<!T(CTzm4dD>Xh5&_wp#l(23Z2kKt`7YxKKwe0L0 zW8=MWM;t`+LiIC#z#e15feR_cH{1sG?;Zgbtu&)z4mjXH5*Y^US|JmFopCDElaDn3 zCl9%@^-;+~HVOJQSvx_S6Y>7d4b#$!f}W(?1Ms{;15;>nY1OBbJD*hmN#ZR#YTURP z!Az&*p`-KDD!<OIo$V9nGedi?sQ}$o0KMwNM-S?P2&ItjN$q2Vtdv(G%TjU)u<<$s zoV<Vq7Kp@|n)rUT{w<*`pepcE)=BtX6ORNjqaEl)?$sS!-wtXRU7(;>iM+Zu{1iO? zTpF;uqW098yCBNvz;IgsF@n$3M``{hHM68@?`}XXpm%^l)J;8(RtC0BTB%#xrpV-L zD9e|+w{E~d1sag7qh~Ig=-n)h=wvZ<@-XPQK<CfCX9f}as-3EKwZ?Ykw|cMq=nP=? z5aDW*w~a@qCfL>#;3}V!r~!0VB(QzdeIoS&1elVlzHrz<3lN2<Qz%-1hG(lv8MrS~ zA2|A~jQq7NWp)JRy6(BC{V^c7@~3?o5SZZV{4R^Vm#!rb8B9PDoSoED0i4-!f*Pnj z{A4_9J>w!Gh{DBR@#zc6ALh*m*VrHGkJzyMw6c~__49p1yW<U(wsVa}B(p$)!%Di6 zJ5;2fF<nyC>FBPWy-eDf6Q8HMu~;6%y_V@piRkY(0vhq0#%3c{y7?@6IqScXzvZ!Y zMvmJI%x4(&rM9yqqKO#{Hf=xr^xx(`vrE8w>hj}WS8Kz6n+Br}Yb#lY{M(Ixk*xmn zw7EI6$4fVemIpT@RZB|5>XUy@v48VlGd9%`wzx<P*<bVT-&8C7SK?nbCzjwB;=&2Z z($c@#PtV@gAy1$?7D<>tB%Yg*tO0`UCNC;v2T(?UdkZW>cmBWeZTL?}1mIN>xk!D- zDRGo{gl#0ODJ;)#h}HopA@$wzT%kb}C#Yii&^uR{$=5uVP&o>YLN$Ig`-9pu=+<BO z{KJ;*Q#_*S2{GeICKhF*(#0it$|$~yE!KJwW1nELA@!lxyfbpHva&idNYLUKWR)#x z!ti};)n#;B<VOmve;o>b7*bh<Y?bFVY{V{Si;mDE<Rx+MO{82E=r~q2izpD=nstU+ zqu&JvHGDsza)UlT0V7SW(9TQT_tkm5`+1CVMG_kVqN_5<S)C`&Pomeg#Dw)W<0Bf1 zLvjA^n#Q?PWk{5tH)i_AFJ4snsa6{G!_R6A`6*rGNZ*Gd&bAPsM+p|952efQfn_fc z=H6Y7Hw^bUHpwxQ2i)Lo*ty@zTkqr=K3pNxqXwrJhugn6sbny9FHrRC34#%QSp`d* zx_6RvWIyLTwrA??0f2x{396A!zdia09QC;MhzongJLnj$!CdLb)GDEGOH^PFw}#Zq zXE+Yyd1KSd1+Fh{3$sDuMA}c`FsKX~%UHEKVf|(xE<q~&uqJ=DOC>3vgUZE(LPHS+ z6k-3>won)LdS0h+lDY0eS>SIR*iV5~As9ca17&ij4u&Gfzx|X1Fa*`}6W+)sC82yd zOX5qf`UIcI&{Q2_SMtV}??H#YwiDKmvyHH4&_RaK-bhF`WwhJq2f3%6UHk)90uPR( zVdXSZdmw}JxoHRh2dRn}0-xAQntIFLNf9q7ZsU`3;$91%1=3dn?tb56-7dCm>}SQ0 zir3ud6L6tOAySYRK(!O?@Aje@52-bJ@qP^=4bu2panyh`@_xIx1up7PT;DmaQU2`u zt(urLF?c05;fD%l=pJlFk`+m_b7;1jjtMOPrfDBwgCH<LYtr8i;c~Qe@@nPYgL$=? zTypshO#_J6Yr!i=XhXrxU7QDSHEkWoKq}E>@+!wSD1Cywrq*?)YhWX?cwo8-8faaj zC>2?^4|Q-m*j9zr7+GdSLvI+Y!BbM$LnpksRJVbMopdga(4qYF^k{rK5$kj6BNUC| z?seP<><TQanR-^C${hHj1JF3sY^bTL{E#I#<0NYBp|{@1%Sb~ShluA+{@&`9g&7LM zJNAIAMF`9+$8ffMTt=adZtzE94NSAUFmv1nreJ6p&!Zu-o80n+!s)n)AR7v6p0JDA zMn8xCO<1H=k}Y|AhJTQx<l+@I^){9-bZY&9ipf4eGBcrQ(%Oy-f(l2&&+&u}YgPxk z1_Zn2g|D^yg1x5s@y&}(D85={8}4~M>av>0=*EswLQW;wl4Q)Gx5VSJd#47t9|8*D z!TUj<4+FHwkUsPqc^P>P1;#<uLsKD+$|c<2ip+`m4yPS-H2X60&UAIX@2&0^bexOt zpZjIGskuVO-%i=&l-eMG?<z{d4w7OLVC6E&v(e<Sxeeo9@xrs~txucJ?{_#4)5M@5 z0S%MPaGu;VCY2u<()PM5O}VkdwFmw(Z~4gxdZ;1vk7)aoRf9VwQWH~?13bx8(1CZ& zl#E$rJsqyy3Oo{JnEkPetIb1^pGLczv|I{VNF~li|2Z2P+kXpes#eAl3|Dpaa^LD& zFEveuow^N`uKH9=Vu!Pnc~+Q+hBkz_3~rW7GZ44LE?!%Xc!v~LC1(=#ZgY~wWzidJ zaZfEs$CroVf?nldZza$=L=%V5_ABDblQ>_zf!*)~qt%pV2dve_Y+0NBQD<BaM`T&W z9*C*Juf==JU<1^CO^nSA_vDY137?uL4ROemvOZ*aHTJG1pcxohW_@Z79YcZ5QWT%9 z`-U|U^^dP-JiMjORYt=-Q?oQP3dbM!^gG;0mn%<5UiA%3uRxxPIBhv$ZFSesA!R>3 zyKnja+k=HdA5W3su{hNFO+Ex>8r6{;j&d4#<xoi-t}uIec%iIFVrDH1KnD?z112<e zBZN(tT8G3at)%%tZZJH)w~kuM4op!##iM7l!@E$kl~Ge?UdPKqEO7Tl_B(Sw;~HYi z`@MP)nyecBeVWIL`$MEVNy$t<!|Qw!;l8kFEx|Lbwne-DTpg>e(nxyk>G`?g+_ox; zknm=$U?{MZ0Qd`jx7@~=CwiE*QHGN_79{_x7XA;D=FKhK3pv{CAaOvxV^Wj^w=c#< z2i`{E5O4Q${DVDn7b#JXrMTQa+j>~ij&36_o?00f{LMxaV0d%kW`{=(m=yj}=kRAL zr9Gp7tMzidLNlBGWF2%9$>;6TIRqHAbs%XO#m}7&{vKEvXo~GH@6Tbxf&=+o3vatd zFT0|x!Io#dPrht?j<{R5Hm=u9=w%y2!_+Cb0)2nw*hSHI$;#?o<BgaSC(&9wEXcgG z1~o8{#~UJ+7a<38=vl$M$Enyp0qht9#*Z6ofb;7lT`QNJ6@E)yU6C9lH|cgZd*?3P z0~=~$32>vD<Jo<}n#(+?kA?@+ZMY&%niCS&lPx)3#W%7zLYE<O;pxKqYEOzNPiNuz z$}wK*+93S`hY!^xv$)3xEitM!i+Lfi0?q|eFr`jI%}cH%pNIH<Ui4?Q4PF*&SioP8 z8DX~6MPf!sXlcvSoOd(kD#~M#m`wF=Udvxh-eI*Dw5vz)*O_NlR&Vqj)ZW?lcYo&; z`Ne<}Hli5eWKF(qG12H0=}RB!aropurgNINm_wawn{7O1HI)XxMSaIbblJje`Vls~ z#q+}!F9<RvmQL51_2BLX3st}rP?TKmK;rS`8y2$%k)0?6)MpAP7Ow0HY)?pGj~_p_ z(XEh|H9uX4+Kx=`yJA81S1(Hw=Gd=$T?_hoM3$EN+=pbUe?^TW;dKOC`hh`bj4~GR z!+|&du*`aAZPLl8J0WG7UZtFsed^>K)eLMV7t{0U6Uo#Jb!5>zae#|W5i;Tzel@5{ z%9xL6il|gBG`inu>VmxTes-8+L5BoZu}?RHrV*Z#q`Gdv%E`y3^HQJB3q${CC8H+C z;x*~9nEE<{*YW^&+$vM*w488R*r=`Zpet0+A(y$v+c7|JaCR^(&Y*jH^qY?wmfM6R zpyNgdBOmt!<uQsfNW|Nd8IpZ$;{ui89$#gruGoylrmKyUgST1`zbyvhK4Lm9Ho+Ia zh{zE}>-%$-^$XTC`q;<vDS!)pA5xF94h@8r_p?&!i9Pi&#lT`(Xx^}S4eh7Mcpcsq zRqWFl^KM^`0ch#%8K3oLa8&Mb^4v-fMw#3(;z5~z(FS8LYYMGyG%w}{|J*2hYgw8) z3kdzfcDF<zz#(uo#+aHj^#d;Tl*GD^8<oNiO>3(av?43~XzW<Gz_#ShxRGh2X?}q| zSs!haokxL11Vs%CxZ0Gc-xrsOvyw%NUIE;nV=+A4unnRGkhPpR)4tZZ-|OUwzPl0Q z<19<3g1R~3z7t^w^9z4!UwrQ<U{iB(y(SLj>=g@@_FzZ+bMrYv_7Par3G&d1dh;wV z0!q|%Q`8ic>l^Z}%h$5A<BOZAA^JR&qG40B_Bw$r2DMeiC|EzB+_Wso@Co6;!5Xkp zE`bFYfdXv>Y96!U7n`v(X#B3;AXG)?;@Aq#ISm;PNVnIA_wGukosY-v<k&LkHB3K5 zZrFGcybybs6pFEHk13mdo~7Y0G*r3a^JpMAlz>@(7Q-d2zKwr8NsBhXmJ;(q>?niD zl(QuHBOQULxg16{)}cnoUz)8adJVdU9<ecHjz6v;Vvy<msFP;c4L<a|*I_+j5i))c zTUT??mmB3)&#>fKbiwjj0$|<>jPbam3E(!7$8cf2OGGQ8iqx;ZC^dIoOUG*a10CIW zwr8#P(XYo#R}U4tG8VM>P0*3y=u^ilt@2X`s&P$ea{!?`M}uz8oj5`E0DV=<nkFTS z{Zy8NCQG^YJ&);bg<39HIXVh7VfhwWuI8WEDOESrnkJZI%pMYnQs0T89o^=Q5hAnv zl3Tg4lPlZ?KgyddV*C$X1SE{>+V3mofGM{`W0PSA6=Aftus1{04in6rq;yg^)bVNH z#1L;7o<{LQSr1`HPtf?JG@g068A<A#c&JF#j)*aLELtN$7iFi_c-N!tTV276*w~O2 z#*c%X7N|?y2AzV#wp0*6&g}K(ZkoTqs%3@`#qz;bY$r9BV;aBynq)x=L@cE7p3bPv zuKuovgLg!1$KC_B-7nV@!N!HZw<~6HjRw0e@Oz}uhptF#G#x67+ZBhxPB-1OzMH3m zA(*wiSGiJnzR#h#Td^vFC8+BRdx?XC@6Ue~--Pf^P*v8<Txd7K{Sf&U8c9D6*;i#~ z&oe5~L3vwE=L}Nx=Z4K-U}zYN?vkRjQEQcgGSM=0(R8ekSSC}>Th<+S<e%V1W0~$* zN<Wk#MaKsSYMn884ALs;qX&alLAww;ZlG3n<?iKjofywvzp6)TIpKy5%V-|FSWUcs zVvg6zY&a?7!S!RX53XdnM^{+|+89rmW+vTorOXqYvQ&l$N+zIkrZ^n$OU%9HRYtTi z8P2bQc)|kP^lE5t=An=~KKV+5R2q*vEC-{$$*saq<JPQ4!~NA5#OgMLB*`4Z=Vjiq zXQ^I@Er^(h8(2}lNH75~6o(}TEtr)kE}G}0(Em|agBUE(D|iYbH9QV^jRmlz*T5kS zW_57mNVCj+VJ1KBPtf?DClD>MlIebMVP^cdyQ04W0F7PJ_{GC(j7!3k-}3t0;#WR> z!+xtaTu=7;)_OOP$o~>Xy7|`sE(774N=Zz#WOZ(8E|nn<oAxY(z%+4S6k^S$t(Fy1 zSi$$4?paP!o^XZ9_ASq$M3N5RpPI#SNqD?-3}UkLD`vcBD+!dufQ<_Y@{4x`j2n!A zkYZ-pqfT!#(%A-m4^69|9ViQ9HA4lz8M#pDBgMCfdSV`baF(+wy>CHWzqNhab)fp< zB3s}0rIt#4R?AN_x63_%yZ!FDDo>4T4#Pkk&E)B-p_4wk9VwK`J%JaMA2PjdK1u2G zaeaMG-uaVe8gOoOkh<cW<^C!{!svoIejiMpQer#I(5yvF$cG%wuT0pbO$R)sX<Mf? zaNBB}kj#D7a_uXF*d|9idu1`1+;8|hGZDEF6HZOPG51C694Sj|J)0lhBxxLt%FAD~ zB{`wSU$6$XM(@wAXS}^7$*>>gs#8?Z(z6;bf7<{jssXNd!1*?EA^PAXEV@%}Vdk_& zf=xg|(SDNiHP6qQ%VlyY9jBj|>3wWwC--#9vDbK)QQi!FWlVa^Q7s{;_e@Db|J)Uu zE7Q@%;d6E4)%~CAYt2E)YbSeFGOR^8*+N)gkmSpJj@o1TL|PFp{}=1s8H-*T$Y7Dm zF3LqGr_6a~IT7$ubO$LkQa=o+{5l+XB!n|IPGK>rg)_uq0WFpQRKcbbR!AQt;N*sE zdOt${fKL~~{f7Rf8}g+PgUe{vt-&49eqMVbWDxP=p6*266plLK>SA{ipvAW7nm8zW z^fALuK~&kU=UbzVG|%Z%hana&!RV2OS!w=6Rwzu3UN`PUP@&Kz8|$BAE6QCxspjaR zoNPf{oBYlW<S@0dlAqHgFJCKKz}!7%J0)5dKHFA4Jdxc7%91NN?TkxAgyx8&cXi<7 z&LA3DHqQ)qY~S|jAV7&~?3Vje`qs$np$14RBXv<ayK+T~JE(AN>H|PCwQY)C!j<SI z-casll~^`-wX+9OKWEJ!LN~{dFe~@0F{mGQCYJtW{gAqMwqgCM<FO_DZT%r>Dn~By zG%|<}#)SqpFCjd+2qfZRVUbAPcSoN+ocw*~Jx-G}Gs17WB>P4(=M~JDa9)jKj1D@% zxb~x^jUjmI@`=!=Gf=#^$=)+uJ^L8u*LvZD=BBT=-AMvOC)!e!m!9r9)}85W;beWp z>npZ$H9uUn-SKBX{ERCxY-zbGC1dYsVw_#;6G$GmF-Pcp(5e42c<EK|NCE;<UQ%y^ zAh+WkXOZb?1}%%xaS%va1O*=c-1RF5?Hl#dEP{1lk*lM#MzQuaYp+_#o}Rq>qE@ZM zq3ZL@k^Ddmyt?R4N;eTp&roOZP>fhiSo|tL<aGoD12##!ubOY(gh4ygKfP=^x?8z? zE)n%y#q}~own1ExW5-KI&+uyiFBHx_>t23*e_qjP;`fV21>nq#s**_kn&v&6ULj0U z*G0IjZ!(Er;DIL+f-0=^9^8BNq*TG#6lMrfa+s%`Ml=231?p9E>*w;jOGKmqHDfy} zqV9yiN8c9F21JhRuOS>sgw~Uq7|r~vRsdoKSlu`G*L4(C3cVroXh$Nl^(PF3;o-HL zPo0=h0u?Z+iGU_XeY!V)@Jv#8B`xKi7vX!4&iF(}zYfV>G&oOFb#!Em7xvLr=>B5{ zgM8H;my$g!DO{}&%fW###`IYt0@kZ^vw~b38P7M}gZCKDpfY;7(dDkbhtL1T1rT~m zM~(}pq8%FJNcK$g2hD7+F*Hzd20+CXwW{nlys&I|{9R&r!d<A>>tSW0s3RfPyXEC& zr`yV}qc|dC>rfj^?%D0tH|I`U?YR*!+E`}~pXgBY>v=){kW=DCBD0a#s2(I)3af^o zzMpqo6X|Y(fkVwrooV!(Us>=<!$OA@@c_cUG`NRi@~yb&@~uh@`O!ea*yM)F(Nzx4 zOU5!E2=<D{zf7%;)nrpfR-|75y$-NadESD#Mk)V3K{j!LwmU1&a(zs^UhkgnxGC+* z+B<~QTy9c*w^r5EhdT^re`vx5<<nL<51IYLE}3?OuacDo5rj*9mz|E<Q#~K=971N# z2Oq`9^+;85@CFc&*HFBT%SjhL*Z3jm*o7OV&w}%kn8-BF#qOrrgisCGuijAASu&ZZ z3d><9@@X6l#jb%donYHQJjp;<=`wjbyn3*Z+2ruexg24@E><(s$XQ*sZQJMX0Zu+v z$*{cS*&(I<C8@(k+&6>F8o4DVbNb9}sqMql`oG-36rDPn>_BxnBEEXQ)iu;Igz-4u z9zpbx%(YUCvXPI0nC9v%>CH6%;&Eli425zpM^VlSX?DcYTVoy-uWNr_+_-@Ctz3^e z-%T8CR;Cfd;`ybg|BODzx1K{@qg+%$6K@Oe_;{`Oy-ny6oU#Vj`03jDxr|Sm3kh}e zA$g(ViEwl$>ZCzKb=#11$5wU!_aHB@HveCOm;aBY%-0?UJcm($*zmuuQGogY*k`t` z8u5Rb>h!#Qoi@eZ#KD(Wc;snR?S>eigkJ5DFh5h#I>NvBZx5h=<?8PwQHEOqT(&4x zzmQG=|4VoDk#N{k2uHM(HpP%_P(I7V8}Vx{(eW{80ki~Bm;Kj|A8FdiyZHEtC=hv> zh9=#8NmI5Fb@F~rhY?`b-@4w*XMdwlaA+(9BLFq8`0<57H!eVtkDq|Z$~6AY&_;Dk zlR}`ENg`{S_HB<nXH$2Jj5+#ORbUTW=@V{HMOFARadQDF{GSI08GuBLB&~c%jrO6V zWYZ?Ub!l87*(IL@y_k3OOxtk{a9ed$+l)-Tb#46aW<YSC>nVA06;N#J%a*f1UHiOA z0ens(Q!VhH0E5cb^(dbjr3b{NrhG(mbdS|+^!)aBb_~=0p*Q+M{#RIN|7AYpDiBOz zb2l0ZD4YO){ntI&w|@MOveb17u=iZQ3E%yTAeXW-7Ozi_2_(P-ieeu;0TyEXI&u@C zUXxog>QH;IV2owei(DIc!#?B%9YF^eP9DE;XK~ZJimN;hPqFx6)L)|~kVgn&S9Bzd zIxeK5IunR}+vvbVLzxCOQT8AY)KIOnXtVIqeved14Sqyf{7@2}zr6w2Az?aTVc27{ zKl$Qg^sD+PHHD2zVm}B0B-kfrnSL1rShdts$)7Z?^xg$9a#yc>te;h=fuJYB2ex1= z=n4LM1kf3<QbND6DbD%w5o(suYO2{2IqANTEomo>_%CGBcU1$T1d;mEdvW$g-y9P6 z!efHLS&OapBOq}yia;F!HSXI~V_k6F*b&u@)|C1~XVFrtNwXfbBxcQ#{1Lqypn!(U zzGRWbZ_)sF=_vrIat}F{5#16`*<}?unk$YuHZf?R!C3J;k=*E?oYae!ZdBdMP3lMN z8YB?8D1<_&BW+?8k|cA`5MB~BROK!S|A=S|?OD^|3QQ;{8{$&5nYP7bDSYK2u(y}- z+2)Ee5$`jsOLC^!DAYAXA(U*cDx_yIS#Q!8Xl=d<p)!r+<wp!=)NA)8ab9!e-;HrB z&X6GG952wr>J&0Z-%Oil*aMPS>Wb8}#x54$6=0t7u&Oa@z&)dicPtNB`&H$mstjcy z8@DGeiaLaRUK-4pV$nJ*2-cKoO?nmSo<2g`&+F8pctqIa9*Mz`$mEkYZ^ptMsUym4 z-@ycWLaViFx}-T9_$0%!LP!afSY0;|qAq$`{oREgr)dvIb(uGCeXpBan9H<6QM+fv zvj?$n)S*w#8|QoF*UEhe(9{4uBO{V8c|HkhT`Op(E7K$sD?nxd+o!s)kMPi<%^x+G z`sYlvScB3Bs4vq6bODoPbOWf0;?WPwck1J@G`P|~?b!K+H)}?8`}7CKrNXO^g&>Fv zw4ovXjf!z{V~^JW_-iKN(m1;Lw1tK|D|s=XO@~i7#sFnR$32>9W8dy=7v5{4_DE2% z)Ok{?sYEu|adx9hLU{7h@X`QbD0ee^6Wy(=$G`z6LINW_@FGrmLCIibr--vbostEl z1^;aOBkWyA4dSg8g>9ZG$4BuNH>eX!1xg#T-LmC?xy#~{kmN>+uXwh})7xQMphUT3 zIXg<Yf(k$S(8gl2hLD-ND3n?BMG3v~APoh=kPQU!S-Wm$L7OtZoi=El0Z1GqGnbr} z8aJXL{W0U39oE4yHYbM_8K6>0o|-sg_2lp4QAL}rVluRG`xW||USSk>IK36p!8FFj z1$i7<C=v0%uSw=Q|Fl!&-Ah^)$?q#6m>W9ZSFlPI+l;vFPyep9bj@Eml)i<pYOK5q z3jdJjxDkJPw2ZTDZL=T2R;2zKeJbkq7<<&{q?#k$aDSQH;~A7ukJcpEv3|)pj~>H@ z$X+emffLjB%^vi);g!WI`ZT)C8qBFt9|%Rqq1Etug-O0*WiKAk2=+wvMO0z1gMUmf zbIn~I2Z4pRR%n`yg4H$fHVqaJ`<tLhvf%z=S5|<!j^`1sz^;bGs3E$IYWla~aHfJ7 z{{V6WR>mZ`t1}{iF^Q%JiPiteOP|bTzu@%fFFbdEKV<0sQ}EWGUOE-}_MyA{W&DU% zgO;_f5W5rQWGHpOHcSr~=L_0hMmg$-QycsC=wL~@HEf_>uMOy>v|h6CEH4m9R!NWA z{3BjXHa64!DZ{rHt}08q#6DTJtti}WMgN-A>A40`M=XkN;#e#9X5pS;ZsTC!k(OY0 zm>3oB9%Um4!e!7RO#5#w`8S@V<oPRvR%O7dmB`q1ChPV%hCZyu3u5>t4w%SyZCv9y zX)~7R;I+Z$JFOv;HLTJ_#-(x~KiPio66~<q28}G9`(o{_-SfhtAacJkI#dN`g(-@l zvw&Vpju|j}-?@B8WQ~h_FF+2gAtOB^TXm{3m-qfXaxOR>@U?ZQDOLRBOI#p#;%0P$ ze(qGP;kJjmQ>Rr_fv@<1USZ!LG5O)6(WfNGbp+vsK=Ls)aszX&BMtaLVfn(d8bbVr z1&PtY&IfA0ggR6m{iY=vAg%00UbQjB_b@p@V}gL!a>{|+2sO5urvLeZoFO8Wg7;Gh z4LyP>Qe?wlRR^SrZePzt{*aA@KrUjsbkig_n+C%72qH7V08m;gA&~TeQE;uMjsbwB zUT3xLGtEaQrwIsrS`G05Hg_U>@5dp_Usod{shguf$Bz8vJktbRoS(ghyE>LInMeNG z9lj>`dkHEracK8R&nREbj&KbT`5r*`*He6TV(tDaa6SA0`R1R?-*OxbFZr4QcU_Fh zM;C=Ls9k=xj9MkkBiHe(SjS1_S|ByvRZfVu9?EpWwC}Q7U~8L^X2<&eo~vDkmR5Gm z0_-t@rO<=Y5KNxQ4W+G|34S!3lkev^V%Ei^Ve<unhrtc?-*Y2=2W4ARWsJ#*)!q<X z(sr=yz=SUY|A*fl{q!>~V+DTbv!>gFOz!yjBIiv~U+?re|HG#nmkTaVZNnU#`YNmL z=8q9m?PurD$_<67>NqPX*C2eX!XD-9^}lZ{zs#Pc^oC9TOhS5gexFKJ?n){+7(+Hj zel0A+IOxMn=b2eJkfQA~iFG^eqH=`j4}Q59OeOHoG1EYCcW|?{C1E4;T*UY0g;b+t zmn?bpREIeG{#(Xe_n2$jdv%g`=qZ81O3sH^*Pailnf^X(IONaM5Tz?-KMbW!{&L%g z=xX<o{b_?&oN#^#PwDzH#r5KCpO}3=vro&sy(bY4jM}%bdCC}twU(evqn**o!d3(x zuX#Z&uUU^64mDf3L{5FSK}RgaTn0xC<8>|4BAUN`2n{V=T=Kao=KR^dlCZ1S!``{q zc4SvDFM#ber$e~!704UY=HwddBmvKR4v*rzMDInoUZnb$Oh^7A`C9=mU2sg1sK`D8 zrQG|F%#z<H5-C+}=f^Z-rDE|PuE=3p>RqH2<9?F-b+E0zD<S%>RmbZz*M~F3$J$&e zkrdWUr|D$Q-VYPMEQr+_xNr0CIp`|~CeNr9#7*w;V}QYHS?r;(d#791fed)<kw=vX zUruiafnV>D-^;bpHH><seX#~vJ+H}Fo^H^5rr6W-vQr~PYtFc;Jf}7YgYkP;mAm%M zeOCrHzTg%l!=ijli(<twYnarxB(!RtdDfcKIA37fpM6V}xq?vdl1k_^BU%y;G38M! zxszLF(I=StXo!CAIGoYuFaL{97EHq!>k&)ZgUUcwN5N{A&DUZtuyy<GBA}^!7k2mf zqQ?=Sl}|Cp1AnscFZuGshNZf-hJS;tmtK|b9g!B{ddKvRr9CW|IJ`yfc0@+z__ju) zVMCR;*CWC?#_fmonyFjm-<XYCZ?)jlvxm&;B}sQZduHzb)LOdPM(uD{U5vkI+lP!+ z<!kaPhnIhKb9x&4rzWHdDA2>FJc$<gw>0hYnwm$bpl+I1!E!jG+o)3*qkPyZ6TDUr zjvJ9xz56D<a~vCth5$cFc_cYc#oi3h=X^C~8;PM>l(f8Oz>?O7#h<Z@kXT|A0#N*X z6vO}n#VUQk0bTSwe1Ba-7_-C)cro!u%#Scdn<N@<Mqr>==qj!L5qtSqjDhc2D!0vK zRHHYb);PQp^2;`!t<Rg34!QATXG5xYS6=ktk7+#Ad9m9}e+rb#{W?Bmt8;6~Ly}ai zLNO6@u%=W(to&E}ch93EfKKJsj+|OMPD@=&F#QZR`F!U`+K-HqQt6k=QAU;oYxTHG z@vqhGT>bo5oN|aGH^NMiXA6shUtV;zacTRi-+SDvF_OfTKJ1gc7i0sU3(!hVj83S# zto{53RFks~XG<+`t5yA7x;I+Mf^~u7*TMLakVqh|6oqtXl!UtNBO1Eg7Z5&vzdt*A zY4_4{JLgp_Y$yE(Y+y~FPKSk2GpYyZ803@(Evhh0R*YrDWCx)XIh}6Gip_`s`~F>c zn?#Erd<qeus=kN?f1Iy52vAH5HXBAjo%fts(GuU9Fu;lgm=1-i5<Vph)8npiKJeSW z22D%J@o!F-8!xfyi5N-i>{F|RbS?3oaRJcbm(6BT!5k%^V4So-FGqT^fx5D7`IZ02 zWZ5U>C$2zD+WLT=B*y4JiV(vm|L4Dp8>LnxGHY;Q`osG$J*HpgI4a0F>wA4#I@Wvl z2hPK|nBd8tgb)L@Z2oU>LVp;vVc+Zcbk}Mh?iW#x-n)Nu^&bZgIbH%};8at&j#_HO zeP&JHw%LsKdwWxro8opN542k{y}a^;HFys>il5DtYq_yncJSB7@mfmduC1>puH<}q zaCo0^Wvn$@GVX3}$oY=qQ#jQWWc>Gl!o5}dmeAjnO`C07U=P1VxH+0DaduJs^8cPz zg?naydJxgs)@r)!2WeEo^u)d;xcZwL(sylE@#Z1VIrMlkf2vleFQbH-@95L<L8p&b z;+R)LP4d`${92*%{8spf*YAG+mp}<0xB=+KCajgmtjxIarj}%QHRfoN#H&w-nqP88 zlF|GoWc-a$qy%qD>i8D;L>K@#`tZdIoi`OdD2C#%hUcQ{c7Im}$G;2DtshI%3)noN zhEai+5`6~`1`M%Y3>d`)gM)DVbm(Rls-qRk);<nZb`^Ye4P789X)GSz)Z~3_6Z2Wi zS>)m3_qeM9V9hSlT*&!bhuy6Q65Dcw=V{LPrr6syYYq9F_6rGhD1ZETX^LD+@V>xp z<Mr7fnCUWEmcZ*&4K;zSy;c702mfEh%>gjTBInyrO3)Gz)`N7;%CIrjL&K~o3it%z zafdIRuhJ3KIjep7<c~?UR{pR@pVe~fU_2oD)(2=L>;7hbc#L*YydD5M7t(OIi0A-Q zZj8l7LPJy=Ekj;kRnXfAxh4~q8J_pq>qp_1{^BN~yG1zZZRkCCJ#kCcJv6D+p8w6k z_89I`%d+Wmo6svhc{{WtA~x4`-DV6CljFMHwEeKH{vCsxkjh2SgVRvWMb1l<&365+ z|NKt6>+8;XvegfvD!=`ZeMTJng=;!zHJmULSI1llBg`Pa)FRwTLn<C=4=1dq2?ikh zTZc8fgB#f*8tKDEKYGKdzE8PBnOvtD8Z0KB6oyMHJguU*ZD*lMi%`Q3L`;+GO4Ihu zM2O!h0&Dcj*%s6vXkMS0vgE_3lhR8eE$U>^LQh|nY}h3qCf&fBIf8`~WzW@1)R%d% zjg?!#xL9Is(7&L~v3$COHz}+spDyOt=Y8HhACx}d)rQ_R_2^%@n@JNGpiQDLLLSo- zd`d5xcl`2Efg6ZVqhqL|%`e<btsDe-h2mNTk-W?LWS;AaP3$Oh<uXt3->UoaxFplB zZ<}Unnwhk0(aCKp)Kb%I+!vU#jZDcMb0I;qatjT2v29Y^m@t>bbjs9Jl)!yuDv;bu zQ&dz+as$y6#T0?(w&u4y@B2J|ynj5O_w)P#eBkE3u5+DpuJ1Y5xvu-100yKpqo$to zmC{eoVi(u1N(`dGp-Q87x9#r*XclJz<1W%@mk127S1GVdj4MpZBaXz;Q}fr6j@8=l z{1L^F=*B3!1E5q*PC=HXe!{l{e1k2S3<7ieAN1R2#?vQP`}z=nfhYiz=>*f^TA&_i zeL3q&?Ln>l%#><iR(@$`N;MfjhV3ejI*n`-22;4bSPOnzKo?tMk6+_mw?mEGze)W5 z#x|0FS3<sI{vjxH$N0+)5(mg#nzhUO2yp%lgDKA5PV2p1Pd+Xy<(n9I!w8zlx5D5O zF13uD)-UaYlba<D#$(p4f0K7w(e`_ElwMRp9G^8wU`MBF5`f2KA?x|2q~w3nmZh4k z=YAm5dOp)azmdu-yVK$b|8E-zNQcX2hz3Lr$t)r#UMS{}dBbo31-qJa<2|moQC<TS z4Q)_#0B5Xbt8V(6;*aV-L-qF4Cn$g%%MnD|V7_q$6j{BEWKVqE4!&QVDH+L$F_+c6 zC!p?Y+R~|0qmIl|iUAgxR>3zxd##QU;3pD0P;Dv#51L8V$UuN+4qay#ygb~z<|^vQ zSIrE1p~*a8o0;g>(^#063>vth7d0XW)r<7~A{OSq#G-r-DUrsD7v8&lJEip;MA47f z;HYP)9@Q5I7d3hC>OT9d%=|5j*JqL2_Uq#{L#jd~!=9lY<olYG29S%$!)*%mU)(!e z*A&?dAY%2T0G~v~j|F=t`$ee!cPv0EmPx$IG-Q1=Res0Gf%<KFP*TU}hROlrFmgYz z7Z3-aZDe`%j<}4Y|E)N(>DLPEE;3FIu%x`=Q{<@s)QlA%Rjc_-YyAXzf4a@npgGg8 zJbjMN8Ugfw@!yooT~XK8H)HZ&JQ-Pok2vW?jhX8!D19BnpqZ)92|Xp-u`8Ul>iUm0 z-l#*keoZP?+C!VJmKn&n+AfWhf2jf=g@#c+MoraOd483~B`(k@1^Dt$Wu$;yRb+Dz z*(gOITcgRyrTIz!RLWZL-j&_9c@b$HufEQ;Z%n%FvUhYa{w2)pbI9tqTGW>1S_rv) zihl8LK)LOqksOnx*<<-nMA@V=rFA|LK$(B)P$v}WwJQKH@AX;2kROBN^yUr&oKnq7 zNY=!w{DS)~a6~1f>Foxj_iw+mW4!4K;*5ZQ^>8irw~HM%w?G3HUnEu0*Fo={e+!UE z@7;idZ%pQzSH=RyqNX14ijIGe_HGi-H8!&P9OpD~zu>Cv0Spbg#a}u`S=zwhqm-qu z7#y>@=qH>chRg*kuAg#96c)sdR*~~Xn0GCCnV}uDMe>XRn<ilx7}M5QA!Gu~_N3+9 z{Q6whxX!~5-rck#*B`a$2QRA&>PAe0F&ldSe&>}C`C(dUwZa|&g8BQ7zgsK}p#qx) z5~3s{-Y$L!E3FPOqDegv<%$<<>Et+*U`sGi8$uYO`^D@vpQ%;NVl$55RYoiUKj9L( z_OovMN|vB@EIPngVT&MqeX`PEUeVq*?m*f90qL7>#vBBK&Li~R_z46bQNtEog&6i@ zmkol2ns2eEfQ_oZ4a%m!tndHrQh+w<Ey%&G|8_|LM+^9Rvp@ZR&E;kz9N-CrY}<c# z$BFO1ye*s?hsl;;s0JMvvN>|$$tv)`-0%Omxc_dX=FY;eqlNGKUomQvaiGjrmw2AW zX<BGi=~8O>^c`jV3f>`xG>qCP#&rx><ZT}IeeDs_+}|YZw(J6O^Nz%>%@hMJrFww~ zUd=pz0FdgXp8*$nlb|?y`03g6nTZ%?<9rLdX=N;C;X1HkcYPC7Z}6swe-(VIy7>y; zJ!TfrgStG>-oW3)mbQk+57g`wP&VpjL~pc0fU~!6@b0D`;5GoRLy+kgJ<2r9rmuZm z?VD`to9fc0AYUf*<eBvJ2yX1kH|og;U(KsPq2BBGYf`+M#;gFuRwmQV4kvC+u7{FF zW9B|&TX%{Fq}EiAsY(S@oZyxJP)*#Rm2P*fSLe@xzsdGdHN;6D^o^$09J)D`muKu| zyIv*q6tN78yRu<<rZ6tLX=c^TKdt9o_lxgVj>yRcGO0krc2%IgdO_ie0a<@Vmq&>U zZuu>|M|&&slR)%B`L^V?lMb1`3^q?OSBCWK!(OzICifkSlhn;DBnhtv-M*IgLiqlV zrzBn1!?3Dv<UYYS#@lI&jC<E48TMBol4;W!w8&=tT?$J0gFrIZ1J|A)i023AjD6SE z(0$xJQy((4C^-ua)k8u2)TtljZn|B@DwZ|k!0Qv%*zXG0b<VGMtk3yO!j&{G3?~%y zwC6=|!9mz5&XfYA5uMaHEv=)#V!wx~zr1vC65yK=83Jtq*NKe=_`u1a=E%f49pEu7 zMj6%&Ki@nQ;~7h~(*C(R9ps>u?(8!%m$T>-5(7iEN(N~W+VgC*{Y#UNd>rf1<a5|W z(}SS#<pP6l|0dvoUc_`AyJpHu<}2-u%C3{n(NVjn4hP#Bq1Anvmcao-rUCJKt;{K? zoSX_Cdh)n4$GCGc5-CN-9m9h4fm1$=hftE#jw?OgQrDIeZ>=8aG&UP<T1c^rot}nt zzB7HjpsNt<8)bD_lL7|Zx+7xVpXA*wy>(`|4A7o&@mLFN!8>X?ESh5(TTPB7r*K;* zPOfi$*|fsK5>YR?q=2($k!lqhC~<@*tZwf+RwX5%e@VJsjl8CC1T7o))EXCcwMf-7 z(^30+9-Zqg-n|mBIFc-WZlIUupUoYNcXO`z)tj4cZuV>rAtx7U)O{ZLyGn0lp9-74 zc1PN^ByBYk2LzHyD{hk?$-+jhiMl?8{m=IRdY+n`4quQ|5t?8oKDnbYp9Yn?-iw!@ zHF+dG3lLs@vl|ru=%{^l52m-^oZRmM@+4(XYk7JorE6*VV1+hJ(N4g*IjFB+JC4>R z-**=uMmHU*-@;sNBiO%UEr8nGyExF?`DS0W#_>>VV7a8_uSI!j=hHN^-L!kv&Od$Z zC#K4j-hLPB8?&lX3-<4zz4$*s1L53pkn6%&W($71rcM&w#rpDr7W|p3lHV5p)P^E8 zp-J8+N`{LU*N#?o|I9CGJyMp$XELCq4*|~e7c;%i{ECjL#4gl<Sp6@;w0AL+CqZo| zdT*>-cz2^o$@lnucR%KS1m+KMNe)U{-1InQ0puD&s>}1j7!LSYR;o-6nSOeX+~7?| zI=r!0@+xLwY$%?VI$!3s8%oN4gCnf4@~W`iVtx~BIG0E-trgw|T9}icXg28+XK7NX zBC-~)I^byRobPz#@sN1`+!)IO)`A5tql@F+Y|xyj;#K}5keGZN02(LLSsMkdVp@Y6 zm%gli7P$cLI)_~KS#fE_KuL}(zvOFrh4!IL?#vgT*}S~Un)=}}0%JFnC4%@k37j6$ zOF4c1pbo;fE*YQC4!`4Dv=QL_*<C()(PC4y)kU;A72tz!P}<A-bR74)Wo$|c#wb(` zMt~2k3+(#0f&p{->B^`P&gF>45>x#gQY|<q9~_X!AhH5I<hcMf%3c2e1M)2vVyPX` z<eh~}NS+|T%f}_hT4d_P-Sha(^DnGzxT@Phc&#-Ch=rAn*W6u^U5n{hyLGZP*VjE{ zWId-+c4NK}N{WtGD3sLOlD%+d3hp#BnL9BrmWCgXEQBj%S+<${<js7gIwg!CuoP5_ zeStI`k*dK&`tY7=g)OIOz$R*Iw5c~6@=l}mP>3fCVK6&jd_C+(6(a-O^2`S(H%2if zHse#qhAMoN7}b>QvN8N{<Lvs9y3~fqv#uWy@3yBQBU+X@{*5rn5?M(cBnYw1$bKd= zw+&65M_>fkmRrlk?^roA{4-X2N3Al2&R#Mq|B6<(&47V=E!A$87685vO697lNq^g| zQ`FO3Vb&d_-H8tMnx8+@tY#yAkO$Zhs~<YFC}|1?L#gYB*G#Dgp`^JY<BAA3OoQRv z0E<?Vrm!Eyzl9+_qF>|w@tXH!E&6ff8vrW$ljg(vwI4QMi%nb<AD3|M!~~VDESwZc z<KH#IRyg>AU|C)k+e35TxG^Y-Ge<bJnO|DrRjyOAt9G?Aj<4we;9aIV*(|t0jRMo^ z{6h2K<<|PXT~pPGkE61~=C&i4mF8(o&EPN+9#um{Z<34D+ma6dD>^rWu2_~-Mu02q z*RpYh9-BE&4wTgyGzy2Jwg6TEh&Fz)g6d}!%ZB2q+F0uJPaA*G6%@<I{qUpQ`vn61 zHsGiZ2j^zd_lYkK^d^x>T~Hv=gXZ@jN?pC~u5vj!5)gh0ya`NhRPcrub`$-7TiP!U z0ASudHP6x;3al^xn@QdXSOCU<-WjS$nTuQ*jfh}wR7v4)kk%BtN{s>{1QF1k`L8d= zS23Siy9x{g@EiGcSU^}T^-B8w4ab07TurM44X6kVui-Pk1+rlM75e|zKfH8M`jLzs zUgv2@gM?(PIHoJTCvIh~;88+2csS}|hiab2<f;j}t?3)NznX!8Z2!!iUw<0?{odj$ zQ~pWjP2f&p5V9M%DhKd#8*OoGyp#3kB&RCjuMAc1jav=<y@Asjfa`M?u~<!d`(NF) z@YwC0p=OOz7URL7cjty9m9ya$#lGKzIgb-C{5Gx$fgZB8aNnuy(1;`_XLX(NS=WeL zNsyRu)>r)tAt5b}%U&VCzYWsJ64I)J>bgH90DG{8n8^7&2QjUE$dxQerisN=^11|K zsu6pnrctkmE}CL05EZa{&sf)8%3}|9EkBH7gC|tSEC8`y-O!DNTPwYT+V*SP(ol|N zv9Gh}?I=?Nv~(Ec;1N9*JF1V{gRJdRIS-`!>L{HfL<MtaK?D08e#Q%r0F&?^<QgPV zwhC=V7k0T5;8$k}hoGT_w%@wuUs2fxB|TQQN2ap2Cx8G|u#*3~OTwV$r7apC;|F6W zh^M~Mf&w|a#(B=$h`fMs%x$eSiZ9{Pxj>+@-2LC6lLlI+8$bhFo6Ui&*p(<zhBq<p zM5$?3GdFt8!Y6m0m+iH~2`Lt$ka?9)J*`$waP)B1GH179<@rxn8w-#mvwVdp;0)gv z=>el%AJpD*S=;c0;$_)i2&-u(P?ICy69=t~`{t5wiY^N17Me>?#@wz@s!WI5g`|zM zCenh^a1X{;I+5;huzIrIOxP(v3_W-p$kmEfDx7`;$%{EC^o+AJswhz5?#ZJ8yal9t zBKEyCq<g)=<KbPX`ZRkwPA&MD1A$C4ZOs70O*0xVMqfnJCbcQ!xyw_B1DrH3HBeE6 z$@|)rmr{oBj6St~ZuqC%o@R8Z30b-hghl}ueb@Nr`PKW7y9%ct-u?O9?IrakSpJT4 zEJKUaj@aV>QDppQ@-&0|wCgOA@v&n{zU_g{H`=xYU&)*)&iID+3M2~N?QT-ssBAkT z-}Pbhe<HQwvxQIQA6E~8r`@2BvcFYcJPN%zh<$6;$uL|XbUg$ObY`DLZU@1BeFY`$ zM***nPQbn&wNw1j<QMQKZ^ao_#XVjb$aV2g@Y>-A`j0WsfW+Z1vK83|YIlSz1_|T} zxpfe?hu@+y89tp3mpn^{Lmg{UjBwQ>s+WNYbbe#*B`P#2or*mQ<E6FTq>x?JkQP5* z06A@GJ)3T=)cRmhI;%XKVDljV&vWVO2{7RjV2E4%X*f-sv8Pg2<8;sQknSy$1uQLf ze%%P;--p+1)IfGz)@W5gwCU_R_~ApW3^mTU6Q8rh)82yo<}%H*=HbfWocayHfJ&pL z4`6kUbi)>^YXL`lrYmOst;j5aNwu^?GFFF98MDw}o_Sd-4q93_lDhCi58w>~kusD0 z02lToY+Z6({v|K=<;UzB=C2_cj-|V_(J9xO-RJ=I<IhBuC4_UB#&G>b*w(nh-1MW} z2LSh|ww*wKv(Y&O!sEDFwolflM%w!ev%B2)=k+kxvVYRG`nU?92C#6@qHpzfU;-%O zxz`C9V`%WNdHnx?FrRE`l4jmxx7;U>@()w+bsIo|^ag;uZ(|vVoluY#MNjYff`2F9 zFB@vRU&-sin+t#VO2PU<1lI9y2t0M*(^_`Ao>9*fGdJq1j{f@Za2wm}rzEhd629&3 zP*uFeV&?ijjsim_J9U8r!MN{6cH;gLaz}i9I;>z!&5ia~?Efc%2hE7}aV5f+3~(gk z1`x@~l>s}~z{g)a=$HMG=fIM5<7X1ETHW~kAH2*K4Q&sKakAV;>3K?(J@%c93}bJS zo4QIaC&1l4e_X}qXv4rkd0<&F9P>yazDZ@JtuG5$3D2F^0E=%x1`M$yvC1mt&b5M` zEhcqDnRXALq;fZ7cJ6Yu*(pxd5v!lOoMv3><s1~E_}In;QS*!!?O>GaxNLVo^g*Y8 z-8BJwO^T8=*tsA~m7n1!4BL+nPoDB}*(092<AbiCey>)#mdw#E;zigMu{+aKcQWS$ zZP!Off^^s^{l6RbV)72FM6|o}kJL6Jc8UVV!p~QedE)-ISl1(^YZXv22bMFL&{f$J zR~zNXSTRkXonGx;iD1i??!>1UTWUxh8bde%d9pZ?IfnoxnfQdAAJ8Mv*PudDRuhkT z0Xcn5P-F1Gxj_%N3<EZ^AlLE`V6;kj<Pq7JLWNlfP|uh^9C63^?`z&~&>5uEZ#s+F zom$pV*In9_)OWq06bq$;JxMw2>rK4H$e#!eZ;Esvt(4=AtbQg{Il)l0d70l{3U{Ng z`HDr?==JSSu6XvVp+u2RD2%R(3jf{Zil%tg6{UhHNlTr6Pwmw!BXvhGMCz>LE4Fc< zG+HPabJG+XQ`9hQY<|P~j^a(c2AkZRcNp;?>k$Dyac7<*`!i}^M-4Iz7~PB_!8pGu zFweE^p->fatKatS9$a~uqHn!b$&GqpI($?LMJ{`H#4o*~?v%6A|FFf>*%dRiJ<R&F zr@U!@ah_yR8A{wAHhhCuGZCFIoRX!WGu$)#f-#QP%VOWAtOX}tZ)%^Yg4H)^_+B$_ z=Zm>>Po4?-SK3)cBMI=8PmA^4{XzV=686Ulr;e!<>yl}=G}CB%#-dGe$%M^R={!&$ zxhFHB)e5E>mKMd|F77`~j_y`2tdmJ7OuoWFI%aQ2LV?k-R`4RowK9-8b-er-ZVwo6 zTYh<@2$wX(i9<(#;v)snXTfo8Zd)U^Q5)8?ckrHMCF->D6$2Bd70<iKY!1w1Cq`p= zri0obTDL7yGvCVN(8C&cuVWV#f4s>gMTA*8M(9~&6bed-lMM(H*L~2&jWJU(C+~2( zrh&{aVyeI}dOKl_`>i(r=Y9TXt;0h)frNb(nEW??mO@UkK$-sBltW^*<Ro+vFMZ;g zyf*WD!OHeh@R_S#=BHgbCQx3yLn`?3975jEJF~0D93!D1z0%)38m3d7Y7fseY*`xE zsjIMsNu2gr?igm8RPN@gq8cjndsyx)mLwd_J8I!wwy)CEl_vOO5Ujt_A^II%?;3n& zr(ZI>Hu=f%2Pu8*w34+k6SaL0{KWDFs4DbnMcr7zr$MO(af;@Kl|1*51`B5`#d-O$ zpPI+uVhY#HZsCnY@~S}|6+V$L-8yPn9#Wg8a9N8YF9?5Y{ZV_{^JsN@AYeoIcuu7e z^zMRU8Ts5LJI$*NC!LPDUcSDLlHH0MWPta(YCb)o7yzgu!-S)QtA=PKbQeDsHXZK9 zYwQjJTbi~w<>fP2*L#8xnvY%v2;s6jQgaPNL8E9P;3X%d1v@z3Cv9cv%LQJjtM4iZ z#Om}g2lqI~#c&0-1j?EpW1rUYTH#wDH=<I%SgW|feB#b{G$A{%HsnIqO6#Glbc{w) zYd<&b4C_c{K60$iDM<cR?vWISl&EWj2N~^xM2sccvQp&kerVohx8G(yWVsBL*MJzw ztQ#?42YL2JG+>{tJJUQIT)_K^?NnWs%bu|6Dhx_j?CddN?PYNa)rB{RTFz`XU!$W@ zP}U)uD7=8ksFgi@r_EJoYY=nW#R6DR5gm-KN7NXkbW|f#o&+_|yXT(%S!r!IDmMq@ zS6H(4JWV7Mf?Ss|F9(ZcpV%<RN9uViZGYOZZ8%uR={GeoS0Gwt_cUfvCrGwuXEi!u z+sYR}10`Sqq>d98Mu0E7jUhv|RxNyvW^|V13W*mP+GY0Ke8m%DYTqInftT1LMpf9X zv6{|{Q%hJDpD4BPkwq%x;x|u4Wj(MMi0GhzL8ts{^NIANw$Tz11$#YC?)h=X_D@$- ziQ1-}%{7g;pO4JfhB)FM)euWq2C1bsy_4?_WwIPnjEi_~XY?y{^;zTD=%|ZSFUDfY zvp^@-N;}{fbwn5OikEA{+}<G6bu4qn?p;$ubGCL2kKbDC{f&67d9z@PrhuDWJVEss zDpE#WFN6}2DKDsXs@+|24)DCkrl<G0Bs}dZanK_dC<ky*Pq1W`maF{XwWmVw@))Z% zWZbjhjAeKCJznW>@KI^vputz|k8-XLDt>v*+COy&B;YPyaCgjdsU5c%mT3SvXFu*b z)C?m%@JmSe;Dwz2{O4Gz1K5lSI-Ye>Ir<PeUA`H^0NLoS8o89L`S!yJfk=`$l=K3o zswTG6rldhj4s2o9bOWn`pjXA2i!k$yw#UJZQ<{|MFr$D+wP%r<Q?^%mR{7^F7!zS^ z;OJQN!%}>Qi&)Apj}F@O*WT2zZ?iB5O{M+H=z2~F2c#EquU-2o+t?<gF-b}xY54qM z=tqNRCGjoF$@&WHUJur9L<ea8Shm;O5<Sk?QG0Tnb``XvaxE%a0{eYA+}BT>G^YIU zhMFJkE!7OaxfkP`6wciqF-fviF%aoyRf>kf8HQ;`Iu=8lNLYkp^+QLzA#8{|tI@Hx zbIaijL22oS1|JHnM$L~%mF^DWa^wBmMPWPwb!_eB;^Br(lQ_wED2?Pj|1^}1^tu|{ zc=^4VKl?$(?~CyMwt=_O2q~2GOWdG9Gtxf)QZzR5EVhL&9C{UMV0iS8qkO{YHk*ib z9?NhG0qKM**1_#z9wPW+*ezRakr?E$fTK`jLMM)fGuD0lK+-x81tpEObX}bKjdLOp z(!jB7TXoE~>fzS!>0#By28-)dYa>d*`fdW^fy1Wv-)z2Fo?W+7Kje1hgpH5#L49r0 zKJ@CJ*G!!ny!;a-+(pLZ9IU?rF0a-R#1BDvf$M=J+mG7JB+FWS{;Bws^fyJG_WUV+ zISt{EkrkADZ}Wuq9Uv>ZWe~BdqjQd!v0b+|{_KF3Zt{d=ExM6s0*x|vb%~#KsD5~? zYOWqBtIO4``IRkt5@0?yn3zH3{6=3*S{7?<7HHSRAo?{RnSKIM@<cXN{EJ7tUPmj= z4;|(F)`VUAmU^;&&b#rc)o3?$^sl6Q18?;qs|$G9%Jdyc_d9LpoIdUByc&g8flb(o zTyyf=adYsEtpFc$;AZF4>8SBvo+&!@TQuGsSrJXxu!n(geLpU9*qK^nl0iC5@NYip zwxHtawMrt3fZ&~9TgeU1<?^sULmua`eTmToVWANwj~S+$XNg`N5uwdnyo-3;(EgUd zFf&>V2AKB+rmy_G;<)*vzVk%J1PNgsu2*K_f6{v3k7#yy;p2GEmcdR*$$*<kg_oV; zl@=xyY4da8XNI+TK`?LEkdR*gd!e}v9;(0UGpW&c2R>Wy;&2@aFW(xbZ5eh!$ycd7 zsKTRKC(Of~@E#)Q@J|^o+z0HiLx-4iNm{wB*}VIKD35(>%!&OjjmXt1%T){indPp6 z9P*&n1A&sbqZuqFq*qnwC!<7J$)f%rL`WH_Cz2T0yep|@re%9Yt!qt*2g8sXs#kXA zN@{t*k(fnRyadABWox<MV-DT28(Jo@iCHKq8$TYkWSU4#n7gny{o+i>MYY<;;p+~o zw-(x|6!b+V=-fW91DdNZ7QEv=SGg|FlzwD#wz4zt4K(7985(`QO5r7p0>SL?x3Wzu z*@-#cQ`b4&*A@9YpyNl?=f_xQxU0%N!mxD5sTw>VvZR5HqYKpF^0?AP4cFJ{ujHQZ zpXi#q(iubxa9-wDo6GMJ-#a_Jy=3jOVOh}Vq)z{5_s*dr_yGRH@}trsO-VZ??UYY* zzXdA)X_L|}ROe_yDFPz0<1KorCY<G^8HT963X<2|7IZp8lF*(oV5lQ1V?OH;8-iQW zr_&c3NIbVp%t5sd`R^voyx!iet1!A;UCvG^U1MS~QKOTpezK>5waNp#+C^Txpr1#I z%myfRbB*{0>4iVi!kkl`YRT<3bdz)fW;U5mK@sx?_3158FYh$>45kT152qc!nk9=n ztyty)D(n?`NoJhvM_+};UeMQg(svTRe&g)@Upf?Rix*l<#R%<K(V2s|QtsM4+PT4; zEc!LZUB}N)FBq&kX(ie7p2EiTbJ*nJEbniwTvpVb^(V&evpty#<S+{<1CDVSZY9Jn z=$1-^VIQp^riU@XVlAx;3bN7<K*;yg@O1ZtzPZT~&PZ;M@Nr9R+MwnDvj%Ox^w83^ z_ww0((`0NyL(7$;{*Nl1`LB_zqlfYA3t96|;G-4&XGiNoM=GAFmyK1t(f5jQj86$p z#73D<s#4-pUW6CtG*l=-IXf8VN?Qu6U`47ZlD<2$YLKR0Pyt~)KIPJqOfkIIjz`Vu zoEg?oaRE&Ja^c(g3#=6rp)<H-pZ}%!bTdRv^C@@FxqXa@3$Fbc?ItcRst3s`y1@Pg zv9enVSkHIn{B6sHr9p{bI@GT!YbQi5jx&-cHKZRj(q8rE625bJBCmc62z;e8<m7ZO zfJvki^P8?c{plug7}$9F{Qk})kog{ui6|EvonPK|B=XyP;Qia=MzTJ$1V+eW50!KB z48guc_A^#r@}QN&a@&FM2B-ce-<_60-c-ChJ(&2%?3uk370__lL>pqAfiObI)>uS{ zxDpZ|otu~H*VO-7%z3wXSWi8FJ%T59Q|xSg^72m0(F^gTE`H5H&=LFQ3NQNQ&81j( zx_v}xPL>|BxXV^#m^>J?iy(P@ApFkBm<p@af!db-SRs)U*s_ocoR5?6+=wCZVs_UG pO(vNvhDfdkZWLmbQveROO5zEW8Km))ZOz6n&{Os&D^6Ux{U2fQUSj|N diff --git a/docs/source/Plugin/P131_TextPrintModeOptions.png b/docs/source/Plugin/P131_TextPrintModeOptions.png index cbfd4c7b1416b8d3a0fdca4a040778a8ed176e04..95599714a9a45ef37ea42d01e71ef1e0d117184c 100644 GIT binary patch literal 18532 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 SRY9Nt0000<MNUMnLSTX})M~u| literal 19653 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 diff --git a/docs/source/Plugin/P131_commands.repl b/docs/source/Plugin/P131_commands.repl index 104a360b9..841236ba4 100644 --- a/docs/source/Plugin/P131_commands.repl +++ b/docs/source/Plugin/P131_commands.repl @@ -24,3 +24,37 @@ | The maximum brightness allowed is determined by the Maximum allowed brightness setting. " + " + | ``neomatrixcmd,settext,<line>,<text>`` + "," + | Set the text for a specific line of the matrix. When Scroll is enabled for that line, the text will be scrolled as configured. + " + " + | ``neomatrixcmd,setscroll,<line>,<0|1>`` + "," + | Set scrolling off or on for the text of a specific line of the matrix. When Scroll is enabled the text will be scrolled if it doesn't fit on the display. + " + " + | ``neomatrixcmd,setempty,<line>,<0|1>`` + "," + | Set scrolling with empty start off or on for the text of a specific line of the matrix. + " + " + | ``neomatrixcmd,setright,<line>,<0|1>`` + "," + | Set scrolling to right off or on for the text of a specific line of the matrix. + " + " + | ``neomatrixcmd,setstep,<line>,<1..16>`` + "," + | Set the scroll step size for a line. Range is from 1 .. 16 pixels. + " + " + | ``neomatrixcmd,setspeed,<line>,<1..600>`` + "," + | Set the scroll speed for a line. Range is from 1 .. 600 x 0.1 second (0.1 .. 1 minute/step). + " + " + | NB: The settings changed via ``neomatrixcmd,set*...`` commands will **not** be reflected in the device configuration! + "," + " diff --git a/docs/source/Plugin/_plugin_substitutions_p13x.repl b/docs/source/Plugin/_plugin_substitutions_p13x.repl index a2060f468..01441249f 100644 --- a/docs/source/Plugin/_plugin_substitutions_p13x.repl +++ b/docs/source/Plugin/_plugin_substitutions_p13x.repl @@ -2,7 +2,7 @@ .. |P131_type| replace:: :cyan:`Display` .. |P131_typename| replace:: :cyan:`Display - NeoPixel Matrix` .. |P131_porttype| replace:: `.` -.. |P131_status| replace:: :yellow:`DISPLAY, NEOPIXEL` +.. |P131_status| replace:: :yellow:`NEOPIXEL` .. |P131_github| replace:: P131_NeoPixelMatrix.ino .. _P131_github: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P131_NeoPixelMatrix.ino .. |P131_usedby| replace:: `.` diff --git a/src/_P131_NeoPixelMatrix.ino b/src/_P131_NeoPixelMatrix.ino index 2a3d91552..7abf47335 100644 --- a/src/_P131_NeoPixelMatrix.ino +++ b/src/_P131_NeoPixelMatrix.ino @@ -7,6 +7,10 @@ // ####################################################################################################### /** Changelog: + * 2022-07-30 tonhuisman: Add commands to set scroll-options (settext, setscroll, setstep, setspeed, setempty, setright) + * Fix issue that on startup the display wasn't cleared (unit reset should turn off the display) + * Changed initial Text print mode to 'Truncate exceeding message' to enable Scroll mode + * Removed Testing tag from the plugin name. It has been tested and proven stable. * 2022-07-15 tonhuisman: Implement horizontal scrolling (left/right, opt. empty start) for predefined content * 2022-07-11 tonhuisman: Fix Clear on Exit issue * 2022-06-13 tonhuisman: Improved Splash handling, non-blocking delay, default 3 seconds @@ -23,7 +27,7 @@ # define PLUGIN_131 # define PLUGIN_ID_131 131 -# define PLUGIN_NAME_131 "Display - NeoPixel Matrix [TESTING]" +# define PLUGIN_NAME_131 "Display - NeoPixel Matrix" # include "./src/PluginStructs/P131_data_struct.h" @@ -67,6 +71,8 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) NEO_MATRIX_TOP | NEO_MATRIX_LEFT | NEO_MATRIX_ROWS | NEO_MATRIX_PROGRESSIVE | NEO_TILE_TOP | NEO_TILE_LEFT | NEO_TILE_ROWS | NEO_TILE_PROGRESSIVE); + set4BitToUL(P131_CONFIG_FLAGS, P131_CONFIG_FLAG_MODE, static_cast<int>(AdaGFXTextPrintMode::TruncateExceedingMessage)); + set8BitToUL(P131_CONFIG_FLAGS_B, P131_CONFIG_FLAG_B_BRIGHTNESS, 40); // Default brightness set8BitToUL(P131_CONFIG_FLAGS_B, P131_CONFIG_FLAG_B_MAXBRIGHT, 255); // Default max brightness @@ -240,7 +246,7 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) # endif // ifdef ENABLE_TOOLTIPS ); html_TD(); // Pixels per step, offset with -1 - addNumericBox(getPluginCustomArgName(varNr + 400), get4BitFromUL(optBits, P131_OPTBITS_SCROLLSTEP) + 1, 1, 16 + addNumericBox(getPluginCustomArgName(varNr + 400), get4BitFromUL(optBits, P131_OPTBITS_SCROLLSTEP) + 1, 1, P131_MAX_SCROLL_STEPS # ifdef ENABLE_TOOLTIPS , EMPTY_STRING, F("Scroll 1..16 pixels / step") # endif // ifdef ENABLE_TOOLTIPS @@ -252,7 +258,7 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) if (scrollSpeed == 0) { scrollSpeed = 10; } html_TD(); // Speed 0.1 seconds per step - addNumericBox(getPluginCustomArgName(varNr + 500), scrollSpeed, 1, 600 + addNumericBox(getPluginCustomArgName(varNr + 500), scrollSpeed, 1, P131_MAX_SCROLL_SPEED # ifdef ENABLE_TOOLTIPS , EMPTY_STRING, F("Scroll-speed in 0.1 seconds / step") # endif // ifdef ENABLE_TOOLTIPS diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp index 3b286cc51..06823b677 100644 --- a/src/src/PluginStructs/P131_data_struct.cpp +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -119,6 +119,7 @@ bool P131_data_struct::plugin_init(struct EventStruct *event) { gfxHelper->setRotation(_rotation); matrix->setBrightness(std::min(_maxbright, _brightness)); // Set brightness, so we don't get blinded by the light matrix->fillScreen(_bgcolor); // fill screen with black color + matrix->show(); // Update the display # ifdef P131_SHOW_SPLASH @@ -209,22 +210,32 @@ void P131_data_struct::loadContent(struct EventStruct *event) { for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { content[x] = P131_content_struct(); - String opts = parseString(strings[x], 2); - uint32_t optBits = 0; - validUIntFromString(opts, optBits); - content[x].active = bitRead(optBits, P131_OPTBITS_SCROLL); - content[x].rightScroll = bitRead(optBits, P131_OPTBITS_RIGHTSCROLL); - content[x].startBlank = bitRead(optBits, P131_OPTBITS_STARTBLANK) == 0; // Inverted - content[x].stepWidth = get4BitFromUL(optBits, P131_OPTBITS_SCROLLSTEP) + 1; // Add offset once - opts = parseString(strings[x], 3); - int speed = 0; - validIntFromString(opts, speed); - content[x].speed = speed; + initialize_content(event, x); } contentInitialized = true; } } +/**************************************************************************** + * initialize_content: set the content[x] flags from arguments provided + ***************************************************************************/ +void P131_data_struct::initialize_content(struct EventStruct *event, + uint8_t x) { + String opts = parseString(strings[x], 2); + uint32_t optBits = 0; + + validUIntFromString(opts, optBits); + content[x].active = bitRead(optBits, P131_OPTBITS_SCROLL); + content[x].rightScroll = bitRead(optBits, P131_OPTBITS_RIGHTSCROLL); + content[x].startBlank = bitRead(optBits, P131_OPTBITS_STARTBLANK) == 0; // Inverted + content[x].stepWidth = get4BitFromUL(optBits, P131_OPTBITS_SCROLLSTEP) + 1; // Add offset once + opts = parseString(strings[x], 3); + int speed = 0; + + validIntFromString(opts, speed); + content[x].speed = speed; +} + /**************************************************************************** * plugin_read: Re-draw the default content ***************************************************************************/ @@ -250,13 +261,22 @@ bool P131_data_struct::plugin_read(struct EventStruct *event) { * display_content: Re-display the text, and apply any scrolling offset ***************************************************************************/ void P131_data_struct::display_content(struct EventStruct *event, - bool scrollOnly) { + bool scrollOnly, + uint8_t line) { if (isInitialized() && (nullptr != gfxHelper)) { int16_t yPos = 0; bool useVal = gfxHelper->getValidation(); gfxHelper->setValidation(false); // Ignore validation to enable scrolling - for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { + uint8_t x = 0; + uint8_t x_end = P131_CONFIG_TILE_HEIGHT; + + if (line != 255) { + x = line; + x_end = line + 1; + } + + for (; x < x_end; x++) { if (!scrollOnly || (scrollOnly && content[x].active)) { String tmpString = parseStringKeepCase(strings[x], 1); @@ -350,21 +370,93 @@ bool P131_data_struct::plugin_write(struct EventStruct *event, const String& str const String cmd = parseString(string, 1); if ((nullptr != matrix) && cmd.equals(_commandTriggerCmd)) { - String sub = parseString(string, 2); + String sub = parseString(string, 2); + int16_t x = event->Par2 - 1; success = true; if (sub.equals(F("clear"))) { matrix->fillScreen(_bgcolor); - } - else if (sub.startsWith(F("bright")) && (event->Par2 >= 0) && (event->Par2 <= 255)) { + } else if (sub.startsWith(F("bright")) && (event->Par2 >= 0) && (event->Par2 <= 255)) { if (parseString(string, 3).isEmpty()) { // No argument, then matrix->setBrightness(std::min(_maxbright, _brightness)); // use initial brightness } else { matrix->setBrightness(std::min(_maxbright, static_cast<uint8_t>(event->Par2))); } + } else if (sub.equals(F("settext")) + && ((event->Par2 > 0) && (event->Par2 <= P131_CONFIG_TILE_HEIGHT))) { // line + String tmpString = parseStringToEnd(strings[x], 2); // settings to be transferred + strings[x] = wrapWithQuotesIfContainsParameterSeparatorChar(parseStringToEndKeepCase(string, 4)); + strings[x] += ','; + strings[x] += tmpString; + } else if ((sub.equals(F("setscroll")) || // neomatrixcmd,setscroll,<line>,0|1 + sub.equals(F("setempty")) || // neomatrixcmd,setempty,<line>,0|1 + sub.equals(F("setright")) // neomatrixcmd,setright,<line>,0|1 + ) + && ((event->Par2 > 0) && (event->Par2 <= P131_CONFIG_TILE_HEIGHT)) // line + && ((event->Par3 >= 0) && (event->Par3 <= 1))) { // on/off + String tmpString1 = parseStringKeepCase(strings[x], 1); // settings to be transferred + String tmpString3 = parseString(strings[x], 3); // settings to be transferred + String opts = parseString(strings[x], 2); + uint32_t optBits = 0; + + validUIntFromString(opts, optBits); + + if (sub[3] == 's') { // setscroll + bitWrite(optBits, P131_OPTBITS_SCROLL, event->Par3 == 1); + } else if (sub[3] == 'e') { // setempty + bitWrite(optBits, P131_OPTBITS_STARTBLANK, event->Par3 == 0); // Inverted value + } else if (sub[3] == 'r') { // setright + bitWrite(optBits, P131_OPTBITS_RIGHTSCROLL, event->Par3 == 1); + } + strings[x] = wrapWithQuotesIfContainsParameterSeparatorChar(tmpString1); + strings[x] += ','; + strings[x] += optBits; + strings[x] += ','; + strings[x] += tmpString3; + } else if (sub.equals(F("setstep")) // neomatrixcmd,setstep,<line>,1..16 + && ((event->Par2 > 0) && (event->Par2 <= P131_CONFIG_TILE_HEIGHT)) // line + && ((event->Par3 > 0) && (event->Par3 <= P131_MAX_SCROLL_STEPS))) { // 1..16 + String tmpString1 = parseStringKeepCase(strings[x], 1); // settings to be transferred + String tmpString3 = parseString(strings[x], 3); // settings to be transferred + String opts = parseString(strings[x], 2); + uint32_t optBits = 0; + + validUIntFromString(opts, optBits); + set4BitToUL(optBits, P131_OPTBITS_SCROLLSTEP, event->Par3 - 1); // Use offset of -1 + strings[x] = wrapWithQuotesIfContainsParameterSeparatorChar(tmpString1); + strings[x] += ','; + strings[x] += optBits; + strings[x] += ','; + strings[x] += tmpString3; + } else if (sub.equals(F("setspeed")) // neomatrixcmd,setspeed,<line>,1..600 + && ((event->Par2 > 0) && (event->Par2 <= P131_CONFIG_TILE_HEIGHT)) // line + && ((event->Par3 > 0) && (event->Par3 <= P131_MAX_SCROLL_SPEED))) { // 1..600 + String tmpString1 = parseStringKeepCase(strings[x], 1); // settings to be transferred + String tmpString2 = parseString(strings[x], 2); // settings to be transferred + strings[x] = wrapWithQuotesIfContainsParameterSeparatorChar(tmpString1); + strings[x] += ','; + strings[x] += tmpString2; + strings[x] += ','; + strings[x] += event->Par3; } else { success = false; } + + if (success && sub.startsWith(F("set"))) { + initialize_content(event, x); // Set up line parameters + content[x].loop = -1; // Restart loop + display_content(event, false, x); // (re-)display line + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + String log = F("NEOMATRIX: set line "); + log += event->Par2; + log += F(": "); + log += strings[x]; + addLogMove(LOG_LEVEL_INFO, log); + } + # endif // ifndef BUILD_NO_DEBUG + } } else if (matrix && (cmd.equals(_commandTrigger) || (gfxHelper && gfxHelper->isAdaGFXTrigger(cmd)))) { @@ -419,7 +511,7 @@ bool P131_data_struct::plugin_ten_per_second(struct EventStruct *event) { success = true; for (uint8_t x = 0; x < P131_CONFIG_TILE_HEIGHT; x++) { - if (content[x].active && content[x].length > _xpix) { + if (content[x].active && (content[x].length > _xpix)) { if (content[x].loop == -1) { content[x].loop = content[x].speed; } // Initialize if (!content[x].loop--) { diff --git a/src/src/PluginStructs/P131_data_struct.h b/src/src/PluginStructs/P131_data_struct.h index ce5a0aa76..e2a117207 100644 --- a/src/src/PluginStructs/P131_data_struct.h +++ b/src/src/PluginStructs/P131_data_struct.h @@ -27,6 +27,9 @@ # define P131_CONFIG_FLAGS_B PCONFIG_ULONG(1) # define P131_CONFIG_COLORS PCONFIG_ULONG(3) // 2 Colors fit in 1 long +# define P131_MAX_SCROLL_STEPS 16 // Max. stepsize +# define P131_MAX_SCROLL_SPEED 600 // Max. speed + # define P131_FLAGS_MATRIX_TYPE 0 // MatrixType flags # define P131_FLAGS_MATRIX_TYPE_TOP 0 // MatrixType flags Top/Bottom/Left/Right # define P131_FLAGS_MATRIX_TYPE_RC 2 // MatrixType Row/Col @@ -124,8 +127,11 @@ private: void updateFontMetrics(); void cleanup(); void display_content(struct EventStruct *event, - bool scrollOnly = false); + bool scrollOnly = false, + uint8_t line = 255); void loadContent(struct EventStruct *event); + void initialize_content(struct EventStruct *event, + uint8_t x); Adafruit_NeoMatrix *matrix = nullptr; AdafruitGFX_helper *gfxHelper = nullptr; From 558c0f83c657ac20bc363f90717a92606a0eb9a1 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 30 Jul 2022 21:12:24 +0200 Subject: [PATCH 66/89] [P129] Remove testing tag, update ENABLE_TOOLTIPS to FEATURE_TOOLTIPS --- src/_P129_74HC165.ino | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/_P129_74HC165.ino b/src/_P129_74HC165.ino index 7ad78d3f8..f7e0728c1 100644 --- a/src/_P129_74HC165.ino +++ b/src/_P129_74HC165.ino @@ -7,6 +7,7 @@ // ####################################################################################################### /** Changelog: + * 2022-07-30 tonhuisman: Remove Testing tag from plugin name. * 2022-06-12 tonhuisman: Optimizations and small fixes. Implement use of PCONFIG_ULONG() * 2022-02-25 tonhuisman: Rename command to ShiftIn,<subcommand>,<arg>... * 2022-02-23 tonhuisman: Add command handling. @@ -28,7 +29,7 @@ # define PLUGIN_129 # define PLUGIN_ID_129 129 -# define PLUGIN_NAME_129 "Input - Shift registers (74HC165) [TESTING]" +# define PLUGIN_NAME_129 "Input - Shift registers (74HC165)" # define PLUGIN_VALUENAME1_129 "State_A" # define PLUGIN_VALUENAME2_129 "State_B" # define PLUGIN_VALUENAME3_129 "State_C" @@ -221,19 +222,19 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) for (uint8_t j = 0; j < 8; j++) { html_TD(); - # ifdef ENABLE_TOOLTIPS + # ifdef FEATURE_TOOLTIPS String toolTip = F("Chip "); toolTip += (i + 1); toolTip += F(" port D"); toolTip += (7 - j); toolTip += F(", pin "); toolTip += i * 8 + (8 - j); - # endif // ifdef ENABLE_TOOLTIPS + # endif // ifdef FEATURE_TOOLTIPS addCheckBox(getPluginCustomArgName((i * 8 + (7 - j)) + 1), bitRead(bits, off * 8 + (7 - j)) - # ifdef ENABLE_TOOLTIPS + # ifdef FEATURE_TOOLTIPS , false // = not Disabled , toolTip - # endif // ifdef ENABLE_TOOLTIPS + # endif // ifdef FEATURE_TOOLTIPS ); } off++; From 8a6ba9cb3823508c533cee0661aea97cbc7c80ab Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 30 Jul 2022 21:13:25 +0200 Subject: [PATCH 67/89] [P131] Update ENABLE_TOOLTIPS to FEATURE_TOOLTIPS --- src/_P131_NeoPixelMatrix.ino | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/_P131_NeoPixelMatrix.ino b/src/_P131_NeoPixelMatrix.ino index 7abf47335..9ae200456 100644 --- a/src/_P131_NeoPixelMatrix.ino +++ b/src/_P131_NeoPixelMatrix.ino @@ -229,27 +229,27 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) html_TD(); // Scroll addCheckBox(getPluginCustomArgName(varNr + 100), bitRead(optBits, P131_OPTBITS_SCROLL) == 1, false - # ifdef ENABLE_TOOLTIPS + # ifdef FEATURE_TOOLTIPS , F("Scroll text") - # endif // ifdef ENABLE_TOOLTIPS + # endif // ifdef FEATURE_TOOLTIPS ); html_TD(); // Start with empty display, inverted setting addCheckBox(getPluginCustomArgName(varNr + 200), bitRead(optBits, P131_OPTBITS_STARTBLANK) == 0, false - # ifdef ENABLE_TOOLTIPS + # ifdef FEATURE_TOOLTIPS , F("Start and end scroll with empty display") - # endif // ifdef ENABLE_TOOLTIPS + # endif // ifdef FEATURE_TOOLTIPS ); html_TD(); // Scroll from right addCheckBox(getPluginCustomArgName(varNr + 300), bitRead(optBits, P131_OPTBITS_RIGHTSCROLL) == 1, false - # ifdef ENABLE_TOOLTIPS + # ifdef FEATURE_TOOLTIPS , F("Scroll from left to right") - # endif // ifdef ENABLE_TOOLTIPS + # endif // ifdef FEATURE_TOOLTIPS ); html_TD(); // Pixels per step, offset with -1 addNumericBox(getPluginCustomArgName(varNr + 400), get4BitFromUL(optBits, P131_OPTBITS_SCROLLSTEP) + 1, 1, P131_MAX_SCROLL_STEPS - # ifdef ENABLE_TOOLTIPS + # ifdef FEATURE_TOOLTIPS , EMPTY_STRING, F("Scroll 1..16 pixels / step") - # endif // ifdef ENABLE_TOOLTIPS + # endif // ifdef FEATURE_TOOLTIPS ); opts = parseString(strings[varNr], 3); @@ -259,9 +259,9 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) if (scrollSpeed == 0) { scrollSpeed = 10; } html_TD(); // Speed 0.1 seconds per step addNumericBox(getPluginCustomArgName(varNr + 500), scrollSpeed, 1, P131_MAX_SCROLL_SPEED - # ifdef ENABLE_TOOLTIPS + # ifdef FEATURE_TOOLTIPS , EMPTY_STRING, F("Scroll-speed in 0.1 seconds / step") - # endif // ifdef ENABLE_TOOLTIPS + # endif // ifdef FEATURE_TOOLTIPS ); remain -= (strings[varNr].length() + 1); From c99de48f35100732cf8bf73b52fbf5b1dd3fb05b Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 30 Jul 2022 22:38:08 +0200 Subject: [PATCH 68/89] [P129] Update ENABLE_TOOLTIPS to FEATURE_TOOLTIPS --- src/_P129_74HC165.ino | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/_P129_74HC165.ino b/src/_P129_74HC165.ino index f7e0728c1..36e25f2fb 100644 --- a/src/_P129_74HC165.ino +++ b/src/_P129_74HC165.ino @@ -222,19 +222,19 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) for (uint8_t j = 0; j < 8; j++) { html_TD(); - # ifdef FEATURE_TOOLTIPS + # if FEATURE_TOOLTIPS String toolTip = F("Chip "); toolTip += (i + 1); toolTip += F(" port D"); toolTip += (7 - j); toolTip += F(", pin "); toolTip += i * 8 + (8 - j); - # endif // ifdef FEATURE_TOOLTIPS - addCheckBox(getPluginCustomArgName((i * 8 + (7 - j)) + 1), bitRead(bits, off * 8 + (7 - j)) - # ifdef FEATURE_TOOLTIPS + # endif // if FEATURE_TOOLTIPS + addCheckBox(getPluginCustomArgName((i * 8 + (7 - j)) + 1), bitRead(bits, off * 8 + (7 - j)) == 1 + # if FEATURE_TOOLTIPS , false // = not Disabled , toolTip - # endif // ifdef FEATURE_TOOLTIPS + # endif // if FEATURE_TOOLTIPS ); } off++; From c1030c785ca030dbc5dae9f4eb6418fc1f3223d1 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sat, 30 Jul 2022 22:42:41 +0200 Subject: [PATCH 69/89] [P131] Update ENABLE_TOOLTIPS to FEATURE_TOOLTIPS --- src/_P131_NeoPixelMatrix.ino | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/_P131_NeoPixelMatrix.ino b/src/_P131_NeoPixelMatrix.ino index 9ae200456..636e6f0b8 100644 --- a/src/_P131_NeoPixelMatrix.ino +++ b/src/_P131_NeoPixelMatrix.ino @@ -229,27 +229,27 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) html_TD(); // Scroll addCheckBox(getPluginCustomArgName(varNr + 100), bitRead(optBits, P131_OPTBITS_SCROLL) == 1, false - # ifdef FEATURE_TOOLTIPS + # if FEATURE_TOOLTIPS , F("Scroll text") - # endif // ifdef FEATURE_TOOLTIPS + # endif // if FEATURE_TOOLTIPS ); html_TD(); // Start with empty display, inverted setting addCheckBox(getPluginCustomArgName(varNr + 200), bitRead(optBits, P131_OPTBITS_STARTBLANK) == 0, false - # ifdef FEATURE_TOOLTIPS + # if FEATURE_TOOLTIPS , F("Start and end scroll with empty display") - # endif // ifdef FEATURE_TOOLTIPS + # endif // if FEATURE_TOOLTIPS ); html_TD(); // Scroll from right addCheckBox(getPluginCustomArgName(varNr + 300), bitRead(optBits, P131_OPTBITS_RIGHTSCROLL) == 1, false - # ifdef FEATURE_TOOLTIPS + # if FEATURE_TOOLTIPS , F("Scroll from left to right") - # endif // ifdef FEATURE_TOOLTIPS + # endif // if FEATURE_TOOLTIPS ); html_TD(); // Pixels per step, offset with -1 addNumericBox(getPluginCustomArgName(varNr + 400), get4BitFromUL(optBits, P131_OPTBITS_SCROLLSTEP) + 1, 1, P131_MAX_SCROLL_STEPS - # ifdef FEATURE_TOOLTIPS + # if FEATURE_TOOLTIPS , EMPTY_STRING, F("Scroll 1..16 pixels / step") - # endif // ifdef FEATURE_TOOLTIPS + # endif // if FEATURE_TOOLTIPS ); opts = parseString(strings[varNr], 3); @@ -259,9 +259,9 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) if (scrollSpeed == 0) { scrollSpeed = 10; } html_TD(); // Speed 0.1 seconds per step addNumericBox(getPluginCustomArgName(varNr + 500), scrollSpeed, 1, P131_MAX_SCROLL_SPEED - # ifdef FEATURE_TOOLTIPS + # if FEATURE_TOOLTIPS , EMPTY_STRING, F("Scroll-speed in 0.1 seconds / step") - # endif // ifdef FEATURE_TOOLTIPS + # endif // if FEATURE_TOOLTIPS ); remain -= (strings[varNr].length() + 1); From 8219bef010447f96dcd343057590da5f2d90d181 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Fri, 5 Aug 2022 17:08:32 +0200 Subject: [PATCH 70/89] [P129] Fix a bug, improve code and documentation --- docs/source/Plugin/P129.rst | 26 +++++++---- .../Plugin/P129_DeviceConfiguration.png | Bin 67216 -> 64302 bytes docs/source/Plugin/P129_commands.repl | 2 +- docs/source/Plugin/P129_events.repl | 43 ++++++++++++++++++ docs/source/Reference/Command.rst | 5 ++ docs/source/Reference/Events.rst | 5 ++ src/_P129_74HC165.ino | 37 ++++++++++----- src/src/PluginStructs/P129_data_struct.cpp | 19 ++++---- src/src/PluginStructs/P129_data_struct.h | 1 - 9 files changed, 106 insertions(+), 32 deletions(-) create mode 100644 docs/source/Plugin/P129_events.repl diff --git a/docs/source/Plugin/P129.rst b/docs/source/Plugin/P129.rst index 9494ea543..8cd6aca94 100644 --- a/docs/source/Plugin/P129.rst +++ b/docs/source/Plugin/P129.rst @@ -24,7 +24,7 @@ Used libraries: |P129_usedlibraries| Description ----------- -The 74HC165 Shift registers can be used to connect many input pins to an ESP using only 4 GPIO pins, as these shift registers can easily be daisy chained. +The 74HC165 Shift registers can be used to connect many input pins to an ESP using only 3 or 4 GPIO pins, as these shift registers can easily be daisy chained. When connecting many shift registers daisy-chained, it is important to ensure that not *too* many are connected to a single GPIO output pin, as that could overload that pin. It is advised to use a buffer chip for all used GPIOs for every 4 to 5 shift registers. When using a Schmitt-trigger buffer, it will also clean up the signal further down the line. Any buffer will introduce a small delay in the signal, possibly reducing the number of shift registers that can be controlled. A few useful answers are in this `Stack Exchange question`_ (issue is similar for input and output shift registers) @@ -36,22 +36,22 @@ Configuration .. image:: P129_DeviceConfiguration.png :alt: Device configuration -* **Name** A unique name should be entered here. +* **Name**: A unique name should be entered here. -* **Enabled** The device can be disabled or enabled. When not enabled the device should not use any resources. +* **Enabled**: The device can be disabled or enabled. When not enabled the device should not use any resources. Actuator ^^^^^^^^ -* **GPIO -> Data pin (Q7)**: Select the GPIO pin that is connected to the Data out pin of the (first) shift register. Any daisy chained register has its ``DS`` pin connected to the ``Q7`` pin of the previous shift register. +* **GPIO -> Data (Q7)**: Select the GPIO pin that is connected to the Data out pin of the (first) shift register. Any daisy chained register has its ``DS`` pin connected to the ``Q7`` pin of the previous shift register. -* **GPIO -> Clock pin (CP)**: Select the Clock pin of all shift registers. +* **GPIO -> Clock (CP)**: Select the Clock pin of all shift registers. -* **GPIO -> Enable pin (EN)**: Select the Enable pin of all shift registers. +* **GPIO -> Enable (EN) (optional)**: Select the Enable pin of all shift registers, or set to None if not used or not available. -* **GPIO -> Load pin (PL)**: Select the Load pin of all shift registers. +* **GPIO -> Load (PL)**: Select the Load pin of all shift registers. -NB: All 4 pins need to be configured or the plugin will not start. +NB: At least **Data**, **Clock** and **Load** GPIO pins need to be configured for the plugin to be able to function as intended. Device configuration ^^^^^^^^^^^^^^^^^^^^ @@ -90,7 +90,7 @@ These are the available options: .. image:: P129_OutputOptions.png :alt: Output selection options -If ``Decimal & hex/bin`` is selected, the value is output twice, formatted as decimal and as hexadecimal or binary, separated by a comma. +If ``Decimal & hex/bin`` is selected, the value is output twice, formatted as decimal and as hexadecimal (``0x`` prefix) or binary (``0b`` prefix), separated by a comma. If either of the Hex/bin options is selected, but no ``Values display (Off=Hex/On=Bin)`` option is available, then the output will be formatted as hexadecimal. @@ -113,7 +113,7 @@ The Data Acquisition, Send to Controller and Interval settings are standard avai Values ^^^^^^ -The Values ``State_A`` to ``State_D`` are used to show the state of up to 16 shift registers. (Custom formatted) +The Values ``State_A`` to ``State_D`` are used to show the state of up to 16 shift registers. (Custom formatted like set in **Output selection**.) Values that are not going to be filled are not shown here, and no events will be generated either. Commands ~~~~~~~~ @@ -121,6 +121,12 @@ Commands .. include:: P129_commands.repl +Events +~~~~~~ + +.. include:: P129_events.repl + + Change log ---------- diff --git a/docs/source/Plugin/P129_DeviceConfiguration.png b/docs/source/Plugin/P129_DeviceConfiguration.png index ad7fd38c96145094bede9f079e11d475db6daa8e..8cb649202fd9262e3543430a34918d5942e7567d 100644 GIT binary patch literal 64302 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 literal 67216 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%0AkxsDgbc5!yn=_J$mr>VBrllY<UH(HG*Clz9% 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 Y%i<o8q{G7hpN;V;x3eb*$1bJ)1H=k{>Hq)$ diff --git a/docs/source/Plugin/P129_commands.repl b/docs/source/Plugin/P129_commands.repl index 7e339d76c..c5990ca50 100644 --- a/docs/source/Plugin/P129_commands.repl +++ b/docs/source/Plugin/P129_commands.repl @@ -20,7 +20,7 @@ The commands are all used to update configuration, not directly control the stat | Set the number of chips connected together. Is updated in the configuration, but not saved. " " - | ``ShiftIn,SampleFrequency,<0}1>`` + | ``ShiftIn,SampleFrequency,<0|1>`` "," | Select the sample frequency, 0 = 10/sec, 1 = 50/sec. " diff --git a/docs/source/Plugin/P129_events.repl b/docs/source/Plugin/P129_events.repl new file mode 100644 index 000000000..ebbc0b6ea --- /dev/null +++ b/docs/source/Plugin/P129_events.repl @@ -0,0 +1,43 @@ +.. csv-table:: + :header: "Event", "Extra information" + :widths: 20, 30 + + " + | ``<taskname>=<state>,<chip>,<port>,<pin>`` + + | ``state``: ``0`` or ``1``. + + | ``chip``: range 1..16, depending on the number of chips configured. + + | ``port``: range 1..8. + + | ``pin``: range 1..128, depending on the number of chips configured. + "," + | Generic event for each activated input pin, that is enabled in the **Event configuration** matrix. + + | Generated if **Separate events per pin** is *unchecked*/*disabled*. + " + " + | ``<taskname>#<pin>=<state>,<chip>,<port>,<pin>`` + + | ``state``: ``0`` or ``1``. + + | ``chip``: range 1..16, depending on the number of chips configured. + + | ``port``: range 1..8. + + | ``pin``: range 1..128, depending on the number of chips configured. + "," + | Generic event for each activated input pin, that is enabled in the **Event configuration** matrix. + + | Generated if **Separate events per pin** is **enabled**. + " + " + | ``<taskname>#<valuename>=[<decimalvalue>][,][<hex/binvalue>]`` + + | Values provided depend on the setting **Output selection**. + "," + | The generic event per Value ``State_A`` .. ``State_D``, that are available, depending on the number of chips configured. + + | Only sent if **Interval** is greater than 0, or an explicit ``TaskRun`` command for this task is executed. + " \ No newline at end of file diff --git a/docs/source/Reference/Command.rst b/docs/source/Reference/Command.rst index 660bc9ea8..2149ab9ad 100644 --- a/docs/source/Reference/Command.rst +++ b/docs/source/Reference/Command.rst @@ -701,3 +701,8 @@ P127 :ref:`P127_page` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. include:: ../Plugin/P127_commands.repl + +P129 :ref:`P129_page` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. include:: ../Plugin/P129_commands.repl diff --git a/docs/source/Reference/Events.rst b/docs/source/Reference/Events.rst index bb28ec1c7..8594b4c7d 100644 --- a/docs/source/Reference/Events.rst +++ b/docs/source/Reference/Events.rst @@ -522,3 +522,8 @@ P115 :ref:`P115_page` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. include:: ../Plugin/P115_events.repl + +P129 :ref:`P129_page` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. include:: ../Plugin/P129_events.repl diff --git a/src/_P129_74HC165.ino b/src/_P129_74HC165.ino index 36e25f2fb..6a474e85e 100644 --- a/src/_P129_74HC165.ino +++ b/src/_P129_74HC165.ino @@ -7,6 +7,9 @@ // ####################################################################################################### /** Changelog: + * 2022-08-05 tonhuisman: Fix issue with reading 8th bit of each byte (found during HW testing) + * Reduce number of Values to match the selected number of chips/4. Small UI improvements. + * Enable pin is no longer required, as it is not available or required on some boards. * 2022-07-30 tonhuisman: Remove Testing tag from plugin name. * 2022-06-12 tonhuisman: Optimizations and small fixes. Implement use of PCONFIG_ULONG() * 2022-02-25 tonhuisman: Rename command to ShiftIn,<subcommand>,<arg>... @@ -118,20 +121,38 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_GET_DEVICEGPIONAMES: { - event->String1 = formatGpioName_input(F("Data pin (Q7)")); - event->String2 = formatGpioName_output(F("Clock pin (CP)")); - event->String3 = formatGpioName_output(F("Enable pin (<SPAN STYLE=\"text-decoration:overline\">EN</SPAN>)")); + event->String1 = formatGpioName_input(F("Data (Q7)")); + event->String2 = formatGpioName_output(F("Clock (CP)")); + event->String3 = formatGpioName_output(F("Enable (<SPAN STYLE=\"text-decoration:overline\">EN</SPAN>) (opt.)")); + break; + } + + case PLUGIN_GET_DEVICEVALUECOUNT: + { + event->Par1 = min(static_cast<uint8_t>(VARS_PER_TASK), + static_cast<uint8_t>(ceil(P129_CONFIG_CHIP_COUNT / 4.0))); + success = true; + break; + } + + case PLUGIN_GET_DEVICEVTYPE: + { + event->sensorType = static_cast<Sensor_VType>( + min(static_cast<uint8_t>(VARS_PER_TASK), + static_cast<uint8_t>(ceil(P129_CONFIG_CHIP_COUNT / 4.0)))); + event->idx = 0; + success = true; break; } case PLUGIN_WEBFORM_LOAD: { addFormPinSelect(PinSelectPurpose::Generic_output, - formatGpioName_output(F("Load pin (<SPAN STYLE=\"text-decoration:overline\">PL</SPAN>)")), + formatGpioName_output(F("Load (<SPAN STYLE=\"text-decoration:overline\">PL</SPAN>)")), F("load_pin"), P129_CONFIG_LOAD_PIN); # ifndef LIMIT_BUILD_SIZE - addFormNote(F("All GPIO pins <B>must</B> be configured to correctly initialize the plugin.")); + addFormNote(F("GPIO pins for Data, Clock and Load <B>must</B> be configured to correctly initialize the plugin.")); # endif // ifndef LIMIT_BUILD_SIZE addFormSubHeader(F("Device configuration")); @@ -321,12 +342,6 @@ boolean Plugin_129(uint8_t function, struct EventStruct *event, String& string) break; } - case PLUGIN_EXIT: - { - success = true; - break; - } - case PLUGIN_READ: { P129_data_struct *P129_data = static_cast<P129_data_struct *>(getPluginTaskData(event->TaskIndex)); diff --git a/src/src/PluginStructs/P129_data_struct.cpp b/src/src/PluginStructs/P129_data_struct.cpp index bcfdeda3e..d6f650cd9 100644 --- a/src/src/PluginStructs/P129_data_struct.cpp +++ b/src/src/PluginStructs/P129_data_struct.cpp @@ -24,12 +24,13 @@ bool P129_data_struct::plugin_init(struct EventStruct *event) { } // Prepare all used GPIO pins - pinMode(_enablePin, OUTPUT); - pinMode(_loadPin, OUTPUT); - pinMode(_clockPin, OUTPUT); - pinMode(_dataPin, INPUT); - digitalWrite(_loadPin, HIGH); - digitalWrite(_enablePin, HIGH); + if (validGpio(_enablePin)) { pinMode(_enablePin, OUTPUT); } + pinMode(_loadPin, OUTPUT); + pinMode(_clockPin, OUTPUT); + pinMode(_dataPin, INPUT); + digitalWrite(_loadPin, HIGH); + + if (validGpio(_enablePin)) { digitalWrite(_enablePin, HIGH); } return true; } @@ -178,14 +179,14 @@ bool P129_data_struct::plugin_readData(struct EventStruct *event) { digitalWrite(_loadPin, HIGH); delayMicroseconds(5); - digitalWrite(_clockPin, HIGH); - digitalWrite(_enablePin, LOW); + if (validGpio(_enablePin)) { digitalWrite(_enablePin, LOW); } for (uint8_t i = 0; i < P129_CONFIG_CHIP_COUNT; i++) { prevBuffer[i] = readBuffer[i]; readBuffer[i] = shiftIn(static_cast<uint8_t>(_dataPin), static_cast<uint8_t>(_clockPin), MSBFIRST); } - digitalWrite(_enablePin, HIGH); + + if (validGpio(_enablePin)) { digitalWrite(_enablePin, HIGH); } delay(0); checkDiff(event); diff --git a/src/src/PluginStructs/P129_data_struct.h b/src/src/PluginStructs/P129_data_struct.h index ab68b78f8..fac4753f0 100644 --- a/src/src/PluginStructs/P129_data_struct.h +++ b/src/src/PluginStructs/P129_data_struct.h @@ -66,7 +66,6 @@ public: const bool isInitialized() const { // All GPIO's defined return _dataPin != -1 && _clockPin != -1 && - _enablePin != -1 && _loadPin != -1; } From 074ea94e058c10bfe6b9ed9861c245b73b37f1e7 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Fri, 5 Aug 2022 17:10:20 +0200 Subject: [PATCH 71/89] [P129] Fix documentation --- docs/source/Plugin/_plugin_substitutions_p12x.repl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/Plugin/_plugin_substitutions_p12x.repl b/docs/source/Plugin/_plugin_substitutions_p12x.repl index 4cb676a61..069df90f5 100644 --- a/docs/source/Plugin/_plugin_substitutions_p12x.repl +++ b/docs/source/Plugin/_plugin_substitutions_p12x.repl @@ -93,7 +93,7 @@ .. |P129_type| replace:: :cyan:`Input` .. |P129_typename| replace:: :cyan:`Input - Shift registers (74HC165)` .. |P129_porttype| replace:: `.` -.. |P129_status| replace:: :yellow:`TESTING E` +.. |P129_status| replace:: :yellow:`COLLECTION E` .. |P129_github| replace:: P129_74HC165.ino .. _P129_github: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P129_74HC165.ino .. |P129_usedby| replace:: `.` From 3e26dc4fc5b51ecc50db56dcdb5452194fc76bf9 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 7 Aug 2022 15:50:23 +0200 Subject: [PATCH 72/89] [IR] [Build] Enable IR device selection --- .gitignore | 1 + platformio_esp32_envs.ini | 3 + platformio_esp32s2_envs.ini | 1 + platformio_esp82xx_envs.ini | 10 ++ src/CustomIR-sample.h | 272 ++++++++++++++++++++++++++++++++++++ tools/pio/ir_build_check.py | 17 +++ 6 files changed, 304 insertions(+) create mode 100644 src/CustomIR-sample.h create mode 100644 tools/pio/ir_build_check.py diff --git a/.gitignore b/.gitignore index 70cc10dd0..05796194e 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,4 @@ dist/Espressif_flash_download_tool_v3.8.5/dl_temp/bin_tmp/ dist/Espressif_flash_download_tool_v3.8.5/dl_temp/_temp_by_dltool/ dist/Espressif_flash_download_tool_v3.8.5/configure/esp32/spi_download.conf +src/CustomIR.h diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index 1fd28d9bd..651bd31c8 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -98,6 +98,8 @@ build_flags = ${esp32_base.build_flags} -DCOLLECTION_USE_RTTTL lib_deps = ${esp32_base.lib_deps} LittleFS +extra_scripts = ${esp32_base.extra_scripts} + pre:tools/pio/ir_build_check.py @@ -140,6 +142,7 @@ lib_ignore = ${esp32_always.lib_ignore} HeatpumpIR extra_scripts = ${esp32_base.extra_scripts} pre:tools/pio/pre_custom_esp32.py + pre:tools/pio/ir_build_check.py [env:normal_ESP32_4M316k] diff --git a/platformio_esp32s2_envs.ini b/platformio_esp32s2_envs.ini index 010408322..25ae85df7 100644 --- a/platformio_esp32s2_envs.ini +++ b/platformio_esp32s2_envs.ini @@ -54,6 +54,7 @@ lib_ignore = ${esp32_always.lib_ignore} HeatpumpIR extra_scripts = ${esp32s2_common.extra_scripts} pre:tools/pio/pre_custom_esp32.py + pre:tools/pio/ir_build_check.py diff --git a/platformio_esp82xx_envs.ini b/platformio_esp82xx_envs.ini index a14911222..c3bdcdd81 100644 --- a/platformio_esp82xx_envs.ini +++ b/platformio_esp82xx_envs.ini @@ -53,6 +53,7 @@ lib_ignore = ESP32_ping Adafruit Motor Shield V2 Library Adafruit_ST77xx extra_scripts = ${esp8266_custom_common.extra_scripts} + pre:tools/pio/ir_build_check.py @@ -118,6 +119,7 @@ lib_ignore = ESP32_ping Adafruit Motor Shield V2 Library Adafruit_ST77xx extra_scripts = ${esp8266_custom_common.extra_scripts} + pre:tools/pio/ir_build_check.py ; TD-er: Disabled as it will no longer fit @@ -430,6 +432,8 @@ lib_ignore = ${ir.lib_ignore} build_flags = ${minimal_ir_extended.build_flags} ${esp8266_1M.build_flags} build_unflags = ${esp8266_1M_OTA.build_unflags} -DPLUGIN_BUILD_NORMAL_IR +extra_scripts = ${esp8266_1M.extra_scripts} + pre:tools/pio/ir_build_check.py ; Minimal IR: 4096k version -------------------------- @@ -443,6 +447,8 @@ platform_packages = ${ir.platform_packages} lib_ignore = ${ir.lib_ignore} build_flags = ${minimal_ir_extended.build_flags} ${esp8266_4M1M.build_flags} +extra_scripts = ${esp8266_4M1M.extra_scripts} + pre:tools/pio/ir_build_check.py ; 4M flash, 2M SPIFFS [env:minimal_IRext_ESP8266_4M2M] @@ -452,6 +458,8 @@ platform_packages = ${ir.platform_packages} lib_ignore = ${ir.lib_ignore} build_flags = ${minimal_ir_extended.build_flags} ${esp8266_4M2M.build_flags} +extra_scripts = ${esp8266_4M2M.extra_scripts} + pre:tools/pio/ir_build_check.py ; NORMAL IR: 4096k version -------------------------- @@ -466,6 +474,8 @@ lib_ignore = ${ir.lib_ignore} build_flags = ${normal_ir_extended_no_rx.build_flags} ${esp8266_4M2M.build_flags} -DLIMIT_BUILD_SIZE +extra_scripts = ${esp8266_4M2M.extra_scripts} + pre:tools/pio/ir_build_check.py diff --git a/src/CustomIR-sample.h b/src/CustomIR-sample.h new file mode 100644 index 000000000..863892044 --- /dev/null +++ b/src/CustomIR-sample.h @@ -0,0 +1,272 @@ +#ifndef _CUSTOM_IR_H +#define _CUSTOM_IR_H + +/** + * Custom_IR-sample.h + * Usage: + * - Copy this file to CustomIR.h (CustomIR.h is excluded from Git, so don't try to commit that) + * - Change the supported list of IR devices by commenting/uncommenting options that DISABLE a device when UNcommented + */ + +// *** This file must be updated adding new supported devices when updating IRreceive8266 library *** + +// Set flags to enable (1) or disable (0) the DECODE_ and/or SEND_ feature for a specific IR device +// To limit ESPEasy build-size you can disable DECODE_ or SEND_ flags for devices not needed + +// #define DECODE_RAW 0 // RAW support should be left to default unless explicitly disabled via P016_P035_USE_RAW_RAW2 +// #define SEND_RAW 0 + +// Standard: Use defaults for up to library version 2.8.2 +// Change as desired after copying CustomIR-sample.h to CustomIR.h + +// #define DECODE_RC5 0 +// #define SEND_RC5 0 +// #define DECODE_RC6 0 +// #define SEND_RC6 0 +// #define DECODE_NEC 0 +// #define SEND_NEC 0 +// #define DECODE_SONY 0 +// #define SEND_SONY 0 +// #define DECODE_PANASONIC 0 +// #define SEND_PANASONIC 0 +// #define DECODE_JVC 0 +// #define SEND_JVC 0 +// #define DECODE_SAMSUNG 0 +// #define SEND_SAMSUNG 0 +// #define DECODE_WHYNTER 0 +// #define SEND_WHYNTER 0 +// #define DECODE_AIWA_RC_T501 0 +// #define SEND_AIWA_RC_T501 0 +// #define DECODE_LG 0 +// #define SEND_LG 0 +// #define DECODE_SANYO 0 +// #define SEND_SANYO 0 +// #define DECODE_MITSUBISHI 0 +// #define SEND_MITSUBISHI 0 +// #define DECODE_DISH 0 +// #define SEND_DISH 0 +// #define DECODE_SHARP 0 +// #define SEND_SHARP 0 +// #define DECODE_COOLIX 0 +// #define SEND_COOLIX 0 +// #define DECODE_DAIKIN 0 +// #define SEND_DAIKIN 0 +// #define DECODE_DENON 0 +// #define SEND_DENON 0 +// #define DECODE_KELVINATOR 0 +// #define SEND_KELVINATOR 0 +// #define DECODE_SHERWOOD 0 +// #define SEND_SHERWOOD 0 +// #define DECODE_MITSUBISHI_AC 0 +// #define SEND_MITSUBISHI_AC 0 +// #define DECODE_RCMM 0 +// #define SEND_RCMM 0 +// #define DECODE_SANYO_LC7461 0 +// #define SEND_SANYO_LC7461 0 +// #define DECODE_RC5X 0 +// #define SEND_RC5X 0 +// #define DECODE_GREE 0 +// #define SEND_GREE 0 +// #define DECODE_PRONTO 0 +// #define SEND_PRONTO 0 +// #define DECODE_NEC_LIKE 0 +// #define SEND_NEC_LIKE 0 +// #define DECODE_ARGO 0 +// #define SEND_ARGO 0 +// #define DECODE_TROTEC 0 +// #define SEND_TROTEC 0 +// #define DECODE_NIKAI 0 +// #define SEND_NIKAI 0 +// #define DECODE_GLOBALCACHE 0 +// #define SEND_GLOBALCACHE 0 +// #define DECODE_TOSHIBA_AC 0 +// #define SEND_TOSHIBA_AC 0 +// #define DECODE_FUJITSU_AC 0 +// #define SEND_FUJITSU_AC 0 +// #define DECODE_MIDEA 0 +// #define SEND_MIDEA 0 +// #define DECODE_MAGIQUEST 0 +// #define SEND_MAGIQUEST 0 +// #define DECODE_LASERTAG 0 +// #define SEND_LASERTAG 0 +// #define DECODE_CARRIER_AC 0 +// #define SEND_CARRIER_AC 0 +// #define DECODE_HAIER_AC 0 +// #define SEND_HAIER_AC 0 +// #define DECODE_MITSUBISHI2 0 +// #define SEND_MITSUBISHI2 0 +// #define DECODE_HITACHI_AC 0 +// #define SEND_HITACHI_AC 0 +// #define DECODE_HITACHI_AC1 0 +// #define SEND_HITACHI_AC1 0 +// #define DECODE_HITACHI_AC2 0 +// #define SEND_HITACHI_AC2 0 +// #define DECODE_GICABLE 0 +// #define SEND_GICABLE 0 +// #define DECODE_HAIER_AC_YRW02 0 +// #define SEND_HAIER_AC_YRW02 0 +// #define DECODE_WHIRLPOOL_AC 0 +// #define SEND_WHIRLPOOL_AC 0 +// #define DECODE_SAMSUNG_AC 0 +// #define SEND_SAMSUNG_AC 0 +// #define DECODE_LUTRON 0 +// #define SEND_LUTRON 0 +// #define DECODE_ELECTRA_AC 0 +// #define SEND_ELECTRA_AC 0 +// #define DECODE_PANASONIC_AC 0 +// #define SEND_PANASONIC_AC 0 +// #define DECODE_PIONEER 0 +// #define SEND_PIONEER 0 +// #define DECODE_LG2 0 +// #define SEND_LG2 0 +// #define DECODE_MWM 0 +// #define SEND_MWM 0 +// #define DECODE_DAIKIN2 0 +// #define SEND_DAIKIN2 0 +// #define DECODE_VESTEL_AC 0 +// #define SEND_VESTEL_AC 0 +// #define DECODE_TECO 0 +// #define SEND_TECO 0 +// #define DECODE_SAMSUNG36 0 +// #define SEND_SAMSUNG36 0 +// #define DECODE_TCL112AC 0 +// #define SEND_TCL112AC 0 +// #define DECODE_LEGOPF 0 +// #define SEND_LEGOPF 0 +// #define DECODE_MITSUBISHI_HEAVY_88 0 +// #define SEND_MITSUBISHI_HEAVY_88 0 +// #define DECODE_MITSUBISHI_HEAVY_152 0 +// #define SEND_MITSUBISHI_HEAVY_152 0 +// #define DECODE_DAIKIN216 0 +// #define SEND_DAIKIN216 0 +// #define DECODE_SHARP_AC 0 +// #define SEND_SHARP_AC 0 +// #define DECODE_GOODWEATHER 0 +// #define SEND_GOODWEATHER 0 +// #define DECODE_INAX 0 +// #define SEND_INAX 0 +// #define DECODE_DAIKIN160 0 +// #define SEND_DAIKIN160 0 +// #define DECODE_NEOCLIMA 0 +// #define SEND_NEOCLIMA 0 +// #define DECODE_DAIKIN176 0 +// #define SEND_DAIKIN176 0 +// #define DECODE_DAIKIN128 0 +// #define SEND_DAIKIN128 0 +// #define DECODE_AMCOR 0 +// #define SEND_AMCOR 0 +// #define DECODE_DAIKIN152 0 +// #define SEND_DAIKIN152 0 +// #define DECODE_MITSUBISHI136 0 +// #define SEND_MITSUBISHI136 0 +// #define DECODE_MITSUBISHI112 0 +// #define SEND_MITSUBISHI112 0 +// #define DECODE_HITACHI_AC424 0 +// #define SEND_HITACHI_AC424 0 +// #define DECODE_SONY_38K 0 +// #define SEND_SONY_38K 0 +// #define DECODE_EPSON 0 +// #define SEND_EPSON 0 +// #define DECODE_SYMPHONY 0 +// #define SEND_SYMPHONY 0 +// #define DECODE_HITACHI_AC3 0 +// #define SEND_HITACHI_AC3 0 +// #define DECODE_DAIKIN64 0 +// #define SEND_DAIKIN64 0 +// #define DECODE_AIRWELL 0 +// #define SEND_AIRWELL 0 +// #define DECODE_DELONGHI_AC 0 +// #define SEND_DELONGHI_AC 0 +// #define DECODE_DOSHISHA 0 +// #define SEND_DOSHISHA 0 +// #define DECODE_MULTIBRACKETS 0 +// #define SEND_MULTIBRACKETS 0 +// #define DECODE_CARRIER_AC40 0 +// #define SEND_CARRIER_AC40 0 +// #define DECODE_CARRIER_AC64 0 +// #define SEND_CARRIER_AC64 0 +// #define DECODE_HITACHI_AC344 0 +// #define SEND_HITACHI_AC344 0 +// #define DECODE_CORONA_AC 0 +// #define SEND_CORONA_AC 0 +// #define DECODE_MIDEA24 0 +// #define SEND_MIDEA24 0 +// #define DECODE_ZEPEAL 0 +// #define SEND_ZEPEAL 0 +// #define DECODE_SANYO_AC 0 +// #define SEND_SANYO_AC 0 +// #define DECODE_VOLTAS 0 +// #define SEND_VOLTAS 0 +// #define DECODE_METZ 0 +// #define SEND_METZ 0 +// #define DECODE_TRANSCOLD 0 +// #define SEND_TRANSCOLD 0 +// #define DECODE_TECHNIBEL_AC 0 +// #define SEND_TECHNIBEL_AC 0 +// #define DECODE_MIRAGE 0 +// #define SEND_MIRAGE 0 +// #define DECODE_ELITESCREENS 0 +// #define SEND_ELITESCREENS 0 +// #define DECODE_PANASONIC_AC32 0 +// #define SEND_PANASONIC_AC32 0 +// #define DECODE_MILESTAG2 0 +// #define SEND_MILESTAG2 0 +// #define DECODE_ECOCLIM 0 +// #define SEND_ECOCLIM 0 +// #define DECODE_XMP 0 +// #define SEND_XMP 0 +// #define DECODE_TRUMA 0 +// #define SEND_TRUMA 0 +// #define DECODE_HAIER_AC176 0 +// #define SEND_HAIER_AC176 0 +// #define DECODE_TEKNOPOINT 0 +// #define SEND_TEKNOPOINT 0 +// #define DECODE_KELON 0 +// #define SEND_KELON 0 +// #define DECODE_TROTEC_3550 0 +// #define SEND_TROTEC_3550 0 +// #define DECODE_SANYO_AC88 0 +// #define SEND_SANYO_AC88 0 +// #define DECODE_BOSE 0 +// #define SEND_BOSE 0 +// #define DECODE_ARRIS 0 +// #define SEND_ARRIS 0 +// #define DECODE_RHOSS 0 +// #define SEND_RHOSS 0 +// #define DECODE_AIRTON 0 +// #define SEND_AIRTON 0 +// #define DECODE_COOLIX48 0 +// #define SEND_COOLIX48 0 + +// ATTENTION: DISABLE new devices from library version 2.8.2 and newer by default to save ESPEasy .bin size +// When extending this list: Add both the DECODE_ and SEND_ defines per new device! + +// Version 2.8.2 added devices: +#define DECODE_HITACHI_AC264 0 +#define SEND_HITACHI_AC264 0 +#define DECODE_KELON168 0 +#define SEND_KELON168 0 +#define DECODE_HITACHI_AC296 0 +#define SEND_HITACHI_AC296 0 +#define DECODE_DAIKIN200 0 +#define SEND_DAIKIN200 0 +#define DECODE_HAIER_AC160 0 +#define SEND_HAIER_AC160 0 +#define DECODE_CARRIER_AC128 0 +#define SEND_CARRIER_AC128 0 +#define DECODE_TOTO 0 +#define SEND_TOTO 0 +#define DECODE_CLIMABUTLER 0 +#define SEND_CLIMABUTLER 0 +#define DECODE_TCL96AC 0 +#define SEND_TCL96AC 0 +#define DECODE_BOSCH144 0 +#define SEND_BOSCH144 0 +#define DECODE_SANYO_AC152 0 +#define SEND_SANYO_AC152 0 +#define DECODE_DAIKIN312 0 +#define SEND_DAIKIN312 0 + +// Version 2.x.y added devices: + +#endif // ifndef _CUSTOM_IR_H diff --git a/tools/pio/ir_build_check.py b/tools/pio/ir_build_check.py new file mode 100644 index 000000000..40d63f2a8 --- /dev/null +++ b/tools/pio/ir_build_check.py @@ -0,0 +1,17 @@ +Import("env") +import os + +# Check for IR and IRext builds and use a Custom-IR.h file if available, uses Custom-IR-sample.h for defaults +pioenv = env['PIOENV'] +# print("***** PIOENV: ",pioenv) +if "_IR_" in pioenv or "_IRext_" in pioenv: + if os.path.isfile('src/CustomIR.h'): + print("\n\u001b[35m *** CustomIR.h build detected. Create a clean build after changes to CustomIR.h *** \u001b[0m\n") + ir_defines=["-include src/CustomIR.h"] + env.Append(BUILD_FLAGS=ir_defines) + else: + if os.path.isfile('src/CustomIR-sample.h'): + print(" IR build detected. Using CustomIR-sample.h for defaults.") + ir_defines=["-include src/CustomIR-sample.h"] # Use as default settings + env.Append(BUILD_FLAGS=ir_defines) + From 1b3c71884f31da6c2edf2ad23425b101dc2f4268 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 7 Aug 2022 17:26:09 +0200 Subject: [PATCH 73/89] [LIB] IRremoteESP8266 updated to v2.8.2 --- .../.github/workflows/Build.yml | 47 +- .../.github/workflows/MetaChecks.yml | 2 +- .../.github/workflows/UnitTests.yml | 29 +- .../.github/workflows/codeql-analysis.yml | 72 +++ lib/IRremoteESP8266/README.md | 4 +- lib/IRremoteESP8266/README_de.md | 4 +- lib/IRremoteESP8266/README_fr.md | 4 +- lib/IRremoteESP8266/ReleaseNotes.md | 33 ++ lib/IRremoteESP8266/SupportedProtocols.md | 23 +- lib/IRremoteESP8266/assets/images/banner.svg | 142 ++++++ lib/IRremoteESP8266/assets/images/logo.svg | 50 ++ .../DumbIRRepeater/DumbIRRepeater.ino | 5 + .../examples/IRMQTTServer/IRMQTTServer.h | 7 +- .../examples/IRMQTTServer/IRMQTTServer.ino | 49 +- .../examples/IRrecvDemo/IRrecvDemo.ino | 5 + .../examples/IRrecvDumpV2/IRrecvDumpV2.ino | 5 + .../examples/IRrecvDumpV3/IRrecvDumpV3.ino | 5 + .../SmartIRRepeater/SmartIRRepeater.ino | 5 + .../TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino | 2 +- lib/IRremoteESP8266/keywords.txt | 95 +++- lib/IRremoteESP8266/library.json | 2 +- lib/IRremoteESP8266/library.properties | 2 +- lib/IRremoteESP8266/src/IRac.cpp | 159 +++++- lib/IRremoteESP8266/src/IRac.h | 16 +- lib/IRremoteESP8266/src/IRrecv.cpp | 86 +++- lib/IRremoteESP8266/src/IRrecv.h | 82 ++- lib/IRremoteESP8266/src/IRremoteESP8266.h | 141 +++++- lib/IRremoteESP8266/src/IRsend.cpp | 84 ++++ lib/IRremoteESP8266/src/IRsend.h | 111 +++- lib/IRremoteESP8266/src/IRtext.cpp | 15 + lib/IRremoteESP8266/src/IRtext.h | 17 +- lib/IRremoteESP8266/src/IRutils.cpp | 18 +- lib/IRremoteESP8266/src/ir_Airton.cpp | 2 +- lib/IRremoteESP8266/src/ir_Airwell.cpp | 2 +- lib/IRremoteESP8266/src/ir_Amcor.cpp | 2 +- lib/IRremoteESP8266/src/ir_Argo.cpp | 2 +- lib/IRremoteESP8266/src/ir_Bosch.cpp | 112 +++++ lib/IRremoteESP8266/src/ir_Carrier.cpp | 116 ++++- lib/IRremoteESP8266/src/ir_Carrier.h | 4 +- lib/IRremoteESP8266/src/ir_ClimaButler.cpp | 86 ++++ lib/IRremoteESP8266/src/ir_Coolix.cpp | 58 ++- lib/IRremoteESP8266/src/ir_Corona.cpp | 2 +- lib/IRremoteESP8266/src/ir_Daikin.cpp | 209 +++++++- lib/IRremoteESP8266/src/ir_Daikin.h | 38 +- lib/IRremoteESP8266/src/ir_Delonghi.cpp | 2 +- lib/IRremoteESP8266/src/ir_Ecoclim.cpp | 2 +- lib/IRremoteESP8266/src/ir_Electra.cpp | 2 +- lib/IRremoteESP8266/src/ir_Electra.h | 1 + lib/IRremoteESP8266/src/ir_Fujitsu.cpp | 291 ++++++----- lib/IRremoteESP8266/src/ir_Fujitsu.h | 12 +- lib/IRremoteESP8266/src/ir_Goodweather.cpp | 2 +- lib/IRremoteESP8266/src/ir_Gree.cpp | 30 +- lib/IRremoteESP8266/src/ir_Gree.h | 16 +- lib/IRremoteESP8266/src/ir_Haier.cpp | 56 ++- lib/IRremoteESP8266/src/ir_Haier.h | 2 + lib/IRremoteESP8266/src/ir_Hitachi.cpp | 472 ++++++++++++++++-- lib/IRremoteESP8266/src/ir_Hitachi.h | 203 +++++++- lib/IRremoteESP8266/src/ir_Kelon.cpp | 281 ++++++----- lib/IRremoteESP8266/src/ir_Kelon.h | 50 +- lib/IRremoteESP8266/src/ir_Kelvinator.cpp | 78 ++- lib/IRremoteESP8266/src/ir_Kelvinator.h | 24 +- lib/IRremoteESP8266/src/ir_LG.cpp | 76 ++- lib/IRremoteESP8266/src/ir_LG.h | 10 +- lib/IRremoteESP8266/src/ir_Midea.cpp | 107 +++- lib/IRremoteESP8266/src/ir_Midea.h | 46 +- lib/IRremoteESP8266/src/ir_Mirage.cpp | 2 +- lib/IRremoteESP8266/src/ir_Mitsubishi.cpp | 8 +- lib/IRremoteESP8266/src/ir_Mitsubishi.h | 1 + .../src/ir_MitsubishiHeavy.cpp | 4 +- lib/IRremoteESP8266/src/ir_Neoclima.cpp | 2 +- lib/IRremoteESP8266/src/ir_Panasonic.cpp | 4 +- lib/IRremoteESP8266/src/ir_Pioneer.cpp | 5 + lib/IRremoteESP8266/src/ir_Rhoss.cpp | 2 +- lib/IRremoteESP8266/src/ir_Samsung.cpp | 2 +- lib/IRremoteESP8266/src/ir_Sanyo.cpp | 72 ++- lib/IRremoteESP8266/src/ir_Sanyo.h | 3 + lib/IRremoteESP8266/src/ir_Sharp.cpp | 2 +- lib/IRremoteESP8266/src/ir_Tcl.cpp | 93 +++- lib/IRremoteESP8266/src/ir_Tcl.h | 1 + lib/IRremoteESP8266/src/ir_Technibel.cpp | 2 +- lib/IRremoteESP8266/src/ir_Teco.cpp | 2 +- lib/IRremoteESP8266/src/ir_Teknopoint.cpp | 6 + lib/IRremoteESP8266/src/ir_Toshiba.cpp | 2 +- lib/IRremoteESP8266/src/ir_Toto.cpp | 131 +++++ lib/IRremoteESP8266/src/ir_Transcold.cpp | 2 +- lib/IRremoteESP8266/src/ir_Trotec.cpp | 4 +- lib/IRremoteESP8266/src/ir_Truma.cpp | 2 +- lib/IRremoteESP8266/src/ir_Vestel.cpp | 2 +- lib/IRremoteESP8266/src/ir_Voltas.cpp | 2 +- lib/IRremoteESP8266/src/ir_Voltas.h | 1 + lib/IRremoteESP8266/src/ir_Whirlpool.cpp | 2 +- lib/IRremoteESP8266/src/locale/defaults.h | 79 ++- lib/IRremoteESP8266/test/IRac_test.cpp | 103 +++- lib/IRremoteESP8266/test/IRutils_test.cpp | 14 + lib/IRremoteESP8266/test/ir_Bosch_test.cpp | 100 ++++ lib/IRremoteESP8266/test/ir_Carrier_test.cpp | 93 +++- .../test/ir_ClimaButler_test.cpp | 67 +++ lib/IRremoteESP8266/test/ir_Coolix_test.cpp | 35 ++ lib/IRremoteESP8266/test/ir_Daikin_test.cpp | 239 +++++++++ lib/IRremoteESP8266/test/ir_Fujitsu_test.cpp | 265 ++++++++-- lib/IRremoteESP8266/test/ir_Gree_test.cpp | 42 +- lib/IRremoteESP8266/test/ir_Haier_test.cpp | 83 +++ lib/IRremoteESP8266/test/ir_Hitachi_test.cpp | 463 ++++++++++++++++- lib/IRremoteESP8266/test/ir_Kelon_test.cpp | 173 +++++++ .../test/ir_Kelvinator_test.cpp | 50 +- lib/IRremoteESP8266/test/ir_LG_test.cpp | 64 +++ lib/IRremoteESP8266/test/ir_Midea_test.cpp | 233 ++++++--- .../test/ir_Mitsubishi_test.cpp | 91 +++- lib/IRremoteESP8266/test/ir_Sanyo_test.cpp | 75 +++ lib/IRremoteESP8266/test/ir_Tcl_test.cpp | 70 ++- lib/IRremoteESP8266/test/ir_Toto_test.cpp | 159 ++++++ .../tools/auto_analyse_raw_data.py | 4 - lib/IRremoteESP8266/tools/code_to_raw_test.sh | 2 +- lib/IRremoteESP8266/tools/mkkeywords | 4 +- 114 files changed, 5795 insertions(+), 789 deletions(-) create mode 100644 lib/IRremoteESP8266/.github/workflows/codeql-analysis.yml create mode 100644 lib/IRremoteESP8266/assets/images/banner.svg create mode 100644 lib/IRremoteESP8266/assets/images/logo.svg create mode 100644 lib/IRremoteESP8266/src/ir_Bosch.cpp create mode 100644 lib/IRremoteESP8266/src/ir_ClimaButler.cpp create mode 100644 lib/IRremoteESP8266/src/ir_Toto.cpp create mode 100644 lib/IRremoteESP8266/test/ir_Bosch_test.cpp create mode 100644 lib/IRremoteESP8266/test/ir_ClimaButler_test.cpp create mode 100644 lib/IRremoteESP8266/test/ir_Toto_test.cpp diff --git a/lib/IRremoteESP8266/.github/workflows/Build.yml b/lib/IRremoteESP8266/.github/workflows/Build.yml index 5c0e5907c..dd4504361 100644 --- a/lib/IRremoteESP8266/.github/workflows/Build.yml +++ b/lib/IRremoteESP8266/.github/workflows/Build.yml @@ -7,9 +7,31 @@ on: branches: [ master ] jobs: - Build_Examples: - + Gen_Matrix: + outputs: + matrix: ${{ steps.files.outputs.matrix }} runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Generate Matrix of all examples + id: files + run: | + JSONI=$(find . -name platformio.ini -type f | sed 's,/platformio.ini$,,' | xargs -n 1 -I {} echo -e '"{}",') + + # Remove last "," and add closing brackets + if [[ $JSONI == *, ]]; then + JSONI="${JSONI%?}" + fi + JSONI=${JSONI//$'\n'} + echo $JSONI + # Set output + echo "::set-output name=matrix::[${JSONI}]" + Build_Example: + needs: Gen_Matrix + runs-on: ubuntu-latest + strategy: + matrix: + project: ${{fromJson(needs.Gen_Matrix.outputs.matrix)}} steps: - uses: actions/checkout@v2 @@ -24,14 +46,29 @@ jobs: uses: actions/cache@v2 with: path: ~/.platformio - key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} + key: ${{ runner.os }}-${{ hashFiles('**/platformio.ini') }} + - name: Cache PlatformIO build + uses: actions/cache@v2 + with: + path: .pio + key: pio-${{ runner.os }}-${{ matrix.project }} + restore-keys: | + pio-${{ runner.os }}- + pio- - name: Set up Python uses: actions/setup-python@v2 - name: Install PlatformIO run: | python -m pip install --upgrade pip pip install --upgrade platformio - - name: Build all the examples + - name: Build example env: PLATFORMIO_BUILD_CACHE_DIR: "../../.pio/buildcache" - run: find . -name platformio.ini -type f | sed 's,/platformio.ini$,,' | xargs --verbose -n 1 pio run --jobs 2 --project-dir + run: pio run --jobs 2 --project-dir ${{ matrix.project }} + + Build_Examples: + needs: Build_Example + runs-on: ubuntu-latest + steps: + - name: done + run: echo ok diff --git a/lib/IRremoteESP8266/.github/workflows/MetaChecks.yml b/lib/IRremoteESP8266/.github/workflows/MetaChecks.yml index 2866ffc37..d8dcd0703 100644 --- a/lib/IRremoteESP8266/.github/workflows/MetaChecks.yml +++ b/lib/IRremoteESP8266/.github/workflows/MetaChecks.yml @@ -37,7 +37,7 @@ jobs: - uses: actions/checkout@v2 - name: Check all the version numbers match. run: | - LIB_VERSION=$(egrep "^#define\s+_IRREMOTEESP8266_VERSION_\s+" src/IRremoteESP8266.h | cut -d\" -f2) + LIB_VERSION=$(tools/extract_lib_version.sh) test ${LIB_VERSION} == "$(jq -r .version library.json)" grep -q "^version=${LIB_VERSION}$" library.properties examples-have-platformio_ini: diff --git a/lib/IRremoteESP8266/.github/workflows/UnitTests.yml b/lib/IRremoteESP8266/.github/workflows/UnitTests.yml index bbc486b18..a99e18c80 100644 --- a/lib/IRremoteESP8266/.github/workflows/UnitTests.yml +++ b/lib/IRremoteESP8266/.github/workflows/UnitTests.yml @@ -3,21 +3,28 @@ name: Tests on: [push, pull_request] jobs: - Unit_Tests: - + Tools_Tests: runs-on: ubuntu-latest + env: + MAKEFLAGS: "-j 2" + steps: + - uses: actions/checkout@v2 + - name: Build tools unit tests + run: (cd tools; make all) + - name: Run tools unit tests + run: (cd tools; make run_tests) + Unit_Tests: + runs-on: ubuntu-latest + env: + MAKEFLAGS: "-j 2" steps: - uses: actions/checkout@v2 - name: Install the Google test suite - env: - MAKEFLAGS: "-j 2" run: (cd test; make install-googletest) - - name: Build and run the library unit tests. - env: - MAKEFLAGS: "-j 2" + - name: Build base unit test + run: (cd test; make IRac_test) + - name: Build library unit tests + run: (cd test; make all) + - name: Run library unit tests run: (cd test; make run) - - name: Build and run the tools unit tests. - env: - MAKEFLAGS: "-j 2" - run: (cd tools; make all; make run_tests) diff --git a/lib/IRremoteESP8266/.github/workflows/codeql-analysis.yml b/lib/IRremoteESP8266/.github/workflows/codeql-analysis.yml new file mode 100644 index 000000000..48500339a --- /dev/null +++ b/lib/IRremoteESP8266/.github/workflows/codeql-analysis.yml @@ -0,0 +1,72 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "master" ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ "master" ] + schedule: + - cron: '38 1 * * 3' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'python' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/lib/IRremoteESP8266/README.md b/lib/IRremoteESP8266/README.md index f392c5529..e9d16eddd 100644 --- a/lib/IRremoteESP8266/README.md +++ b/lib/IRremoteESP8266/README.md @@ -10,8 +10,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.8.1 Now Available -Version 2.8.1 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.8.2 Now Available +Version 2.8.2 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/IRremoteESP8266/README_de.md b/lib/IRremoteESP8266/README_de.md index 884628149..50dbab2cb 100644 --- a/lib/IRremoteESP8266/README_de.md +++ b/lib/IRremoteESP8266/README_de.md @@ -11,8 +11,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.8.1 jetzt verfügbar -Version 2.8.1 der Bibliothek ist nun [verfügbar](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Die [Versionshinweise](ReleaseNotes.md) enthalten alle wichtigen Neuerungen. +## v2.8.2 jetzt verfügbar +Version 2.8.2 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/IRremoteESP8266/README_fr.md b/lib/IRremoteESP8266/README_fr.md index 3f1a93048..71f4d4abc 100644 --- a/lib/IRremoteESP8266/README_fr.md +++ b/lib/IRremoteESP8266/README_fr.md @@ -10,8 +10,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.8.1 disponible -Version 2.8.1 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.8.2 disponible +Version 2.8.2 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/IRremoteESP8266/ReleaseNotes.md b/lib/IRremoteESP8266/ReleaseNotes.md index 9c8d7df98..5fd04c726 100644 --- a/lib/IRremoteESP8266/ReleaseNotes.md +++ b/lib/IRremoteESP8266/ReleaseNotes.md @@ -1,5 +1,38 @@ # Release Notes +## _v2.8.2 (20220314)_ + +**[Bug Fixes]** +- ESP32-C3: Fix reboot/crashes on ESP32-C3s when receiving. (#1768 #1751) + +**[Features]** +- HITACHI_AC296: Add `IRac` class support & tests. (#1776 #1758 #1757) +- Support for Hitachi RAS-70YHA3 (remote RAR-3U3) (#1758 #1757) +- LG: Add Swing Toggle support for Model `LG6711A20083V` (#1771 #1770) +- IRMQTTServer: add `MQTT_SERVER_AUTODETECT_ENABLE` via mqtt mDNS (#1769) +- Experimental basic support for Kelon 168 bit / 21 byte protocol. (#1747 #1745 #1744) +- MitsubishiAC: Tweak repeat gap timing. (#1760 #1759) +- Gree YAP0F8 (Detected as Kelvinator) vertical position set support (#1756) +- Make KELON (48 bit) protocol decoding stricter. (#1746 #1744) +- IRMQTTServer V1.6.1 (#1740 #1739 #1729) +- HITACHI_AC264: Add minimal detailed support. (#1735 #1729) +- LG2: Improve Light toggle msg handling. (#1738 #1737) +- MIDEA: Add support for Quiet, Clean & Freeze Protect controls. (#1734 #1733) +- Add basic support for HITACHI_AC264 264bit protocol. (#1730 #1729) +- ESP32-C3: Work around for some C3 specific compiler issues again. (#1732 #1695) + +**[Misc]** +- MIDEA: Update supported devices (#1774 #1773 #1716) +- Update devices supported by ELECTRA_AC (#1766 #1765) +- Improve documentation for `encodePioneer()` (#1761 #1749) +- Update (un)supported DAIKIN128 devices. (#1752) +- Refactor `decodeCOOLIX()` code & add another test case. (#1750 #1748) +- Simplify code based on state_t being initialised by default. (#1736 #1699) +- Add comments to help Teknopoint users. (#1731 #1728) +- Fix library version string calculation. (#1727 #1725) +- Confirm we can reproduce `TurnOnFujitsuAC.ino` via IRac/IRMQTTServer. (#1726 #1701) + + ## _v2.8.1 (20220101)_ **[Bug Fixes]** diff --git a/lib/IRremoteESP8266/SupportedProtocols.md b/lib/IRremoteESP8266/SupportedProtocols.md index 0b6fb06c1..509e7cd50 100644 --- a/lib/IRremoteESP8266/SupportedProtocols.md +++ b/lib/IRremoteESP8266/SupportedProtocols.md @@ -1,6 +1,6 @@ <!--- WARNING: Do NOT edit this file directly. It is generated by './tools/scrape_supported_devices.py'. - Last generated: Fri 31 Dec 2021 21:49:00 +0000 ---> + Last generated: Mon 14 Mar 2022 06:52:21 +0000 ---> # IR Protocols supported by this library | Protocol | Brand | Model | A/C Model | Detailed A/C Support | @@ -22,12 +22,13 @@ | [Coolix](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.cpp) | **[Tokio](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.h)** | AATOEMF17-12CHR1SW split-type RG51\|50/BGE Remote | | Yes | | [Coolix](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.cpp) | **[Toshiba](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.h)** | RAS-4M27YAV-E A/C<BR>RAS-M10YKV-E A/C<BR>RAS-M13YKV-E A/C<BR>WH-E1YE remote | | Yes | | [Corona](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Corona.cpp) | **[Corona](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Corona.h)** | AR-01 remote<BR>CSH-N2211 A/C<BR>CSH-N2511 A/C<BR>CSH-N2811 A/C<BR>CSH-N4011 A/C | | Yes | -| [Daikin](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Daikin.cpp) | **[Daikin](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Daikin.h)** | 17 Series A/C (DAIKIN128)<BR>ARC423A5 remote (DAIKIN160)<BR>ARC433** remote (DAIKIN)<BR>ARC433B69 remote (DAIKIN216)<BR>ARC466A33 remote (DAIKIN)<BR>ARC477A1 remote (DAIKIN2)<BR>ARC480A5 remote (DAIKIN152)<BR>ARC484A4 remote (DAIKIN216)<BR>BRC4C151 remote (DAIKIN176)<BR>BRC4C153 remote (DAIKIN176)<BR>BRC52B63 remote (DAIKIN128)<BR>DGS01 remote (DAIKIN64)<BR>FFN-C/FCN-F Series A/C (DAIKIN64)<BR>FFQ35B8V1B A/C (DAIKIN176)<BR>FTE12HV2S A/C<BR>FTQ60TV16U2 A/C (DAIKIN216)<BR>FTWX35AXV1 A/C (DAIKIN64)<BR>FTXB09AXVJU A/C (DAIKIN128)<BR>FTXB12AXVJU A/C (DAIKIN128)<BR>FTXM-M A/C (DAIKIN)<BR>FTXZ25NV1B A/C (DAIKIN2)<BR>FTXZ35NV1B A/C (DAIKIN2)<BR>FTXZ50NV1B A/C (DAIKIN2)<BR>M Series A/C (DAIKIN) | | Yes | +| [Daikin](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Daikin.cpp) | **[Daikin](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Daikin.h)** | 17 Series FTXB09AXVJU A/C (DAIKIN128)<BR>17 Series FTXB12AXVJU A/C (DAIKIN128)<BR>17 Series FTXB24AXVJU A/C (NOT SUPPORTED)<BR>ARC423A5 remote (DAIKIN160)<BR>ARC433** remote (DAIKIN)<BR>ARC433B69 remote (DAIKIN216)<BR>ARC466A33 remote (DAIKIN)<BR>ARC477A1 remote (DAIKIN2)<BR>ARC480A5 remote (DAIKIN152)<BR>ARC484A4 remote (DAIKIN216)<BR>BRC4C151 remote (DAIKIN176)<BR>BRC4C153 remote (DAIKIN176)<BR>BRC52B63 remote (DAIKIN128)<BR>DGS01 remote (DAIKIN64)<BR>FFN-C/FCN-F Series A/C (DAIKIN64)<BR>FFQ35B8V1B A/C (DAIKIN176)<BR>FTE12HV2S A/C<BR>FTQ60TV16U2 A/C (DAIKIN216)<BR>FTWX35AXV1 A/C (DAIKIN64)<BR>FTXM-M A/C (DAIKIN)<BR>FTXZ25NV1B A/C (DAIKIN2)<BR>FTXZ35NV1B A/C (DAIKIN2)<BR>FTXZ50NV1B A/C (DAIKIN2)<BR>M Series A/C (DAIKIN) | | Yes | | [Delonghi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Delonghi.cpp) | **[Delonghi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Delonghi.h)** | PAC A95 | | Yes | | [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<BR>CZ-S38D LED Light<BR>CZ-S50D LED Light<BR>RCZ01 remote | | - | | [Ecoclim](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Ecoclim.cpp) | **[EcoClim](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Ecoclim.h)** | HYSFR-P348 remote<BR>ZC200DPO A/C | | Yes | +| [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[AEG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | Chillflex Pro AXP26U338CW A/C | | Yes | | [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[AUX](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | KFR-35GW/BpNFW=3 A/C<BR>YKR-T/011 remote | | Yes | | [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[Centek](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | SCT-65Q09 A/C<BR>YKR-P/002E remote | | Yes | | [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | Classic INV 17 / AXW12DCS A/C<BR>YKR-M/003E remote | | Yes | @@ -52,15 +53,17 @@ | [Haier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Haier.cpp) | **[Daichi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Haier.h)** | D-H A/C (HAIER_AC176) | | Yes | | [Haier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Haier.cpp) | **[Haier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Haier.h)** | HSU-09HMC203 A/C (HAIER_AC_YRW02)<BR>HSU07-HEA03 remote (HAIER_AC)<BR>V9014557 M47 8D remote (HAIER_AC176)<BR>YR-W02 remote (HAIER_AC_YRW02) | | Yes | | [Haier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Haier.cpp) | **[Mabe](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Haier.h)** | MMI18HDBWCA6MI8 A/C (HAIER_AC176)<BR>V12843 HJ200223 remote (HAIER_AC176) | | Yes | -| [Hitachi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Hitachi.cpp) | **[Hitachi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Hitachi.h)** | KAZE-312KSDP A/C (HITACHI_AC1)<BR>LT0541-HTA remote (HITACHI_AC1)<BR>PC-LH3B (HITACHI_AC3)<BR>R-LT0541-HTA/Y.K.1.1-1 V2.3 remote (HITACHI_AC1)<BR>RAR-8P2 remote (HITACHI_AC424)<BR>RAS-22NK A/C (HITACHI_AC344)<BR>RAS-35THA6 remote<BR>RAS-AJ25H A/C (HITACHI_AC424)<BR>RF11T1 remote (HITACHI_AC344)<BR>Series VI A/C (Circa 2007) (HITACHI_AC1) | | Yes | +| [Hitachi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Hitachi.cpp) | **[Hitachi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Hitachi.h)** | KAZE-312KSDP A/C (HITACHI_AC1)<BR>LT0541-HTA remote (HITACHI_AC1)<BR>PC-LH3B (HITACHI_AC3)<BR>R-LT0541-HTA/Y.K.1.1-1 V2.3 remote (HITACHI_AC1)<BR>RAK-25NH5 A/C (HITACHI_AC264)<BR>RAR-2P2 remote (HITACHI_AC264)<BR>RAR-3U3 remote (HITACHI_AC296)<BR>RAR-8P2 remote (HITACHI_AC424)<BR>RAS-22NK A/C (HITACHI_AC344)<BR>RAS-35THA6 remote<BR>RAS-70YHA3 A/C (HITACHI_AC296)<BR>RAS-AJ25H A/C (HITACHI_AC424)<BR>RF11T1 remote (HITACHI_AC344)<BR>Series VI A/C (Circa 2007) (HITACHI_AC1) | | Yes | | [Inax](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Inax.cpp) | **Lixil** | Inax DT-BA283 Toilet | | - | | [JVC](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_JVC.cpp) | **JVC** | PTU94023B remote | | - | -| [Kelon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelon.cpp) | **[Kelon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelon.h)** | ON/OFF 9000-12000 | | Yes | +| [Kelon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelon.cpp) | **[Hisense](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelon.h)** | AST-09UW4RVETG00A A/C (KELON168) | | Yes | +| [Kelon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelon.cpp) | **[Kelon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelon.h)** | AST-09UW4RVETG00A A/C (KELON168)<BR>DG11R2-01 remote (KELON168)<BR>ON/OFF 9000-12000 (KELON) | | Yes | +| [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | YAP0F8 remote | | Yes | | [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Green](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | YAPOF3 remote | | Yes | | [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | KSV26CRC A/C<BR>KSV26HRC A/C<BR>KSV35CRC A/C<BR>KSV35HRC A/C<BR>KSV53HRC A/C<BR>KSV62HRC A/C<BR>KSV70CRC A/C<BR>KSV70HRC A/C<BR>KSV80HRC A/C<BR>YALIF Remote | | Yes | | [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Sharp](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | A5VEY A/C<BR>YB1FA remote | | Yes | -| [LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.cpp) | **[General Electric](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.h)** | 6711AR2853M A/C Remote (LG)<BR>AG1BH09AW101 Split A/C (LG) | | Yes | -| [LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.cpp) | **[LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.h)** | 6711A20083V remote (LG)<BR>A4UW30GFA2 A/C (LG2 - AKB74955603 & AKB73757604)<BR>AKB73315611 remote (LG2 - AKB74955603)<BR>AKB73757604 remote (LG2 - AKB73757604)<BR>AKB74395308 remote (LG2)<BR>AKB74955603 remote (LG2 - AKB74955603)<BR>AKB75215403 remote (LG2)<BR>AMNW09GSJA0 A/C (LG2 - AKB74955603)<BR>AMNW24GTPA1 A/C (LG2 - AKB73757604)<BR>MS05SQ NW0 A/C (LG2 - AKB74955603)<BR>S4-W12JA3AA A/C (LG2) | | Yes | +| [LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.cpp) | **[General Electric](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.h)** | 6711AR2853M Remote (LG - GE6711AR2853M)<BR>AG1BH09AW101 A/C (LG - GE6711AR2853M) | | Yes | +| [LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.cpp) | **[LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.h)** | 6711A20083V remote (LG - LG6711A20083V)<BR>A4UW30GFA2 A/C (LG2 - AKB74955603 & AKB73757604)<BR>AKB73315611 remote (LG2 - AKB74955603)<BR>AKB73757604 remote (LG2 - AKB73757604)<BR>AKB74395308 remote (LG2)<BR>AKB74955603 remote (LG2 - AKB74955603)<BR>AKB75215403 remote (LG2)<BR>AMNW09GSJA0 A/C (LG2 - AKB74955603)<BR>AMNW24GTPA1 A/C (LG2 - AKB73757604)<BR>MS05SQ NW0 A/C (LG2 - AKB74955603)<BR>S4-W12JA3AA A/C (LG2)<BR>TS-H122ERM1 remote (LG - LG6711A20083V) | | Yes | | [Lasertag](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Lasertag.cpp) | **Lasertag** | Phaser emitters | | - | | [Lego](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Lego.cpp) | **LEGO Power Functions** | IR Receiver | | - | | [Lutron](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Lutron.cpp) | **Lutron** | MIR-ITFS remote<BR>MIR-ITFS-F remote<BR>MIR-ITFS-LF remote<BR>SP-HT remote | | - | @@ -71,6 +74,7 @@ | [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Danby](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | DAC080BGUWDB (MIDEA)<BR>DAC100BGUWDB (MIDEA)<BR>DAC120BGUWDB (MIDEA)<BR>R09C/BCGE remote (MIDEA) | | Yes | | [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Kaysun](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | Casual CF A/C (MIDEA) | | Yes | | [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Keystone](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | RG57H4(B)BGEF remote (MIDEA) | | Yes | +| [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Lennox](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | M22A indoor split A/C (MIDEA)<BR>M33A indoor split A/C (MIDEA)<BR>M33B indoor split A/C (MIDEA)<BR>MCFA indoor split A/C (MIDEA)<BR>MCFB indoor split A/C (MIDEA)<BR>MMDA indoor split A/C (MIDEA)<BR>MMDB indoor split A/C (MIDEA)<BR>MWMA indoor split A/C (MIDEA)<BR>MWMA009S4-3P A/C (MIDEA)<BR>MWMA012S4-3P A/C (MIDEA)<BR>MWMB indoor split A/C (MIDEA)<BR>RG57A6/BGEFU1 remote (MIDEA) | | Yes | | [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)<BR>RUBO18GMFILCAD A/C (18K BTU) (MIDEA)<BR>RYBO12GMFILCAD A/C (12K BTU) (MIDEA)<BR>UB018GMFILCFHD A/C (12K BTU) (MIDEA)<BR>WS012GMFI22HLD A/C (12K BTU) (MIDEA)<BR>WS018GMFI22HLD A/C (12K BTU) (MIDEA) | | Yes | @@ -80,7 +84,7 @@ | [Mirage](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mirage.cpp) | **[Mirage](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mirage.h)** | VLU series A/C | KKG29AC1<BR>KKG9AC1 | Yes | | [Mirage](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mirage.cpp) | **[Tronitechnik](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mirage.h)** | KKG29A-C1 remote<BR>Reykir 9000 A/C | KKG29AC1<BR>KKG9AC1 | Yes | | [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)<BR>KM14A 0179213 remote<BR>MS-GK24VA A/C<BR>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)<BR>KPOA remote (MITSUBISHI112)<BR>MLZ-RX5017AS A/C (MITSUBISHI_AC)<BR>MSH-A24WV A/C (MITSUBISHI112)<BR>MSZ-FHnnVE A/C (MITSUBISHI_AC)<BR>MSZ-GV2519 A/C (MITSUBISHI_AC)<BR>MSZ-SF25VE3 A/C (MITSUBISHI_AC)<BR>MSZ-ZW4017S A/C (MITSUBISHI_AC)<BR>MUH-A24WV A/C (MITSUBISHI112)<BR>PEAD-RP71JAA Ducted A/C (MITSUBISHI136)<BR>RH151/M21ED6426 remote (MITSUBISHI_AC)<BR>SG153/M21EDF426 remote (MITSUBISHI_AC)<BR>SG15D remote (MITSUBISHI_AC) | | 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)<BR>KPOA remote (MITSUBISHI112)<BR>MLZ-RX5017AS A/C (MITSUBISHI_AC)<BR>MSH-A24WV A/C (MITSUBISHI112)<BR>MSZ-FHnnVE A/C (MITSUBISHI_AC)<BR>MSZ-GV2519 A/C (MITSUBISHI_AC)<BR>MSZ-SF25VE3 A/C (MITSUBISHI_AC)<BR>MSZ-ZW4017S A/C (MITSUBISHI_AC)<BR>MUH-A24WV A/C (MITSUBISHI112)<BR>PEAD-RP71JAA Ducted A/C (MITSUBISHI136)<BR>RH151 remote (MITSUBISHI_AC)<BR>RH151/M21ED6426 remote (MITSUBISHI_AC)<BR>SG153/M21EDF426 remote (MITSUBISHI_AC)<BR>SG15D 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)<BR>RLA502A700B remote (152 bit)<BR>SRKxxZJ-S A/C (88 bit)<BR>SRKxxZM-S A/C (152 bit)<BR>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 | | - | @@ -114,7 +118,7 @@ | [Tcl](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Tcl.cpp) | **[Teknopoint](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Tcl.h)** | Allegro SSA-09H A/C (GZ055BE1)<BR>GZ-055B-E1 remote (GZ055BE1) | GZ055BE1<BR>TAC09CHSD | Yes | | [Technibel](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Technibel.cpp) | **[Technibel](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Technibel.h)** | IRO PLUS | | Yes | | [Teco](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Teco.cpp) | **[Alaska](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Teco.h)** | SAC9010QC A/C<BR>SAC9010QC remote | | Yes | -| [Teknopoint](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Teknopoint.cpp) | **Teknopoint** | Allegro SSA-09H A/C<BR>GZ-055B-E1 remote | | - | +| [Teknopoint](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Teknopoint.cpp) | **Teknopoint** | Allegro SSA-09H A/C<BR>GZ-055B-E1 remote<BR>GZ01-BEJ0-000 remote | | - | | [Toshiba](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Toshiba.cpp) | **[Carrier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Toshiba.h)** | 42NQV025M2 / 38NYV025M2 A/C<BR>42NQV035M2 / 38NYV035M2 A/C<BR>42NQV050M2 / 38NYV050M2 A/C<BR>42NQV060M2 / 38NYV060M2 A/C | | Yes | | [Toshiba](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Toshiba.cpp) | **[Toshiba](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Toshiba.h)** | Akita EVO II<BR>RAS 18SKP-ES<BR>RAS-2558V A/C<BR>RAS-25SKVP2-ND A/C<BR>RAS-B13N3KV2<BR>RAS-B13N3KVP-E<BR>WC-L03SE<BR>WH-TA01JE remote<BR>WH-TA04NE<BR>WH-UB03NJ remote | | Yes | | [Transcold](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Transcold.cpp) | **[Transcold](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Transcold.h)** | M1-F-NO-6 A/C | | Yes | @@ -179,12 +183,15 @@ - HITACHI_AC - HITACHI_AC1 - HITACHI_AC2 +- HITACHI_AC264 +- HITACHI_AC296 - HITACHI_AC3 - HITACHI_AC344 - HITACHI_AC424 - INAX - JVC - KELON +- KELON168 - KELVINATOR - LASERTAG - LEGOPF diff --git a/lib/IRremoteESP8266/assets/images/banner.svg b/lib/IRremoteESP8266/assets/images/banner.svg new file mode 100644 index 000000000..d1e2c3592 --- /dev/null +++ b/lib/IRremoteESP8266/assets/images/banner.svg @@ -0,0 +1,142 @@ +<svg class="card-svg-wrapper" width="1280px" height="640px" viewBox="0 0 640 320" xmlns="http://www.w3.org/2000/svg"><foreignObject x="0" y="0" width="640" height="320"><div xmlns="http://www.w3.org/1999/xhtml" style="font-family:KoHo;background-image:url(&#x27;data:image/svg+xml,%3Csvg%20width%3D%22304%22%20height%3D%22304%22%20viewBox%3D%220%200%20304%20304%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Ctitle%3EArtboard%203%20Copy%202%3C%2Ftitle%3E%3Cpath%20d%3D%22M44.1%20224c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4H0v-2h44.1zm160%2048c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4H82v-2h122.1zm57.8-46c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H304v2h-42.1zm0%2016c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H304v2h-42.1zm6.2-114c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4h-86.2c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204h86.2zm-256-48c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4H0v-2h12.1zm185.8%2034c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204h86.2c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4h-86.2zM258%2012.1c2.282.463%204%202.481%204%204.9%200%202.761-2.239%205-5%205s-5-2.239-5-5c0-2.419%201.718-4.437%204-4.9V0h2v12.1zm-64%20208c2.282.463%204%202.481%204%204.9%200%202.761-2.239%205-5%205s-5-2.239-5-5c0-2.419%201.718-4.437%204-4.9v-54.2c-2.282-.463-4-2.481-4-4.9%200-2.761%202.239-5%205-5s5%202.239%205%205c0%202.419-1.718%204.437-4%204.9v54.2zm48-198.2c2.282-.463%204-2.481%204-4.9%200-2.761-2.239-5-5-5s-5%202.239-5%205c0%202.419%201.718%204.437%204%204.9V82h64v-2h-62V21.9zm16%2016c2.282-.463%204-2.481%204-4.9%200-2.761-2.239-5-5-5s-5%202.239-5%205c0%202.419%201.718%204.437%204%204.9V66h48v-2h-46V37.9zm-128%2096c2.282-.463%204-2.481%204-4.9%200-2.761-2.239-5-5-5s-5%202.239-5%205c0%202.419%201.718%204.437%204%204.9V210h16v10.1c-2.282.463-4%202.481-4%204.9%200%202.761%202.239%205%205%205s5-2.239%205-5c0-2.419-1.718-4.437-4-4.9V208h-16v-74.1zm-5.9-21.9c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4H114v48H85.9c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H112v-48h12.1zm-6.2%20130c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H176v-74.1c-2.282-.463-4-2.481-4-4.9%200-2.761%202.239-5%205-5s5%202.239%205%205c0%202.419-1.718%204.437-4%204.9V242h-60.1zm-16-64c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H114v48h10.1c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4H112v-48h-10.1zM66%20284.1c2.282.463%204%202.481%204%204.9%200%202.761-2.239%205-5%205s-5-2.239-5-5c0-2.419%201.718-4.437%204-4.9V274H50v30h-2v-32h18v12.1zM236.1%20176c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H274v44.1c2.282.463%204%202.481%204%204.9%200%202.761-2.239%205-5%205s-5-2.239-5-5c0-2.419%201.718-4.437%204-4.9V146h-10.1zm-64%2096c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H208v-80h16v-14h-42.1c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H226v18h-16v80h-12.1zm86.2-210c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4H272V0h2v32h10.1zM98%20101.9c2.282-.463%204-2.481%204-4.9%200-2.761-2.239-5-5-5s-5%202.239-5%205c0%202.419%201.718%204.437%204%204.9V144H53.9c-.463-2.282-2.481-4-4.9-4-2.761%200-5%202.239-5%205s2.239%205%205%205c2.419%200%204.437-1.718%204.9-4H98v-44.1zM53.9%2034c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H80V0h2v34H53.9zm60.1%203.9c2.282-.463%204-2.481%204-4.9%200-2.761-2.239-5-5-5s-5%202.239-5%205c0%202.419%201.718%204.437%204%204.9V64H80v64H69.9c-.463-2.282-2.481-4-4.9-4-2.761%200-5%202.239-5%205s2.239%205%205%205c2.419%200%204.437-1.718%204.9-4H82V66h32V37.9zM101.9%2082c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H128V37.9c-2.282-.463-4-2.481-4-4.9%200-2.761%202.239-5%205-5s5%202.239%205%205c0%202.419-1.718%204.437-4%204.9V82h-28.1zm16-64c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H146v44.1c2.282.463%204%202.481%204%204.9%200%202.761-2.239%205-5%205s-5-2.239-5-5c0-2.419%201.718-4.437%204-4.9V18h-26.1zm102.2%20270c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4H98v14h-2v-16h124.1zM242%20149.9c2.282-.463%204-2.481%204-4.9%200-2.761-2.239-5-5-5s-5%202.239-5%205c0%202.419%201.718%204.437%204%204.9V162h16v30h-16v66h48v46h2v-48h-48v-62h16v-34h-16v-10.1zM53.9%2018c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H64V2H48V0h18v18H53.9zm112%2032c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H192V0h50v2h-48v48h-28.1zm-48-48c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5%200-.342.034-.677.1-1h2.07c-.11.313-.17.65-.17%201%200%201.657%201.343%203%203%203s3-1.343%203-3c0-.35-.06-.687-.17-1H178v34h-18V21.9c-2.282-.463-4-2.481-4-4.9%200-2.761%202.239-5%205-5s5%202.239%205%205c0%202.419-1.718%204.437-4%204.9V32h14V2h-58.1zm0%2096c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H137l32-32h39V21.9c-2.282-.463-4-2.481-4-4.9%200-2.761%202.239-5%205-5s5%202.239%205%205c0%202.419-1.718%204.437-4%204.9V66h-40.172l-32%2032H117.9zm28.1%2090.1c2.282.463%204%202.481%204%204.9%200%202.761-2.239%205-5%205s-5-2.239-5-5c0-2.419%201.718-4.437%204-4.9v-76.514L175.586%2080H224V21.9c-2.282-.463-4-2.481-4-4.9%200-2.761%202.239-5%205-5s5%202.239%205%205c0%202.419-1.718%204.437-4%204.9V82h-49.586L146%20112.414V188.1zm16%2032c2.282.463%204%202.481%204%204.9%200%202.761-2.239%205-5%205s-5-2.239-5-5c0-2.419%201.718-4.437%204-4.9v-99.514L184.586%2096H300.1c.398-1.96%201.94-3.502%203.9-3.9v2.07c-1.165.413-2%201.524-2%202.83s.835%202.417%202%202.83v2.07c-1.96-.398-3.502-1.94-3.9-3.9H185.414L162%20121.414V220.1zm-144-64c2.282.463%204%202.481%204%204.9%200%202.761-2.239%205-5%205s-5-2.239-5-5c0-2.419%201.718-4.437%204-4.9V152.586l48-48V48h32V0h2v50H66v55.414l-48%2048v2.686zM50%2053.9c2.282-.463%204-2.481%204-4.9%200-2.761-2.239-5-5-5s-5%202.239-5%205c0%202.419%201.718%204.437%204%204.9v42.686l-48%2048V210h28.1c.463%202.282%202.481%204%204.9%204%202.761%200%205-2.239%205-5s-2.239-5-5-5c-2.419%200-4.437%201.718-4.9%204H2v-62.586l48-48V53.9zm-16%2016c2.282-.463%204-2.481%204-4.9%200-2.761-2.239-5-5-5s-5%202.239-5%205c0%202.419%201.718%204.437%204%204.9v18.686l-32%2032v2.828l34-34V69.9zM12.1%2032c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4H9.414L0%2043.414v-2.828L8.586%2032H12.1zm265.8%2018c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204h18.686L304%2040.586v2.828L297.414%2050H277.9zm-16%20160c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H288v-71.414l16-16v2.828l-14%2014V210h-28.1zm-208%2032c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H64v-22.586L40.586%20194H21.9c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204h19.514L66%20216.586V242H53.9zm150.2%2014c.463-2.282%202.481-4%204.9-4%202.761%200%205%202.239%205%205s-2.239%205-5%205c-2.419%200-4.437-1.718-4.9-4H96v-56.598L56.598%20162H37.9c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204h19.502L98%20200.598V256h106.1zm-150.2%202c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204H80v-46.586L48.586%20178H21.9c-.463%202.282-2.481%204-4.9%204-2.761%200-5-2.239-5-5s2.239-5%205-5c2.419%200%204.437%201.718%204.9%204h27.514L82%20208.586V258H53.9zM97%20100c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0-16c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-48%2032c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm32%2048c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-16%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm32-16c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0-32c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16%2032c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm32%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0-16c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-16-64c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16%200c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16%2096c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16-144c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0%2032c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16-32c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16-16c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-96%200c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16-32c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm96%200c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-16-64c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16-16c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-32%200c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0-16c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-16%200c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-16%200c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-16%200c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zM49%2036c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-32%200c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm32%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zM33%2068c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16-48c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0%20240c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16%2032c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-16-64c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-16-32c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm80-176c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16%200c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-16-16c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm32%2048c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16-16c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0-32c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm112%20176c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm-16%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zM17%20180c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0%2016c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm0-32c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16%200c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zM17%2084c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm32%2064c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zm16-16c1.657%200%203-1.343%203-3s-1.343-3-3-3-3%201.343-3%203%201.343%203%203%203zM34%2039.793V0h-2v40.586L8.586%2064H0v2h9.414L34%2041.414v-1.621zM2%20300.1V258h14v46h2v-48H0V302.17c.313-.11.65-.17%201-.17%201.306%200%202.417.835%202.83%202H5.9c-.398-1.96-1.94-3.502-3.9-3.9zM34%20241v63h-2v-62H0v-2h34v1zM17%2018h1V0h-2v16H0v2h17zm273-2V0h-2v18h16v-2h-14zm-32%20273v15h-2v-14h-14v14h-2v-16h18v1zM0%2092.1c.323-.066.658-.1%201-.1%202.761%200%205%202.239%205%205s-2.239%205-5%205c-.342%200-.677-.034-1-.1v-2.07c.313.11.65.17%201%20.17%201.657%200%203-1.343%203-3s-1.343-3-3-3c-.35%200-.687.06-1%20.17V92.1zM80%20272h2v32h-2v-32zm37.9%2032c-.463-2.282-2.481-4-4.9-4-2.419%200-4.437%201.718-4.9%204h2.07c.413-1.165%201.524-2%202.83-2s2.417.835%202.83%202h2.07zM5.9%200c.066.323.1.658.1%201%200%202.761-2.239%205-5%205-.342%200-.677-.034-1-.1V3.83C.313%203.94.65%204%201%204c1.657%200%203-1.343%203-3%200-.35-.06-.687-.17-1H5.9zm294.2%200c-.066.323-.1.658-.1%201%200%202.419%201.718%204.437%204%204.9V3.83c-1.165-.413-2-1.524-2-2.83%200-.35.06-.687.17-1h-2.07zm3.9%20300.1c-1.96.398-3.502%201.94-3.9%203.9h2.07c.302-.852.978-1.528%201.83-1.83v-2.07z%22%20fill%3D%22%23eaeaea%22%20fill-opacity%3D%220.6%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E&#x27;)" class="jsx-1465808448 card-wrapper theme-light"><div class="jsx-1465808448 card-logo-wrapper"><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA5MDAgOTAwIiB3aWR0aD0iOTAwIiBoZWlnaHQ9IjkwMCI+Cgk8ZGVmcz4KCQk8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjcDEiPgoJCQk8cGF0aCBkPSJNMCAwTDkwMCAwTDkwMCA5MDBMMCA5MDBaIiAvPgoJCTwvY2xpcFBhdGg+Cgk8L2RlZnM+Cgk8c3R5bGU+CgkJdHNwYW4geyB3aGl0ZS1zcGFjZTpwcmUgfQoJCS5zaHAwIHsgZmlsbDogbm9uZTtzdHJva2U6ICM0ZjNlZTY7c3Ryb2tlLXdpZHRoOiAyMCB9CgkJLnNocDEgeyBmaWxsOiBub25lO3N0cm9rZTogIzRmM2VlNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6IDI4IH0KCQkuc2hwMiB7IGZpbGw6IG5vbmU7c3Ryb2tlOiAjNGYzZWU2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6IDI4IH0KCQkuc2hwMyB7IGZpbGw6IG5vbmU7c3Ryb2tlOiAjNGYzZWU2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6IDE2IH0KCQkuc2hwNCB7IGZpbGw6ICNmZmZmZmY7c3Ryb2tlOiAjNGYzZWU2O3N0cm9rZS13aWR0aDogMjggfQoJCS5zaHA1IHsgZmlsbDogI2ZmZmZmZjtzdHJva2U6ICM0ZjNlZTY7c3Ryb2tlLXdpZHRoOiAxOCB9Cgk8L3N0eWxlPgoJPGcgaWQ9IkFydGJvYXJkIDEiIGNsaXAtcGF0aD0idXJsKCNjcDEpIj4KCQk8ZyBpZD0iSVIiPgoJCQk8cGF0aCBpZD0iRWxsaXBzZSAxIiBjbGFzcz0ic2hwMCIgZD0iTTQ1MC40NyAyNjEuOTVDNDYwLjQxIDI2MS45NSA0NjguNDYgMjcwLjAxIDQ2OC40NiAyNzkuOTRDNDY4LjQ2IDI4OS44OCA0NjAuNDEgMjk3LjkzIDQ1MC40NyAyOTcuOTNDNDQwLjU0IDI5Ny45MyA0MzIuNDggMjg5Ljg4IDQzMi40OCAyNzkuOTRDNDMyLjQ4IDI3MC4wMSA0NDAuNTQgMjYxLjk1IDQ1MC40NyAyNjEuOTVaIiAvPgoJCQk8cGF0aCBpZD0iU2hhcGUgMSIgY2xhc3M9InNocDEiIGQ9Ik0zODcuMzQgMjE3LjQ3QzQwMi42NyAxOTYuODcgNDI3LjA1IDE4NC44MiA0NTIuNzYgMTg1LjQxQzQ3OS40OCAxODYuMDMgNTA0LjAyIDIwMC4yMSA1MTguMTMgMjIyLjc3IiAvPgoJCQk8cGF0aCBpZD0iU2hhcGUgOSIgY2xhc3M9InNocDIiIGQ9Ik02MTMuMDQgNDA3LjE4IiAvPgoJCQk8cGF0aCBpZD0iU2hhcGUgMiIgY2xhc3M9InNocDEiIGQ9Ik0zNTcuOTEgMTY4LjRDMzg0LjcyIDEzNy4xMyA0MjQuNSAxMTkuNDggNDY1Ljg1IDEyMS45NkM1MDEuOSAxMjQuMTEgNTM1LjE5IDE0MS4zNiA1NTguMzggMTY4LjgzIiAvPgoJCQk8cGF0aCBpZD0iU2hhcGUgMyIgY2xhc3M9InNocDEiIGQ9Ik0zMjcuMTYgMTIzLjkyQzM2MC42MyA4OC42NyA0MDYuNzQgNjguMDQgNDU1LjM4IDY3QzUwNi43OSA2NS45MSA1NTYuMTcgODYuODEgNTkxLjUgMTI0LjA3IiAvPgoJCTwvZz4KCQk8ZyBpZD0id2lyZXMiPgoJCQk8cGF0aCBpZD0iU2hhcGUgNiIgY2xhc3M9InNocDIiIGQ9Ik0yOTEgNDc0TDE2MCA0NzZMOTAgNDIyIiAvPgoJCQk8cGF0aCBpZD0iRWxsaXBzZSAzIiBjbGFzcz0ic2hwMyIgZD0iTTY1LjUgMzc1Qzc5LjAzIDM3NSA5MCAzODUuOTcgOTAgMzk5LjVDOTAgNDEzLjAzIDc5LjAzIDQyNCA2NS41IDQyNEM1MS45NyA0MjQgNDEgNDEzLjAzIDQxIDM5OS41QzQxIDM4NS45NyA1MS45NyAzNzUgNjUuNSAzNzVaIiAvPgoJCQk8cGF0aCBpZD0iRWxsaXBzZSAzIiBjbGFzcz0ic2hwMyIgZD0iTTk2LjUgNTIxQzExMC4wMyA1MjEgMTIxIDUzMS45NyAxMjEgNTQ1LjVDMTIxIDU1OS4wMyAxMTAuMDMgNTcwIDk2LjUgNTcwQzgyLjk3IDU3MCA3MiA1NTkuMDMgNzIgNTQ1LjVDNzIgNTMxLjk3IDgyLjk3IDUyMSA5Ni41IDUyMVoiIC8+CgkJCTxwYXRoIGlkPSJFbGxpcHNlIDMiIGNsYXNzPSJzaHAzIiBkPSJNMTMyLjUgNjU5QzE0Ni4wMyA2NTkgMTU3IDY2OS45NyAxNTcgNjgzLjVDMTU3IDY5Ny4wMyAxNDYuMDMgNzA4IDEzMi41IDcwOEMxMTguOTcgNzA4IDEwOCA2OTcuMDMgMTA4IDY4My41QzEwOCA2NjkuOTcgMTE4Ljk3IDY1OSAxMzIuNSA2NTlaIiAvPgoJCQk8cGF0aCBpZD0iU2hhcGUgNyIgY2xhc3M9InNocDIiIGQ9Ik0yOTEgNTQwTDEyOSA1NDUiIC8+CgkJCTxwYXRoIGlkPSJTaGFwZSA4IiBjbGFzcz0ic2hwMiIgZD0iTTI5NiA2MDBMMTk5IDYwNEwxNTMgNjU5IiAvPgoJCTwvZz4KCQk8ZyBpZD0id2lyZXMiPgoJCQk8cGF0aCBpZD0iU2hhcGUgNiIgY2xhc3M9InNocDIiIGQ9Ik02MDIgNDY4TDczMyA0NzBMODAzIDQxNiIgLz4KCQkJPHBhdGggaWQ9IkVsbGlwc2UgMyIgY2xhc3M9InNocDMiIGQ9Ik04MjcuNSAzNjlDODEzLjk3IDM2OSA4MDMgMzc5Ljk3IDgwMyAzOTMuNUM4MDMgNDA3LjAzIDgxMy45NyA0MTggODI3LjUgNDE4Qzg0MS4wMyA0MTggODUyIDQwNy4wMyA4NTIgMzkzLjVDODUyIDM3OS45NyA4NDEuMDMgMzY5IDgyNy41IDM2OVoiIC8+CgkJCTxwYXRoIGlkPSJFbGxpcHNlIDMiIGNsYXNzPSJzaHAzIiBkPSJNNzk2LjUgNTE1Qzc4Mi45NyA1MTUgNzcyIDUyNS45NyA3NzIgNTM5LjVDNzcyIDU1My4wMyA3ODIuOTcgNTY0IDc5Ni41IDU2NEM4MTAuMDMgNTY0IDgyMSA1NTMuMDMgODIxIDUzOS41QzgyMSA1MjUuOTcgODEwLjAzIDUxNSA3OTYuNSA1MTVaIiAvPgoJCQk8cGF0aCBpZD0iRWxsaXBzZSAzIiBjbGFzcz0ic2hwMyIgZD0iTTc2MC41IDY1M0M3NDYuOTcgNjUzIDczNiA2NjMuOTcgNzM2IDY3Ny41QzczNiA2OTEuMDMgNzQ2Ljk3IDcwMiA3NjAuNSA3MDJDNzc0LjAzIDcwMiA3ODUgNjkxLjAzIDc4NSA2NzcuNUM3ODUgNjYzLjk3IDc3NC4wMyA2NTMgNzYwLjUgNjUzWiIgLz4KCQkJPHBhdGggaWQ9IlNoYXBlIDciIGNsYXNzPSJzaHAyIiBkPSJNNjAyIDUzNEw3NjQgNTM5IiAvPgoJCQk8cGF0aCBpZD0iU2hhcGUgOCIgY2xhc3M9InNocDIiIGQ9Ik01OTcgNTk0TDY5NCA1OThMNzQwIDY1MyIgLz4KCQk8L2c+CgkJPHBhdGggaWQ9IlJvdW5kZWQgUmVjdGFuZ2xlIDEiIGNsYXNzPSJzaHA0IiBkPSJNMzYwLjg0IDMzNy4wOEw1MzIuNyAzMzcuMDhDNTYwLjMxIDMzNy4wOCA1ODIuNyAzNTkuNDYgNTgyLjcgMzg3LjA4TDU4Mi43IDcxNC4xNEM1ODIuNyA3NDEuNzUgNTYwLjMxIDc2NC4xNCA1MzIuNyA3NjQuMTRMMzYwLjg0IDc2NC4xNEMzMzMuMjMgNzY0LjE0IDMxMC44NCA3NDEuNzUgMzEwLjg0IDcxNC4xNEwzMTAuODQgMzg3LjA4QzMxMC44NCAzNTkuNDYgMzMzLjIzIDMzNy4wOCAzNjAuODQgMzM3LjA4Wk0zNzggNDg5WiIgLz4KCQk8ZyBpZD0iQnV0dG9ucyI+CgkJCTxwYXRoIGlkPSJFbGxpcHNlIDQiIGNsYXNzPSJzaHA1IiBkPSJNMzc4IDQ4OUMzODkuNiA0ODkgMzk5IDQ5OC40IDM5OSA1MTBDMzk5IDUyMS42IDM4OS42IDUzMSAzNzggNTMxQzM2Ni40IDUzMSAzNTcgNTIxLjYgMzU3IDUxMEMzNTcgNDk4LjQgMzY2LjQgNDg5IDM3OCA0ODlaTTM3OCA0ODlDMzg5LjYgNDg5IDM5OSA0OTguNCAzOTkgNTEwQzM5OSA1MjEuNiAzODkuNiA1MzEgMzc4IDUzMUMzNjYuNCA1MzEgMzU3IDUyMS42IDM1NyA1MTBDMzU3IDQ5OC40IDM2Ni40IDQ4OSAzNzggNDg5Wk0zNzggNDg5QzM4OS42IDQ4OSAzOTkgNDk4LjQgMzk5IDUxMEMzOTkgNTIxLjYgMzg5LjYgNTMxIDM3OCA1MzFDMzY2LjQgNTMxIDM1NyA1MjEuNiAzNTcgNTEwQzM1NyA0OTguNCAzNjYuNCA0ODkgMzc4IDQ4OVoiIC8+CgkJCTxwYXRoIGlkPSJFbGxpcHNlIDQiIGNsYXNzPSJzaHA1IiBkPSJNNTE0IDQ4OEM1MjUuNiA0ODggNTM1IDQ5Ny40IDUzNSA1MDlDNTM1IDUyMC42IDUyNS42IDUzMCA1MTQgNTMwQzUwMi40IDUzMCA0OTMgNTIwLjYgNDkzIDUwOUM0OTMgNDk3LjQgNTAyLjQgNDg4IDUxNCA0ODhaTTUxNCA0ODhDNTI1LjYgNDg4IDUzNSA0OTcuNCA1MzUgNTA5QzUzNSA1MjAuNiA1MjUuNiA1MzAgNTE0IDUzMEM1MDIuNCA1MzAgNDkzIDUyMC42IDQ5MyA1MDlDNDkzIDQ5Ny40IDUwMi40IDQ4OCA1MTQgNDg4Wk01MTQgNDg4QzUyNS42IDQ4OCA1MzUgNDk3LjQgNTM1IDUwOUM1MzUgNTIwLjYgNTI1LjYgNTMwIDUxNCA1MzBDNTAyLjQgNTMwIDQ5MyA1MjAuNiA0OTMgNTA5QzQ5MyA0OTcuNCA1MDIuNCA0ODggNTE0IDQ4OFoiIC8+CgkJCTxwYXRoIGlkPSJFbGxpcHNlIDQiIGNsYXNzPSJzaHA1IiBkPSJNNTE0IDU3OEM1MjUuNiA1NzggNTM1IDU4Ny40IDUzNSA1OTlDNTM1IDYxMC42IDUyNS42IDYyMCA1MTQgNjIwQzUwMi40IDYyMCA0OTMgNjEwLjYgNDkzIDU5OUM0OTMgNTg3LjQgNTAyLjQgNTc4IDUxNCA1NzhaTTUxNCA1NzhDNTI1LjYgNTc4IDUzNSA1ODcuNCA1MzUgNTk5QzUzNSA2MTAuNiA1MjUuNiA2MjAgNTE0IDYyMEM1MDIuNCA2MjAgNDkzIDYxMC42IDQ5MyA1OTlDNDkzIDU4Ny40IDUwMi40IDU3OCA1MTQgNTc4Wk01MTQgNTc4QzUyNS42IDU3OCA1MzUgNTg3LjQgNTM1IDU5OUM1MzUgNjEwLjYgNTI1LjYgNjIwIDUxNCA2MjBDNTAyLjQgNjIwIDQ5MyA2MTAuNiA0OTMgNTk5QzQ5MyA1ODcuNCA1MDIuNCA1NzggNTE0IDU3OFoiIC8+CgkJCTxwYXRoIGlkPSJFbGxpcHNlIDQiIGNsYXNzPSJzaHA1IiBkPSJNMzc4IDU3OUMzODkuNiA1NzkgMzk5IDU4OC40IDM5OSA2MDBDMzk5IDYxMS42IDM4OS42IDYyMSAzNzggNjIxQzM2Ni40IDYyMSAzNTcgNjExLjYgMzU3IDYwMEMzNTcgNTg4LjQgMzY2LjQgNTc5IDM3OCA1NzlaTTM3OCA1NzlDMzg5LjYgNTc5IDM5OSA1ODguNCAzOTkgNjAwQzM5OSA2MTEuNiAzODkuNiA2MjEgMzc4IDYyMUMzNjYuNCA2MjEgMzU3IDYxMS42IDM1NyA2MDBDMzU3IDU4OC40IDM2Ni40IDU3OSAzNzggNTc5Wk0zNzggNTc5QzM4OS42IDU3OSAzOTkgNTg4LjQgMzk5IDYwMEMzOTkgNjExLjYgMzg5LjYgNjIxIDM3OCA2MjFDMzY2LjQgNjIxIDM1NyA2MTEuNiAzNTcgNjAwQzM1NyA1ODguNCAzNjYuNCA1NzkgMzc4IDU3OVoiIC8+CgkJCTxwYXRoIGlkPSJFbGxpcHNlIDQiIGNsYXNzPSJzaHA1IiBkPSJNMzc4IDM5NUMzODkuNiAzOTUgMzk5IDQwNC40IDM5OSA0MTZDMzk5IDQyNy42IDM4OS42IDQzNyAzNzggNDM3QzM2Ni40IDQzNyAzNTcgNDI3LjYgMzU3IDQxNkMzNTcgNDA0LjQgMzY2LjQgMzk1IDM3OCAzOTVaTTM3OCAzOTVDMzg5LjYgMzk1IDM5OSA0MDQuNCAzOTkgNDE2QzM5OSA0MjcuNiAzODkuNiA0MzcgMzc4IDQzN0MzNjYuNCA0MzcgMzU3IDQyNy42IDM1NyA0MTZDMzU3IDQwNC40IDM2Ni40IDM5NSAzNzggMzk1Wk0zNzggMzk1QzM4OS42IDM5NSAzOTkgNDA0LjQgMzk5IDQxNkMzOTkgNDI3LjYgMzg5LjYgNDM3IDM3OCA0MzdDMzY2LjQgNDM3IDM1NyA0MjcuNiAzNTcgNDE2QzM1NyA0MDQuNCAzNjYuNCAzOTUgMzc4IDM5NVoiIC8+CgkJCTxwYXRoIGlkPSJFbGxpcHNlIDQiIGNsYXNzPSJzaHA1IiBkPSJNNTE0IDM5NUM1MjUuNiAzOTUgNTM1IDQwNC40IDUzNSA0MTZDNTM1IDQyNy42IDUyNS42IDQzNyA1MTQgNDM3QzUwMi40IDQzNyA0OTMgNDI3LjYgNDkzIDQxNkM0OTMgNDA0LjQgNTAyLjQgMzk1IDUxNCAzOTVaTTUxNCAzOTVDNTI1LjYgMzk1IDUzNSA0MDQuNCA1MzUgNDE2QzUzNSA0MjcuNiA1MjUuNiA0MzcgNTE0IDQzN0M1MDIuNCA0MzcgNDkzIDQyNy42IDQ5MyA0MTZDNDkzIDQwNC40IDUwMi40IDM5NSA1MTQgMzk1Wk01MTQgMzk1QzUyNS42IDM5NSA1MzUgNDA0LjQgNTM1IDQxNkM1MzUgNDI3LjYgNTI1LjYgNDM3IDUxNCA0MzdDNTAyLjQgNDM3IDQ5MyA0MjcuNiA0OTMgNDE2QzQ5MyA0MDQuNCA1MDIuNCAzOTUgNTE0IDM5NVoiIC8+CgkJPC9nPgoJPC9nPgo8L3N2Zz4=" alt="Custom logo" class="jsx-1465808448"/></div><p style="font-size:40px" class="jsx-1465808448 card-name-wrapper"><span class="jsx-1465808448 card-name-owner"></span><span class="jsx-1465808448 card-name-name">IRremoteESP8266</span></p><p class="jsx-1465808448 card-description-wrapper">Infrared remote library for ESP8266/ESP32: send and receive infrared signals with multiple protocols</p></div><style id="__jsx-1465808448">.card-svg-wrapper{width:640px !important;height:320px !important;margin:0;}.card-wrapper.jsx-1465808448{width:640px;height:320px;margin:0;padding:10px 30px;box-sizing:border-box;font-display:block;color:#000;text-align:center;background:#fff;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;line-height:1.5;}.card-wrapper.jsx-1465808448{margin:0 auto;}.card-wrapper.jsx-1465808448 *.jsx-1465808448{box-sizing:border-box;pointer-events:none;}.card-wrapper.theme-dark.jsx-1465808448{color:#fff;background:#000;}.card-logo-wrapper.jsx-1465808448{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:10px 0 0;}.card-logo-wrapper.jsx-1465808448>img.jsx-1465808448{height:100px;}.card-logo-wrapper.jsx-1465808448>i.jsx-1465808448{font-size:90px;}.card-logo-wrapper.jsx-1465808448>i.jsx-1465808448:first-child{font-size:100px;}.card-logo-divider.jsx-1465808448{color:#bbb;font-size:30px;margin:0 20px;font-family:'Times New Roman',Verdana;}.card-name-wrapper.jsx-1465808448{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:10px 0 0;font-size:40px;font-weight:500;}.card-name-wrapper.jsx-1465808448>span.jsx-1465808448{display:inline-block;white-space:nowrap;}.card-name-wrapper.jsx-1465808448 .card-name-owner.jsx-1465808448{font-weight:200;}.card-description-wrapper.jsx-1465808448{margin:10px 0 0;font-size:17px;font-weight:400;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;}.card-badges-wrapper.jsx-1465808448{margin:25px 0 0;}.card-badges-wrapper.jsx-1465808448>*{margin:0 5px;}</style></foreignObject> + <defs><style type="text/css"> + @font-face { + font-family: devicon; + src: url('data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAABmgAA0AAAAALyQAABlIAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACDZhEICtA4vHgLMgABNgIkAzwEIAWDGweBeRtJJFGUsFo02RcJ2ZwxO3U50248AuQGx98ZIcnsEc35P3t3Eb+7hBh2CZY2WBIgeJOQgBeC1xGtYFpD6k+gqlRU/q+owXvePnF8Yz80aTlp+VMBR0JOmQKg3zjPJraIdkgKzxdUmmIS9VFLvsRtUUYXWo9QB/01Afqf3i2D3h/cOVIxOVFBTmzbfp5L8jv5fTMTQSqJs2wlwlIxpCYjS3o163UV+IBXTC1zdjfJpfTiXkiaMODU7e6l7O7n53bTLq0A96GmH6VVhREMQt0/7flQP6G0LhxGVNeEQ0mkQuLQLGNzAVYMK8j7QXa16kCMfAgZAID64X6fH7eT93TL3zhAAoQI5RUxQIBAwYm1JQFw/CPqAZYavgy7BgBfF0eCvgUT4kFvVogEaokyr+BnBs/sFDf4+BTAmbVaPOduWQLAK46qCQRcaPYHZv/5FwIC5oPrh9AP5g8RH8Z/aP34e7+t3zHAG2AG9ANRAyMGRn1b++2cb68M/js4CABAnEb+fRp8p/pGdVt1S3VTtUbVq5QpriguKVjyH+Xv5Q/kx+RHZX2yL2VpKh0kf+hRlBwPiB2N8AiETQsD6HeGgGwoAjQ4CEkWrITBoCxcNBAjua0QIagbuECM+RjggKEbw9tkSflswYENBIhwVWFwn9hdLDR8hSaON7kTFkNWANuVraDQg6dcSrkQTESJCGqEeAWsUXRWFtt3URGtTHEze8aIBrN5yTweLbHrW3H30LgrFUpS4i3UCElG7yKn+BIFR0mJUO5n0D51EryFKCDMPJeIi3CgGiEUuBo5ykNIneVSPE8L9JsNrps5QACSW0KSigEVGIHYjSQBPcCAsqFY1R4mgvxUtVCYBAI9kHXgJiYlZLy4YXBKaQWGxJwmp9B8psVNrPwVfyHIgqMUDnFEjMa6zxGTDjJqEWDOsIysqpRSc2gMylC5as90sLSlXLa34UCFSJgSoAC4IKxyEZowLi86Kwkvx7KPGVBWVUCrBJVaGXSK64iMXHM1UjlnqCOTZKcxFunkVUamrhig+3oX/jLOtqOaW9GVUmd5MQQyLOyakG4mjU3/1NkSyXZ+WXujzyx3BmwrhvoWQlzx+w2LFxKdhuSdYDbgokynXDdsIB3GiIibTXi5Ah2BYfC+D1pTXi72v7pFvNf4CIf8GnSUGFYJA5jxMYLWPmqxdJt8zGsGCIg9D7wSyB+ObwqtnLHtrTIphozrvY0+swRc8Dcvi+xYHnuOy8OVYjyScDfYVquTOIV8I3Dbjp9U1pvvsotSKEm7dA0TWNuSurRdUN91Iwjd/Cu9jSHB81m9lZ9sTOLBFoe2deFLm+mZ1RRPxp52auKdNBGlJuk26sngm5mLh2PWxqOpEF/rJ5e5NhfBT5+J7aP9kxrX1Cs0vA3Pc+bhprSM2WWWh0Z7Ceb3hOMasvZO3BX3uz0n4wvyo19dfnf5iFOl/GI8lsnn95iUgPDAGHZ1OWLIxXpyHUArHmCXv/5+PD37tGH9YyLuK/oaA9rfPzhY09q7+J56w33FwZEri7v7a4uhKmVNRzwBzI4WGfwjm27IK7aeRJyddM7x/y5fo3h5xJIj9VM3AXJ+vrjgL2A8xTXG3uJJ9wrtadx6OL7I6K+knlL2J55sUI9gS8YqIbfu5+CRxLl4HYC3z52J7xk+DCC5mfH/MVFNVsDp1h5rBlvP8tcnv18esfXkUfXSi81bu0Q9+fJ3RWPlo53BFgvL7a9NDQsbwlnTQ4QENQXGfq3HB6xKNxPTkXca83tyRTJFNxQTeuLckF1yMZZtX5PQbjxBUXApfks0Wvk38qk3lrM656drdcc65T/LKwGvhvyW8eMpvpW2FVX6aHo76uchfSJydfzyprYzNuUU3jIi4Jht7d0s4ofxLBSxN0753g35kXk0hJDxC0sbYEKKUmGcm4CshOFgdSvKXucj6EFq77MCcfqGlf/QIEGqtL3kZwsaKxseO4GqFuWqgX01rl0fUGhY2NkvXWMNzuhXC7DD7baXPRIWpfXUljJm4UxPQaAl/JAOV2Ja8PmkcXyndnka4aiWkxIplc4TYXFTG/p0z0xEJREyMPW9bieIC+rAF/rE1gXWDhEPsnEcOYnuieykXtEIhFt9B+oudPz5eWYMHo5ZlT4pxNyZ3y89ksg6eyr/69nTAqzbSej5Z07x1rpMuDm87fW3n1qzfQJjUVrd5aqI3veAf3CLqwdXAmSZM+rvu8enZyeHDPLrxZznzUZfX3E+IZxPNvZtoK6/Vh8cbMttsXrWT0AmdpYmzfkBqTbd8ME19LLUSJGUS2XdvrxsHMMLMgiwaJZK79rvEfLT7L/mEOa63TDTOnxFyM3TlTq7AjEpEKLGjMlZVQsAhEEXTTjIHDj7ja3+Q/8YceS+ho2p67yOgsym1ggDRmKa19bhDKCas97etnBmxQFUiiGjB7pub8IiCdymK1UvxDxtJlQp6f4Grt1OW9KmmmZwAHs0sBuuZreo89KVMA96NyIm3abR2Ha+VEGbYVQHPf5ACJ3igU70w52sqeWKaqPCzbVjpjNWRwhHqRb0gw001QCwE5ypxGQS5S3gMo0HQTbx0SlNumtiEnIcgajDScwKHYRQ4TgtkIPof4QG8Yq2iTaunzUMME1I1mJlUCZRwOrZWy1jHZKSD2QbYD1HyoWEhhNSpLIZLi0qgTkSTwFSR8HDS5XrEenWTHId++SyiK3pQpYWKYnNzRYjWAYZINZ6cQM2G26CuQZwoIJ3R9l81PG8QmiQXToe0WNjmXa+oZcXPpy6XOv18GLMkM2l6UStZr7WFl2Oa6Gp3YZnvVqFW19dbDfd0dpespoUFutBgkCWqsV9evQ2nCuqh0vuIsL7fMJ1wGC9NXtT61wFbQCuLFniGtTtbjMnA9KNRKuJso5bemJmUe8F07stZYe7zi22vBR0nG8N1LoyNrIUL7BR8pRaramgxZvr7u2KTHBpAYgqulJXz97p18kTBNsk+uf0DmIW1T7mJNvr9JIznRHElSIN+mGY/VRgjYSXxhKl1+OM0GB+wHUKFwtLEKcdH6mgiDmQ7hbdS4WExJX35eCBL0efEaDjXfuEjdSHTb33/OA1CPOxTNqeix1MLJMt45dHU8+oIKUHULkYTTlmrU6stQs1QK5A4MzyYNsb8dpUinhsGgHba+Cy1Yur8OGk8cwpXnorRlPKyZk8nj19OcOGzoLHQSF9MqqRCLcnnIXU1ZvB1Xbyvup8Y9YKs/W1Y4hGIdzlFbUEa72XqFmv+VFcmwSGqNyJgUYGO4uRUo0zhSmvBzmu9mEjTqqJou5TAPP/HRJIyBgSZxgZL8f8k0lg4dq4kx8X7/0VHvDdX3idS0+9v71/rm7d//tOb/a29hg6bAXQ7LZZPm8bNiQd+ASbhUebuE7InkZ1Rk4oLet4u+lBIAessU9u/k0HIP2zDg7UbC09wJQDK2+8d0NeWp5eWXP+7HT94Xanc5Hz53bMyVh+k1z7UjG/s7wjpPO5yr6MPadyI8S7nh+v6EoZJjtgzVGe/u5OrFRUBKV+ZIKCz9fXRGPmp+PWco/cEbqINwSpk7fqX7EW4t14L3N/9Idm7HkhRn//gJbDV0Zs6TguKvQcwzTHEGAIEABGjoKQAKbMZxCO0NXRCp0OpYeZN6a5ps20BR1qVFje1br3cD+/RUAKg4ZAVOVmAJDm6qYAIbIIR9oGQMwg4CIIOHYvQSRCLmpvsKoBoYo2TUBA+0c5KPvRPqRKli5FaYQxg8hNDOGIGQGgqHwSADRWILVAggloXFaKYbi3gaVcbIiThLgKhBAAgQsk7OjUkeNbs9p9lhKgJR81Nnc3HQYYQoQ6VIsBBujFn9wTRlNQusRiqKH6z4/ZYqwS7VBftUo2sb5o4zl5ZdkQAKYlkAw5hagha2OyOqPgZxn8eCxlGjazCU/nKnyZuTDsN2uxkr3gTrY1bc327UlcDPfwnTnLxvvhB3lGM9QJ/Fy9N1gLlviSVV/lFRxImBqEGeKwGt2pn8zzdMtm2wQ//jd75dx58QKKPJco/FkoEkOARJvPQNwbx0Mw3ETgIU9DhK+t4DX8OcEND4nEsZuFyHMHKJ/lmR0vbGc5nHPWaS8WXRae5ASEgnezYfrLHd5eLrokPEWo3f9jdD0yfsai6i9GhJl1scPsn98M0b39bB8WOMQ8ImxeebTt2jXHkHlt/tals3NyZs+xWufMyc5eutTqP2+uY8j1a6byqO+rKbQEM8F0Nh5/uXMow8jsOTPPzs7ZIFVsl6SoqzU63Rq/NZ5fm49Dmc6t2ks3dI3f1x5rfNfQulJPz2oPNbZ/n6nrr9SbAr134lmpFienTuTuT3bgn9UdZzkBi0L6NpnH5Osy2OW88Lh41j6Bnj8evSK6iuLxofnrQnD1qERP4t6q3x0OJ+fObYOJ9Uzu+b79tnrwxEEnnuvffGqi1ALk+4V9K1lnt513fV1Yi2JHH/jdVG6amXKgwWDv7BswsV9e0ifxfVm+aYKoLTc4uOFqX50hbobAf5Yw8exP7QvtjLtunzWaSF2fgiOMHUfa/GSSK9uyJnNcbj9fsYAcmbdY0n7qtoz39eGx46Uyu59dAkTxEZZ0VnlJZYmyb7h2Q+2PCKBv029ixwsR76zm5LVp2jXCr3FFYqCcX70FPQ/1AKJrDwvvKCuqKIJ/MjWX7iapNvKqe/UqBr2OeR0p3lrNzm1jiDYP4RdT1cGBOj1M3rWmb1GJMgWlYIkera/AKnBiG1l5wM3KIRuwD0QPvFuwocolB8/F8lU+RTDyLQQFFcTZTNGOJAnAhMwVZZC7fkz6bLh6YmUGJ52zA6Wx01iWbX+9wWkYaCq/brFWLFR0og5sn4c5vmD2p8f/AowVN9iJGcieJ1gSCDCKZfF0po5eyBlJjGLVliEtjFH4ynlWLXWjrhVgwbpLYbXjJu0aM6V13OLmkK/g38qRKfZdaxZ5Z9TGD3uyatm9dy1QnLUITPksG54O6WiO7PMbT7hfKgWEH+nv73evz940eWaig7tGvWd+SiDylk54dfDA+r6RYt8YaIkea5tm0YGjAbsUGprH3XF8+4nXVWeGnv7A75a1NUwpdt+9Q9KgO5ljv9vTGGrfOXmS6y9Vmft9JsexRUNq9lda1SOdqSUYMPiSkjwfFJ2d5ZPOK8lQJioS8pqvHU9QSF/xeSaPEpeY4cBLBVY8GMfCb7msRF/J1vr2CW/99Q6dytISzrdr4JM98OLFV6+U2hufQPPSw1ucps7hr3+bEmD9FX9tcKKQ/0qaoLh6Iq9ZmaBIzCgRIzs7RVpL9AeQhWS8YQ5nyBv3QRm0hkVRTopmkXoqk9ZyNKRTK+Uw26garVZOgasehooMllCE1xmCQ0vwbIIoxvEsC5GNOXB7cHARBhZLJgaSM7/0D39GY+E12c8nyk4nYCgKHN4TvnpVuFEGCFhKr6Tqa7m297+z7DtOzZ5ZQ/IEzp4LQ03lMUAZNPYz+eM1m77o/DenmseJDsk7I65uebXsUYwS43NEnHrnrIKfuMKidd/qhnTWja7r1GEsnAtcKE/cDbHnfmB2TZrit23b/PcPBz5h1E8CUcfZdaV9TB1zMGAxXazdqps0ZSfjHgjvSSYwaOeUSWnR6+97+ouisU+PH37o3XY04b/pVUxAkOQ1GRy4aIznBO4/qLIyB116eCfRvalwldvSSuKbP/OgtY2GT4cPDXeadfe2J38Zu/dsTkxCQsr1naeGf91Tk9lVl2N7efP7jQ0al1T5Ye4QmTPMvN/iTUtjGlat/hNjYWhYCjF1KjB4xxPn0VkXZ1/MONp1iMW1KmcOMbh1Hs3akZLYo8/q/U3Ybs0ngoh8q2TK3DT1wWPOnamWacElvQ/wdoOSBZfLhqusNpxs1JbnsjkyLy2hcpUqmSBS7JNw/e9wWT70BAGi/TM9fH2vZ2UVGeKk4VFzQ1b5hOaTtjMGgw7QEoG6GWC01qJcGb0i2qIcrQXU37Ol49P7L+8aO+QqhLQx0SaECqbHeGOAI3yOgexhcZ1GjQmjMWlifXl290JDERPMWF972Ru09RgT/NnwCuBT1kJRdoQx5Prx8t8L6KmHw3/FkIVAid5hfizphq4F7bladtf/7nUtDL16zOv7bf8yQ6xcImvoXAdfUDureXtOrwueydAu57PLC4jTBz8Emn3UYX6yxuc++3q6udZNRyNs3IUcQ+DID0JK7Gwu+2UtZUJU/8YsSOWQFTKzUihSmqf1vOYtNif7dIRjrAxaARAX4F+ri/UQ0Vntb05pavYg5EVmT+PhbID1hYdGd/mpAtwFhCsRdJPHPxw5amJeCEFTpA9eqGvpqbP2eVe6zfcdgRCPfEmEDuXin3X3Q09VjDAafbNLZdoSPR9ngZT0akO/ZajFRaWzKqp8yuODS0w0TiEKYUX+sWkhuXE5TabUodYQwCkkxfBwDGuSeolpSmy9gJtcyuJpLRhJZgONkTJfQ/x4RdI07EyedG7eu7ipQiIMYU/jaS8EWgyZSMZgzyU4v9QaLMWZTlLDV6hG2e17urtk0iKn2Gqr844vc2hkiG5F4Cura0KAMIQQiQAQeHpVQnv8ft7g8kYcswCZ4lcQxuALlzRcRJxkTVh9Yv09hKyUlo3YBk3NOXyPV4hN4Y8Bjqian1zHb/ZLQUTXm+lnAVGUSb/rrC6vVc8AVz9gJ9g5ah5fwvjPTtCdbU3G2Qu1bxYQKNV383iVyuEYJvDSiD7vq9EY2IitpawI3esKrw/TjGRjhxsuLdCgMeboRI110bVbvfvui+7vm/7T8kYcNwA5Wuc3GowLLzUewtijNB6+Gqbwfv09DFlRHFvC0WrYb6UCrYljtDuU1HTay7XKnAKsDZ9674ApZtVZnXm2P0ly9ZNEk/RcknSdI1lEEgE/3asUc5W7kZou+Wk6RbOHGTlGE1+6r4axyTlxyIqwC133CxmNr6eEf9EXG47WMYyXDE+RDclh443LB2VDfDupYWukqZfXUeT1Y2Ugye38GBc33ehwr0l3ueDzpmomRqRQpPLCdTZbSBCUxEQLq4s3oxYUJbcPPDXmIGjKSi+madXcXmhzFAJgjbPqf+C+zZn9PUl/2WAPm7Bnwprj4/hRCYn3RQ9son9LivICHVEIPbvPgwRxdZK+6M8xd1/wOW1dRdATEWnymC780vlNaHzZqITuuce9Il39EPoSgXSd/Ju6sZn1E/ba9zJ0gowDBrXaRiaSC3vvIDQPoWQImRbAYSH4Se5r1tNn8fPX+ufT9Px+G9mINxoT9nX3RZTCleTJY/EkrF2UIbx47KhDXtlm9tLHTHlyZLjarfLxk06qbyPjdTD8qzscmynOEI8kvwoaiyG7yelRWn7lSo7LyJEtsr6NTi5FS5T7W/GC2yIve3ajZM7cyilJbk9LmRF5fk1b23xW/LHlSJ2YkKqVMHi4NF+aT3fbxkw0mSaO6bbl0/nS0u2XPtVvlm79BlfKKEyPMklqVWkndpaYVYXmhNOlWxXyOpXYpL0nDHRfEmniRIoSQpTK2UsSjYrWKGu+0pkQfqqUMF6UHvkV1ajTdpwsTZgUq5NVe9ELZzQdCAr0ceTkUZc6TwTm3hww2OINL4Ps1o/vLtzyKOlKFs4x5vUzNlNG1GOJrUTiOB9tMWZURObmRIvD6WW0VOLpZdI7Hndjb2icKaciekRW5ECwLTn4RZA94vvqKsxKn0gIM43oZ8aYJIQvVFHxw0/Qc6TA6bwfPO1OfqN+vXxqntp50jyqPa+dexXX9t27+r67sduQPKN7hpc5tLnwGTS8ubxp8h8r8AJiHFHAO9Oi/U0swMP2JlMdzINR/o8ezjm2OCt1EZ2NfffkP19/FuPUNDn1FVGU5Ej90bIbefoE/20hy14ZTu/eIy9Yu2dvXVbRBIczM3PnjlU5rqt2RHh/fPBwlPghud//+qtHypT//fNn0SMdvh/396qVX2ap9VW/Onx4JL9/92t6xTiXS+7xEXOrN7BjEtahtptmqh0TbjHLli6TZS1ftv1hfsD/JwS1T9nctGn4pspU6QgLx+fppqeAYYtmLM4UzJi56EauNuO8wrbuUyjmhgeuL3ItOJOBB2tHc0dzIPwoiaffHn64SXI4ibdAlsz9tbo5qKrZm2NfZtouTnL7SpRAIho13pqbQc5mLAw2q15ykX340eQPD0Mk+gvjJNG/cgUEPAdiIAxexP/Dj2SUi5UE5HkLTkCU+H/tNXvJbAKSUA7UYZC39kJG3xMF8ZAI84AEdzOeGHwBgzy4CgpwA5LRQiUWACK8tRedYth1Q5pzkAkSOhUdxBULJJT8EhYIoIWyXcpCNx/UcOdDAiJ4UKzlEFOUEFeCIaEklrBADgWUTUr35PgQAiuhBEqhCSqhGKqhCuBrLtDqjmaiYzk0wkQohLrKz8vaHkBdzwzmFtVBPVSuyIABAiEY4Dm2h2gIDCbj8eu04QMtD/IqJrSQ1ZWWUHMRtM48iYCmGYzWEgjwYqI1noDZklRc/R8NE0+tf+/JKgEQBhjCAUcEYiE24iAu4iE+EiAhEiExkiASUYhGUiRDLkjOLp/YWlNh4DRWVQYDmWY7wgy2GFOoYg6JiA6zOs3rSeZ4c3t4iDHTSNoigiOyGGNwiE0xxYSGKxHavjab2ZBFh0fIOCsAAAA=') + format('woff2'); + font-weight: 400; + font-style: normal; + font-display: block; +} +[class*=' devicon-'], +[class^='devicon-'] { + font-family: devicon !important; + speak: never; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.devicon-groovy-plain:before { + content: '\e958'; +} +.devicon-groovy-plain.colored { + color: #619cbc; +} +.devicon-rust-plain:before { + content: '\e959'; +} +.devicon-rust-plain.colored { + color: #000; +} +.devicon-scala-plain:before { + content: '\e95b'; +} +.devicon-scala-plain.colored { + color: #de3423; +} +.devicon-devicon-plain:before { + content: '\e93b'; +} +.devicon-devicon-plain.colored { + color: #60be86; +} +.devicon-swift-plain:before { + content: '\e92b'; +} +.devicon-swift-plain.colored { + color: #f05138; +} +.devicon-typescript-plain:before { + content: '\e920'; +} +.devicon-typescript-plain.colored { + color: #007acc; +} +.devicon-github-original:before { + content: '\e909'; +} +.devicon-github-plain.colored { + color: #181616; +} +.devicon-cplusplus-plain:before { + content: '\e635'; +} +.devicon-cplusplus-plain.colored { + color: #9c033a; +} +.devicon-csharp-plain:before { + content: '\e637'; +} +.devicon-csharp-plain.colored { + color: #68217a; +} +.devicon-c-plain:before { + content: '\e639'; +} +.devicon-c-plain.colored { + color: #03599c; +} +.devicon-go-plain:before { + content: '\e61b'; +} +.devicon-go-plain.colored { + color: #000; +} +.devicon-coffeescript-original:before { + content: '\e66a'; +} +.devicon-coffeescript-plain.colored { + color: #28334c; +} +.devicon-css3-plain:before { + content: '\e679'; +} +.devicon-css3-plain.colored { + color: #3d8fc6; +} +.devicon-html5-plain:before { + content: '\e7f7'; +} +.devicon-html5-plain.colored { + color: #e54d26; +} +.devicon-java-plain:before { + content: '\e842'; +} +.devicon-java-plain.colored { + color: #ea2d2e; +} +.devicon-javascript-plain:before { + content: '\e845'; +} +.devicon-javascript-plain.colored { + color: #f0db4f; +} +.devicon-php-plain:before { + content: '\eb71'; +} +.devicon-php-plain.colored { + color: #6181b6; +} +.devicon-python-plain:before { + content: '\eb89'; +} +.devicon-python-plain.colored { + color: #ffd845; +} +.devicon-ruby-plain:before { + content: '\ebca'; +} +.devicon-ruby-plain.colored { + color: #d91404; +} + + @font-face {font-family: 'KoHo';font-style: normal;font-weight: 200;src: url("data:application/x-font-woff2;base64,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") format('woff2');} +@font-face {font-family: 'KoHo';font-style: normal;font-weight: 400;src: url("data:application/x-font-woff2;base64,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") format('woff2');} +@font-face {font-family: 'KoHo';font-style: normal;font-weight: 500;src: url("data:application/x-font-woff2;base64,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") format('woff2');} + </style></defs></svg> \ No newline at end of file diff --git a/lib/IRremoteESP8266/assets/images/logo.svg b/lib/IRremoteESP8266/assets/images/logo.svg new file mode 100644 index 000000000..a42691f96 --- /dev/null +++ b/lib/IRremoteESP8266/assets/images/logo.svg @@ -0,0 +1,50 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 900" width="900" height="900"> + <defs> + <clipPath clipPathUnits="userSpaceOnUse" id="cp1"> + <path d="M0 0L900 0L900 900L0 900Z" /> + </clipPath> + </defs> + <style> + tspan { white-space:pre } + .shp0 { fill: none;stroke: #4f3ee6;stroke-width: 20 } + .shp1 { fill: none;stroke: #4f3ee6;stroke-linecap:round;stroke-width: 28 } + .shp2 { fill: none;stroke: #4f3ee6;stroke-linecap:round;stroke-linejoin:round;stroke-width: 28 } + .shp3 { fill: none;stroke: #4f3ee6;stroke-linecap:round;stroke-linejoin:round;stroke-width: 16 } + .shp4 { fill: #ffffff;stroke: #4f3ee6;stroke-width: 28 } + .shp5 { fill: #ffffff;stroke: #4f3ee6;stroke-width: 18 } + </style> + <g id="Artboard 1" clip-path="url(#cp1)"> + <g id="IR"> + <path id="Ellipse 1" class="shp0" d="M450.47 261.95C460.41 261.95 468.46 270.01 468.46 279.94C468.46 289.88 460.41 297.93 450.47 297.93C440.54 297.93 432.48 289.88 432.48 279.94C432.48 270.01 440.54 261.95 450.47 261.95Z" /> + <path id="Shape 1" class="shp1" d="M387.34 217.47C402.67 196.87 427.05 184.82 452.76 185.41C479.48 186.03 504.02 200.21 518.13 222.77" /> + <path id="Shape 9" class="shp2" d="M613.04 407.18" /> + <path id="Shape 2" class="shp1" d="M357.91 168.4C384.72 137.13 424.5 119.48 465.85 121.96C501.9 124.11 535.19 141.36 558.38 168.83" /> + <path id="Shape 3" class="shp1" d="M327.16 123.92C360.63 88.67 406.74 68.04 455.38 67C506.79 65.91 556.17 86.81 591.5 124.07" /> + </g> + <g id="wires"> + <path id="Shape 6" class="shp2" d="M291 474L160 476L90 422" /> + <path id="Ellipse 3" class="shp3" d="M65.5 375C79.03 375 90 385.97 90 399.5C90 413.03 79.03 424 65.5 424C51.97 424 41 413.03 41 399.5C41 385.97 51.97 375 65.5 375Z" /> + <path id="Ellipse 3" class="shp3" d="M96.5 521C110.03 521 121 531.97 121 545.5C121 559.03 110.03 570 96.5 570C82.97 570 72 559.03 72 545.5C72 531.97 82.97 521 96.5 521Z" /> + <path id="Ellipse 3" class="shp3" d="M132.5 659C146.03 659 157 669.97 157 683.5C157 697.03 146.03 708 132.5 708C118.97 708 108 697.03 108 683.5C108 669.97 118.97 659 132.5 659Z" /> + <path id="Shape 7" class="shp2" d="M291 540L129 545" /> + <path id="Shape 8" class="shp2" d="M296 600L199 604L153 659" /> + </g> + <g id="wires"> + <path id="Shape 6" class="shp2" d="M602 468L733 470L803 416" /> + <path id="Ellipse 3" class="shp3" d="M827.5 369C813.97 369 803 379.97 803 393.5C803 407.03 813.97 418 827.5 418C841.03 418 852 407.03 852 393.5C852 379.97 841.03 369 827.5 369Z" /> + <path id="Ellipse 3" class="shp3" d="M796.5 515C782.97 515 772 525.97 772 539.5C772 553.03 782.97 564 796.5 564C810.03 564 821 553.03 821 539.5C821 525.97 810.03 515 796.5 515Z" /> + <path id="Ellipse 3" class="shp3" d="M760.5 653C746.97 653 736 663.97 736 677.5C736 691.03 746.97 702 760.5 702C774.03 702 785 691.03 785 677.5C785 663.97 774.03 653 760.5 653Z" /> + <path id="Shape 7" class="shp2" d="M602 534L764 539" /> + <path id="Shape 8" class="shp2" d="M597 594L694 598L740 653" /> + </g> + <path id="Rounded Rectangle 1" class="shp4" d="M360.84 337.08L532.7 337.08C560.31 337.08 582.7 359.46 582.7 387.08L582.7 714.14C582.7 741.75 560.31 764.14 532.7 764.14L360.84 764.14C333.23 764.14 310.84 741.75 310.84 714.14L310.84 387.08C310.84 359.46 333.23 337.08 360.84 337.08ZM378 489Z" /> + <g id="Buttons"> + <path id="Ellipse 4" class="shp5" d="M378 489C389.6 489 399 498.4 399 510C399 521.6 389.6 531 378 531C366.4 531 357 521.6 357 510C357 498.4 366.4 489 378 489ZM378 489C389.6 489 399 498.4 399 510C399 521.6 389.6 531 378 531C366.4 531 357 521.6 357 510C357 498.4 366.4 489 378 489ZM378 489C389.6 489 399 498.4 399 510C399 521.6 389.6 531 378 531C366.4 531 357 521.6 357 510C357 498.4 366.4 489 378 489Z" /> + <path id="Ellipse 4" class="shp5" d="M514 488C525.6 488 535 497.4 535 509C535 520.6 525.6 530 514 530C502.4 530 493 520.6 493 509C493 497.4 502.4 488 514 488ZM514 488C525.6 488 535 497.4 535 509C535 520.6 525.6 530 514 530C502.4 530 493 520.6 493 509C493 497.4 502.4 488 514 488ZM514 488C525.6 488 535 497.4 535 509C535 520.6 525.6 530 514 530C502.4 530 493 520.6 493 509C493 497.4 502.4 488 514 488Z" /> + <path id="Ellipse 4" class="shp5" d="M514 578C525.6 578 535 587.4 535 599C535 610.6 525.6 620 514 620C502.4 620 493 610.6 493 599C493 587.4 502.4 578 514 578ZM514 578C525.6 578 535 587.4 535 599C535 610.6 525.6 620 514 620C502.4 620 493 610.6 493 599C493 587.4 502.4 578 514 578ZM514 578C525.6 578 535 587.4 535 599C535 610.6 525.6 620 514 620C502.4 620 493 610.6 493 599C493 587.4 502.4 578 514 578Z" /> + <path id="Ellipse 4" class="shp5" d="M378 579C389.6 579 399 588.4 399 600C399 611.6 389.6 621 378 621C366.4 621 357 611.6 357 600C357 588.4 366.4 579 378 579ZM378 579C389.6 579 399 588.4 399 600C399 611.6 389.6 621 378 621C366.4 621 357 611.6 357 600C357 588.4 366.4 579 378 579ZM378 579C389.6 579 399 588.4 399 600C399 611.6 389.6 621 378 621C366.4 621 357 611.6 357 600C357 588.4 366.4 579 378 579Z" /> + <path id="Ellipse 4" class="shp5" d="M378 395C389.6 395 399 404.4 399 416C399 427.6 389.6 437 378 437C366.4 437 357 427.6 357 416C357 404.4 366.4 395 378 395ZM378 395C389.6 395 399 404.4 399 416C399 427.6 389.6 437 378 437C366.4 437 357 427.6 357 416C357 404.4 366.4 395 378 395ZM378 395C389.6 395 399 404.4 399 416C399 427.6 389.6 437 378 437C366.4 437 357 427.6 357 416C357 404.4 366.4 395 378 395Z" /> + <path id="Ellipse 4" class="shp5" d="M514 395C525.6 395 535 404.4 535 416C535 427.6 525.6 437 514 437C502.4 437 493 427.6 493 416C493 404.4 502.4 395 514 395ZM514 395C525.6 395 535 404.4 535 416C535 427.6 525.6 437 514 437C502.4 437 493 427.6 493 416C493 404.4 502.4 395 514 395ZM514 395C525.6 395 535 404.4 535 416C535 427.6 525.6 437 514 437C502.4 437 493 427.6 493 416C493 404.4 502.4 395 514 395Z" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/lib/IRremoteESP8266/examples/DumbIRRepeater/DumbIRRepeater.ino b/lib/IRremoteESP8266/examples/DumbIRRepeater/DumbIRRepeater.ino index d3ddbdb6a..2d3f1a8b3 100644 --- a/lib/IRremoteESP8266/examples/DumbIRRepeater/DumbIRRepeater.ino +++ b/lib/IRremoteESP8266/examples/DumbIRRepeater/DumbIRRepeater.ino @@ -57,7 +57,12 @@ // The GPIO an IR detector/demodulator is connected to. Recommended: 14 (D5) // Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts. +// Note: GPIO 14 won't work on the ESP32-C3 as it causes the board to reboot. +#ifdef ARDUINO_ESP32C3_DEV +const uint16_t kRecvPin = 10; // 14 on a ESP32-C3 causes a boot loop. +#else // ARDUINO_ESP32C3_DEV const uint16_t kRecvPin = 14; +#endif // ARDUINO_ESP32C3_DEV // GPIO to use to control the IR LED circuit. Recommended: 4 (D2). const uint16_t kIrLedPin = 4; diff --git a/lib/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.h b/lib/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.h index 1d05d3691..611c1ff73 100644 --- a/lib/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.h +++ b/lib/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.h @@ -169,6 +169,11 @@ const uint32_t kMqttReconnectTime = 5000; // Delay(ms) between reconnect tries. // In theory, you shouldn't need this as you can always clean up by hand, hence // it is disabled by default. Note: `false` saves ~1.2k. #define MQTT_CLEAR_ENABLE false + +#ifndef MQTT_SERVER_AUTODETECT_ENABLE +// Whether or not MQTT Server IP is detected through mDNS +#define MQTT_SERVER_AUTODETECT_ENABLE true +#endif // MQTT_SERVER_AUTODETECT_ENABLE #endif // MQTT_ENABLE // ------------------------ IR Capture Settings -------------------------------- @@ -285,7 +290,7 @@ const uint16_t kJsonAcStateMaxSize = 1024; // Bytes // ----------------- End of User Configuration Section ------------------------- // Constants -#define _MY_VERSION_ "v1.6.0" +#define _MY_VERSION_ "v1.7.0" const uint8_t kRebootTime = 15; // Seconds const uint8_t kQuickDisplayTime = 2; // Seconds diff --git a/lib/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.ino b/lib/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.ino index c2e427166..4f3324fc2 100644 --- a/lib/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.ino +++ b/lib/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.ino @@ -24,6 +24,10 @@ * ## Before First Boot (i.e. Compile time) * - Disable MQTT if desired. (see '#define MQTT_ENABLE' in IRMQTTServer.h). * + * - The MQTT server IP is detected automatically through mDNS (aka avahi, + * bonjour, zeroconf) if the server advertises _mqtt._tcp. Disable this if + * desired (see '#define MQTT_SERVER_AUTODETECT_ENABLE' in IRMQTTServer.h). + * * - Site specific settings: * o Search for 'CHANGE_ME' in IRMQTTServer.h for the things you probably * need to change for your particular situation. @@ -1973,6 +1977,29 @@ void handleNotFound(void) { server.send(404, "text/plain", message); } +#if (MQTT_ENABLE && MQTT_SERVER_AUTODETECT_ENABLE) +void mqtt_detect_server(void) { + debug("Looking for the MQTT server..."); + int nrOfServices = MDNS.queryService("mqtt", "tcp"); + if (nrOfServices == 0) { + debug("MQTT server not found"); + return; + } + + debug(("Number of MQTT servers found: " + String(nrOfServices)).c_str()); + for (int i = 0; i < nrOfServices; i=i+1) { + debug(("Hostname: " + MDNS.hostname(i)).c_str()); + debug(("IP address: " + MDNS.IP(i).toString()).c_str()); + debug(("Port: " + String(MDNS.port(i))).c_str()); + } + strncpy(MqttServer, MDNS.IP(0).toString().c_str(), kHostnameLength); + strncpy(MqttPort, String(MDNS.port(0)).c_str(), kPortLength); + + debug(("First one selected: " + String(MqttServer) + ":" + + String(MqttPort)).c_str()); +} +#endif // (MQTT_ENABLE && MQTT_SERVER_AUTODETECT_ENABLE)) + void setup_wifi(void) { delay(10); loadConfigFile(); @@ -2000,6 +2027,12 @@ void setup_wifi(void) { WiFiManagerParameter custom_mqtt_text( "<br><br><center>MQTT Broker details</center>"); wifiManager.addParameter(&custom_mqtt_text); +#if MQTT_SERVER_AUTODETECT_ENABLE + WiFiManagerParameter custom_mqtt_server_text( + "<br><left>NOTE: if _mqtt._tcp mDNS service is found, it will be " + "used instead of the mqtt server:port below</left><br><br>"); + wifiManager.addParameter(&custom_mqtt_server_text); +#endif // MQTT_SERVER_AUTODETECT_ENABLE WiFiManagerParameter custom_mqtt_server( kMqttServerKey, "mqtt server", MqttServer, kHostnameLength); wifiManager.addParameter(&custom_mqtt_server); @@ -2196,6 +2229,9 @@ void setup(void) { // Finish setup of the mqtt clent object. if (!mqtt_client.setBufferSize(kMqttBufferSize)) debug("Can't fully allocate MQTT buffer! Try a smaller value."); +#if MQTT_SERVER_AUTODETECT_ENABLE + mqtt_detect_server(); +#endif // MQTT_SERVER_AUTODETECT_ENABLE mqtt_client.setServer(MqttServer, atoi(MqttPort)); mqtt_client.setCallback(mqttCallback); // Set various variables @@ -2308,6 +2344,10 @@ bool reconnect(void) { uint16_t tries = 1; while (!mqtt_client.connected() && tries <= 3) { int connected = false; +#if MQTT_SERVER_AUTODETECT_ENABLE + mqtt_detect_server(); + mqtt_client.setServer(MqttServer, atoi(MqttPort)); +#endif // MQTT_SERVER_AUTODETECT_ENABLE // Attempt to connect debug(("Attempting MQTT connection to " + String(MqttServer) + ":" + String(MqttPort) + "... ").c_str()); @@ -2863,7 +2903,8 @@ bool sendInt(const String topic, const int32_t num, const bool retain) { bool sendBool(const String topic, const bool on, const bool retain) { #if MQTT_ENABLE mqttSentCounter++; - return mqtt_client.publish(topic.c_str(), (on ? "on" : "off"), retain); + return mqtt_client.publish(topic.c_str(), (on ? D_STR_ON : D_STR_OFF), + retain); #else // MQTT_ENABLE return true; #endif // MQTT_ENABLE @@ -2991,12 +3032,14 @@ void updateClimate(stdAc::state_t *state, const String str, } else if (str.equals(prefix + F(KEY_POWER))) { state->power = IRac::strToBool(payload.c_str()); #if MQTT_CLIMATE_HA_MODE + // When in Home Assistant mode, Power Off, means turn the Mode to Off too. if (!state->power) state->mode = stdAc::opmode_t::kOff; #endif // MQTT_CLIMATE_HA_MODE } else if (str.equals(prefix + F(KEY_MODE))) { state->mode = IRac::strToOpmode(payload.c_str()); #if MQTT_CLIMATE_HA_MODE - state->power = (state->mode != stdAc::opmode_t::kOff); + // When in Home Assistant mode, a Mode of Off, means turn the Power off too. + if (state->mode == stdAc::opmode_t::kOff) state->power = false; #endif // MQTT_CLIMATE_HA_MODE } else if (str.equals(prefix + F(KEY_TEMP))) { state->degrees = payload.toFloat(); @@ -3055,7 +3098,7 @@ bool sendClimate(const String topic_prefix, const bool retain, // Home Assistant want's these two bound together. if (prev.power != next.power || prev.mode != next.mode || forceMQTT) { success &= sendBool(topic_prefix + KEY_POWER, next.power, retain); - if (!next.power) mode_str = F("off"); + if (!next.power) mode_str = kOffStr; #else // MQTT_CLIMATE_HA_MODE // In non-Home Assistant mode, power and mode are not bound together. if (prev.power != next.power || forceMQTT) { diff --git a/lib/IRremoteESP8266/examples/IRrecvDemo/IRrecvDemo.ino b/lib/IRremoteESP8266/examples/IRrecvDemo/IRrecvDemo.ino index 2ae2e1410..743d32c4e 100644 --- a/lib/IRremoteESP8266/examples/IRrecvDemo/IRrecvDemo.ino +++ b/lib/IRremoteESP8266/examples/IRrecvDemo/IRrecvDemo.ino @@ -24,7 +24,12 @@ // An IR detector/demodulator is connected to GPIO pin 14(D5 on a NodeMCU // board). // Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts. +// Note: GPIO 14 won't work on the ESP32-C3 as it causes the board to reboot. +#ifdef ARDUINO_ESP32C3_DEV +const uint16_t kRecvPin = 10; // 14 on a ESP32-C3 causes a boot loop. +#else // ARDUINO_ESP32C3_DEV const uint16_t kRecvPin = 14; +#endif // ARDUINO_ESP32C3_DEV IRrecv irrecv(kRecvPin); diff --git a/lib/IRremoteESP8266/examples/IRrecvDumpV2/IRrecvDumpV2.ino b/lib/IRremoteESP8266/examples/IRrecvDumpV2/IRrecvDumpV2.ino index 70dbdba42..f0bebff12 100644 --- a/lib/IRremoteESP8266/examples/IRrecvDumpV2/IRrecvDumpV2.ino +++ b/lib/IRremoteESP8266/examples/IRrecvDumpV2/IRrecvDumpV2.ino @@ -38,7 +38,12 @@ // An IR detector/demodulator is connected to GPIO pin 14 // e.g. D5 on a NodeMCU board. // Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts. +// Note: GPIO 14 won't work on the ESP32-C3 as it causes the board to reboot. +#ifdef ARDUINO_ESP32C3_DEV +const uint16_t kRecvPin = 10; // 14 on a ESP32-C3 causes a boot loop. +#else // ARDUINO_ESP32C3_DEV const uint16_t kRecvPin = 14; +#endif // ARDUINO_ESP32C3_DEV // The Serial connection baud rate. // i.e. Status message will be sent to the PC at this baud rate. diff --git a/lib/IRremoteESP8266/examples/IRrecvDumpV3/IRrecvDumpV3.ino b/lib/IRremoteESP8266/examples/IRrecvDumpV3/IRrecvDumpV3.ino index 0948ae5e9..6bc054a3c 100644 --- a/lib/IRremoteESP8266/examples/IRrecvDumpV3/IRrecvDumpV3.ino +++ b/lib/IRremoteESP8266/examples/IRrecvDumpV3/IRrecvDumpV3.ino @@ -45,7 +45,12 @@ // An IR detector/demodulator is connected to GPIO pin 14 // e.g. D5 on a NodeMCU board. // Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts. +// Note: GPIO 14 won't work on the ESP32-C3 as it causes the board to reboot. +#ifdef ARDUINO_ESP32C3_DEV +const uint16_t kRecvPin = 10; // 14 on a ESP32-C3 causes a boot loop. +#else // ARDUINO_ESP32C3_DEV const uint16_t kRecvPin = 14; +#endif // ARDUINO_ESP32C3_DEV // The Serial connection baud rate. // i.e. Status message will be sent to the PC at this baud rate. diff --git a/lib/IRremoteESP8266/examples/SmartIRRepeater/SmartIRRepeater.ino b/lib/IRremoteESP8266/examples/SmartIRRepeater/SmartIRRepeater.ino index d35c4cef6..10554735d 100644 --- a/lib/IRremoteESP8266/examples/SmartIRRepeater/SmartIRRepeater.ino +++ b/lib/IRremoteESP8266/examples/SmartIRRepeater/SmartIRRepeater.ino @@ -60,7 +60,12 @@ // The GPIO an IR detector/demodulator is connected to. Recommended: 14 (D5) // Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts. +// Note: GPIO 14 won't work on the ESP32-C3 as it causes the board to reboot. +#ifdef ARDUINO_ESP32C3_DEV +const uint16_t kRecvPin = 10; // 14 on a ESP32-C3 causes a boot loop. +#else // ARDUINO_ESP32C3_DEV const uint16_t kRecvPin = 14; +#endif // ARDUINO_ESP32C3_DEV // GPIO to use to control the IR LED circuit. Recommended: 4 (D2). const uint16_t kIrLedPin = 4; diff --git a/lib/IRremoteESP8266/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino b/lib/IRremoteESP8266/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino index ebdb7536b..974bb94fc 100644 --- a/lib/IRremoteESP8266/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino +++ b/lib/IRremoteESP8266/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino @@ -57,7 +57,7 @@ void setup() { ac.setFan(1); ac.setMode(kKelvinatorCool); ac.setTemp(26); - ac.setSwingVertical(false); + ac.setSwingVertical(false, kKelvinatorSwingVOff); ac.setSwingHorizontal(true); ac.setXFan(true); ac.setIonFilter(false); diff --git a/lib/IRremoteESP8266/keywords.txt b/lib/IRremoteESP8266/keywords.txt index e6e33a008..bab1f5d5e 100644 --- a/lib/IRremoteESP8266/keywords.txt +++ b/lib/IRremoteESP8266/keywords.txt @@ -47,8 +47,10 @@ IRHaierAC176 KEYWORD1 IRHaierACYRW02 KEYWORD1 IRHitachiAc KEYWORD1 IRHitachiAc1 KEYWORD1 +IRHitachiAc264 KEYWORD1 +IRHitachiAc296 KEYWORD1 IRHitachiAc3 KEYWORD1 -IRHitachiAc344: KEYWORD1 +IRHitachiAc344 KEYWORD1 IRHitachiAc424 KEYWORD1 IRKelonAc KEYWORD1 IRKelvinatorAC KEYWORD1 @@ -120,6 +122,7 @@ _getTime KEYWORD2 _getTimer KEYWORD2 _isAKB73757604 KEYWORD2 _isAKB74955603 KEYWORD2 +_isLG6711A20083V KEYWORD2 _isNormal KEYWORD2 _matchGeneric KEYWORD2 _restoreState KEYWORD2 @@ -242,11 +245,13 @@ decodeHaierAC176 KEYWORD2 decodeHaierACYRW02 KEYWORD2 decodeHash KEYWORD2 decodeHitachiAC KEYWORD2 +decodeHitachiAc296 KEYWORD2 decodeHitachiAc3 KEYWORD2 decodeHitachiAc424 KEYWORD2 decodeInax KEYWORD2 decodeJVC KEYWORD2 decodeKelon KEYWORD2 +decodeKelon168 KEYWORD2 decodeKelvinator KEYWORD2 decodeLG KEYWORD2 decodeLasertag KEYWORD2 @@ -344,6 +349,7 @@ fujitsu KEYWORD2 get10CHeat KEYWORD2 get3D KEYWORD2 get8CHeat KEYWORD2 +get8CHeatToggle KEYWORD2 getAbsenseDetect KEYWORD2 getBeep KEYWORD2 getBit KEYWORD2 @@ -493,12 +499,16 @@ hasInvertedStates KEYWORD2 hasStateChanged KEYWORD2 hitachi KEYWORD2 hitachi1 KEYWORD2 +hitachi264 KEYWORD2 +hitachi296 KEYWORD2 hitachi344 KEYWORD2 hitachi424 KEYWORD2 htmlEscape KEYWORD2 initState KEYWORD2 int64ToString KEYWORD2 invertBits KEYWORD2 +is8CHeatToggle KEYWORD2 +isCleanToggle KEYWORD2 isEconoToggle KEYWORD2 isLightToggle KEYWORD2 isOffCommand KEYWORD2 @@ -508,6 +518,7 @@ isOnTimerActive KEYWORD2 isOnTimerEnabled KEYWORD2 isPowerSpecial KEYWORD2 isProtocolSupported KEYWORD2 +isQuiet KEYWORD2 isRepeat KEYWORD2 isSpecialState KEYWORD2 isSwing KEYWORD2 @@ -617,12 +628,15 @@ sendHaierACYRW02 KEYWORD2 sendHitachiAC KEYWORD2 sendHitachiAC1 KEYWORD2 sendHitachiAC2 KEYWORD2 +sendHitachiAc264 KEYWORD2 +sendHitachiAc296 KEYWORD2 sendHitachiAc3 KEYWORD2 sendHitachiAc344 KEYWORD2 sendHitachiAc424 KEYWORD2 sendInax KEYWORD2 sendJVC KEYWORD2 sendKelon KEYWORD2 +sendKelon168 KEYWORD2 sendKelvinator KEYWORD2 sendLG KEYWORD2 sendLG2 KEYWORD2 @@ -694,6 +708,7 @@ serialPrintUint64 KEYWORD2 set10CHeat KEYWORD2 set3D KEYWORD2 set8CHeat KEYWORD2 +set8CHeatToggle KEYWORD2 setAbsenseDetect KEYWORD2 setAuto KEYWORD2 setBeep KEYWORD2 @@ -983,12 +998,15 @@ DECODE_HASH LITERAL1 DECODE_HITACHI_AC LITERAL1 DECODE_HITACHI_AC1 LITERAL1 DECODE_HITACHI_AC2 LITERAL1 +DECODE_HITACHI_AC264 LITERAL1 +DECODE_HITACHI_AC296 LITERAL1 DECODE_HITACHI_AC3 LITERAL1 DECODE_HITACHI_AC344 LITERAL1 DECODE_HITACHI_AC424 LITERAL1 DECODE_INAX LITERAL1 DECODE_JVC LITERAL1 DECODE_KELON LITERAL1 +DECODE_KELON168 LITERAL1 DECODE_KELVINATOR LITERAL1 DECODE_LASERTAG LITERAL1 DECODE_LEGOPF LITERAL1 @@ -1177,6 +1195,10 @@ HITACHI_AC1 LITERAL1 HITACHI_AC1_BITS LITERAL1 HITACHI_AC1_STATE_LENGTH LITERAL1 HITACHI_AC2 LITERAL1 +HITACHI_AC264 LITERAL1 +HITACHI_AC296 LITERAL1 +HITACHI_AC296_BITS LITERAL1 +HITACHI_AC296_STATE_LENGTH LITERAL1 HITACHI_AC2_BITS LITERAL1 HITACHI_AC2_STATE_LENGTH LITERAL1 HITACHI_AC3 LITERAL1 @@ -1184,11 +1206,12 @@ HITACHI_AC344 LITERAL1 HITACHI_AC424 LITERAL1 HITACHI_AC_BITS LITERAL1 HITACHI_AC_STATE_LENGTH LITERAL1 -IRAM_ATTR LITERAL1 +ICACHE_RAM_ATTR LITERAL1 INAX LITERAL1 JVC LITERAL1 JVC_BITS LITERAL1 KELON LITERAL1 +KELON168 LITERAL1 KELVINATOR LITERAL1 KELVINATOR_AUTO LITERAL1 KELVINATOR_AUTO_TEMP LITERAL1 @@ -1210,6 +1233,7 @@ LEGOPF LITERAL1 LG LITERAL1 LG2 LITERAL1 LG32_BITS LITERAL1 +LG6711A20083V LITERAL1 LG_BITS LITERAL1 LOW LITERAL1 LUTRON LITERAL1 @@ -1337,12 +1361,15 @@ SEND_HAIER_AC_YRW02 LITERAL1 SEND_HITACHI_AC LITERAL1 SEND_HITACHI_AC1 LITERAL1 SEND_HITACHI_AC2 LITERAL1 +SEND_HITACHI_AC264 LITERAL1 +SEND_HITACHI_AC296 LITERAL1 SEND_HITACHI_AC3 LITERAL1 SEND_HITACHI_AC344 LITERAL1 SEND_HITACHI_AC424 LITERAL1 SEND_INAX LITERAL1 SEND_JVC LITERAL1 SEND_KELON LITERAL1 +SEND_KELON168 LITERAL1 SEND_KELVINATOR LITERAL1 SEND_LASERTAG LITERAL1 SEND_LEGOPF LITERAL1 @@ -1685,7 +1712,6 @@ kCool LITERAL1 kCoolStr LITERAL1 kCoolingStr LITERAL1 kCoolix48Bits LITERAL1 -kCoolix48ExtraTolerance LITERAL1 kCoolixAuto LITERAL1 kCoolixBitMark LITERAL1 kCoolixBitMarkTicks LITERAL1 @@ -1696,6 +1722,7 @@ kCoolixCool LITERAL1 kCoolixDefaultRepeat LITERAL1 kCoolixDefaultState LITERAL1 kCoolixDry LITERAL1 +kCoolixExtraTolerance LITERAL1 kCoolixFan LITERAL1 kCoolixFanAuto LITERAL1 kCoolixFanAuto0 LITERAL1 @@ -2426,6 +2453,44 @@ kHitachiAc1TempAuto LITERAL1 kHitachiAc1TempDelta LITERAL1 kHitachiAc1TempSize LITERAL1 kHitachiAc1TimerSize LITERAL1 +kHitachiAc264Bits LITERAL1 +kHitachiAc264ButtonFan LITERAL1 +kHitachiAc264ButtonPowerMode LITERAL1 +kHitachiAc264ButtonSwingV LITERAL1 +kHitachiAc264ButtonTempDown LITERAL1 +kHitachiAc264ButtonTempUp LITERAL1 +kHitachiAc264Cool LITERAL1 +kHitachiAc264Dry LITERAL1 +kHitachiAc264Fan LITERAL1 +kHitachiAc264FanAuto LITERAL1 +kHitachiAc264FanHigh LITERAL1 +kHitachiAc264FanLow LITERAL1 +kHitachiAc264FanMedium LITERAL1 +kHitachiAc264FanMin LITERAL1 +kHitachiAc264Heat LITERAL1 +kHitachiAc264MaxTemp LITERAL1 +kHitachiAc264MinTemp LITERAL1 +kHitachiAc264StateLength LITERAL1 +kHitachiAc296Auto LITERAL1 +kHitachiAc296AutoDehumidifying LITERAL1 +kHitachiAc296Bits LITERAL1 +kHitachiAc296CondensationControl LITERAL1 +kHitachiAc296Cool LITERAL1 +kHitachiAc296Dehumidify LITERAL1 +kHitachiAc296DryCool LITERAL1 +kHitachiAc296FanAuto LITERAL1 +kHitachiAc296FanHigh LITERAL1 +kHitachiAc296FanLow LITERAL1 +kHitachiAc296FanMedium LITERAL1 +kHitachiAc296FanSilent LITERAL1 +kHitachiAc296Heat LITERAL1 +kHitachiAc296MaxTemp LITERAL1 +kHitachiAc296MinTemp LITERAL1 +kHitachiAc296PowerOff LITERAL1 +kHitachiAc296PowerOn LITERAL1 +kHitachiAc296QuickLaundry LITERAL1 +kHitachiAc296StateLength LITERAL1 +kHitachiAc296TempAuto LITERAL1 kHitachiAc2Bits LITERAL1 kHitachiAc2StateLength LITERAL1 kHitachiAc344Bits LITERAL1 @@ -2490,8 +2555,6 @@ kHitachiAc424LdrSpace LITERAL1 kHitachiAc424MaxTemp LITERAL1 kHitachiAc424MinTemp LITERAL1 kHitachiAc424OneSpace LITERAL1 -kHitachiAc424PowerOff LITERAL1 -kHitachiAc424PowerOn LITERAL1 kHitachiAc424StateLength LITERAL1 kHitachiAc424ZeroSpace LITERAL1 kHitachiAcAuto LITERAL1 @@ -2553,6 +2616,12 @@ kJvcRptLengthTicks LITERAL1 kJvcTick LITERAL1 kJvcZeroSpace LITERAL1 kJvcZeroSpaceTicks LITERAL1 +kKelon168Bits LITERAL1 +kKelon168FooterSpace LITERAL1 +kKelon168Section1Size LITERAL1 +kKelon168Section2Size LITERAL1 +kKelon168Section3Size LITERAL1 +kKelon168StateLength LITERAL1 kKelonBitMark LITERAL1 kKelonBits LITERAL1 kKelonDryGradeMax LITERAL1 @@ -2602,6 +2671,16 @@ kKelvinatorMinTemp LITERAL1 kKelvinatorOneSpace LITERAL1 kKelvinatorOneSpaceTicks LITERAL1 kKelvinatorStateLength LITERAL1 +kKelvinatorSwingVAuto LITERAL1 +kKelvinatorSwingVHighAuto LITERAL1 +kKelvinatorSwingVHighest LITERAL1 +kKelvinatorSwingVLowAuto LITERAL1 +kKelvinatorSwingVLowerMiddle LITERAL1 +kKelvinatorSwingVLowest LITERAL1 +kKelvinatorSwingVMiddle LITERAL1 +kKelvinatorSwingVMiddleAuto LITERAL1 +kKelvinatorSwingVOff LITERAL1 +kKelvinatorSwingVUpperMiddle LITERAL1 kKelvinatorTick LITERAL1 kKelvinatorZeroSpace LITERAL1 kKelvinatorZeroSpaceTicks LITERAL1 @@ -2640,6 +2719,7 @@ kLg32Bits LITERAL1 kLg32HdrMark LITERAL1 kLg32HdrSpace LITERAL1 kLg32RptHdrMark LITERAL1 +kLg6711a20083vStr LITERAL1 kLgAcAKB74955603DetectionMask LITERAL1 kLgAcAuto LITERAL1 kLgAcChecksumSize LITERAL1 @@ -2684,6 +2764,7 @@ kLgAcSwingVOff LITERAL1 kLgAcSwingVOff_Short LITERAL1 kLgAcSwingVSwing LITERAL1 kLgAcSwingVSwing_Short LITERAL1 +kLgAcSwingVToggle LITERAL1 kLgAcSwingVUpperMiddle LITERAL1 kLgAcSwingVUpperMiddle_Short LITERAL1 kLgAcTempAdjust LITERAL1 @@ -2786,10 +2867,14 @@ kMideaACMinSensorTempC LITERAL1 kMideaACMinSensorTempF LITERAL1 kMideaACMinTempC LITERAL1 kMideaACMinTempF LITERAL1 +kMideaACQuietOff LITERAL1 +kMideaACQuietOn LITERAL1 kMideaACSensorTempOnTimerOff LITERAL1 kMideaACTimerOff LITERAL1 +kMideaACToggle8CHeat LITERAL1 kMideaACToggleEcono LITERAL1 kMideaACToggleLight LITERAL1 +kMideaACToggleSelfClean LITERAL1 kMideaACToggleTurbo LITERAL1 kMideaACTypeCommand LITERAL1 kMideaACTypeFollow LITERAL1 diff --git a/lib/IRremoteESP8266/library.json b/lib/IRremoteESP8266/library.json index e1777f1c4..948ae48fa 100644 --- a/lib/IRremoteESP8266/library.json +++ b/lib/IRremoteESP8266/library.json @@ -1,6 +1,6 @@ { "name": "IRremoteESP8266", - "version": "2.8.1", + "version": "2.8.2", "keywords": "infrared, ir, remote, esp8266, esp32", "description": "Send and receive infrared signals with multiple protocols (ESP8266/ESP32)", "repository": diff --git a/lib/IRremoteESP8266/library.properties b/lib/IRremoteESP8266/library.properties index 5ee1f5229..d776853f2 100644 --- a/lib/IRremoteESP8266/library.properties +++ b/lib/IRremoteESP8266/library.properties @@ -1,5 +1,5 @@ name=IRremoteESP8266 -version=2.8.1 +version=2.8.2 author=David Conran, Sebastien Warin, Mark Szabo, Ken Shirriff maintainer=David Conran, Mark Szabo, Sebastien Warin, Roi Dayan, Massimiliano Pinto, Christian Nilsson sentence=Send and receive infrared signals with multiple protocols (ESP8266/ESP32) diff --git a/lib/IRremoteESP8266/src/IRac.cpp b/lib/IRremoteESP8266/src/IRac.cpp index f9d9647d3..e14f05b62 100644 --- a/lib/IRremoteESP8266/src/IRac.cpp +++ b/lib/IRremoteESP8266/src/IRac.cpp @@ -71,7 +71,6 @@ IRac::IRac(const uint16_t pin, const bool inverted, const bool use_modulation) { _pin = pin; _inverted = inverted; _modulation = use_modulation; - initState(&next); this->markAsSent(); } @@ -132,11 +131,8 @@ void IRac::initState(stdAc::state_t *state, /// @param[out] state A Ptr to where the settings will be stored. /// @note Sets all the parameters to reasonable base/automatic defaults. void IRac::initState(stdAc::state_t *state) { - initState(state, decode_type_t::UNKNOWN, -1, false, stdAc::opmode_t::kOff, - 25, true, // 25 degrees Celsius - stdAc::fanspeed_t::kAuto, stdAc::swingv_t::kOff, - stdAc::swingh_t::kOff, false, false, false, false, false, false, - false, -1, -1); + stdAc::state_t def; + *state = def; } /// Get the current internal A/C climate state. @@ -231,6 +227,12 @@ bool IRac::isProtocolSupported(const decode_type_t protocol) { #if SEND_HITACHI_AC1 case decode_type_t::HITACHI_AC1: #endif +#if SEND_HITACHI_AC264 + case decode_type_t::HITACHI_AC264: +#endif +#if SEND_HITACHI_AC296 + case decode_type_t::HITACHI_AC296: +#endif #if SEND_HITACHI_AC344 case decode_type_t::HITACHI_AC344: #endif @@ -1313,6 +1315,64 @@ void IRac::hitachi1(IRHitachiAc1 *ac, const hitachi_ac1_remote_model_t model, } #endif // SEND_HITACHI_AC1 +#if SEND_HITACHI_AC264 +/// Send a Hitachi 264-bit A/C message with the supplied settings. +/// @param[in, out] ac A Ptr to an IRHitachiAc264 object to use. +/// @param[in] on The power setting. +/// @param[in] mode The operation mode setting. +/// @param[in] degrees The temperature setting in degrees. +/// @param[in] fan The speed setting for the fan. +void IRac::hitachi264(IRHitachiAc264 *ac, + const bool on, const stdAc::opmode_t mode, + const float degrees, const stdAc::fanspeed_t fan) { + ac->begin(); + ac->setMode(ac->convertMode(mode)); + ac->setTemp(degrees); + ac->setFan(ac->convertFan(fan)); + ac->setPower(on); + // No Swing(V) setting available. + // No Swing(H) setting available. + // No Quiet setting available. + // No Turbo setting available. + // No Light setting available. + // No Filter setting available. + // No Clean setting available. + // No Beep setting available. + // No Sleep setting available. + // No Clock setting available. + ac->send(); +} +#endif // SEND_HITACHI_AC264 + +#if SEND_HITACHI_AC296 +/// Send a Hitachi 296-bit A/C message with the supplied settings. +/// @param[in, out] ac A Ptr to an IRHitachiAc296 object to use. +/// @param[in] on The power setting. +/// @param[in] mode The operation mode setting. +/// @param[in] degrees The temperature setting in degrees. +/// @param[in] fan The speed setting for the fan. +void IRac::hitachi296(IRHitachiAc296 *ac, + const bool on, const stdAc::opmode_t mode, + const float degrees, const stdAc::fanspeed_t fan) { + ac->begin(); + ac->setMode(ac->convertMode(mode)); + ac->setTemp(degrees); + ac->setFan(ac->convertFan(fan)); + ac->setPower(on); + // No Swing(V) setting available. + // No Swing(H) setting available. + // No Quiet setting available. + // No Turbo setting available. + // No Light setting available. + // No Filter setting available. + // No Clean setting available. + // No Beep setting available. + // No Sleep setting available. + // No Clock setting available. + ac->send(); +} +#endif // SEND_HITACHI_AC296 + #if SEND_HITACHI_AC344 /// Send a Hitachi 344-bit A/C message with the supplied settings. /// @param[in, out] ac A Ptr to an IRHitachiAc344 object to use. @@ -1437,7 +1497,8 @@ void IRac::kelvinator(IRKelvinatorAC *ac, ac->setMode(ac->convertMode(mode)); ac->setTemp(degrees); ac->setFan((uint8_t)fan); // No conversion needed. - ac->setSwingVertical((int8_t)swingv >= 0); + ac->setSwingVertical(swingv == stdAc::swingv_t::kAuto, // Set auto flag. + ac->convertSwingV(swingv)); ac->setSwingHorizontal((int8_t)swingh >= 0); ac->setQuiet(quiet); ac->setTurbo(turbo); @@ -1480,6 +1541,12 @@ void IRac::lg(IRLgAc *ac, const lg_ac_remote_model_t model, const uint8_t pos = ac->convertVaneSwingV(swingv); for (uint8_t vane = 0; vane < kLgAcSwingVMaxVanes; vane++) ac->setVaneSwingV(vane, pos); + // Toggle the swingv for LG6711A20083V models if we need to. + // i.e. Off to Not-Off, send a toggle. Not-Off to Off, send a toggle. + if ((model == lg_ac_remote_model_t::LG6711A20083V) && + ((swingv == stdAc::swingv_t::kOff) != + (swingv_prev == stdAc::swingv_t::kOff))) + ac->setSwingV(kLgAcSwingVToggle); ac->setSwingH(swingh != stdAc::swingh_t::kOff); // No Quiet setting available. // No Turbo setting available. @@ -1502,16 +1569,21 @@ void IRac::lg(IRLgAc *ac, const lg_ac_remote_model_t model, /// @param[in] degrees The temperature setting in degrees. /// @param[in] fan The speed setting for the fan. /// @param[in] swingv The vertical swing setting. +/// @param[in] quiet Run the device in quiet/silent mode. +/// @param[in] quiet_prev The device's previous quiet/silent mode. /// @param[in] turbo Toggle the device's turbo/powerful mode. /// @param[in] econo Toggle the device's economical mode. /// @param[in] light Toggle the LED/Display mode. +/// @param[in] clean Turn on the self-cleaning mode. e.g. XFan, dry filters etc /// @param[in] sleep Nr. of minutes for sleep mode. -1 is Off, >= 0 is on. /// @note On Danby A/C units, swingv controls the Ion Filter instead. void IRac::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) { + const stdAc::swingv_t swingv, + const bool quiet, const bool quiet_prev, + const bool turbo, const bool econo, const bool light, + const bool clean, const int16_t sleep) { ac->begin(); ac->setPower(on); ac->setMode(ac->convertMode(mode)); @@ -1520,12 +1592,12 @@ void IRac::midea(IRMideaAC *ac, ac->setFan(ac->convertFan(fan)); ac->setSwingVToggle(swingv != stdAc::swingv_t::kOff); // No Horizontal swing setting available. - // No Quiet setting available. + ac->setQuiet(quiet, quiet_prev); ac->setTurboToggle(turbo); ac->setEconoToggle(econo); ac->setLightToggle(light); // No Filter setting available. - // No Clean setting available. + ac->setCleanToggle(clean); // No Beep setting available. ac->setSleep(sleep >= 0); // Sleep on this A/C is either on or off. // No Clock setting available. @@ -1570,6 +1642,7 @@ void IRac::mitsubishi(IRMitsubishiAC *ac, ac->setTemp(degrees); ac->setFan(ac->convertFan(fan)); ac->setVane(ac->convertSwingV(swingv)); + ac->setVaneLeft(ac->convertSwingV(swingv)); ac->setWideVane(ac->convertSwingH(swingh)); if (quiet) ac->setFan(kMitsubishiAcFanSilent); ac->setISave10C(false); @@ -2530,6 +2603,7 @@ stdAc::state_t IRac::handleToggles(const stdAc::state_t desired, result.turbo = desired.turbo ^ prev->turbo; result.econo = desired.econo ^ prev->econo; result.light = desired.light ^ prev->light; + result.clean = desired.clean ^ prev->clean; // FALL THRU case decode_type_t::CORONA_AC: case decode_type_t::HITACHI_AC344: @@ -2645,6 +2719,9 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { const stdAc::swingv_t prev_swingv = (prev != NULL) ? prev->swingv : stdAc::swingv_t::kOff; #endif // (SEND_LG || SEND_SHARP_AC) +#if SEND_MIDEA + const bool prev_quiet = (prev != NULL) ? prev->quiet : !send.quiet; +#endif // SEND_MIDEA // Per vendor settings & setup. switch (send.protocol) { #if SEND_AIRTON @@ -2894,6 +2971,22 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { break; } #endif // SEND_HITACHI_AC1 +#if SEND_HITACHI_AC264 + case HITACHI_AC264: + { + IRHitachiAc264 ac(_pin, _inverted, _modulation); + hitachi264(&ac, send.power, send.mode, degC, send.fanspeed); + break; + } +#endif // SEND_HITACHI_AC264 +#if SEND_HITACHI_AC296 + case HITACHI_AC296: + { + IRHitachiAc296 ac(_pin, _inverted, _modulation); + hitachi296(&ac, send.power, send.mode, degC, send.fanspeed); + break; + } +#endif // SEND_HITACHI_AC296 #if SEND_HITACHI_AC344 case HITACHI_AC344: { @@ -2945,8 +3038,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { { IRMideaAC ac(_pin, _inverted, _modulation); midea(&ac, send.power, send.mode, send.celsius, send.degrees, - send.fanspeed, send.swingv, send.turbo, send.econo, send.light, - send.sleep); + send.fanspeed, send.swingv, send.quiet, prev_quiet, send.turbo, + send.econo, send.light, send.sleep); break; } #endif // SEND_MIDEA @@ -3380,6 +3473,8 @@ int16_t IRac::strToModel(const char *str, const int16_t def) { return gree_ac_remote_model_t::YAW1F; } else if (!STRCASECMP(str, kYbofbStr)) { return gree_ac_remote_model_t::YBOFB; + } else if (!STRCASECMP(str, kYx1fsfStr)) { + return gree_ac_remote_model_t::YX1FSF; // Haier models } else if (!STRCASECMP(str, kV9014557AStr)) { return haier_ac176_remote_model_t::V9014557_A; @@ -3412,6 +3507,8 @@ int16_t IRac::strToModel(const char *str, const int16_t def) { return lg_ac_remote_model_t::AKB74955603; } else if (!STRCASECMP(str, kAkb73757604Str)) { return lg_ac_remote_model_t::AKB73757604; + } else if (!STRCASECMP(str, kLg6711a20083vStr)) { + return lg_ac_remote_model_t::LG6711A20083V; // Panasonic A/C families } else if (!STRCASECMP(str, kLkeStr) || !STRCASECMP(str, kPanasonicLkeStr)) { @@ -3747,6 +3844,20 @@ namespace IRAcUtils { return ac.toString(); } #endif // DECODE_HITACHI_AC1 +#if DECODE_HITACHI_AC264 + case decode_type_t::HITACHI_AC264: { + IRHitachiAc264 ac(kGpioUnused); + ac.setRaw(result->state); + return ac.toString(); + } +#endif // DECODE_HITACHI_AC264 +#if DECODE_HITACHI_AC296 + case decode_type_t::HITACHI_AC296: { + IRHitachiAc296 ac(kGpioUnused); + ac.setRaw(result->state); + return ac.toString(); + } +#endif // DECODE_HITACHI_AC296 #if DECODE_HITACHI_AC344 case decode_type_t::HITACHI_AC344: { IRHitachiAc344 ac(kGpioUnused); @@ -4060,7 +4171,7 @@ namespace IRAcUtils { case decode_type_t::DAIKIN128: { IRDaikin128 ac(kGpioUnused); ac.setRaw(decode->state); - *result = ac.toCommon(); + *result = ac.toCommon(prev); break; } #endif // DECODE_DAIKIN128 @@ -4144,7 +4255,7 @@ namespace IRAcUtils { case decode_type_t::FUJITSU_AC: { IRFujitsuAC ac(kGpioUnused); ac.setRaw(decode->state, decode->bits / 8); - *result = ac.toCommon(); + *result = ac.toCommon(prev); break; } #endif // DECODE_FUJITSU_AC @@ -4204,6 +4315,22 @@ namespace IRAcUtils { break; } #endif // DECODE_HITACHI_AC1 +#if DECODE_HITACHI_AC264 + case decode_type_t::HITACHI_AC264: { + IRHitachiAc264 ac(kGpioUnused); + ac.setRaw(decode->state); + *result = ac.toCommon(); + break; + } +#endif // DECODE_HITACHI_AC264 +#if DECODE_HITACHI_AC296 + case decode_type_t::HITACHI_AC296: { + IRHitachiAc296 ac(kGpioUnused); + ac.setRaw(decode->state); + *result = ac.toCommon(); + break; + } +#endif // DECODE_HITACHI_AC296 #if DECODE_HITACHI_AC344 case decode_type_t::HITACHI_AC344: { IRHitachiAc344 ac(kGpioUnused); @@ -4224,7 +4351,7 @@ namespace IRAcUtils { case decode_type_t::KELON: { IRKelonAc ac(kGpioUnused); ac.setRaw(decode->value); - *result = ac.toCommon(); + *result = ac.toCommon(prev); break; } #endif // DECODE_KELON diff --git a/lib/IRremoteESP8266/src/IRac.h b/lib/IRremoteESP8266/src/IRac.h index 9954eecb0..8e3ef7582 100644 --- a/lib/IRremoteESP8266/src/IRac.h +++ b/lib/IRremoteESP8266/src/IRac.h @@ -300,6 +300,16 @@ void electra(IRElectraAc *ac, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool swing_toggle, const int16_t sleep = -1); #endif // SEND_HITACHI_AC1 +#if SEND_HITACHI_AC264 + void hitachi264(IRHitachiAc264 *ac, + const bool on, const stdAc::opmode_t mode, + const float degrees, const stdAc::fanspeed_t fan); +#endif // SEND_HITACHI_AC264 +#if SEND_HITACHI_AC296 + void hitachi296(IRHitachiAc296 *ac, + const bool on, const stdAc::opmode_t mode, + const float degrees, const stdAc::fanspeed_t fan); +#endif // SEND_HITACHI_AC296 #if SEND_HITACHI_AC344 void hitachi344(IRHitachiAc344 *ac, const bool on, const stdAc::opmode_t mode, @@ -338,8 +348,10 @@ void electra(IRElectraAc *ac, 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); + const stdAc::swingv_t swingv, + const bool quiet, const bool quiet_prev, const bool turbo, + const bool econo, const bool light, const bool clean, + const int16_t sleep = -1); #endif // SEND_MIDEA #if SEND_MIRAGE void mirage(IRMirageAc *ac, const stdAc::state_t state); diff --git a/lib/IRremoteESP8266/src/IRrecv.cpp b/lib/IRremoteESP8266/src/IRrecv.cpp index 0b2efeb09..6ff9fd70b 100644 --- a/lib/IRremoteESP8266/src/IRrecv.cpp +++ b/lib/IRremoteESP8266/src/IRrecv.cpp @@ -22,8 +22,8 @@ extern "C" { #include "IRutils.h" #ifdef UNIT_TEST -#undef IRAM_ATTR -#define IRAM_ATTR +#undef ICACHE_RAM_ATTR +#define ICACHE_RAM_ATTR #endif #ifndef USE_IRAM_ATTR @@ -261,13 +261,20 @@ static void USE_IRAM_ATTR gpio_intr() { /// capturing data. (Default: kTimeoutMs) /// @param[in] save_buffer Use a second (save) buffer to decode from. /// (Default: false) -/// @param[in] timer_num Nr. of the ESP32 timer to use (0 to 3) (ESP32 Only) +/// @param[in] timer_num Nr. of the ESP32 timer to use. (0 to 3) (ESP32 Only) +/// or (0 to 1) (ESP32-C3) #if defined(ESP32) IRrecv::IRrecv(const uint16_t recvpin, const uint16_t bufsize, const uint8_t timeout, const bool save_buffer, const uint8_t timer_num) { - // There are only 4 timers. 0 to 3. - _timer_num = std::min(timer_num, (uint8_t)3); + // Ensure we use a valid timer number. + _timer_num = std::min(timer_num, + (uint8_t)( +#ifdef SOC_TIMER_GROUP_TOTAL_TIMERS + SOC_TIMER_GROUP_TOTAL_TIMERS - 1)); +#else // SOC_TIMER_GROUP_TOTAL_TIMERS + 3)); +#endif // SOC_TIMER_GROUP_TOTAL_TIMERS #else // ESP32 /// @cond IGNORE /// Class constructor @@ -353,6 +360,13 @@ void IRrecv::enableIRIn(const bool pullup) { // Initialise the ESP32 timer. // 80MHz / 80 = 1 uSec granularity. timer = timerBegin(_timer_num, 80, true); +#ifdef DEBUG + if (timer == NULL) { + DPRINT("FATAL: Unable enable system timer: "); + DPRINTLN((uint16_t)_timer_num); + } +#endif // DEBUG + assert(timer != NULL); // Check we actually got the timer. // Set the timer so it only fires once, and set it's trigger in uSeconds. timerAlarmWrite(timer, MS_TO_USEC(params.timeout), ONCE); // Note: Interrupt needs to be attached before it can be enabled or disabled. @@ -715,6 +729,11 @@ bool IRrecv::decode(decode_results *results, irparams_t *save, DPRINTLN("Attempting Sharp decode"); if (decodeSharp(results, offset)) return true; #endif +#if DECODE_BOSCH144 + DPRINTLN("Attempting Bosch 144-bit decode"); + // Bosch is similar to Coolix, so it must be attempted before decodeCOOLIX. + if (decodeBosch144(results, offset)) return true; +#endif // DECODE_BOSCH144 #if DECODE_COOLIX DPRINTLN("Attempting Coolix 24-bit decode"); if (decodeCOOLIX(results, offset)) return true; @@ -830,6 +849,18 @@ bool IRrecv::decode(decode_results *results, irparams_t *save, if (decodeHitachiAC(results, offset, kHitachiAc344Bits, true, false)) return true; #endif // DECODE_HITACHI_AC344 +#if DECODE_HITACHI_AC264 + // HitachiAC264 should be checked before HitachiAC + DPRINTLN("Attempting Hitachi AC264 decode"); + if (decodeHitachiAC(results, offset, kHitachiAc264Bits, true, false)) + return true; +#endif // DECODE_HITACHI_AC264 +#if DECODE_HITACHI_AC296 + // HitachiAC296 should be checked before HitachiAC + DPRINTLN("Attempting Hitachi AC296 decode"); + if (decodeHitachiAc296(results, offset, kHitachiAc296Bits, true)) + return true; +#endif // DECODE_HITACHI_AC296 #if DECODE_HITACHI_AC2 // HitachiAC2 should be checked before HitachiAC DPRINTLN("Attempting Hitachi AC2 decode"); @@ -1044,8 +1075,12 @@ bool IRrecv::decode(decode_results *results, irparams_t *save, DPRINTLN("Attempting Teknopoint decode"); if (decodeTeknopoint(results, offset)) return true; #endif // DECODE_TEKNOPOINT +#if DECODE_KELON168 + DPRINTLN("Attempting Kelon 168-bit decode"); + if (decodeKelon168(results, offset)) return true; +#endif // DECODE_KELON168 #if DECODE_KELON - DPRINTLN("Attempting Kelon decode"); + DPRINTLN("Attempting Kelon 48-bit decode"); if (decodeKelon(results, offset)) return true; #endif // DECODE_KELON #if DECODE_SANYO_AC88 @@ -1072,6 +1107,39 @@ bool IRrecv::decode(decode_results *results, irparams_t *save, DPRINTLN("Attempting Coolix 48-bit decode"); if (decodeCoolix48(results, offset)) return true; #endif // DECODE_COOLIX48 +#if DECODE_DAIKIN200 + DPRINTLN("Attempting Daikin 200-bit decode"); + if (decodeDaikin200(results, offset)) return true; +#endif // DECODE_DAIKIN200 +#if DECODE_HAIER_AC160 + DPRINTLN("Attempting Haier AC 160 bit decode"); + if (decodeHaierAC160(results, offset)) return true; +#endif // DECODE_HAIER_AC160 +#if DECODE_CARRIER_AC128 + DPRINTLN("Attempting Carrier AC 128-bit decode"); + if (decodeCarrierAC128(results, offset)) return true; +#endif // DECODE_CARRIER_AC128 +#if DECODE_TOTO + DPRINTLN("Attempting Toto 48/24-bit decode"); + if (decodeToto(results, offset, kTotoLongBits) || // Long needs to be first + decodeToto(results, offset, kTotoShortBits)) return true; +#endif // DECODE_TOTO +#if DECODE_CLIMABUTLER + DPRINTLN("Attempting ClimaButler decode"); + if (decodeClimaButler(results)) return true; +#endif // DECODE_CLIMABUTLER +#if DECODE_TCL96AC + DPRINTLN("Attempting TCL AC 96-bit decode"); + if (decodeTcl96Ac(results, offset)) return true; +#endif // DECODE_TCL96AC +#if DECODE_SANYO_AC152 + DPRINTLN("Attempting Sanyo AC 152-bit decode"); + if (decodeSanyoAc152(results, offset)) return true; +#endif // DECODE_SANYO_AC152 +#if DECODE_DAIKIN312 + DPRINTLN("Attempting Daikin 312-bit decode"); + if (decodeDaikin312(results, offset)) return true; +#endif // DECODE_DAIKIN312 // Typically new protocols are added above this line. } #if DECODE_HASH @@ -1086,7 +1154,7 @@ bool IRrecv::decode(decode_results *results, irparams_t *save, if (!resumed) // Check if we have already resumed. resume(); return false; -} +} // NOLINT(readability/fn_size) /// Convert the tolerance percentage into something valid. /// @param[in] percentage An integer percentage. @@ -1166,8 +1234,8 @@ bool IRrecv::matchAtLeast(uint32_t measured, uint32_t desired, DPRINT(". Matching: "); DPRINT(measured); DPRINT(" >= "); - DPRINT(ticksLow(std::min(desired, MS_TO_USEC(params.timeout)), tolerance, - delta)); + DPRINT(ticksLow(std::min(desired, (uint32_t)MS_TO_USEC(params.timeout)), + tolerance, delta)); DPRINT(" [min("); DPRINT(ticksLow(desired, tolerance, delta)); DPRINT(", "); diff --git a/lib/IRremoteESP8266/src/IRrecv.h b/lib/IRremoteESP8266/src/IRrecv.h index 75070172d..025de5272 100644 --- a/lib/IRremoteESP8266/src/IRrecv.h +++ b/lib/IRremoteESP8266/src/IRrecv.h @@ -52,8 +52,15 @@ const uint16_t kMaxTimeoutMs = kRawTick * (UINT16_MAX / MS_TO_USEC(1)); const uint32_t kFnvPrime32 = 16777619UL; const uint32_t kFnvBasis32 = 2166136261UL; -// Which of the ESP32 timers to use by default. (0-3) +#ifdef ESP32 +// Which of the ESP32 timers to use by default. +// (3 for most ESP32s, 1 for ESP32-C3s) +#ifdef SOC_TIMER_GROUP_TOTAL_TIMERS +const uint8_t kDefaultESP32Timer = SOC_TIMER_GROUP_TOTAL_TIMERS - 1; +#else // SOC_TIMER_GROUP_TOTAL_TIMERS const uint8_t kDefaultESP32Timer = 3; +#endif // SOC_TIMER_GROUP_TOTAL_TIMERS +#endif // ESP32 #if DECODE_AC // Hitachi AC is the current largest state size. @@ -318,6 +325,12 @@ class IRrecv { const uint16_t nbits = kSanyoAc88Bits, const bool strict = true); #endif // DECODE_SANYO_AC88 +#if DECODE_SANYO_AC152 + bool decodeSanyoAc152(decode_results *results, + uint16_t offset = kStartOffset, + const uint16_t nbits = kSanyoAc152Bits, + const bool strict = true); +#endif // DECODE_SANYO_AC152 #if DECODE_MITSUBISHI bool decodeMitsubishi(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kMitsubishiBits, @@ -500,11 +513,21 @@ class IRrecv { const uint16_t nbits = kDaikin2Bits, const bool strict = true); #endif +#if DECODE_DAIKIN200 + bool decodeDaikin200(decode_results *results, uint16_t offset = kStartOffset, + const uint16_t nbits = kDaikin200Bits, + const bool strict = true); +#endif // DECODE_DAIKIN200 #if DECODE_DAIKIN216 bool decodeDaikin216(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kDaikin216Bits, const bool strict = true); -#endif +#endif // DECODE_DAIKIN216 +#if DECODE_DAIKIN312 + bool decodeDaikin312(decode_results *results, uint16_t offset = kStartOffset, + const uint16_t nbits = kDaikin312Bits, + const bool strict = true); +#endif // DECODE_DAIKIN312 #if DECODE_TOSHIBA_AC bool decodeToshibaAC(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kToshibaACBits, @@ -562,6 +585,12 @@ class IRrecv { const uint16_t nbits = kCarrierAc64Bits, const bool strict = true); #endif // DECODE_CARRIER_AC64 +#if DECODE_CARRIER_AC128 + bool decodeCarrierAC128(decode_results *results, + uint16_t offset = kStartOffset, + const uint16_t nbits = kCarrierAc128Bits, + const bool strict = true); +#endif // DECODE_CARRIER_AC128 #if DECODE_GOODWEATHER bool decodeGoodweather(decode_results *results, uint16_t offset = kStartOffset, @@ -573,7 +602,8 @@ class IRrecv { const uint16_t nbits = kGreeBits, const bool strict = true); #endif -#if (DECODE_HAIER_AC | DECODE_HAIER_AC_YRW02) +#if (DECODE_HAIER_AC | DECODE_HAIER_AC_YRW02 || DECODE_HAIER_AC160 || \ + DECODE_HAIER_AC176) bool decodeHaierAC(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kHaierACBits, const bool strict = true); @@ -584,17 +614,25 @@ class IRrecv { const uint16_t nbits = kHaierACYRW02Bits, const bool strict = true); #endif +#if DECODE_HAIER_AC160 + bool decodeHaierAC160(decode_results *results, + uint16_t offset = kStartOffset, + const uint16_t nbits = kHaierAC160Bits, + const bool strict = true); +#endif // DECODE_HAIER_AC160 #if DECODE_HAIER_AC176 bool decodeHaierAC176(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kHaierAC176Bits, const bool strict = true); #endif // DECODE_HAIER_AC176 -#if (DECODE_HITACHI_AC || DECODE_HITACHI_AC2 || DECODE_HITACHI_AC344) +#if (DECODE_HITACHI_AC || DECODE_HITACHI_AC2 || DECODE_HITACHI_AC264 || \ + DECODE_HITACHI_AC344) bool decodeHitachiAC(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kHitachiAcBits, const bool strict = true, const bool MSBfirst = true); -#endif +#endif // (DECODE_HITACHI_AC || DECODE_HITACHI_AC2 || DECODE_HITACHI_AC264 || + // DECODE_HITACHI_AC344) #if DECODE_HITACHI_AC1 bool decodeHitachiAC1(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kHitachiAc1Bits, @@ -606,6 +644,12 @@ class IRrecv { const uint16_t nbits = kHitachiAc3Bits, const bool strict = true); #endif // DECODE_HITACHI_AC3 +#if DECODE_HITACHI_AC296 + bool decodeHitachiAc296(decode_results *results, + uint16_t offset = kStartOffset, + const uint16_t nbits = kHitachiAc296Bits, + const bool strict = true); +#endif // DECODE_HITACHI_AC296 #if DECODE_HITACHI_AC424 bool decodeHitachiAc424(decode_results *results, uint16_t offset = kStartOffset, @@ -771,6 +815,11 @@ class IRrecv { bool decodeKelon(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kKelonBits, const bool strict = true); #endif // DECODE_KELON +#if DECODE_KELON168 + bool decodeKelon168(decode_results *results, uint16_t offset = kStartOffset, + const uint16_t nbits = kKelon168Bits, + const bool strict = true); +#endif // DECODE_KELON168 #if DECODE_BOSE bool decodeBose(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kBoseBits, const bool strict = true); @@ -784,6 +833,29 @@ class IRrecv { const uint16_t nbits = kAirtonBits, const bool strict = true); #endif // DECODE_AIRTON +#if DECODE_TOTO + bool decodeToto(decode_results *results, uint16_t offset = kStartOffset, + const uint16_t nbits = kTotoBits, + const bool strict = true); +#endif // DECODE_TOTO +#if DECODE_CLIMABUTLER + bool decodeClimaButler(decode_results *results, + uint16_t offset = kStartOffset, + const uint16_t nbits = kClimaButlerBits, + const bool strict = true); +#endif // DECODE_CLIMABUTLER +#if DECODE_TCL96AC + bool decodeTcl96Ac(decode_results *results, + uint16_t offset = kStartOffset, + const uint16_t nbits = kTcl96AcBits, + const bool strict = true); +#endif // DECODE_TCL96AC +#if DECODE_BOSCH144 + bool decodeBosch144(decode_results *results, + uint16_t offset = kStartOffset, + const uint16_t nbits = kBosch144Bits, + const bool strict = true); +#endif // DECODE_BOSCH144 }; #endif // IRRECV_H_ diff --git a/lib/IRremoteESP8266/src/IRremoteESP8266.h b/lib/IRremoteESP8266/src/IRremoteESP8266.h index 3cd19a81d..f73909054 100644 --- a/lib/IRremoteESP8266/src/IRremoteESP8266.h +++ b/lib/IRremoteESP8266/src/IRremoteESP8266.h @@ -58,12 +58,13 @@ // Minor version number (x.X.x) #define _IRREMOTEESP8266_VERSION_MINOR 8 // Patch version number (x.x.X) -#define _IRREMOTEESP8266_VERSION_PATCH 1 +#define _IRREMOTEESP8266_VERSION_PATCH 2 // Macro to convert version info into an integer #define _IRREMOTEESP8266_VERSION_VAL(major, minor, patch) \ ((major << 16) | (minor << 8) | (patch)) // Macro to convert literal into a string -#define MKSTR(x) #x +#define MKSTR_HELPER(x) #x +#define MKSTR(x) MKSTR_HELPER(x) // Integer version #define _IRREMOTEESP8266_VERSION _IRREMOTEESP8266_VERSION_VAL(\ _IRREMOTEESP8266_VERSION_MAJOR, \ @@ -237,6 +238,13 @@ #define SEND_SANYO_AC88 _IR_ENABLE_DEFAULT_ #endif // SEND_SANYO_AC88 +#ifndef DECODE_SANYO_AC152 +#define DECODE_SANYO_AC152 _IR_ENABLE_DEFAULT_ +#endif // DECODE_SANYO_AC152 +#ifndef SEND_SANYO_AC152 +#define SEND_SANYO_AC152 _IR_ENABLE_DEFAULT_ +#endif // SEND_SANYO_AC152 + #ifndef DECODE_MITSUBISHI #define DECODE_MITSUBISHI _IR_ENABLE_DEFAULT_ #endif // DECODE_MITSUBISHI @@ -454,6 +462,13 @@ #define SEND_CARRIER_AC64 _IR_ENABLE_DEFAULT_ #endif // SEND_CARRIER_AC64 +#ifndef DECODE_CARRIER_AC128 +#define DECODE_CARRIER_AC128 _IR_ENABLE_DEFAULT_ +#endif // DECODE_CARRIER_AC128 +#ifndef SEND_CARRIER_AC128 +#define SEND_CARRIER_AC128 _IR_ENABLE_DEFAULT_ +#endif // SEND_CARRIER_AC128 + #ifndef DECODE_HAIER_AC #define DECODE_HAIER_AC _IR_ENABLE_DEFAULT_ #endif // DECODE_HAIER_AC @@ -489,6 +504,20 @@ #define SEND_HITACHI_AC3 _IR_ENABLE_DEFAULT_ #endif // SEND_HITACHI_AC3 +#ifndef DECODE_HITACHI_AC264 +#define DECODE_HITACHI_AC264 _IR_ENABLE_DEFAULT_ +#endif // DECODE_HITACHI_AC264 +#ifndef SEND_HITACHI_AC264 +#define SEND_HITACHI_AC264 _IR_ENABLE_DEFAULT_ +#endif // SEND_HITACHI_AC264 + +#ifndef DECODE_HITACHI_AC296 +#define DECODE_HITACHI_AC296 _IR_ENABLE_DEFAULT_ +#endif // DECODE_HITACHI_AC296 +#ifndef SEND_HITACHI_AC296 +#define SEND_HITACHI_AC296 _IR_ENABLE_DEFAULT_ +#endif // SEND_HITACHI_AC296 + #ifndef DECODE_HITACHI_AC344 #define DECODE_HITACHI_AC344 _IR_ENABLE_DEFAULT_ #endif // DECODE_HITACHI_AC344 @@ -587,6 +616,13 @@ #define SEND_TECO _IR_ENABLE_DEFAULT_ #endif // SEND_TECO +#ifndef DECODE_TCL96AC +#define DECODE_TCL96AC _IR_ENABLE_DEFAULT_ +#endif // DECODE_TCL96AC +#ifndef SEND_TCL96AC +#define SEND_TCL96AC _IR_ENABLE_DEFAULT_ +#endif // SEND_TCL96AC + #ifndef DECODE_TCL112AC #define DECODE_TCL112AC _IR_ENABLE_DEFAULT_ #endif // DECODE_TCL112AC @@ -839,6 +875,55 @@ #define SEND_AIRTON _IR_ENABLE_DEFAULT_ #endif // SEND_AIRTON +#ifndef DECODE_KELON168 +#define DECODE_KELON168 _IR_ENABLE_DEFAULT_ +#endif // DECODE_KELON168 +#ifndef SEND_KELON168 +#define SEND_KELON168 _IR_ENABLE_DEFAULT_ +#endif // SEND_KELON168 + +#ifndef DECODE_DAIKIN200 +#define DECODE_DAIKIN200 _IR_ENABLE_DEFAULT_ +#endif // DECODE_DAIKIN200 +#ifndef SEND_DAIKIN200 +#define SEND_DAIKIN200 _IR_ENABLE_DEFAULT_ +#endif // SEND_DAIKIN200 + +#ifndef DECODE_HAIER_AC160 +#define DECODE_HAIER_AC160 _IR_ENABLE_DEFAULT_ +#endif // DECODE_HAIER_AC160 +#ifndef SEND_HAIER_AC160 +#define SEND_HAIER_AC160 _IR_ENABLE_DEFAULT_ +#endif // SEND_HAIER_AC160 + +#ifndef DECODE_TOTO +#define DECODE_TOTO _IR_ENABLE_DEFAULT_ +#endif // DECODE_TOTO +#ifndef SEND_TOTO +#define SEND_TOTO _IR_ENABLE_DEFAULT_ +#endif // SEND_TOTO + +#ifndef DECODE_CLIMABUTLER +#define DECODE_CLIMABUTLER _IR_ENABLE_DEFAULT_ +#endif // DECODE_CLIMABUTLER +#ifndef SEND_CLIMABUTLER +#define SEND_CLIMABUTLER _IR_ENABLE_DEFAULT_ +#endif // SEND_CLIMABUTLER + +#ifndef DECODE_BOSCH144 +#define DECODE_BOSCH144 _IR_ENABLE_DEFAULT_ +#endif // DECODE_BOSCH144 +#ifndef SEND_BOSCH144 +#define SEND_BOSCH144 _IR_ENABLE_DEFAULT_ +#endif // SEND_BOSCH144 + +#ifndef DECODE_DAIKIN312 +#define DECODE_DAIKIN312 _IR_ENABLE_DEFAULT_ +#endif // DECODE_DAIKIN312 +#ifndef SEND_DAIKIN312 +#define SEND_DAIKIN312 _IR_ENABLE_DEFAULT_ +#endif // SEND_DAIKIN312 + #if (DECODE_ARGO || DECODE_DAIKIN || DECODE_FUJITSU_AC || DECODE_GREE || \ DECODE_KELVINATOR || DECODE_MITSUBISHI_AC || DECODE_TOSHIBA_AC || \ DECODE_TROTEC || DECODE_HAIER_AC || DECODE_HITACHI_AC || \ @@ -853,7 +938,10 @@ DECODE_HITACHI_AC344 || DECODE_CORONA_AC || DECODE_SANYO_AC || \ DECODE_VOLTAS || DECODE_MIRAGE || DECODE_HAIER_AC176 || \ DECODE_TEKNOPOINT || DECODE_KELON || DECODE_TROTEC_3550 || \ - DECODE_SANYO_AC88 || DECODE_RHOSS || \ + DECODE_SANYO_AC88 || DECODE_RHOSS || DECODE_HITACHI_AC264 || \ + DECODE_KELON168 || DECODE_HITACHI_AC296 || DECODE_CARRIER_AC128 || \ + DECODE_DAIKIN200 || DECODE_HAIER_AC160 || DECODE_TCL96AC || \ + DECODE_BOSCH144 || DECODE_SANYO_AC152 || DECODE_DAIKIN312 || \ false) // Add any DECODE to the above if it uses result->state (see kStateSizeMax) // you might also want to add the protocol to hasACState function @@ -1004,8 +1092,20 @@ enum decode_type_t { RHOSS, AIRTON, COOLIX48, // 110 + HITACHI_AC264, + KELON168, + HITACHI_AC296, + DAIKIN200, + HAIER_AC160, // 115 + CARRIER_AC128, + TOTO, + CLIMABUTLER, + TCL96AC, + BOSCH144, // 120 + SANYO_AC152, + DAIKIN312, // Add new entries before this one, and update it to point to the last entry. - kLastDecodeType = COOLIX48, + kLastDecodeType = DAIKIN312, }; // Message lengths & required repeat values @@ -1026,6 +1126,8 @@ const uint16_t kArgoStateLength = 12; const uint16_t kArgoBits = kArgoStateLength * 8; const uint16_t kArgoDefaultRepeat = kNoRepeat; const uint16_t kArrisBits = 32; +const uint16_t kBosch144StateLength = 18; +const uint16_t kBosch144Bits = kBosch144StateLength * 8; const uint16_t kCoolixBits = 24; const uint16_t kCoolix48Bits = kCoolixBits * 2; const uint16_t kCoolixDefaultRepeat = kSingleRepeat; @@ -1035,6 +1137,9 @@ const uint16_t kCarrierAc40Bits = 40; const uint16_t kCarrierAc40MinRepeat = 2; const uint16_t kCarrierAc64Bits = 64; const uint16_t kCarrierAc64MinRepeat = kNoRepeat; +const uint16_t kCarrierAc128StateLength = 16; +const uint16_t kCarrierAc128Bits = kCarrierAc128StateLength * 8; +const uint16_t kCarrierAc128MinRepeat = kNoRepeat; const uint16_t kCoronaAcStateLengthShort = 7; const uint16_t kCoronaAcStateLength = kCoronaAcStateLengthShort * 3; const uint16_t kCoronaAcBitsShort = kCoronaAcStateLengthShort * 8; @@ -1061,9 +1166,15 @@ const uint16_t kDaikin152DefaultRepeat = kNoRepeat; const uint16_t kDaikin176StateLength = 22; const uint16_t kDaikin176Bits = kDaikin176StateLength * 8; const uint16_t kDaikin176DefaultRepeat = kNoRepeat; +const uint16_t kDaikin200StateLength = 25; +const uint16_t kDaikin200Bits = kDaikin200StateLength * 8; +const uint16_t kDaikin200DefaultRepeat = kNoRepeat; const uint16_t kDaikin216StateLength = 27; const uint16_t kDaikin216Bits = kDaikin216StateLength * 8; const uint16_t kDaikin216DefaultRepeat = kNoRepeat; +const uint16_t kDaikin312StateLength = 39; +const uint16_t kDaikin312Bits = kDaikin312StateLength * 8; +const uint16_t kDaikin312DefaultRepeat = kNoRepeat; const uint16_t kDelonghiAcBits = 64; const uint16_t kDelonghiAcDefaultRepeat = kNoRepeat; const uint16_t kTechnibelAcBits = 56; @@ -1101,6 +1212,9 @@ const uint16_t kHaierAcDefaultRepeat = kNoRepeat; const uint16_t kHaierACYRW02StateLength = 14; const uint16_t kHaierACYRW02Bits = kHaierACYRW02StateLength * 8; const uint16_t kHaierAcYrw02DefaultRepeat = kNoRepeat; +const uint16_t kHaierAC160StateLength = 20; +const uint16_t kHaierAC160Bits = kHaierAC160StateLength * 8; +const uint16_t kHaierAc160DefaultRepeat = kNoRepeat; const uint16_t kHaierAC176StateLength = 22; const uint16_t kHaierAC176Bits = kHaierAC176StateLength * 8; const uint16_t kHaierAc176DefaultRepeat = kNoRepeat; @@ -1115,6 +1229,10 @@ const uint16_t kHitachiAc3StateLength = 27; const uint16_t kHitachiAc3Bits = kHitachiAc3StateLength * 8; const uint16_t kHitachiAc3MinStateLength = 15; const uint16_t kHitachiAc3MinBits = kHitachiAc3MinStateLength * 8; +const uint16_t kHitachiAc264StateLength = 33; +const uint16_t kHitachiAc264Bits = kHitachiAc264StateLength * 8; +const uint16_t kHitachiAc296StateLength = 37; +const uint16_t kHitachiAc296Bits = kHitachiAc296StateLength * 8; const uint16_t kHitachiAc344StateLength = 43; const uint16_t kHitachiAc344Bits = kHitachiAc344StateLength * 8; const uint16_t kHitachiAc424StateLength = 53; @@ -1123,6 +1241,8 @@ const uint16_t kInaxBits = 24; const uint16_t kInaxMinRepeat = kSingleRepeat; const uint16_t kJvcBits = 16; const uint16_t kKelonBits = 48; +const uint16_t kKelon168StateLength = 21; +const uint16_t kKelon168Bits = kKelon168StateLength * 8; const uint16_t kKelvinatorStateLength = 16; const uint16_t kKelvinatorBits = kKelvinatorStateLength * 8; const uint16_t kKelvinatorDefaultRepeat = kNoRepeat; @@ -1198,6 +1318,9 @@ const uint16_t kSanyoAcBits = kSanyoAcStateLength * 8; const uint16_t kSanyoAc88StateLength = 11; const uint16_t kSanyoAc88Bits = kSanyoAc88StateLength * 8; const uint16_t kSanyoAc88MinRepeat = 2; +const uint16_t kSanyoAc152StateLength = 19; +const uint16_t kSanyoAc152Bits = kSanyoAc152StateLength * 8; +const uint16_t kSanyoAc152MinRepeat = kNoRepeat; const uint16_t kSanyoSA8650BBits = 12; const uint16_t kSanyoLC7461AddressBits = 13; const uint16_t kSanyoLC7461CommandBits = 8; @@ -1218,6 +1341,9 @@ const uint16_t kSonyMinBits = 12; const uint16_t kSonyMinRepeat = 2; const uint16_t kSymphonyBits = 12; const uint16_t kSymphonyDefaultRepeat = 3; +const uint16_t kTcl96AcStateLength = 12; +const uint16_t kTcl96AcBits = kTcl96AcStateLength * 8; +const uint16_t kTcl96AcDefaultRepeat = kNoRepeat; const uint16_t kTcl112AcStateLength = 14; const uint16_t kTcl112AcBits = kTcl112AcStateLength * 8; const uint16_t kTcl112AcDefaultRepeat = kNoRepeat; @@ -1232,6 +1358,10 @@ const uint16_t kToshibaACStateLengthShort = kToshibaACStateLength - 2; const uint16_t kToshibaACBitsShort = kToshibaACStateLengthShort * 8; const uint16_t kToshibaACStateLengthLong = kToshibaACStateLength + 1; const uint16_t kToshibaACBitsLong = kToshibaACStateLengthLong * 8; +const uint16_t kTotoBits = 24; +const uint16_t kTotoShortBits = kTotoBits; +const uint16_t kTotoLongBits = kTotoShortBits * 2; +const uint16_t kTotoDefaultRepeat = kSingleRepeat; const uint16_t kTranscoldBits = 24; const uint16_t kTranscoldDefaultRepeat = kNoRepeat; const uint16_t kTrotecStateLength = 9; @@ -1255,6 +1385,7 @@ const uint16_t kBoseBits = 16; const uint16_t kRhossStateLength = 12; const uint16_t kRhossBits = kRhossStateLength * 8; const uint16_t kRhossDefaultRepeat = 0; +const uint16_t kClimaButlerBits = 52; // Legacy defines. (Deprecated) @@ -1282,6 +1413,8 @@ const uint16_t kRhossDefaultRepeat = 0; #define HITACHI_AC1_BITS kHitachiAc1Bits #define HITACHI_AC2_STATE_LENGTH kHitachiAc2StateLength #define HITACHI_AC2_BITS kHitachiAc2Bits +#define HITACHI_AC296_STATE_LENGTH kHitachiAc296StateLength +#define HITACHI_AC296_BITS kHitachiAc296Bits #define JVC_BITS kJvcBits #define KELVINATOR_STATE_LENGTH kKelvinatorStateLength #define LASERTAG_BITS kLasertagBits diff --git a/lib/IRremoteESP8266/src/IRsend.cpp b/lib/IRremoteESP8266/src/IRsend.cpp index e0a66e068..1fb1339c5 100644 --- a/lib/IRremoteESP8266/src/IRsend.cpp +++ b/lib/IRremoteESP8266/src/IRsend.cpp @@ -571,6 +571,7 @@ uint16_t IRsend::minRepeats(const decode_type_t protocol) { case MULTIBRACKETS: case SHERWOOD: case TOSHIBA_AC: + case TOTO: return kSingleRepeat; // Special case AIRWELL: @@ -633,6 +634,7 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) { case MIDEA24: case NIKAI: case RCMM: + case TOTO: case TRANSCOLD: return 24; case LG: @@ -668,6 +670,8 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) { case MIDEA: case PANASONIC: return 48; + case CLIMABUTLER: + return kClimaButlerBits; // 52 case AIRTON: case ECOCLIM: case MAGIQUEST: @@ -682,8 +686,12 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) { return 64; case ARGO: return kArgoBits; + case BOSCH144: + return kBosch144Bits; case CORONA_AC: return kCoronaAcBits; + case CARRIER_AC128: + return kCarrierAc128Bits; case DAIKIN: return kDaikinBits; case DAIKIN128: @@ -696,8 +704,12 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) { return kDaikin176Bits; case DAIKIN2: return kDaikin2Bits; + case DAIKIN200: + return kDaikin200Bits; case DAIKIN216: return kDaikin216Bits; + case DAIKIN312: + return kDaikin312Bits; case DAIKIN64: return kDaikin64Bits; case ELECTRA_AC: @@ -708,6 +720,8 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) { return kHaierACBits; case HAIER_AC_YRW02: return kHaierACYRW02Bits; + case HAIER_AC160: + return kHaierAC160Bits; case HAIER_AC176: return kHaierAC176Bits; case HITACHI_AC: @@ -718,10 +732,16 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) { return kHitachiAc2Bits; case HITACHI_AC3: return kHitachiAc3Bits; + case HITACHI_AC264: + return kHitachiAc264Bits; + case HITACHI_AC296: + return kHitachiAc296Bits; case HITACHI_AC344: return kHitachiAc344Bits; case HITACHI_AC424: return kHitachiAc424Bits; + case KELON168: + return kKelon168Bits; case KELVINATOR: return kKelvinatorBits; case MILESTAG2: @@ -750,8 +770,12 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) { return kSanyoAcBits; case SANYO_AC88: return kSanyoAc88Bits; + case SANYO_AC152: + return kSanyoAc152Bits; case SHARP_AC: return kSharpAcBits; + case TCL96AC: + return kTcl96AcBits; case TCL112AC: return kTcl112AcBits; case TEKNOPOINT: @@ -827,6 +851,11 @@ bool IRsend::send(const decode_type_t type, const uint64_t data, sendCarrierAC64(data, nbits, min_repeat); break; #endif // SEND_CARRIER_AC64 +#if SEND_CLIMABUTLER + case CLIMABUTLER: + sendClimaButler(data, nbits, min_repeat); + break; +#endif // SEND_CLIMABUTLER #if SEND_COOLIX case COOLIX: sendCOOLIX(data, nbits, min_repeat); @@ -1060,6 +1089,11 @@ bool IRsend::send(const decode_type_t type, const uint64_t data, sendTeco(data, nbits, min_repeat); break; #endif // SEND_TECO +#if SEND_TOTO + case TOTO: + sendToto(data, nbits, min_repeat); + break; +#endif // SEND_TOTO #if SEND_TRANSCOLD case TRANSCOLD: sendTranscold(data, nbits, min_repeat); @@ -1120,6 +1154,16 @@ bool IRsend::send(const decode_type_t type, const uint8_t *state, sendArgo(state, nbytes); break; #endif // SEND_ARGO +#if SEND_BOSCH144 + case BOSCH144: + sendBosch144(state, nbytes); + break; +#endif // SEND_BOSCH144 +#if SEND_CARRIER_AC128 + case CARRIER_AC128: + sendCarrierAC128(state, nbytes); + break; +#endif // SEND_CARRIER_AC128 #if SEND_CORONA_AC case CORONA_AC: sendCoronaAc(state, nbytes); @@ -1155,11 +1199,21 @@ bool IRsend::send(const decode_type_t type, const uint8_t *state, sendDaikin2(state, nbytes); break; #endif // SEND_DAIKIN2 +#if SEND_DAIKIN200 + case DAIKIN200: + sendDaikin200(state, nbytes); + break; +#endif // SEND_DAIKIN200 #if SEND_DAIKIN216 case DAIKIN216: sendDaikin216(state, nbytes); break; #endif // SEND_DAIKIN216 +#if SEND_DAIKIN312 + case DAIKIN312: + sendDaikin312(state, nbytes); + break; +#endif // SEND_DAIKIN312 #if SEND_ELECTRA_AC case ELECTRA_AC: sendElectraAC(state, nbytes); @@ -1185,6 +1239,11 @@ bool IRsend::send(const decode_type_t type, const uint8_t *state, sendHaierACYRW02(state, nbytes); break; #endif // SEND_HAIER_AC_YRW02 +#if SEND_HAIER_AC160 + case HAIER_AC160: + sendHaierAC160(state, nbytes); + break; +#endif // SEND_HAIER_AC160 #if SEND_HAIER_AC176 case HAIER_AC176: sendHaierAC176(state, nbytes); @@ -1210,6 +1269,16 @@ bool IRsend::send(const decode_type_t type, const uint8_t *state, sendHitachiAc3(state, nbytes); break; #endif // SEND_HITACHI_AC3 +#if SEND_HITACHI_AC264 + case HITACHI_AC264: + sendHitachiAc264(state, nbytes); + break; +#endif // SEND_HITACHI_AC264 +#if SEND_HITACHI_AC296 + case HITACHI_AC296: + sendHitachiAc296(state, nbytes); + break; +#endif // SEND_HITACHI_AC296 #if SEND_HITACHI_AC344 case HITACHI_AC344: sendHitachiAc344(state, nbytes); @@ -1220,6 +1289,11 @@ bool IRsend::send(const decode_type_t type, const uint8_t *state, sendHitachiAc424(state, nbytes); break; #endif // SEND_HITACHI_AC424 +#if SEND_KELON168 + case KELON168: + sendKelon168(state, nbytes); + break; +#endif // SEND_KELON168 #if SEND_KELVINATOR case KELVINATOR: sendKelvinator(state, nbytes); @@ -1288,11 +1362,21 @@ bool IRsend::send(const decode_type_t type, const uint8_t *state, sendSanyoAc88(state, nbytes); break; #endif // SEND_SANYO_AC88 +#if SEND_SANYO_AC152 + case SANYO_AC152: + sendSanyoAc152(state, nbytes); + break; +#endif // SEND_SANYO_AC152 #if SEND_SHARP_AC case SHARP_AC: sendSharpAc(state, nbytes); break; #endif // SEND_SHARP_AC +#if SEND_TCL96AC + case TCL96AC: + sendTcl96Ac(state, nbytes); + break; +#endif // SEND_TCL96AC #if SEND_TCL112AC case TCL112AC: sendTcl112Ac(state, nbytes); diff --git a/lib/IRremoteESP8266/src/IRsend.h b/lib/IRremoteESP8266/src/IRsend.h index 3696eb40f..02f2c939e 100644 --- a/lib/IRremoteESP8266/src/IRsend.h +++ b/lib/IRremoteESP8266/src/IRsend.h @@ -95,30 +95,31 @@ enum class swingh_t { /// Structure to hold a common A/C state. struct state_t { - decode_type_t protocol; - int16_t model; - bool power; - stdAc::opmode_t mode; - float degrees; - bool celsius; - stdAc::fanspeed_t fanspeed; - stdAc::swingv_t swingv; - stdAc::swingh_t swingh; - bool quiet; - bool turbo; - bool econo; - bool light; - bool filter; - bool clean; - bool beep; - int16_t sleep; - int16_t clock; + decode_type_t protocol = decode_type_t::UNKNOWN; + int16_t model = -1; // `-1` means unused. + bool power = false; + stdAc::opmode_t mode = stdAc::opmode_t::kOff; + float degrees = 25; + bool celsius = true; + stdAc::fanspeed_t fanspeed = stdAc::fanspeed_t::kAuto; + stdAc::swingv_t swingv = stdAc::swingv_t::kOff; + stdAc::swingh_t swingh = stdAc::swingh_t::kOff; + bool quiet = false; + bool turbo = false; + bool econo = false; + bool light = false; + bool filter = false; + bool clean = false; + bool beep = false; + int16_t sleep = -1; // `-1` means off. + int16_t clock = -1; // `-1` means not set. }; }; // namespace stdAc /// Fujitsu A/C model numbers enum fujitsu_ac_remote_model_t { - ARRAH2E = 1, ///< (1) AR-RAH2E, AR-RAC1E, AR-RAE1E, AR-RCE1E (Default) + ARRAH2E = 1, ///< (1) AR-RAH2E, AR-RAC1E, AR-RAE1E, AR-RCE1E, AR-RAH2U, + ///< AR-REG1U (Default) ///< Warning: Use on incorrect models can cause the A/C to lock ///< up, requring the A/C to be physically powered off to fix. ///< e.g. AR-RAH1U may lock up with a Swing command. @@ -133,7 +134,9 @@ enum fujitsu_ac_remote_model_t { /// Gree A/C model numbers enum gree_ac_remote_model_t { YAW1F = 1, // (1) Ultimate, EKOKAI, RusClimate (Default) - YBOFB, // (2) Green, YBOFB2, YAPOF3 + YBOFB, // (2) Green, YBOFB2, YAPOF3 + YX1FSF, // (3) Soleus Air window unit (Similar to YAW1F, but with an + // Operation mode of Energy Saver (Econo)) }; /// HAIER_AC176 A/C model numbers @@ -172,10 +175,10 @@ enum sharp_ac_remote_model_t { A903 = 3, // 820 too }; -/// TCL A/C model numbers +/// TCL (& Teknopoint) A/C model numbers enum tcl_ac_remote_model_t { TAC09CHSD = 1, - GZ055BE1 = 2, + GZ055BE1 = 2, // Also Teknopoint GZ01-BEJ0-000 }; /// Voltas A/C model numbers @@ -196,6 +199,7 @@ enum lg_ac_remote_model_t { AKB75215403, // (2) LG2 28-bit Protocol AKB74955603, // (3) LG2 28-bit Protocol variant AKB73757604, // (4) LG2 Variant of AKB74955603 + LG6711A20083V, // (5) Same as GE6711AR2853M, but only SwingV toggle. }; @@ -342,6 +346,11 @@ class IRsend { const uint16_t nbytes = kSanyoAc88StateLength, const uint16_t repeat = kSanyoAc88MinRepeat); #endif // SEND_SANYO_AC88 +#if SEND_SANYO_AC152 + void sendSanyoAc152(const uint8_t *data, + const uint16_t nbytes = kSanyoAc152StateLength, + const uint16_t repeat = kSanyoAc152MinRepeat); +#endif // SEND_SANYO_AC152 #if SEND_DISH // sendDISH() should typically be called with repeat=3 as DISH devices // expect the code to be sent at least 4 times. (code + 3 repeats = 4 codes) @@ -480,11 +489,21 @@ class IRsend { const uint16_t nbytes = kDaikin2StateLength, const uint16_t repeat = kDaikin2DefaultRepeat); #endif +#if SEND_DAIKIN200 + void sendDaikin200(const unsigned char data[], + const uint16_t nbytes = kDaikin200StateLength, + const uint16_t repeat = kDaikin200DefaultRepeat); +#endif // SEND_DAIKIN200 #if SEND_DAIKIN216 void sendDaikin216(const unsigned char data[], const uint16_t nbytes = kDaikin216StateLength, const uint16_t repeat = kDaikin216DefaultRepeat); -#endif +#endif // SEND_DAIKIN216 +#if SEND_DAIKIN312 + void sendDaikin312(const unsigned char data[], + const uint16_t nbytes = kDaikin312StateLength, + const uint16_t repeat = kDaikin312DefaultRepeat); +#endif // SEND_DAIKIN312 #if SEND_AIWA_RC_T501 void sendAiwaRCT501(uint64_t data, uint16_t nbits = kAiwaRcT501Bits, uint16_t repeat = kAiwaRcT501MinRepeats); @@ -556,6 +575,11 @@ class IRsend { void sendCarrierAC64(uint64_t data, uint16_t nbits = kCarrierAc64Bits, uint16_t repeat = kCarrierAc64MinRepeat); #endif +#if SEND_CARRIER_AC128 + void sendCarrierAC128(const uint8_t data[], + uint16_t nbytes = kCarrierAc128StateLength, + uint16_t repeat = kCarrierAc128MinRepeat); +#endif // SEND_CARRIER_AC128 #if (SEND_HAIER_AC || SEND_HAIER_AC_YRW02 || SEND_HAIER_AC176) void sendHaierAC(const unsigned char data[], const uint16_t nbytes = kHaierACStateLength, @@ -566,6 +590,11 @@ class IRsend { const uint16_t nbytes = kHaierACYRW02StateLength, const uint16_t repeat = kHaierAcYrw02DefaultRepeat); #endif // SEND_HAIER_AC_YRW02 +#if SEND_HAIER_AC160 + void sendHaierAC160(const unsigned char data[], + const uint16_t nbytes = kHaierAC160StateLength, + const uint16_t repeat = kHaierAc160DefaultRepeat); +#endif // SEND_HAIER_AC160 #if SEND_HAIER_AC176 void sendHaierAC176(const unsigned char data[], const uint16_t nbytes = kHaierAC176StateLength, @@ -592,6 +621,16 @@ class IRsend { // different sizes const uint16_t repeat = kHitachiAcDefaultRepeat); #endif // SEND_HITACHI_AC3 +#if SEND_HITACHI_AC264 + void sendHitachiAc264(const unsigned char data[], + const uint16_t nbytes = kHitachiAc264StateLength, + const uint16_t repeat = kHitachiAcDefaultRepeat); +#endif // SEND_HITACHI_AC264 +#if SEND_HITACHI_AC296 + void sendHitachiAc296(const unsigned char data[], + const uint16_t nbytes = kHitachiAc296StateLength, + const uint16_t repeat = kHitachiAcDefaultRepeat); +#endif // SEND_HITACHI_AC296 #if SEND_HITACHI_AC344 void sendHitachiAc344(const unsigned char data[], const uint16_t nbytes = kHitachiAc344StateLength, @@ -643,11 +682,16 @@ class IRsend { void sendVestelAc(const uint64_t data, const uint16_t nbits = kVestelAcBits, const uint16_t repeat = kNoRepeat); #endif +#if SEND_TCL96AC + void sendTcl96Ac(const unsigned char data[], + const uint16_t nbytes = kTcl96AcStateLength, + const uint16_t repeat = kTcl96AcDefaultRepeat); +#endif // SEND_TCL96AC #if SEND_TCL112AC void sendTcl112Ac(const unsigned char data[], const uint16_t nbytes = kTcl112AcStateLength, const uint16_t repeat = kTcl112AcDefaultRepeat); -#endif +#endif // SEND_TCL112AC #if SEND_TECO void sendTeco(const uint64_t data, const uint16_t nbits = kTecoBits, const uint16_t repeat = kNoRepeat); @@ -755,6 +799,11 @@ class IRsend { void sendKelon(const uint64_t data, const uint16_t nbits = kKelonBits, const uint16_t repeat = kNoRepeat); #endif // SEND_KELON +#if SEND_KELON168 + void sendKelon168(const unsigned char data[], + const uint16_t nbytes = kKelon168StateLength, + const uint16_t repeat = kNoRepeat); +#endif // SEND_KELON168 #if SEND_BOSE void sendBose(const uint64_t data, const uint16_t nbits = kBoseBits, const uint16_t repeat = kNoRepeat); @@ -774,6 +823,20 @@ class IRsend { void sendAirton(const uint64_t data, const uint16_t nbits = kAirtonBits, const uint16_t repeat = kAirtonDefaultRepeat); #endif // SEND_AIRTON +#if SEND_TOTO + void sendToto(const uint64_t data, const uint16_t nbits = kTotoBits, + const uint16_t repeat = kTotoDefaultRepeat); +#endif // SEND_TOTO +#if SEND_CLIMABUTLER + void sendClimaButler(const uint64_t data, + const uint16_t nbits = kClimaButlerBits, + const uint16_t repeat = kNoRepeat); +#endif // SEND_CLIMABUTLER +#if SEND_BOSCH144 + void sendBosch144(const unsigned char data[], + const uint16_t nbytes = kBosch144StateLength, + const uint16_t repeat = kNoRepeat); +#endif // SEND_BOSCH144 protected: #ifdef UNIT_TEST diff --git a/lib/IRremoteESP8266/src/IRtext.cpp b/lib/IRremoteESP8266/src/IRtext.cpp index 077e7b0e7..d16e4465e 100644 --- a/lib/IRremoteESP8266/src/IRtext.cpp +++ b/lib/IRremoteESP8266/src/IRtext.cpp @@ -236,6 +236,7 @@ IRTEXT_CONST_STRING(kBitsStr, D_STR_BITS); ///< "Bits" // Model Names IRTEXT_CONST_STRING(kYaw1fStr, D_STR_YAW1F); ///< "YAW1F" IRTEXT_CONST_STRING(kYbofbStr, D_STR_YBOFB); ///< "YBOFB" +IRTEXT_CONST_STRING(kYx1fsfStr, D_STR_YX1FSF); ///< "YX1FSF" IRTEXT_CONST_STRING(kV9014557AStr, D_STR_V9014557_A); ///< "V9014557-A" IRTEXT_CONST_STRING(kV9014557BStr, D_STR_V9014557_B); ///< "V9014557-B" IRTEXT_CONST_STRING(kRlt0541htaaStr, D_STR_RLT0541HTA_A); ///< "R-LT0541-HTA-A" @@ -251,6 +252,8 @@ IRTEXT_CONST_STRING(kGe6711ar2853mStr, D_STR_GE6711AR2853M); ///< IRTEXT_CONST_STRING(kAkb75215403Str, D_STR_AKB75215403); ///< "AKB75215403" IRTEXT_CONST_STRING(kAkb74955603Str, D_STR_AKB74955603); ///< "AKB74955603" IRTEXT_CONST_STRING(kAkb73757604Str, D_STR_AKB73757604); ///< "AKB73757604" +IRTEXT_CONST_STRING(kLg6711a20083vStr, D_STR_LG6711A20083V); ///< + ///< "LG6711A20083V" IRTEXT_CONST_STRING(kKkg9ac1Str, D_STR_KKG9AC1); ///< "KKG9AC1" IRTEXT_CONST_STRING(kKkg29ac1Str, D_STR_KKG29AC1); ///< "KKG29AC1" IRTEXT_CONST_STRING(kLkeStr, D_STR_LKE); ///< "LKE" @@ -391,6 +394,18 @@ IRTEXT_CONST_BLOB_DECL(kAllProtocolNamesStr) { D_STR_RHOSS "\x0" D_STR_AIRTON "\x0" D_STR_COOLIX48 "\x0" + D_STR_HITACHI_AC264 "\x0" + D_STR_KELON168 "\x0" + D_STR_HITACHI_AC296 "\x0" + D_STR_DAIKIN200 "\x0" + D_STR_HAIER_AC160 "\x0" + D_STR_CARRIER_AC128 "\x0" + D_STR_TOTO "\x0" + D_STR_CLIMABUTLER "\x0" + D_STR_TCL96AC "\x0" + D_STR_BOSCH144 "\x0" + D_STR_SANYO_AC152 "\x0" + D_STR_DAIKIN312 "\x0" ///< New protocol strings should be added just above this line. "\x0" ///< This string requires double null termination. }; diff --git a/lib/IRremoteESP8266/src/IRtext.h b/lib/IRremoteESP8266/src/IRtext.h index 031f73879..c21233761 100644 --- a/lib/IRremoteESP8266/src/IRtext.h +++ b/lib/IRremoteESP8266/src/IRtext.h @@ -1,4 +1,4 @@ -// Copyright 2019-2021 - David Conran (@crankyoldgit) +// Copyright 2019-2022 - David Conran (@crankyoldgit) // This header file is to be included in files **other than** 'IRtext.cpp'. // // WARNING: Do not edit this file! This file is automatically generated by @@ -33,6 +33,7 @@ extern IRTEXT_CONST_PTR(k8CHeatStr); extern IRTEXT_CONST_PTR(kA705Str); extern IRTEXT_CONST_PTR(kA903Str); extern IRTEXT_CONST_PTR(kA907Str); +extern IRTEXT_CONST_PTR(kAbsenseDetectStr); extern IRTEXT_CONST_PTR(kAirFlowStr); extern IRTEXT_CONST_PTR(kAkb73757604Str); extern IRTEXT_CONST_PTR(kAkb74955603Str); @@ -74,6 +75,8 @@ extern IRTEXT_CONST_PTR(kDehumidifyStr); extern IRTEXT_CONST_PTR(kDg11j104Str); extern IRTEXT_CONST_PTR(kDg11j13aStr); extern IRTEXT_CONST_PTR(kDg11j191Str); +extern IRTEXT_CONST_PTR(kDirectIndirectModeStr); +extern IRTEXT_CONST_PTR(kDirectStr); extern IRTEXT_CONST_PTR(kDisplayTempStr); extern IRTEXT_CONST_PTR(kDkeStr); extern IRTEXT_CONST_PTR(kDownStr); @@ -108,8 +111,10 @@ extern IRTEXT_CONST_PTR(kHourStr); extern IRTEXT_CONST_PTR(kHumidStr); extern IRTEXT_CONST_PTR(kIdStr); extern IRTEXT_CONST_PTR(kIFeelStr); +extern IRTEXT_CONST_PTR(kIndirectStr); extern IRTEXT_CONST_PTR(kInsideStr); extern IRTEXT_CONST_PTR(kIonStr); +extern IRTEXT_CONST_PTR(kISeeStr); extern IRTEXT_CONST_PTR(kJkeStr); extern IRTEXT_CONST_PTR(kKkg29ac1Str); extern IRTEXT_CONST_PTR(kKkg9ac1Str); @@ -117,11 +122,12 @@ extern IRTEXT_CONST_PTR(kLastStr); extern IRTEXT_CONST_PTR(kLeftMaxNoSpaceStr); extern IRTEXT_CONST_PTR(kLeftMaxStr); extern IRTEXT_CONST_PTR(kLeftStr); +extern IRTEXT_CONST_PTR(kLg6711a20083vStr); extern IRTEXT_CONST_PTR(kLightStr); extern IRTEXT_CONST_PTR(kLightToggleStr); extern IRTEXT_CONST_PTR(kLkeStr); -extern IRTEXT_CONST_PTR(kLoStr); extern IRTEXT_CONST_PTR(kLockStr); +extern IRTEXT_CONST_PTR(kLoStr); extern IRTEXT_CONST_PTR(kLoudStr); extern IRTEXT_CONST_PTR(kLowerStr); extern IRTEXT_CONST_PTR(kLowestStr); @@ -229,13 +235,8 @@ extern IRTEXT_CONST_PTR(kXFanStr); extern IRTEXT_CONST_PTR(kYaw1fStr); extern IRTEXT_CONST_PTR(kYbofbStr); extern IRTEXT_CONST_PTR(kYesStr); +extern IRTEXT_CONST_PTR(kYx1fsfStr); extern IRTEXT_CONST_PTR(kZoneFollowStr); extern IRTEXT_CONST_PTR(kAllProtocolNamesStr); -extern IRTEXT_CONST_PTR(kISeeStr); -extern IRTEXT_CONST_PTR(kEcocoolStr); -extern IRTEXT_CONST_PTR(kAbsenseDetectStr); -extern IRTEXT_CONST_PTR(kDirectIndirectModeStr); -extern IRTEXT_CONST_PTR(kDirectStr); -extern IRTEXT_CONST_PTR(kIndirectStr); #endif // IRTEXT_H_ diff --git a/lib/IRremoteESP8266/src/IRutils.cpp b/lib/IRremoteESP8266/src/IRutils.cpp index e1f889966..7c59228c0 100644 --- a/lib/IRremoteESP8266/src/IRutils.cpp +++ b/lib/IRremoteESP8266/src/IRutils.cpp @@ -172,6 +172,8 @@ bool hasACState(const decode_type_t protocol) { // This is kept sorted by name case AMCOR: case ARGO: + case BOSCH144: + case CARRIER_AC128: case CORONA_AC: case DAIKIN: case DAIKIN128: @@ -179,19 +181,25 @@ bool hasACState(const decode_type_t protocol) { case DAIKIN160: case DAIKIN176: case DAIKIN2: + case DAIKIN200: case DAIKIN216: + case DAIKIN312: case ELECTRA_AC: case FUJITSU_AC: case GREE: case HAIER_AC: case HAIER_AC_YRW02: + case HAIER_AC160: case HAIER_AC176: case HITACHI_AC: case HITACHI_AC1: case HITACHI_AC2: case HITACHI_AC3: + case HITACHI_AC264: + case HITACHI_AC296: case HITACHI_AC344: case HITACHI_AC424: + case KELON168: case KELVINATOR: case MIRAGE: case MITSUBISHI136: @@ -206,7 +214,9 @@ bool hasACState(const decode_type_t protocol) { case SAMSUNG_AC: case SANYO_AC: case SANYO_AC88: + case SANYO_AC152: case SHARP_AC: + case TCL96AC: case TCL112AC: case TEKNOPOINT: case TOSHIBA_AC: @@ -602,9 +612,10 @@ namespace irutils { break; case decode_type_t::GREE: switch (model) { - case gree_ac_remote_model_t::YAW1F: return kYaw1fStr; - case gree_ac_remote_model_t::YBOFB: return kYbofbStr; - default: return kUnknownStr; + case gree_ac_remote_model_t::YAW1F: return kYaw1fStr; + case gree_ac_remote_model_t::YBOFB: return kYbofbStr; + case gree_ac_remote_model_t::YX1FSF: return kYx1fsfStr; + default: return kUnknownStr; } break; case decode_type_t::HAIER_AC176: @@ -634,6 +645,7 @@ namespace irutils { case lg_ac_remote_model_t::AKB75215403: return kAkb75215403Str; case lg_ac_remote_model_t::AKB74955603: return kAkb74955603Str; case lg_ac_remote_model_t::AKB73757604: return kAkb73757604Str; + case lg_ac_remote_model_t::LG6711A20083V: return kLg6711a20083vStr; default: return kUnknownStr; } break; diff --git a/lib/IRremoteESP8266/src/ir_Airton.cpp b/lib/IRremoteESP8266/src/ir_Airton.cpp index 83ad95ef7..b71214d60 100644 --- a/lib/IRremoteESP8266/src/ir_Airton.cpp +++ b/lib/IRremoteESP8266/src/ir_Airton.cpp @@ -317,7 +317,7 @@ bool IRAirtonAc::getHealth(void) const { return _.Health; } /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRAirtonAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::AIRTON; result.power = getPower(); result.mode = toCommonMode(getMode()); diff --git a/lib/IRremoteESP8266/src/ir_Airwell.cpp b/lib/IRremoteESP8266/src/ir_Airwell.cpp index 26053442e..2aa244a41 100644 --- a/lib/IRremoteESP8266/src/ir_Airwell.cpp +++ b/lib/IRremoteESP8266/src/ir_Airwell.cpp @@ -238,7 +238,7 @@ uint8_t IRAirwellAc::getTemp(void) const { /// @param[in] prev Ptr to the previous state if required. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRAirwellAc::toCommon(const stdAc::state_t *prev) const { - stdAc::state_t result; + stdAc::state_t result{}; // Start with the previous state if given it. if (prev != NULL) { result = *prev; diff --git a/lib/IRremoteESP8266/src/ir_Amcor.cpp b/lib/IRremoteESP8266/src/ir_Amcor.cpp index c2aea5cdd..e2112c78e 100644 --- a/lib/IRremoteESP8266/src/ir_Amcor.cpp +++ b/lib/IRremoteESP8266/src/ir_Amcor.cpp @@ -314,7 +314,7 @@ stdAc::fanspeed_t IRAmcorAc::toCommonFanSpeed(const uint8_t speed) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRAmcorAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::AMCOR; result.power = getPower(); result.mode = toCommonMode(_.Mode); diff --git a/lib/IRremoteESP8266/src/ir_Argo.cpp b/lib/IRremoteESP8266/src/ir_Argo.cpp index e1df28efb..04cde67ed 100644 --- a/lib/IRremoteESP8266/src/ir_Argo.cpp +++ b/lib/IRremoteESP8266/src/ir_Argo.cpp @@ -344,7 +344,7 @@ stdAc::fanspeed_t IRArgoAC::toCommonFanSpeed(const uint8_t speed) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRArgoAC::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::ARGO; result.power = _.Power; result.mode = toCommonMode(_.Mode); diff --git a/lib/IRremoteESP8266/src/ir_Bosch.cpp b/lib/IRremoteESP8266/src/ir_Bosch.cpp new file mode 100644 index 000000000..f6e26eb52 --- /dev/null +++ b/lib/IRremoteESP8266/src/ir_Bosch.cpp @@ -0,0 +1,112 @@ +// Copyright 2022 David Conran +/// @file +/// @brief Support for the Bosch A/C / heatpump protocol +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1787 + +// Supports: +// Brand: Bosch, Model: CL3000i-Set 26 E A/C +// Brand: Bosch, Model: RG10A(G2S)BGEF remote + +#include <algorithm> +#ifndef ARDUINO +#include <string> +#endif +#include "IRrecv.h" +#include "IRsend.h" +#include "IRtext.h" +#include "IRutils.h" + +// Constants +const uint16_t kBoschHdrMark = 4366; +const uint16_t kBoschBitMark = 502; +const uint16_t kBoschHdrSpace = 4415; +const uint16_t kBoschOneSpace = 1645; +const uint16_t kBoschZeroSpace = 571; +const uint16_t kBoschFooterSpace = 5235; +const uint16_t kBoschFreq = 38000; // Hz. (Guessing the most common frequency.) +const uint16_t kBosch144NrOfSections = 3; + +#if SEND_BOSCH144 +/// Send a Bosch 144-bit / 18-byte message +/// Status: STABLE / Confirmed Working. +/// @param[in] data The message to be sent. +/// @param[in] nbytes The number of bytes of message to be sent. +/// @param[in] repeat The number of times the command is to be repeated. +void IRsend::sendBosch144(const unsigned char data[], const uint16_t nbytes, + const uint16_t repeat) { + // nbytes is required to be a multiple of kBosch144NrOfSections. + if (nbytes % kBosch144NrOfSections != 0) return; + + // Set IR carrier frequency + enableIROut(kBoschFreq); + + for (uint16_t r = 0; r <= repeat; r++) { + const uint16_t kSectionByteSize = nbytes / kBosch144NrOfSections; + for (uint16_t offset = 0; offset < nbytes; offset += kSectionByteSize) + // Section Header + Data + Footer + sendGeneric(kBoschHdrMark, kBoschHdrSpace, + kBoschBitMark, kBoschOneSpace, + kBoschBitMark, kBoschZeroSpace, + kBoschBitMark, kBoschFooterSpace, + data + offset, kSectionByteSize, + kBoschFreq, true, 0, kDutyDefault); + space(kDefaultMessageGap); // Complete guess + } +} + +#endif // SEND_BOSCH144 + +#if DECODE_BOSCH144 +/// Decode the supplied Bosch 144-bit / 18-byte A/C message. +/// Status: STABLE / Confirmed Working. +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// result. +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +bool IRrecv::decodeBosch144(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (results->rawlen < 2 * nbits + + kBosch144NrOfSections * (kHeader + kFooter) - + 1 + offset) + return false; // Can't possibly be a valid BOSCH144 message. + if (strict && nbits != kBosch144Bits) + return false; // Not strictly a BOSCH144 message. + if (nbits % 8 != 0) // nbits has to be a multiple of nr. of bits in a byte. + return false; + if (nbits % kBosch144NrOfSections != 0) + return false; // nbits has to be a multiple of kBosch144NrOfSections. + const uint16_t kSectionBits = nbits / kBosch144NrOfSections; + const uint16_t kSectionBytes = kSectionBits / 8; + const uint16_t kNBytes = kSectionBytes * kBosch144NrOfSections; + // Capture each section individually + for (uint16_t pos = 0, section = 0; + pos < kNBytes; + pos += kSectionBytes, section++) { + uint16_t used = 0; + // Section Header + Section Data + Section Footer + used = matchGeneric(results->rawbuf + offset, results->state + pos, + results->rawlen - offset, kSectionBits, + kBoschHdrMark, kBoschHdrSpace, + kBoschBitMark, kBoschOneSpace, + kBoschBitMark, kBoschZeroSpace, + kBoschBitMark, kBoschFooterSpace, + section >= kBosch144NrOfSections - 1, + _tolerance, kMarkExcess, true); + if (!used) return false; // Didn't match. + offset += used; + } + + // Compliance + + // Success + results->decode_type = decode_type_t::BOSCH144; + results->bits = nbits; + // No need to record the state as we stored it as we decoded it. + // As we use result->state, we don't record value, address, or command as it + // is a union data type. + return true; +} +#endif // DECODE_BOSCH144 diff --git a/lib/IRremoteESP8266/src/ir_Carrier.cpp b/lib/IRremoteESP8266/src/ir_Carrier.cpp index 92fca4bd2..42b45f9ab 100644 --- a/lib/IRremoteESP8266/src/ir_Carrier.cpp +++ b/lib/IRremoteESP8266/src/ir_Carrier.cpp @@ -1,8 +1,9 @@ -// Copyright 2018, 2020 David Conran +// Copyright 2018-2022 David Conran /// @file /// @brief Carrier protocols. /// @see CarrierAc https://github.com/crankyoldgit/IRremoteESP8266/issues/385 /// @see CarrierAc64 https://github.com/crankyoldgit/IRremoteESP8266/issues/1127 +/// @see CarrierAc128 https://github.com/crankyoldgit/IRremoteESP8266/issues/1797 #include "ir_Carrier.h" #include <algorithm> @@ -45,6 +46,16 @@ const uint16_t kCarrierAc64OneSpace = 1736; const uint16_t kCarrierAc64ZeroSpace = 615; const uint32_t kCarrierAc64Gap = kDefaultMessageGap; // A guess. +const uint16_t kCarrierAc128HdrMark = 4600; +const uint16_t kCarrierAc128HdrSpace = 2600; +const uint16_t kCarrierAc128Hdr2Mark = 9300; +const uint16_t kCarrierAc128Hdr2Space = 5000; +const uint16_t kCarrierAc128BitMark = 340; +const uint16_t kCarrierAc128OneSpace = 1000; +const uint16_t kCarrierAc128ZeroSpace = 400; +const uint16_t kCarrierAc128SectionGap = 20600; +const uint16_t kCarrierAc128InterSpace = 6700; +const uint16_t kCarrierAc128SectionBits = kCarrierAc128Bits / 2; #if SEND_CARRIER_AC /// Send a Carrier HVAC formatted message. @@ -511,7 +522,7 @@ String IRCarrierAc64::toString(void) const { /// Convert the A/C state to it's common stdAc::state_t equivalent. /// @return A stdAc::state_t state. stdAc::state_t IRCarrierAc64::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::CARRIER_AC64; result.model = -1; // No models used. result.power = _.Power; @@ -533,3 +544,104 @@ stdAc::state_t IRCarrierAc64::toCommon(void) const { result.clock = -1; return result; } + +#if SEND_CARRIER_AC128 +/// Send a Carrier 128bit HVAC formatted message. +/// Status: BETA / Seems to work with tests. Needs testing agaisnt real devices. +/// @param[in] data The message to be sent. +/// @param[in] nbytes The byte size of the message being sent. +/// @param[in] repeat The number of times the message is to be repeated. +void IRsend::sendCarrierAC128(const uint8_t data[], const uint16_t nbytes, + const uint16_t repeat) { + // Min length check. + if (nbytes <= kCarrierAc128StateLength / 2) return; + + enableIROut(kCarrierAcFreq); + // Handle repeats. + for (uint16_t r = 0; r <= repeat; r++) { + // First part of the message. + // Headers + Data + SectionGap + sendGeneric(kCarrierAc128HdrMark, kCarrierAc128HdrSpace, + kCarrierAc128BitMark, kCarrierAc128OneSpace, + kCarrierAc128BitMark, kCarrierAc128ZeroSpace, + kCarrierAc128BitMark, kCarrierAc128SectionGap, + data, nbytes / 2, kCarrierAcFreq, false, 0, kDutyDefault); + // Inter-message markers + mark(kCarrierAc128HdrMark); + space(kCarrierAc128InterSpace); + // Second part of the message + // Headers + Data + SectionGap + sendGeneric(kCarrierAc128Hdr2Mark, kCarrierAc128Hdr2Space, + kCarrierAc128BitMark, kCarrierAc128OneSpace, + kCarrierAc128BitMark, kCarrierAc128ZeroSpace, + kCarrierAc128BitMark, kCarrierAc128SectionGap, + data + (nbytes / 2), nbytes / 2, kCarrierAcFreq, + false, 0, kDutyDefault); + // Footer + mark(kCarrierAc128HdrMark); + space(kDefaultMessageGap); + } +} +#endif // SEND_CARRIER_AC128 + +#if DECODE_CARRIER_AC128 +/// Decode the supplied Carrier 128-bit HVAC message. +/// Status: STABLE / Expected to work. +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// result. +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +bool IRrecv::decodeCarrierAC128(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (results->rawlen < 2 * (nbits + 2 * kHeader + kFooter) - 1 + offset) + return false; // Can't possibly be a valid Carrier message. + if (strict && nbits != kCarrierAc128Bits) + return false; // We expect Carrier to be 128 bits of message. + + uint16_t used; + uint16_t pos = 0; + const uint16_t sectionbits = nbits / 2; + // Match the first section. + used = matchGeneric(results->rawbuf + offset, results->state, + results->rawlen - offset, sectionbits, + kCarrierAc128HdrMark, kCarrierAc128HdrSpace, + kCarrierAc128BitMark, kCarrierAc128OneSpace, + kCarrierAc128BitMark, kCarrierAc128ZeroSpace, + kCarrierAc128BitMark, kCarrierAc128SectionGap, true, + kUseDefTol, kMarkExcess, false); + if (used == 0) return false; // No match. + offset += used; + pos += sectionbits / 8; + // Look for the inter-message markers. + if (!matchMark(results->rawbuf[offset++], kCarrierAc128HdrMark)) + return false; + if (!matchSpace(results->rawbuf[offset++], kCarrierAc128InterSpace)) + return false; + // Now look for the second section. + used = matchGeneric(results->rawbuf + offset, results->state + pos, + results->rawlen - offset, sectionbits, + kCarrierAc128Hdr2Mark, kCarrierAc128Hdr2Space, + kCarrierAc128BitMark, kCarrierAc128OneSpace, + kCarrierAc128BitMark, kCarrierAc128ZeroSpace, + kCarrierAc128BitMark, kCarrierAc128SectionGap, true, + kUseDefTol, kMarkExcess, false); + if (used == 0) return false; // No match. + offset += used; + // Now check for the Footer. + if (!matchMark(results->rawbuf[offset++], kCarrierAc128HdrMark)) return false; + if (offset < results->rawlen && + !matchAtLeast(results->rawbuf[offset], kDefaultMessageGap)) return false; + + + // Compliance + // if (strict && !IRCarrierAc128::validChecksum(results->value)) return false; + + // Success + results->bits = nbits; + results->decode_type = CARRIER_AC128; + return true; +} +#endif // DECODE_CARRIER_AC128 diff --git a/lib/IRremoteESP8266/src/ir_Carrier.h b/lib/IRremoteESP8266/src/ir_Carrier.h index aa9ea8447..c642c51e5 100644 --- a/lib/IRremoteESP8266/src/ir_Carrier.h +++ b/lib/IRremoteESP8266/src/ir_Carrier.h @@ -1,8 +1,9 @@ -// Copyright 2020 David Conran +// Copyright 2020-2022 David Conran /// @file /// @brief Carrier A/C /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1127 /// @see https://docs.google.com/spreadsheets/d/1EZy78L0cn1KDIX1aKq2biptejFqCjD5HO3tLiRvXf48/edit#gid=0 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1797 // Supports: // Brand: Carrier/Surrey, Model: 42QG5A55970 remote @@ -11,6 +12,7 @@ // Brand: Carrier/Surrey, Model: 619EGX0180E0 A/C // Brand: Carrier/Surrey, Model: 619EGX0220E0 A/C // Brand: Carrier/Surrey, Model: 53NGK009/012 Inverter +// Brand: Carrier, Model: 40GKX0E2006 remote (CARRIER_AC128) #ifndef IR_CARRIER_H_ #define IR_CARRIER_H_ diff --git a/lib/IRremoteESP8266/src/ir_ClimaButler.cpp b/lib/IRremoteESP8266/src/ir_ClimaButler.cpp new file mode 100644 index 000000000..d8b4f5a98 --- /dev/null +++ b/lib/IRremoteESP8266/src/ir_ClimaButler.cpp @@ -0,0 +1,86 @@ +// Copyright 2022 benjy3gg +// Copyright 2022 David Conran (crankyoldgit) +/// @file +/// @brief Support for Clima-Butler protocol +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1812 + +// Supports: +// Brand: Clima-Butler, Model: AR-715 remote +// Brand: Clima-Butler, Model: RCS-SD43UWI A/C + +#include "IRrecv.h" +#include "IRsend.h" +#include "IRutils.h" + + +const uint16_t kClimaButlerBitMark = 511; // uSeconds +const uint16_t kClimaButlerHdrMark = kClimaButlerBitMark; +const uint16_t kClimaButlerHdrSpace = 3492; // uSeconds +const uint16_t kClimaButlerOneSpace = 1540; // uSeconds +const uint16_t kClimaButlerZeroSpace = 548; // uSeconds +const uint32_t kClimaButlerGap = kDefaultMessageGap; // uSeconds (A guess.) +const uint16_t kClimaButlerFreq = 38000; // Hz. (Guess.) + +#if SEND_CLIMABUTLER +/// Send a ClimaButler formatted message. +/// Status: STABLE / Confirmed working. +/// @param[in] data containing the IR command. +/// @param[in] nbits Nr. of bits to send. usually kClimaButlerBits +/// @param[in] repeat Nr. of times the message is to be repeated. +void IRsend::sendClimaButler(const uint64_t data, const uint16_t nbits, + const uint16_t repeat) { + enableIROut(kClimaButlerFreq); + for (uint16_t r = 0; r <= repeat; r++) { + // Header + Data + sendGeneric(kClimaButlerHdrMark, kClimaButlerHdrSpace, + kClimaButlerBitMark, kClimaButlerOneSpace, + kClimaButlerBitMark, kClimaButlerZeroSpace, + kClimaButlerBitMark, kClimaButlerHdrSpace, + data, nbits, kClimaButlerFreq, true, 0, kDutyDefault); + // Footer + mark(kClimaButlerBitMark); + space(kClimaButlerGap); + } +} +#endif // SEND_CLIMABUTLER + +#if DECODE_CLIMABUTLER +/// Decode the supplied ClimaButler message. +/// Status: STABLE / Confirmed working. +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +bool IRrecv::decodeClimaButler(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (results->rawlen < 2 * nbits + kHeader + 2 * kFooter - offset) + return false; // Too short a message to match. + if (strict && nbits != kClimaButlerBits) + return false; + + // Header + Data + uint16_t used = matchGeneric(results->rawbuf + offset, &(results->value), + results->rawlen - offset, nbits, + kClimaButlerHdrMark, kClimaButlerHdrSpace, + kClimaButlerBitMark, kClimaButlerOneSpace, + kClimaButlerBitMark, kClimaButlerZeroSpace, + kClimaButlerBitMark, kClimaButlerHdrSpace); + if (!used) return false; // Didn't matched. + offset += used; + // Footer + if (!matchMark(results->rawbuf[offset++], kClimaButlerBitMark)) + return false; + if (results->rawlen <= offset && !matchAtLeast(results->rawbuf[offset], + kClimaButlerGap)) + return false; + + // Success + results->decode_type = decode_type_t::CLIMABUTLER; + results->bits = nbits; + results->command = 0; + results->address = 0; + return true; +} +#endif // DECODE_CLIMABUTLER diff --git a/lib/IRremoteESP8266/src/ir_Coolix.cpp b/lib/IRremoteESP8266/src/ir_Coolix.cpp index 7b5b140f0..755e89190 100644 --- a/lib/IRremoteESP8266/src/ir_Coolix.cpp +++ b/lib/IRremoteESP8266/src/ir_Coolix.cpp @@ -32,7 +32,7 @@ const uint16_t kCoolixHdrSpaceTicks = 16; const uint16_t kCoolixHdrSpace = kCoolixHdrSpaceTicks * kCoolixTick; // 4416us const uint16_t kCoolixMinGapTicks = kCoolixHdrMarkTicks + kCoolixZeroSpaceTicks; const uint16_t kCoolixMinGap = kCoolixMinGapTicks * kCoolixTick; // 5244us -const uint8_t kCoolix48ExtraTolerance = 5; // Percent +const uint8_t kCoolixExtraTolerance = 5; // Percent using irutils::addBoolToString; using irutils::addIntToString; @@ -496,7 +496,7 @@ stdAc::fanspeed_t IRCoolixAC::toCommonFanSpeed(const uint8_t speed) { /// @param[in] prev Ptr to the previous state if required. /// @return A stdAc::state_t state. stdAc::state_t IRCoolixAC::toCommon(const stdAc::state_t *prev) const { - stdAc::state_t result; + stdAc::state_t result{}; // Start with the previous state if given it. if (prev != NULL) { result = *prev; @@ -648,41 +648,39 @@ bool IRrecv::decodeCOOLIX(decode_results *results, uint16_t offset, return false; // We can't possibly capture a Coolix packet that big. // Header - if (!matchMark(results->rawbuf[offset], kCoolixHdrMark)) return false; - // Calculate how long the common tick time is based on the header mark. - uint32_t m_tick = results->rawbuf[offset++] * kRawTick / kCoolixHdrMarkTicks; - if (!matchSpace(results->rawbuf[offset], kCoolixHdrSpace)) return false; - // Calculate how long the common tick time is based on the header space. - uint32_t s_tick = results->rawbuf[offset++] * kRawTick / kCoolixHdrSpaceTicks; + if (!matchMark(results->rawbuf[offset++], kCoolixHdrMark)) return false; + if (!matchSpace(results->rawbuf[offset++], kCoolixHdrSpace)) return false; // Data // Twice as many bits as there are normal plus inverted bits. - for (uint16_t i = 0; i < nbits * 2; i++, offset++) { - bool flip = (i / 8) % 2; - if (!matchMark(results->rawbuf[offset++], kCoolixBitMarkTicks * m_tick)) - return false; - if (matchSpace(results->rawbuf[offset], kCoolixOneSpaceTicks * s_tick)) { - if (flip) - inverted = (inverted << 1) | 1; - else - data = (data << 1) | 1; - } else if (matchSpace(results->rawbuf[offset], - kCoolixZeroSpaceTicks * s_tick)) { - if (flip) - inverted <<= 1; - else - data <<= 1; + for (uint16_t i = 0; i < nbits * 2; i += 8) { + const bool flip = (i / 8) % 2; + uint64_t result = 0; + // Read the next byte of data. + const uint16_t used = matchGeneric(results->rawbuf + offset, &result, + results->rawlen - offset, 8, + 0, 0, // No Header + kCoolixBitMark, kCoolixOneSpace, // Data + kCoolixBitMark, kCoolixZeroSpace, + 0, 0, // No Footer + false, + _tolerance + kCoolixExtraTolerance, + 0, true); + if (!used) return false; // Didn't match a bytes worth of data. + offset += used; + if (flip) { // The inverted byte. + inverted <<= 8; + inverted |= result; } else { - return false; + data <<= 8; + data |= result; } } // Footer - if (!matchMark(results->rawbuf[offset++], kCoolixBitMarkTicks * m_tick)) - return false; + if (!matchMark(results->rawbuf[offset++], kCoolixBitMark)) return false; if (offset < results->rawlen && - !matchAtLeast(results->rawbuf[offset], kCoolixMinGapTicks * s_tick)) - return false; + !matchAtLeast(results->rawbuf[offset], kCoolixMinGap)) return false; // Compliance uint64_t orig = data; // Save a copy of the data. @@ -721,7 +719,7 @@ void IRsend::sendCoolix48(const uint64_t data, const uint16_t nbits, } #endif // SEND_COOLIX48 -#if DECODE_COOLIX +#if DECODE_COOLIX48 /// Decode the supplied Coolix 48-bit A/C message. /// Status: BETA / Probably Working. /// @param[in,out] results Ptr to the data to decode & where to store the decode @@ -744,7 +742,7 @@ bool IRrecv::decodeCoolix48(decode_results *results, uint16_t offset, kCoolixBitMark, kCoolixOneSpace, kCoolixBitMark, kCoolixZeroSpace, kCoolixBitMark, kCoolixMinGap, - true, _tolerance + kCoolix48ExtraTolerance, 0, true)) + true, _tolerance + kCoolixExtraTolerance, 0, true)) return false; // Success diff --git a/lib/IRremoteESP8266/src/ir_Corona.cpp b/lib/IRremoteESP8266/src/ir_Corona.cpp index ef40c241a..da0e3db2b 100644 --- a/lib/IRremoteESP8266/src/ir_Corona.cpp +++ b/lib/IRremoteESP8266/src/ir_Corona.cpp @@ -550,7 +550,7 @@ String IRCoronaAc::toString(void) const { /// Convert the A/C state to it's common stdAc::state_t equivalent. /// @return A stdAc::state_t state. stdAc::state_t IRCoronaAc::toCommon() const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::CORONA_AC; result.model = -1; // No models used. result.power = _.Power; diff --git a/lib/IRremoteESP8266/src/ir_Daikin.cpp b/lib/IRremoteESP8266/src/ir_Daikin.cpp index ea11daf78..f44cd8f13 100644 --- a/lib/IRremoteESP8266/src/ir_Daikin.cpp +++ b/lib/IRremoteESP8266/src/ir_Daikin.cpp @@ -1,6 +1,6 @@ // Copyright 2016 sillyfrog // Copyright 2017 sillyfrog, crankyoldgit -// Copyright 2018-2021 crankyoldgit +// Copyright 2018-2022 crankyoldgit // Copyright 2019 pasna (IRDaikin160 class / Daikin176 class) /// @file @@ -21,6 +21,7 @@ /// @see Daikin216 https://github.com/crankyoldgit/IRremoteESP8266/issues/689 /// @see Daikin216 https://github.com/danny-source/Arduino_DY_IRDaikin /// @see Daikin64 https://github.com/crankyoldgit/IRremoteESP8266/issues/1064 +/// @see Daikin200 https://github.com/crankyoldgit/IRremoteESP8266/issues/1802 #include "ir_Daikin.h" #include <algorithm> @@ -529,7 +530,7 @@ stdAc::fanspeed_t IRDaikinESP::toCommonFanSpeed(const uint8_t speed) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRDaikinESP::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::DAIKIN; result.model = -1; // No models used. result.power = _.Power; @@ -1199,7 +1200,7 @@ stdAc::swingh_t IRDaikin2::toCommonSwingH(const uint8_t setting) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRDaikin2::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::DAIKIN2; result.model = -1; // No models used. result.power = getPower(); @@ -1621,7 +1622,7 @@ bool IRDaikin216::getPowerful(void) const { return _.Powerful; } /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRDaikin216::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::DAIKIN216; result.model = -1; // No models used. result.power = _.Power; @@ -1971,7 +1972,7 @@ stdAc::swingv_t IRDaikin160::toCommonSwingV(const uint8_t setting) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRDaikin160::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::DAIKIN160; result.model = -1; // No models used. result.power = _.Power; @@ -2362,7 +2363,7 @@ stdAc::fanspeed_t IRDaikin176::toCommonFanSpeed(const uint8_t speed) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRDaikin176::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::DAIKIN176; result.model = -1; // No models used. result.power = _.Power; @@ -2883,7 +2884,7 @@ String IRDaikin128::toString(void) const { /// @param[in] prev Ptr to a previous state. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRDaikin128::toCommon(const stdAc::state_t *prev) const { - stdAc::state_t result; + stdAc::state_t result{}; if (prev != NULL) result = *prev; result.protocol = decode_type_t::DAIKIN128; result.model = -1; // No models used. @@ -3285,7 +3286,7 @@ bool IRDaikin152::getComfort(void) const { return _.Comfort; } /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRDaikin152::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::DAIKIN152; result.model = -1; // No models used. result.power = _.Power; @@ -3710,7 +3711,7 @@ String IRDaikin64::toString(void) const { /// @param[in] prev Ptr to a previous state. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRDaikin64::toCommon(const stdAc::state_t *prev) const { - stdAc::state_t result; + stdAc::state_t result{}; if (prev != NULL) result = *prev; result.protocol = decode_type_t::DAIKIN64; result.model = -1; // No models used. @@ -3733,3 +3734,193 @@ stdAc::state_t IRDaikin64::toCommon(const stdAc::state_t *prev) const { result.light = false; return result; } + +#if SEND_DAIKIN200 +/// Send a Daikin200 (200-bit) A/C formatted message. +/// Status: BETA / Untested on a real device. +/// @param[in] data The message to be sent. +/// @param[in] nbytes The number of bytes of message to be sent. +/// @param[in] repeat The number of times the command is to be repeated. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1802 +void IRsend::sendDaikin200(const unsigned char data[], const uint16_t nbytes, + const uint16_t repeat) { + if (nbytes < kDaikin200Section1Length) + return; // Not enough bytes to send a partial message. + + for (uint16_t r = 0; r <= repeat; r++) { + // Section #1 + sendGeneric(kDaikin200HdrMark, kDaikin200HdrSpace, kDaikin200BitMark, + kDaikin200OneSpace, kDaikin200BitMark, kDaikin200ZeroSpace, + kDaikin200BitMark, kDaikin200Gap, data, + kDaikin200Section1Length, + kDaikin200Freq, false, 0, kDutyDefault); + // Section #2 + sendGeneric(kDaikin200HdrMark, kDaikin200HdrSpace, kDaikin200BitMark, + kDaikin200OneSpace, kDaikin200BitMark, kDaikin200ZeroSpace, + kDaikin200BitMark, kDaikin200Gap, + data + kDaikin200Section1Length, + nbytes - kDaikin200Section1Length, + kDaikin200Freq, false, 0, kDutyDefault); + } +} +#endif // SEND_DAIKIN200 + +#if DECODE_DAIKIN200 +/// Decode the supplied Daikin 200-bit message. (DAIKIN200) +/// Status: STABLE / Known to be working. +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// result. +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1802 +bool IRrecv::decodeDaikin200(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1 + offset) + return false; + + // Compliance + if (strict && nbits != kDaikin200Bits) return false; + + const uint8_t ksectionSize[kDaikin200Sections] = {kDaikin200Section1Length, + kDaikin200Section2Length}; + // Sections + uint16_t pos = 0; + for (uint8_t section = 0; section < kDaikin200Sections; section++) { + uint16_t used; + // Section Header + Section Data + Section Footer + used = matchGeneric(results->rawbuf + offset, results->state + pos, + results->rawlen - offset, ksectionSize[section] * 8, + kDaikin200HdrMark, kDaikin200HdrSpace, + kDaikin200BitMark, kDaikin200OneSpace, + kDaikin200BitMark, kDaikin200ZeroSpace, + kDaikin200BitMark, kDaikin200Gap, + section >= kDaikin200Sections - 1, + kDaikinTolerance, 0, false); + if (used == 0) return false; + offset += used; + pos += ksectionSize[section]; + } + // Compliance + if (strict) { + if (pos * 8 != kDaikin200Bits) return false; + // Validate the checksum. + if (!IRDaikin176::validChecksum(results->state, pos)) return false; + } + + // Success + results->decode_type = decode_type_t::DAIKIN200; + results->bits = nbits; + // No need to record the state as we stored it as we decoded it. + // As we use result->state, we don't record value, address, or command as it + // is a union data type. + return true; +} +#endif // DECODE_DAIKIN200 + +#if SEND_DAIKIN312 +/// Send a Daikin312 (312-bit / 39 byte) A/C formatted message. +/// Status: BETA / Untested on a real device. +/// @param[in] data The message to be sent. +/// @param[in] nbytes The number of bytes of message to be sent. +/// @param[in] repeat The number of times the command is to be repeated. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1829 +void IRsend::sendDaikin312(const unsigned char data[], const uint16_t nbytes, + const uint16_t repeat) { + if (nbytes < kDaikin312Section1Length) + return; // Not enough bytes to send a partial message. + + for (uint16_t r = 0; r <= repeat; r++) { + // Send the header, 0b00000 + sendGeneric(0, 0, // No header for the header + kDaikin312BitMark, kDaikin312OneSpace, + kDaikin312BitMark, kDaikin312ZeroSpace, + kDaikin312BitMark, kDaikin312HdrGap, + (uint64_t)0b00000, kDaikinHeaderLength, + kDaikin2Freq, false, 0, kDutyDefault); + // Section #1 + sendGeneric(kDaikin312HdrMark, kDaikin312HdrSpace, kDaikin312BitMark, + kDaikin312OneSpace, kDaikin312BitMark, kDaikin312ZeroSpace, + kDaikin312BitMark, kDaikin312SectionGap, data, + kDaikin312Section1Length, + kDaikin2Freq, false, 0, kDutyDefault); + // Section #2 + sendGeneric(kDaikin312HdrMark, kDaikin312HdrSpace, kDaikin312BitMark, + kDaikin312OneSpace, kDaikin312BitMark, kDaikin312ZeroSpace, + kDaikin312BitMark, kDaikin312SectionGap, + data + kDaikin312Section1Length, + nbytes - kDaikin312Section1Length, + kDaikin2Freq, false, 0, kDutyDefault); + } +} +#endif // SEND_DAIKIN312 + +#if DECODE_DAIKIN312 +/// Decode the supplied Daikin 312-bit / 39-byte message. (DAIKIN312) +/// Status: STABLE / Confirmed working. +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// result. +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1829 +bool IRrecv::decodeDaikin312(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + // Is there enough data to match successfully? + if (results->rawlen < 2 * (nbits + kDaikinHeaderLength + kHeader + kFooter) + + kFooter - 1 + offset) + return false; + + // Compliance + if (strict && nbits != kDaikin312Bits) return false; + + const uint8_t ksectionSize[kDaikin312Sections] = {kDaikin312Section1Length, + kDaikin312Section2Length}; + // Header/Leader Section + uint64_t leaderdata = 0; + uint16_t used = matchGeneric(results->rawbuf + offset, &leaderdata, + results->rawlen - offset, kDaikinHeaderLength, + 0, 0, // No Header Mark or Space for the "header" + kDaikin312BitMark, kDaikin312OneSpace, + kDaikin312BitMark, kDaikin312ZeroSpace, + kDaikin312BitMark, kDaikin312HdrGap, + false, kDaikinTolerance, 0, false); + if (!used) return false; // Failed to match. + if (leaderdata) return false; // The header bits should all be zero. + + offset += used; + + // Data Sections + uint16_t pos = 0; + for (uint8_t section = 0; section < kDaikin312Sections; section++) { + // Section Header + Section Data + Section Footer + used = matchGeneric(results->rawbuf + offset, results->state + pos, + results->rawlen - offset, ksectionSize[section] * 8, + kDaikin312HdrMark, kDaikin312HdrSpace, + kDaikin312BitMark, kDaikin312OneSpace, + kDaikin312BitMark, kDaikin312ZeroSpace, + kDaikin312BitMark, kDaikin312SectionGap, + section >= kDaikin312Sections - 1, + kDaikinTolerance, 0, false); + if (used == 0) return false; + offset += used; + pos += ksectionSize[section]; + } + // Compliance + if (strict) { + if (pos * 8 != kDaikin312Bits) return false; + } + + // Success + results->decode_type = decode_type_t::DAIKIN312; + results->bits = nbits; + // No need to record the state as we stored it as we decoded it. + // As we use result->state, we don't record value, address, or command as it + // is a union data type. + return true; +} +#endif // DECODE_DAIKIN312 diff --git a/lib/IRremoteESP8266/src/ir_Daikin.h b/lib/IRremoteESP8266/src/ir_Daikin.h index 0a12c5b69..3a98f07e7 100644 --- a/lib/IRremoteESP8266/src/ir_Daikin.h +++ b/lib/IRremoteESP8266/src/ir_Daikin.h @@ -1,6 +1,6 @@ // Copyright 2016 sillyfrog // Copyright 2017 sillyfrog, crankyoldgit -// Copyright 2018-2021 crankyoldgit +// Copyright 2018-2022 crankyoldgit // Copyright 2019 pasna (IRDaikin160 class / Daikin176 class) /// @file @@ -21,6 +21,8 @@ /// @see Daikin216 https://github.com/crankyoldgit/IRremoteESP8266/issues/689 /// @see Daikin216 https://github.com/danny-source/Arduino_DY_IRDaikin /// @see Daikin64 https://github.com/crankyoldgit/IRremoteESP8266/issues/1064 +/// @see Daikin200 https://github.com/crankyoldgit/IRremoteESP8266/issues/1802 +/// @see Daikin312 https://github.com/crankyoldgit/IRremoteESP8266/issues/1829 // Supports: // Brand: Daikin, Model: ARC433** remote (DAIKIN) @@ -34,19 +36,23 @@ // Brand: Daikin, Model: BRC4C153 remote (DAIKIN176) // Brand: Daikin, Model: FFQ35B8V1B A/C (DAIKIN176) // Brand: Daikin, Model: BRC4C151 remote (DAIKIN176) -// Brand: Daikin, Model: 17 Series A/C (DAIKIN128) -// Brand: Daikin, Model: FTXB12AXVJU A/C (DAIKIN128) -// Brand: Daikin, Model: FTXB09AXVJU A/C (DAIKIN128) +// Brand: Daikin, Model: 17 Series FTXB09AXVJU A/C (DAIKIN128) +// Brand: Daikin, Model: 17 Series FTXB12AXVJU A/C (DAIKIN128) +// Brand: Daikin, Model: 17 Series FTXB24AXVJU A/C (DAIKIN128) // Brand: Daikin, Model: BRC52B63 remote (DAIKIN128) // Brand: Daikin, Model: ARC480A5 remote (DAIKIN152) // Brand: Daikin, Model: FFN-C/FCN-F Series A/C (DAIKIN64) // Brand: Daikin, Model: DGS01 remote (DAIKIN64) // Brand: Daikin, Model: M Series A/C (DAIKIN) // Brand: Daikin, Model: FTXM-M A/C (DAIKIN) +// Brand: Daikin, Model: ARC466A12 remote (DAIKIN) // Brand: Daikin, Model: ARC466A33 remote (DAIKIN) // Brand: Daikin, Model: FTWX35AXV1 A/C (DAIKIN64) // Brand: Daikin, Model: ARC484A4 remote (DAIKIN216) // Brand: Daikin, Model: FTQ60TV16U2 A/C (DAIKIN216) +// Brand: Daikin, Model: BRC4M150W16 remote (DAIKIN200) +// Brand: Daikin, Model: FTXM20R5V1B A/C (DAIKIN312) +// Brand: Daikin, Model: ARC466A67 remote (DAIKIN312) #ifndef IR_DAIKIN_H_ #define IR_DAIKIN_H_ @@ -676,6 +682,30 @@ const uint8_t kDaikin64MaxTemp = 30; // Celsius const uint8_t kDaikin64ChecksumOffset = 60; const uint8_t kDaikin64ChecksumSize = 4; // Mask 0b1111 << 59 +const uint16_t kDaikin200Freq = 38000; // Modulation Frequency in Hz. +const uint16_t kDaikin200HdrMark = 4920; +const uint16_t kDaikin200HdrSpace = 2230; +const uint16_t kDaikin200BitMark = 290; +const uint16_t kDaikin200OneSpace = 1850; +const uint16_t kDaikin200ZeroSpace = 780; +const uint16_t kDaikin200Gap = 29400; +const uint16_t kDaikin200Sections = 2; +const uint16_t kDaikin200Section1Length = 7; +const uint16_t kDaikin200Section2Length = kDaikin200StateLength - + kDaikin200Section1Length; + +const uint16_t kDaikin312HdrMark = 3518; +const uint16_t kDaikin312HdrSpace = 1688; +const uint16_t kDaikin312BitMark = 453; +const uint16_t kDaikin312ZeroSpace = 414; +const uint16_t kDaikin312OneSpace = 1275; +const uint16_t kDaikin312HdrGap = 25100; +const uint16_t kDaikin312SectionGap = 35512; +const uint16_t kDaikin312Sections = 2; +const uint16_t kDaikin312Section1Length = 20; +const uint16_t kDaikin312Section2Length = kDaikin312StateLength - + kDaikin312Section1Length; + // Legacy defines. #define DAIKIN_COOL kDaikinCool #define DAIKIN_HEAT kDaikinHeat diff --git a/lib/IRremoteESP8266/src/ir_Delonghi.cpp b/lib/IRremoteESP8266/src/ir_Delonghi.cpp index 21a787799..19dec3741 100644 --- a/lib/IRremoteESP8266/src/ir_Delonghi.cpp +++ b/lib/IRremoteESP8266/src/ir_Delonghi.cpp @@ -421,7 +421,7 @@ uint16_t IRDelonghiAc::getOffTimer(void) const { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRDelonghiAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::DELONGHI_AC; result.power = _.Power; // result.mode = toCommonMode(getMode()); diff --git a/lib/IRremoteESP8266/src/ir_Ecoclim.cpp b/lib/IRremoteESP8266/src/ir_Ecoclim.cpp index b16f8beb2..983913d38 100644 --- a/lib/IRremoteESP8266/src/ir_Ecoclim.cpp +++ b/lib/IRremoteESP8266/src/ir_Ecoclim.cpp @@ -359,7 +359,7 @@ void IREcoclimAc::disableOffTimer(void) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IREcoclimAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::ECOCLIM; result.power = _.Power; result.mode = toCommonMode(getMode()); diff --git a/lib/IRremoteESP8266/src/ir_Electra.cpp b/lib/IRremoteESP8266/src/ir_Electra.cpp index b4d670b88..f0882bc6d 100644 --- a/lib/IRremoteESP8266/src/ir_Electra.cpp +++ b/lib/IRremoteESP8266/src/ir_Electra.cpp @@ -359,7 +359,7 @@ uint8_t IRElectraAc::getSensorTemp(void) const { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRElectraAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::ELECTRA_AC; result.power = _.Power; result.mode = toCommonMode(_.Mode); diff --git a/lib/IRremoteESP8266/src/ir_Electra.h b/lib/IRremoteESP8266/src/ir_Electra.h index 8fd4ee182..142b52562 100644 --- a/lib/IRremoteESP8266/src/ir_Electra.h +++ b/lib/IRremoteESP8266/src/ir_Electra.h @@ -13,6 +13,7 @@ // Brand: Subtropic, Model: YKR-H/102E remote // Brand: Centek, Model: SCT-65Q09 A/C // Brand: Centek, Model: YKR-P/002E remote +// Brand: AEG, Model: Chillflex Pro AXP26U338CW A/C #ifndef IR_ELECTRA_H_ #define IR_ELECTRA_H_ diff --git a/lib/IRremoteESP8266/src/ir_Fujitsu.cpp b/lib/IRremoteESP8266/src/ir_Fujitsu.cpp index da4b41dcf..0c2a84331 100644 --- a/lib/IRremoteESP8266/src/ir_Fujitsu.cpp +++ b/lib/IRremoteESP8266/src/ir_Fujitsu.cpp @@ -1,5 +1,5 @@ // Copyright 2017 Jonny Graham -// Copyright 2017-2021 David Conran +// Copyright 2017-2022 David Conran // Copyright 2021 siriuslzx /// @file @@ -116,6 +116,7 @@ void IRFujitsuAC::stateReset(void) { _.longcode[1] = 0x63; _.longcode[3] = 0x10; _.longcode[4] = 0x10; + _rawstatemodified = true; } /// Set up hardware to be able to send a message. @@ -142,6 +143,7 @@ bool IRFujitsuAC::updateUseLongOrShort(void) { case kFujitsuAcCmdStepHoriz: // 0x79 case kFujitsuAcCmdToggleSwingHoriz: // 0x7A _.Cmd = _cmd; + _rawstatemodified = true; break; default: switch (_model) { @@ -150,10 +152,12 @@ bool IRFujitsuAC::updateUseLongOrShort(void) { case fujitsu_ac_remote_model_t::ARREB1E: case fujitsu_ac_remote_model_t::ARREW4E: _.Cmd = 0xFE; + _rawstatemodified = true; break; case fujitsu_ac_remote_model_t::ARDB1: case fujitsu_ac_remote_model_t::ARJW2: _.Cmd = 0xFC; + _rawstatemodified = true; break; } fullCmd = true; @@ -164,7 +168,8 @@ bool IRFujitsuAC::updateUseLongOrShort(void) { /// Calculate and set the checksum values for the internal state. void IRFujitsuAC::checkSum(void) { - if (updateUseLongOrShort()) { // Is it a long code? + _rawstatemodified = true; + if (updateUseLongOrShort()) { // Is it going to be a long code? // Nr. of bytes in the message after this byte. _.RestLength = _state_length - 7; _.Protocol = (_model == fujitsu_ac_remote_model_t::ARREW4E) ? 0x31 : 0x30; @@ -179,7 +184,13 @@ void IRFujitsuAC::checkSum(void) { } } if (_model != fujitsu_ac_remote_model_t::ARRY4) { - if (_model != fujitsu_ac_remote_model_t::ARREW4E) _.Clean = false; + switch (_model) { + case fujitsu_ac_remote_model_t::ARRAH2E: + case fujitsu_ac_remote_model_t::ARREW4E: + break; + default: + _.Clean = false; + } _.Filter = false; } // Set the On/Off/Sleep timer Nr of mins. @@ -235,13 +246,17 @@ uint8_t IRFujitsuAC::getStateLength(void) { return updateUseLongOrShort() ? _state_length : _state_length_short; } +/// Is the current binary state representation a long or a short code? +/// @return true, if long; false, if short. +bool IRFujitsuAC::isLongCode(void) const { + return _.Cmd == 0xFE || _.Cmd == 0xFC; +} + /// Get a PTR to the internal state/code for this protocol. /// @return PTR to a code for this protocol based on the current internal state. uint8_t* IRFujitsuAC::getRaw(void) { checkSum(); - if (_.Cmd == 0xFE || _.Cmd == 0xFC) - return _.longcode; - return _.shortcode; + return isLongCode() ? _.longcode : _.shortcode; } /// Build the internal state/config from the current (raw) A/C message. @@ -281,7 +296,8 @@ void IRFujitsuAC::buildFromState(const uint16_t length) { setCmd(kFujitsuAcCmdStayOn); // Currently the only way we know how to tell ARRAH2E & ARRY4 apart is if // either the raw Filter or Clean setting is on. - if (_model == fujitsu_ac_remote_model_t::ARRAH2E && (_.Filter || _.Clean)) + if (_model == fujitsu_ac_remote_model_t::ARRAH2E && (_.Filter || _.Clean) && + !get10CHeat()) setModel(fujitsu_ac_remote_model_t::ARRY4); if (_state_length == kFujitsuAcStateLength && _.OutsideQuiet) setModel(fujitsu_ac_remote_model_t::ARREB1E); @@ -312,6 +328,7 @@ bool IRFujitsuAC::setRaw(const uint8_t newState[], const uint16_t length) { _.longcode[i] = 0; } buildFromState(length); + _rawstatemodified = false; return true; } @@ -405,6 +422,7 @@ bool IRFujitsuAC::getPower(void) const { return _cmd != kFujitsuAcCmdTurnOff; } /// @param[in] on true, the setting is on. false, the setting is off. void IRFujitsuAC::setOutsideQuiet(const bool on) { _.OutsideQuiet = on; + _rawstatemodified = true; setCmd(kFujitsuAcCmdStayOn); // No special command involved. } @@ -461,6 +479,7 @@ void IRFujitsuAC::setTemp(const float temp, const bool useCelsius) { } else { _.Temp = _temp - offset; } + _rawstatemodified = true; setCmd(kFujitsuAcCmdStayOn); // No special command involved. } @@ -484,6 +503,7 @@ void IRFujitsuAC::setFanSpeed(const uint8_t fanSpeed) { _.Fan = kFujitsuAcFanHigh; // Set the fan to maximum if out of range. else _.Fan = fanSpeed; + _rawstatemodified = true; setCmd(kFujitsuAcCmdStayOn); // No special command involved. } @@ -498,6 +518,7 @@ void IRFujitsuAC::setMode(const uint8_t mode) { _.Mode = kFujitsuAcModeHeat; // Set the mode to maximum if out of range. else _.Mode = mode; + _rawstatemodified = true; setCmd(kFujitsuAcCmdStayOn); // No special command involved. } @@ -511,6 +532,7 @@ uint8_t IRFujitsuAC::getMode(void) const { return _.Mode; } /// @note Not all models support all possible swing modes. void IRFujitsuAC::setSwing(const uint8_t swingMode) { _.Swing = swingMode; + _rawstatemodified = true; switch (_model) { // No Horizontal support. case fujitsu_ac_remote_model_t::ARDB1: @@ -531,14 +553,13 @@ void IRFujitsuAC::setSwing(const uint8_t swingMode) { /// Get the requested swing operation mode of the A/C unit. /// @return The contents of the swing state/mode. -uint8_t IRFujitsuAC::getSwing(void) const { - return _.Swing; -} +uint8_t IRFujitsuAC::getSwing(void) const { return _.Swing; } /// Set the Clean mode of the A/C. /// @param[in] on true, the setting is on. false, the setting is off. void IRFujitsuAC::setClean(const bool on) { _.Clean = on; + _rawstatemodified = true; setCmd(kFujitsuAcCmdStayOn); // No special command involved. } @@ -555,6 +576,7 @@ bool IRFujitsuAC::getClean(void) const { /// @param[in] on true, the setting is on. false, the setting is off. void IRFujitsuAC::setFilter(const bool on) { _.Filter = on; + _rawstatemodified = true; setCmd(kFujitsuAcCmdStayOn); // No special command involved. } @@ -563,7 +585,7 @@ void IRFujitsuAC::setFilter(const bool on) { bool IRFujitsuAC::getFilter(void) const { switch (_model) { case fujitsu_ac_remote_model_t::ARRY4: return _.Filter; - default: return false; + default: return false; } } @@ -572,6 +594,7 @@ bool IRFujitsuAC::getFilter(void) const { void IRFujitsuAC::set10CHeat(const bool on) { switch (_model) { // Only selected models support this. + case fujitsu_ac_remote_model_t::ARRAH2E: case fujitsu_ac_remote_model_t::ARREW4E: setClean(on); // 10C Heat uses the same bit as Clean if (on) { @@ -579,6 +602,7 @@ void IRFujitsuAC::set10CHeat(const bool on) { _.Power = true; _.Fan = kFujitsuAcFanAuto; _.Swing = kFujitsuAcSwingOff; + _rawstatemodified = true; } default: break; @@ -589,6 +613,7 @@ void IRFujitsuAC::set10CHeat(const bool on) { /// @return true, the setting is on. false, the setting is off. bool IRFujitsuAC::get10CHeat(void) const { switch (_model) { + case fujitsu_ac_remote_model_t::ARRAH2E: case fujitsu_ac_remote_model_t::ARREW4E: return (_.Clean && _.Power && _.Mode == kFujitsuAcModeFan && _.Fan == kFujitsuAcFanAuto && _.Swing == kFujitsuAcSwingOff); @@ -602,9 +627,8 @@ uint8_t IRFujitsuAC::getTimerType(void) const { switch (_model) { // These models seem to have timer support. case fujitsu_ac_remote_model_t::ARRAH2E: - case fujitsu_ac_remote_model_t::ARREB1E: - return _.TimerType; - default: return kFujitsuAcStopTimers; + case fujitsu_ac_remote_model_t::ARREB1E: return _.TimerType; + default: return kFujitsuAcStopTimers; } } @@ -620,6 +644,7 @@ void IRFujitsuAC::setTimerType(const uint8_t timertype) { break; default: _.TimerType = kFujitsuAcStopTimers; } + _rawstatemodified = true; } /// Get the On Timer setting of the A/C. @@ -634,6 +659,7 @@ uint16_t IRFujitsuAC::getOnTimer(void) const { /// @param[in] nr_mins Nr. of minutes to set the timer to. 0 means disabled. void IRFujitsuAC::setOnTimer(const uint16_t nr_mins) { _.OnTimer = std::min(kFujitsuAcTimerMax, nr_mins); // Bounds check. + _rawstatemodified = true; if (_.OnTimer) { _.TimerType = kFujitsuAcOnTimer; } else if (getTimerType() == kFujitsuAcOnTimer) { @@ -646,10 +672,8 @@ void IRFujitsuAC::setOnTimer(const uint16_t nr_mins) { uint16_t IRFujitsuAC::getOffSleepTimer(void) const { switch (getTimerType()) { case kFujitsuAcOffTimer: - case kFujitsuAcSleepTimer: - return _.OffTimer; - default: - return 0; + case kFujitsuAcSleepTimer: return _.OffTimer; + default: return 0; } } @@ -657,12 +681,13 @@ uint16_t IRFujitsuAC::getOffSleepTimer(void) const { /// @param[in] nr_mins Nr. of minutes to set the timer to. 0 means disabled. inline void IRFujitsuAC::setOffSleepTimer(const uint16_t nr_mins) { _.OffTimer = std::min(kFujitsuAcTimerMax, nr_mins); // Bounds check. + _rawstatemodified = true; } /// Set the Off Timer time for the A/C. /// @param[in] nr_mins Nr. of minutes to set the timer to. 0 means disabled. void IRFujitsuAC::setOffTimer(const uint16_t nr_mins) { - setOffSleepTimer(nr_mins); + setOffSleepTimer(nr_mins); // This will also set _rawstatemodified to true. if (nr_mins) _.TimerType = kFujitsuAcOffTimer; else if (getTimerType() != kFujitsuAcOnTimer) @@ -672,7 +697,7 @@ void IRFujitsuAC::setOffTimer(const uint16_t nr_mins) { /// Set the Sleep Timer time for the A/C. /// @param[in] nr_mins Nr. of minutes to set the timer to. 0 means disabled. void IRFujitsuAC::setSleepTimer(const uint16_t nr_mins) { - setOffSleepTimer(nr_mins); + setOffSleepTimer(nr_mins); // This will also set _rawstatemodified to true. if (nr_mins) _.TimerType = kFujitsuAcSleepTimer; else if (getTimerType() != kFujitsuAcOnTimer) @@ -706,7 +731,10 @@ bool IRFujitsuAC::validChecksum(uint8_t state[], const uint16_t length) { /// Set the device's remote ID number. /// @param[in] num The ID for the remote. Valid number range is 0 to 3. -void IRFujitsuAC::setId(const uint8_t num) { _.Id = num; } +void IRFujitsuAC::setId(const uint8_t num) { + _.Id = num; + _rawstatemodified = true; +} /// Get the current device's remote ID number. /// @return The current device's remote ID number. @@ -714,7 +742,10 @@ uint8_t IRFujitsuAC::getId(void) const { return _.Id; } /// Set the Temperature units for the A/C. /// @param[in] on true, use Celsius. false, use Fahrenheit. -void IRFujitsuAC::setCelsius(const bool on) { _.Fahrenheit = !on; } +void IRFujitsuAC::setCelsius(const bool on) { + _.Fahrenheit = !on; + _rawstatemodified = true; +} /// Get the Clean mode status of the A/C. /// @return true, the setting is on. false, the setting is off. @@ -774,35 +805,45 @@ stdAc::fanspeed_t IRFujitsuAC::toCommonFanSpeed(const uint8_t speed) { } /// Convert the current internal state into its stdAc::state_t equivalent. +/// @param[in] prev Ptr to a previous state. /// @return The stdAc equivalent of the native settings. -stdAc::state_t IRFujitsuAC::toCommon(void) const { - stdAc::state_t result; +stdAc::state_t IRFujitsuAC::toCommon(const stdAc::state_t *prev) { + stdAc::state_t result{}; + if (prev != NULL) result = *prev; result.protocol = decode_type_t::FUJITSU_AC; + checkSum(); result.model = _model; result.power = getPower(); - result.mode = toCommonMode(_.Mode); - result.celsius = getCelsius(); - result.degrees = getTemp(); - result.fanspeed = toCommonFanSpeed(_.Fan); - uint8_t swing = _.Swing; - switch (result.model) { - case fujitsu_ac_remote_model_t::ARREB1E: - case fujitsu_ac_remote_model_t::ARRAH2E: - case fujitsu_ac_remote_model_t::ARRY4: - result.clean = _.Clean; - result.filter = _.Filter; - result.swingv = (swing & kFujitsuAcSwingVert) ? stdAc::swingv_t::kAuto - : stdAc::swingv_t::kOff; - result.swingh = (swing & kFujitsuAcSwingHoriz) ? stdAc::swingh_t::kAuto - : stdAc::swingh_t::kOff; - break; - case fujitsu_ac_remote_model_t::ARDB1: - case fujitsu_ac_remote_model_t::ARJW2: - default: - result.swingv = stdAc::swingv_t::kOff; - result.swingh = stdAc::swingh_t::kOff; + // Only update these settings if it is a long message, or we have no previous + // state info for those settings. + if (isLongCode() || prev == NULL) { + result.mode = toCommonMode(_.Mode); + result.celsius = getCelsius(); + { + const float minHeat = result.celsius ? kFujitsuAcMinHeat + : kFujitsuAcMinHeatF; + result.degrees = get10CHeat() ? minHeat : getTemp(); + } + result.fanspeed = toCommonFanSpeed(_.Fan); + uint8_t swing = _.Swing; + switch (result.model) { + case fujitsu_ac_remote_model_t::ARREB1E: + case fujitsu_ac_remote_model_t::ARRAH2E: + case fujitsu_ac_remote_model_t::ARRY4: + result.clean = _.Clean; + result.filter = _.Filter; + result.swingv = (swing & kFujitsuAcSwingVert) ? stdAc::swingv_t::kAuto + : stdAc::swingv_t::kOff; + result.swingh = (swing & kFujitsuAcSwingHoriz) ? stdAc::swingh_t::kAuto + : stdAc::swingh_t::kOff; + break; + case fujitsu_ac_remote_model_t::ARDB1: + case fujitsu_ac_remote_model_t::ARJW2: + default: + result.swingv = stdAc::swingv_t::kOff; + result.swingh = stdAc::swingh_t::kOff; + } } - result.quiet = _.Fan == kFujitsuAcFanQuiet; result.turbo = _cmd == kFujitsuAcCmdPowerful; result.econo = _cmd == kFujitsuAcCmdEcono; @@ -820,54 +861,67 @@ stdAc::state_t IRFujitsuAC::toCommon(void) const { /// @return A human readable string. String IRFujitsuAC::toString(void) const { String result = ""; - result.reserve(100); // Reserve some heap for the string to reduce fragging. + result.reserve(180); // Reserve some heap for the string to reduce fragging. fujitsu_ac_remote_model_t model = _model; result += addModelToString(decode_type_t::FUJITSU_AC, model, false); result += addIntToString(_.Id, kIdStr); result += addBoolToString(getPower(), kPowerStr); - result += addModeToString(_.Mode, kFujitsuAcModeAuto, kFujitsuAcModeCool, - kFujitsuAcModeHeat, kFujitsuAcModeDry, - kFujitsuAcModeFan); - result += addTempFloatToString(getTemp(), getCelsius()); - result += addFanToString(_.Fan, kFujitsuAcFanHigh, kFujitsuAcFanLow, - kFujitsuAcFanAuto, kFujitsuAcFanQuiet, - kFujitsuAcFanMed); - switch (model) { - // These models have no internal swing, clean. or filter state. - case fujitsu_ac_remote_model_t::ARDB1: - case fujitsu_ac_remote_model_t::ARJW2: - break; - // These models have Clean & Filter, plus Swing (via fall thru) - case fujitsu_ac_remote_model_t::ARRAH2E: - case fujitsu_ac_remote_model_t::ARREB1E: - case fujitsu_ac_remote_model_t::ARRY4: - result += addBoolToString(getClean(), kCleanStr); - result += addBoolToString(getFilter(), kFilterStr); - // FALL THRU - default: // e.g. ARREW4E - if (model == fujitsu_ac_remote_model_t::ARREW4E) - result += addBoolToString(get10CHeat(), k10CHeatStr); - result += addIntToString(_.Swing, kSwingStr); - result += kSpaceLBraceStr; - switch (_.Swing) { - case kFujitsuAcSwingOff: - result += kOffStr; - break; - case kFujitsuAcSwingVert: - result += kSwingVStr; - break; - case kFujitsuAcSwingHoriz: - result += kSwingHStr; - break; - case kFujitsuAcSwingBoth: - result += kSwingVStr; - result += '+'; - result += kSwingHStr; - break; - default: - result += kUnknownStr; - } - result += ')'; + if (_rawstatemodified || isLongCode()) { + result += addModeToString(_.Mode, kFujitsuAcModeAuto, kFujitsuAcModeCool, + kFujitsuAcModeHeat, kFujitsuAcModeDry, + kFujitsuAcModeFan); + { + const bool isCelsius = getCelsius(); + const float minHeat = isCelsius ? kFujitsuAcMinHeat : kFujitsuAcMinHeatF; + result += addTempFloatToString(get10CHeat() ? minHeat : getTemp(), + isCelsius); + } + result += addFanToString(_.Fan, kFujitsuAcFanHigh, kFujitsuAcFanLow, + kFujitsuAcFanAuto, kFujitsuAcFanQuiet, + kFujitsuAcFanMed); + switch (model) { + // These models have no internal swing, clean. or filter state. + case fujitsu_ac_remote_model_t::ARDB1: + case fujitsu_ac_remote_model_t::ARJW2: + break; + // These models have Clean & Filter, plus Swing (via fall thru) + case fujitsu_ac_remote_model_t::ARRAH2E: + case fujitsu_ac_remote_model_t::ARREB1E: + case fujitsu_ac_remote_model_t::ARRY4: + result += addBoolToString(getClean(), kCleanStr); + result += addBoolToString(getFilter(), kFilterStr); + // FALL THRU + default: // e.g. ARREW4E + switch (model) { + case fujitsu_ac_remote_model_t::ARRAH2E: + case fujitsu_ac_remote_model_t::ARREW4E: + result += addBoolToString(get10CHeat(), k10CHeatStr); + break; + default: + break; + } + result += addIntToString(_.Swing, kSwingStr); + result += kSpaceLBraceStr; + switch (_.Swing) { + case kFujitsuAcSwingOff: + result += kOffStr; + break; + case kFujitsuAcSwingVert: + result += kSwingVStr; + break; + case kFujitsuAcSwingHoriz: + result += kSwingHStr; + break; + case kFujitsuAcSwingBoth: + result += kSwingVStr; + result += '+'; + result += kSwingHStr; + break; + default: + result += kUnknownStr; + } + result += ')'; + } } result += kCommaSpaceStr; result += kCommandStr; @@ -902,33 +956,36 @@ String IRFujitsuAC::toString(void) const { default: result += kNAStr; } - uint16_t mins = 0; - String type_str = kTimerStr; - switch (model) { - case fujitsu_ac_remote_model_t::ARREB1E: - case fujitsu_ac_remote_model_t::ARREW4E: - result += addBoolToString(getOutsideQuiet(), kOutsideQuietStr); - // FALL THRU - // These models seem to have timer support. - case fujitsu_ac_remote_model_t::ARRAH2E: - switch (getTimerType()) { - case kFujitsuAcOnTimer: - type_str = kOnTimerStr; - mins = getOnTimer(); - break; - case kFujitsuAcOffTimer: - type_str = kOffTimerStr; - mins = getOffSleepTimer(); - break; - case kFujitsuAcSleepTimer: - type_str = kSleepTimerStr; - mins = getOffSleepTimer(); - break; - } - result += addLabeledString(mins ? minsToString(mins) : kOffStr, type_str); - break; - default: - break; + if (_rawstatemodified || isLongCode()) { + uint16_t mins = 0; + String type_str = kTimerStr; + switch (model) { + case fujitsu_ac_remote_model_t::ARREB1E: + case fujitsu_ac_remote_model_t::ARREW4E: + result += addBoolToString(getOutsideQuiet(), kOutsideQuietStr); + // FALL THRU + // These models seem to have timer support. + case fujitsu_ac_remote_model_t::ARRAH2E: + switch (getTimerType()) { + case kFujitsuAcOnTimer: + type_str = kOnTimerStr; + mins = getOnTimer(); + break; + case kFujitsuAcOffTimer: + type_str = kOffTimerStr; + mins = getOffSleepTimer(); + break; + case kFujitsuAcSleepTimer: + type_str = kSleepTimerStr; + mins = getOffSleepTimer(); + break; + } + result += addLabeledString(mins ? minsToString(mins) : kOffStr, + type_str); + break; + default: + break; + } } return result; } diff --git a/lib/IRremoteESP8266/src/ir_Fujitsu.h b/lib/IRremoteESP8266/src/ir_Fujitsu.h index 70c0a4cf0..6e2583a0c 100644 --- a/lib/IRremoteESP8266/src/ir_Fujitsu.h +++ b/lib/IRremoteESP8266/src/ir_Fujitsu.h @@ -1,5 +1,5 @@ // Copyright 2017 Jonny Graham -// Copyright 2018-2021 David Conran +// Copyright 2018-2022 David Conran // Copyright 2021 siriuslzx /// @file @@ -30,6 +30,7 @@ // Brand: Fujitsu, Model: AR-DL10 remote (ARDB1) // Brand: Fujitsu, Model: ASU30C1 A/C (ARDB1) // Brand: Fujitsu, Model: AR-RAH1U remote (ARREB1E) +// Brand: Fujitsu, Model: AR-RAH2U remote (ARRAH2E) // Brand: Fujitsu, Model: ASU12RLF A/C (ARREB1E) // Brand: Fujitsu, Model: AR-REW4E remote (ARREW4E) // Brand: Fujitsu, Model: ASYG09KETA-B A/C (ARREW4E) @@ -37,6 +38,9 @@ // Brand: Fujitsu, Model: ASTG09K A/C (ARREW4E) // Brand: Fujitsu, Model: ASTG18K A/C (ARREW4E) // Brand: Fujitsu, Model: AR-REW1E remote (ARREW4E) +// Brand: Fujitsu, Model: AR-REG1U remote (ARRAH2E) +// Brand: OGeneral, Model: AR-RCL1E remote (ARRAH2E) +// Brand: Fujitsu General, Model: AR-JW17 remote (ARDB1) #ifndef IR_FUJITSU_H_ #define IR_FUJITSU_H_ @@ -128,9 +132,11 @@ const uint8_t kFujitsuAcFanMed = 0x02; const uint8_t kFujitsuAcFanLow = 0x03; const uint8_t kFujitsuAcFanQuiet = 0x04; +const float kFujitsuAcMinHeat = 10; // 10C const float kFujitsuAcMinTemp = 16; // 16C const float kFujitsuAcMaxTemp = 30; // 30C const uint8_t kFujitsuAcTempOffsetC = kFujitsuAcMinTemp; +const float kFujitsuAcMinHeatF = 50; // 50F const float kFujitsuAcMinTempF = 60; // 60F const float kFujitsuAcMaxTempF = 88; // 88F const uint8_t kFujitsuAcTempOffsetF = 44; @@ -206,6 +212,7 @@ class IRFujitsuAC { bool setRaw(const uint8_t newState[], const uint16_t length); uint8_t getStateLength(void); static bool validChecksum(uint8_t* state, const uint16_t length); + bool isLongCode(void) const; void setPower(const bool on); void off(void); void on(void); @@ -233,7 +240,7 @@ class IRFujitsuAC { static uint8_t convertFan(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) const; + stdAc::state_t toCommon(const stdAc::state_t *prev = NULL); String toString(void) const; #ifndef UNIT_TEST @@ -249,6 +256,7 @@ class IRFujitsuAC { fujitsu_ac_remote_model_t _model; uint8_t _state_length; uint8_t _state_length_short; + bool _rawstatemodified; void checkSum(void); bool updateUseLongOrShort(void); void buildFromState(const uint16_t length); diff --git a/lib/IRremoteESP8266/src/ir_Goodweather.cpp b/lib/IRremoteESP8266/src/ir_Goodweather.cpp index 1d6918e7f..c3d9d62c8 100644 --- a/lib/IRremoteESP8266/src/ir_Goodweather.cpp +++ b/lib/IRremoteESP8266/src/ir_Goodweather.cpp @@ -311,7 +311,7 @@ stdAc::fanspeed_t IRGoodweatherAc::toCommonFanSpeed(const uint8_t speed) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRGoodweatherAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::GOODWEATHER; result.power = _.Power; result.mode = toCommonMode(_.Mode); diff --git a/lib/IRremoteESP8266/src/ir_Gree.cpp b/lib/IRremoteESP8266/src/ir_Gree.cpp index 3c3a8583e..ead7178e3 100644 --- a/lib/IRremoteESP8266/src/ir_Gree.cpp +++ b/lib/IRremoteESP8266/src/ir_Gree.cpp @@ -162,6 +162,7 @@ void IRGreeAC::setRaw(const uint8_t new_code[]) { else _model = gree_ac_remote_model_t::YBOFB; } + if (_.Mode == kGreeEcono) _model = gree_ac_remote_model_t::YX1FSF; } /// Calculate and set the checksum values for the internal state. @@ -186,7 +187,8 @@ bool IRGreeAC::validChecksum(const uint8_t state[], const uint16_t length) { void IRGreeAC::setModel(const gree_ac_remote_model_t model) { switch (model) { case gree_ac_remote_model_t::YAW1F: - case gree_ac_remote_model_t::YBOFB: _model = model; break; + case gree_ac_remote_model_t::YBOFB: + case gree_ac_remote_model_t::YX1FSF: _model = model; break; default: _model = gree_ac_remote_model_t::YAW1F; } } @@ -291,6 +293,7 @@ void IRGreeAC::setMode(const uint8_t new_mode) { case kGreeDry: setFan(1); break; case kGreeCool: case kGreeFan: + case kGreeEcono: case kGreeHeat: break; // If we get an unexpected mode, default to AUTO. default: mode = kGreeAuto; @@ -352,11 +355,17 @@ bool IRGreeAC::getTurbo(void) const { return _.Turbo; } /// Set the Econo setting of the A/C. /// @param[in] on true, the setting is on. false, the setting is off. -void IRGreeAC::setEcono(const bool on) { _.Econo = on; } +void IRGreeAC::setEcono(const bool on) { + _.Econo = on; + if (on && getModel() == gree_ac_remote_model_t::YX1FSF) + setMode(kGreeEcono); +} /// Get the Econo setting of the A/C. /// @return true, the setting is on. false, the setting is off. -bool IRGreeAC::getEcono(void) const { return _.Econo; } +bool IRGreeAC::getEcono(void) const { + return _.Econo || getMode() == kGreeEcono; +} /// Set the Vertical Swing mode of the A/C. /// @param[in] automatic Do we use the automatic setting? @@ -575,7 +584,7 @@ stdAc::swingh_t IRGreeAC::toCommonSwingH(const uint8_t pos) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRGreeAC::toCommon(void) { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::GREE; result.model = _model; result.power = _.Power; @@ -589,7 +598,7 @@ stdAc::state_t IRGreeAC::toCommon(void) { result.swingv = toCommonSwingV(_.SwingV); result.swingh = toCommonSwingH(_.SwingH); result.turbo = _.Turbo; - result.econo = _.Econo; + result.econo = getEcono(); result.light = _.Light; result.clean = _.Xfan; result.sleep = _.Sleep ? 0 : -1; @@ -608,8 +617,15 @@ String IRGreeAC::toString(void) { result.reserve(220); // Reserve some heap for the string to reduce fragging. result += addModelToString(decode_type_t::GREE, _model, false); result += addBoolToString(_.Power, kPowerStr); - result += addModeToString(_.Mode, kGreeAuto, kGreeCool, kGreeHeat, - kGreeDry, kGreeFan); + if (_model == gree_ac_remote_model_t::YX1FSF && _.Mode == kGreeEcono) { + result += addIntToString(_.Mode, kModeStr); + result += kSpaceLBraceStr; + result += kEconoStr; + result += ')'; + } else { + result += addModeToString(_.Mode, kGreeAuto, kGreeCool, kGreeHeat, + kGreeDry, kGreeFan); + } result += addTempToString(getTemp(), !_.UseFahrenheit); result += addFanToString(_.Fan, kGreeFanMax, kGreeFanMin, kGreeFanAuto, kGreeFanAuto, kGreeFanMed); diff --git a/lib/IRremoteESP8266/src/ir_Gree.h b/lib/IRremoteESP8266/src/ir_Gree.h index be5ac31ce..eb9d4a00c 100644 --- a/lib/IRremoteESP8266/src/ir_Gree.h +++ b/lib/IRremoteESP8266/src/ir_Gree.h @@ -1,9 +1,10 @@ -// Copyright 2016 David Conran +// Copyright 2016-2022 David Conran /// @file /// @brief Support for Gree A/C protocols. /// @see https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.h /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1508 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1821 // Supports: // Brand: Ultimate, Model: Heat Pump @@ -15,6 +16,7 @@ // Brand: Gree, Model: YAA1FBF remote // Brand: Gree, Model: YB1F2F remote // Brand: Gree, Model: YAN1F1 remote +// Brand: Gree, Model: YX1F2F remote (YX1FSF) // Brand: Gree, Model: VIR09HP115V1AH A/C // Brand: Gree, Model: VIR12HP230V1AH A/C // Brand: Amana, Model: PBC093G00CC A/C @@ -23,6 +25,7 @@ // Brand: Cooper & Hunter, Model: CH-S09FTXG A/C // Brand: Vailland, Model: YACIFB remote // Brand: Vailland, Model: VAI5-035WNI A/C +// Brand: Soleus Air, Model: window A/C (YX1FSF) #ifndef IR_GREE_H_ #define IR_GREE_H_ @@ -86,11 +89,12 @@ union GreeProtocol{ // Constants -const uint8_t kGreeAuto = 0; -const uint8_t kGreeCool = 1; -const uint8_t kGreeDry = 2; -const uint8_t kGreeFan = 3; -const uint8_t kGreeHeat = 4; +const uint8_t kGreeAuto = 0; +const uint8_t kGreeCool = 1; +const uint8_t kGreeDry = 2; +const uint8_t kGreeFan = 3; +const uint8_t kGreeHeat = 4; +const uint8_t kGreeEcono = 5; const uint8_t kGreeFanAuto = 0; const uint8_t kGreeFanMin = 1; diff --git a/lib/IRremoteESP8266/src/ir_Haier.cpp b/lib/IRremoteESP8266/src/ir_Haier.cpp index 5c9f2a36d..93336212e 100644 --- a/lib/IRremoteESP8266/src/ir_Haier.cpp +++ b/lib/IRremoteESP8266/src/ir_Haier.cpp @@ -46,7 +46,8 @@ using irutils::minsToString; _.x##Mins = mins % 60;\ } while (0) -#if (SEND_HAIER_AC || SEND_HAIER_AC_YRW02 || SEND_HAIER_AC176) +#if (SEND_HAIER_AC || SEND_HAIER_AC_YRW02 || SEND_HAIER_AC160 || \ + SEND_HAIER_AC176) /// Send a Haier A/C formatted message. (HSU07-HEA03 remote) /// Status: STABLE / Known to be working. /// @param[in] data The message to be sent. @@ -93,6 +94,18 @@ void IRsend::sendHaierAC176(const unsigned char data[], const uint16_t nbytes, } #endif // SEND_HAIER_AC176 +#if SEND_HAIER_AC160 +/// Send a Haier 160 bit remote A/C formatted message. +/// Status: STABLE / Known to be working. +/// @param[in] data The message to be sent. +/// @param[in] nbytes The number of bytes of message to be sent. +/// @param[in] repeat The number of times the command is to be repeated. +void IRsend::sendHaierAC160(const unsigned char data[], const uint16_t nbytes, + const uint16_t repeat) { + if (nbytes >= kHaierAC160StateLength) sendHaierAC(data, nbytes, repeat); +} +#endif // SEND_HAIER_AC160 + /// Class constructor /// @param[in] pin GPIO to be used when sending. /// @param[in] inverted Is the output signal to be inverted? @@ -426,7 +439,7 @@ stdAc::swingv_t IRHaierAC::toCommonSwingV(const uint8_t pos) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRHaierAC::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::HAIER_AC; result.model = -1; // No models used. result.power = true; @@ -568,7 +581,7 @@ void IRHaierAC176::checksum(void) { /// @return true, if the state has a valid checksum. Otherwise, false. bool IRHaierAC176::validChecksum(const uint8_t state[], const uint16_t length) { if (length < 2) return false; // 1 byte of data can't have a checksum. - if (length < kHaierAC176StateLength) { // Is it too short? + if (length < kHaierAC160StateLength) { // Is it too short? // Then it is just a checksum of the whole thing. return (state[length - 1] == sumBytes(state, length - 1)); } else { // It is long enough for two checksums. @@ -1127,7 +1140,7 @@ stdAc::swingh_t IRHaierAC176::toCommonSwingH(const uint8_t pos) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRHaierAC176::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::HAIER_AC_YRW02; result.model = getModel(); result.power = _.Power; @@ -1323,7 +1336,8 @@ bool IRHaierACYRW02::validChecksum(const uint8_t state[], } // End of IRHaierACYRW02 class. -#if (DECODE_HAIER_AC || DECODE_HAIER_AC_YRW02) +#if (DECODE_HAIER_AC || DECODE_HAIER_AC_YRW02 || DECODE_HAIER_AC160 || \ + DECODE_HAIER_AC176) /// Decode the supplied Haier HSU07-HEA03 remote message. /// Status: STABLE / Known to be working. /// @param[in,out] results Ptr to the data to decode & where to store the decode @@ -1435,3 +1449,35 @@ bool IRrecv::decodeHaierAC176(decode_results* results, uint16_t offset, return true; } #endif // DECODE_HAIER_AC176 + +#if DECODE_HAIER_AC160 +/// Decode the supplied Haier 160 bit remote A/C message. +/// Status: STABLE / Known to be working. +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// result. +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +bool IRrecv::decodeHaierAC160(decode_results* results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (strict) { + if (nbits != kHaierAC160Bits) + return false; // Not strictly a HAIER_AC160 message. + } + + // The protocol is almost exactly the same as HAIER_AC + if (!decodeHaierAC(results, offset, nbits, false)) return false; + + // Compliance + if (strict) { + if (!IRHaierAC176::validChecksum(results->state, nbits / 8)) return false; + } + + // Success + // It looks correct, but we haven't check the checksum etc. + results->decode_type = HAIER_AC160; + return true; +} +#endif // DECODE_HAIER_AC160 diff --git a/lib/IRremoteESP8266/src/ir_Haier.h b/lib/IRremoteESP8266/src/ir_Haier.h index 4e5c8e64c..9afc862a5 100644 --- a/lib/IRremoteESP8266/src/ir_Haier.h +++ b/lib/IRremoteESP8266/src/ir_Haier.h @@ -8,6 +8,7 @@ /// @see https://www.dropbox.com/s/mecyib3lhdxc8c6/IR%20data%20reverse%20engineering.xlsx?dl=0 /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/485 /// @see https://www.dropbox.com/sh/w0bt7egp0fjger5/AADRFV6Wg4wZskJVdFvzb8Z0a?dl=0&preview=haer2.ods +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1804 // Supports: // Brand: Haier, Model: HSU07-HEA03 remote (HAIER_AC) @@ -17,6 +18,7 @@ // Brand: Mabe, Model: MMI18HDBWCA6MI8 A/C (HAIER_AC176) // Brand: Mabe, Model: V12843 HJ200223 remote (HAIER_AC176) // Brand: Daichi, Model: D-H A/C (HAIER_AC176) +// Brand: Haier, Model: KFR-26GW/83@UI-Ge A/C (HAIER_AC160) #ifndef IR_HAIER_H_ #define IR_HAIER_H_ diff --git a/lib/IRremoteESP8266/src/ir_Hitachi.cpp b/lib/IRremoteESP8266/src/ir_Hitachi.cpp index 49781997e..e47bac929 100644 --- a/lib/IRremoteESP8266/src/ir_Hitachi.cpp +++ b/lib/IRremoteESP8266/src/ir_Hitachi.cpp @@ -7,6 +7,7 @@ /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1056 /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1060 /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1134 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1757 #include "ir_Hitachi.h" #include <algorithm> @@ -56,7 +57,8 @@ using irutils::checkInvertedBytePairs; using irutils::invertBytePairs; using irutils::minsToString; -#if (SEND_HITACHI_AC || SEND_HITACHI_AC2 || SEND_HITACHI_AC344) +#if (SEND_HITACHI_AC || SEND_HITACHI_AC2 || SEND_HITACHI_AC264 || \ + SEND_HITACHI_AC344) /// Send a Hitachi 28-byte/224-bit A/C formatted message. (HITACHI_AC) /// Status: STABLE / Working. /// @param[in] data The message to be sent. @@ -68,13 +70,21 @@ void IRsend::sendHitachiAC(const unsigned char data[], const uint16_t nbytes, if (nbytes < kHitachiAcStateLength) return; // Not enough bytes to send a proper message. - const bool MSBfirst = (nbytes == kHitachiAc344StateLength) ? false : true; + bool MSBfirst = true; + switch (nbytes) { + case kHitachiAc264StateLength: + case kHitachiAc296StateLength: + case kHitachiAc344StateLength: + MSBfirst = false; + } + sendGeneric(kHitachiAcHdrMark, kHitachiAcHdrSpace, kHitachiAcBitMark, kHitachiAcOneSpace, kHitachiAcBitMark, kHitachiAcZeroSpace, kHitachiAcBitMark, kHitachiAcMinGap, data, nbytes, 38, MSBfirst, repeat, 50); } -#endif // (SEND_HITACHI_AC || SEND_HITACHI_AC2 || SEND_HITACHI_AC344) +#endif // (SEND_HITACHI_AC || SEND_HITACHI_AC2 || SEND_HITACHI_AC264 || + // SEND_HITACHI_AC344) #if SEND_HITACHI_AC1 /// Send a Hitachi 13 byte/224-bit A/C formatted message. (HITACHI_AC1) @@ -82,7 +92,7 @@ void IRsend::sendHitachiAC(const unsigned char data[], const uint16_t nbytes, /// @param[in] data The message to be sent. /// @param[in] nbytes The number of bytes of message to be sent. /// @param[in] repeat The number of times the command is to be repeated. -/// @note Basically the same as sendHitatchiAC() except different size & header. +/// @note Basically the same as sendHitachiAC() except different size & header. /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/453 void IRsend::sendHitachiAC1(const unsigned char data[], const uint16_t nbytes, const uint16_t repeat) { @@ -97,7 +107,7 @@ void IRsend::sendHitachiAC1(const unsigned char data[], const uint16_t nbytes, #if SEND_HITACHI_AC2 /// Send a Hitachi 53 byte/424-bit A/C formatted message. (HITACHI_AC2) -/// Basically the same as sendHitatchiAC() except different size. +/// Basically the same as sendHitachiAC() except different size. /// Status: STABLE / Expected to work. /// @param[in] data The message to be sent. /// @param[in] nbytes The number of bytes of message to be sent. @@ -112,7 +122,7 @@ void IRsend::sendHitachiAC2(const unsigned char data[], const uint16_t nbytes, #if SEND_HITACHI_AC344 /// Send a Hitachi A/C 43-byte/344-bit message. (HITACHI_AC344) -/// Basically the same as sendHitatchiAC() except different size. +/// Basically the same as sendHitachiAC() except different size. /// Status: Beta / Probably works. /// @param[in] data An array of bytes containing the IR command. /// @param[in] nbytes Nr. of bytes of data in the array. @@ -373,7 +383,7 @@ stdAc::fanspeed_t IRHitachiAc::toCommonFanSpeed(const uint8_t speed) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRHitachiAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::HITACHI_AC; result.model = -1; // No models used. result.power = _.Power; @@ -773,7 +783,7 @@ stdAc::fanspeed_t IRHitachiAc1::toCommonFanSpeed(const uint8_t speed) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRHitachiAc1::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::HITACHI_AC1; result.model = getModel(); result.power = _.Power; @@ -827,7 +837,7 @@ String IRHitachiAc1::toString(void) const { } #if (DECODE_HITACHI_AC || DECODE_HITACHI_AC1 || DECODE_HITACHI_AC2 || \ - DECODE_HITACHI_AC344) + DECODE_HITACHI_AC344 || DECODE_HITACHI_AC264) /// Decode the supplied Hitachi A/C message. /// Status: STABLE / Expected to work. /// @param[in,out] results Ptr to the data to decode & where to store the result @@ -835,7 +845,7 @@ String IRHitachiAc1::toString(void) const { /// raw data. Typically/Defaults to kStartOffset. /// @param[in] nbits The number of data bits to expect. /// Typically kHitachiAcBits, kHitachiAc1Bits, kHitachiAc2Bits, -/// kHitachiAc344Bits +/// kHitachiAc344Bits, kHitachiAc264Bits /// @param[in] strict Flag indicating if we should perform strict matching. /// @param[in] MSBfirst Is the data per byte stored in MSB First (true) or /// LSB First order(false)? @@ -843,6 +853,7 @@ String IRHitachiAc1::toString(void) const { /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/417 /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/453 /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1134 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1729 bool IRrecv::decodeHitachiAC(decode_results *results, uint16_t offset, const uint16_t nbits, const bool strict, const bool MSBfirst) { @@ -853,6 +864,7 @@ bool IRrecv::decodeHitachiAC(decode_results *results, uint16_t offset, case kHitachiAcBits: case kHitachiAc1Bits: case kHitachiAc2Bits: + case kHitachiAc264Bits: case kHitachiAc344Bits: break; // Okay to continue. default: @@ -879,16 +891,20 @@ bool IRrecv::decodeHitachiAC(decode_results *results, uint16_t offset, // Compliance if (strict) { - if (nbits / 8 == kHitachiAcStateLength && - !IRHitachiAc::validChecksum(results->state, kHitachiAcStateLength)) - return false; - if (nbits / 8 == kHitachiAc1StateLength && - !IRHitachiAc1::validChecksum(results->state, kHitachiAc1StateLength)) - return false; - if (nbits / 8 == kHitachiAc344StateLength && - !IRHitachiAc3::hasInvertedStates(results->state, - kHitachiAc344StateLength)) - return false; + const uint16_t nbytes = nbits / 8; + switch (nbytes) { + case kHitachiAcStateLength: + if (!IRHitachiAc::validChecksum(results->state, nbytes)) return false; + break; + case kHitachiAc1StateLength: + if (!IRHitachiAc1::validChecksum(results->state, nbytes)) return false; + break; + case kHitachiAc264StateLength: + case kHitachiAc344StateLength: + if (!IRHitachiAc3::hasInvertedStates(results->state, nbytes)) + return false; + break; + } } // Success @@ -899,6 +915,9 @@ bool IRrecv::decodeHitachiAC(decode_results *results, uint16_t offset, case kHitachiAc2Bits: results->decode_type = decode_type_t::HITACHI_AC2; break; + case kHitachiAc264Bits: + results->decode_type = decode_type_t::HITACHI_AC264; + break; case kHitachiAc344Bits: results->decode_type = decode_type_t::HITACHI_AC344; break; @@ -913,7 +932,7 @@ bool IRrecv::decodeHitachiAC(decode_results *results, uint16_t offset, return true; } #endif // (DECODE_HITACHI_AC || DECODE_HITACHI_AC1 || DECODE_HITACHI_AC2 || - // DECODE_HITACHI_AC344) + // DECODE_HITACHI_AC344 || DECODE_HITACHI_AC264) #if SEND_HITACHI_AC424 /// Send a Hitachi 53-byte/424-bit A/C formatted message. (HITACHI_AC424) @@ -1008,6 +1027,7 @@ void IRHitachiAc424::stateReset(void) { _.raw[3] = 0x40; _.raw[5] = 0xFF; _.raw[7] = 0xCC; + _.raw[27] = 0xE1; _.raw[33] = 0x80; _.raw[35] = 0x03; _.raw[37] = 0x01; @@ -1055,15 +1075,13 @@ void IRHitachiAc424::send(const uint16_t repeat) { /// Get the value of the current power setting. /// @return true, the setting is on. false, the setting is off. -bool IRHitachiAc424::getPower(void) const { - return _.Power == kHitachiAc424PowerOn; -} +bool IRHitachiAc424::getPower(void) const { return _.Power; } /// Change the power setting. /// @param[in] on true, the setting is on. false, the setting is off. void IRHitachiAc424::setPower(const bool on) { + _.Power = on; setButton(kHitachiAc424ButtonPowerMode); - _.Power = (on ? kHitachiAc424PowerOn : kHitachiAc424PowerOff); } /// Change the power setting to On. @@ -1203,7 +1221,7 @@ uint8_t IRHitachiAc424::convertMode(const stdAc::opmode_t mode) { /// Convert a stdAc::fanspeed_t enum into it's native speed. /// @param[in] speed The enum to be converted. /// @return The native equivalent of the enum. -uint8_t IRHitachiAc424::convertFan(const stdAc::fanspeed_t speed) { +uint8_t IRHitachiAc424::convertFan(const stdAc::fanspeed_t speed) const { switch (speed) { case stdAc::fanspeed_t::kMin: return kHitachiAc424FanMin; case stdAc::fanspeed_t::kLow: return kHitachiAc424FanLow; @@ -1230,7 +1248,7 @@ stdAc::opmode_t IRHitachiAc424::toCommonMode(const uint8_t mode) { /// Convert a native fan speed into its stdAc equivalent. /// @param[in] speed The native setting to be converted. /// @return The stdAc equivalent of the native setting. -stdAc::fanspeed_t IRHitachiAc424::toCommonFanSpeed(const uint8_t speed) { +stdAc::fanspeed_t IRHitachiAc424::toCommonFanSpeed(const uint8_t speed) const { switch (speed) { case kHitachiAc424FanMax: return stdAc::fanspeed_t::kMax; case kHitachiAc424FanHigh: return stdAc::fanspeed_t::kHigh; @@ -1244,7 +1262,7 @@ stdAc::fanspeed_t IRHitachiAc424::toCommonFanSpeed(const uint8_t speed) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRHitachiAc424::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::HITACHI_AC424; result.model = -1; // No models used. result.power = getPower(); @@ -1578,3 +1596,401 @@ String IRHitachiAc344::toString(void) const { result += ')'; return result; } + + +#if SEND_HITACHI_AC264 +/// Send a Hitachi 33-byte/264-bit A/C message (HITACHI_AC264) +/// Basically the same as sendHitachiAC() except different size. +/// Status: STABLE / Reported as working. +/// @param[in] data An array of bytes containing the IR command. +/// @param[in] nbytes Nr. of bytes of data in the array. +/// @param[in] repeat Nr. of times the message is to be repeated. (Default = 0). +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1729 +void IRsend::sendHitachiAc264(const unsigned char data[], const uint16_t nbytes, + const uint16_t repeat) { + if (nbytes < kHitachiAc264StateLength) + return; // Not enough bytes to send a proper message. + sendHitachiAC(data, nbytes, repeat); +} +#endif // SEND_HITACHI_AC264 + +// Class constructor for handling detailed Hitachi_AC344 43 byte A/C messages. +/// @param[in] pin GPIO to be used when sending. +/// @param[in] inverted Is the output signal to be inverted? +/// @param[in] use_modulation Is frequency modulation to be used? +IRHitachiAc264::IRHitachiAc264(const uint16_t pin, const bool inverted, + const bool use_modulation) + : IRHitachiAc424(pin, inverted, use_modulation) { stateReset(); } + +/// Reset the internal state to auto fan, cooling, 23° Celsius +void IRHitachiAc264::stateReset(void) { + IRHitachiAc424::stateReset(); + _.raw[9] = 0x92; + _.raw[27] = 0xC1; +} + +#if SEND_HITACHI_AC264 +/// Create and send the IR message to the A/C. +/// @param[in] repeat Nr. of times to repeat the message. +void IRHitachiAc264::send(const uint16_t repeat) { + _irsend.sendHitachiAc264(getRaw(), kHitachiAc264StateLength, repeat); +} +#endif // SEND_HITACHI_AC264 + +/// Set the internal state from a valid code for this protocol. +/// @param[in] new_code A valid code for this protocol. +/// @param[in] length Size (in bytes) of the code for this protocol. +void IRHitachiAc264::setRaw(const uint8_t new_code[], const uint16_t length) { + memcpy(_.raw, new_code, std::min(length, kHitachiAc264StateLength)); +} + +/// Set the speed of the fan. +/// @param[in] speed The desired setting. +void IRHitachiAc264::setFan(const uint8_t speed) { + switch (speed) { + case kHitachiAc264FanMin: + case kHitachiAc264FanMedium: + case kHitachiAc264FanHigh: + case kHitachiAc264FanAuto: + _.Fan = speed; + break; + default: + setFan(kHitachiAc264FanAuto); + } +} + +/// Convert a stdAc::fanspeed_t enum into it's native speed. +/// @param[in] speed The enum to be converted. +/// @return The native equivalent of the enum. +uint8_t IRHitachiAc264::convertFan(const stdAc::fanspeed_t speed) const { + switch (speed) { + case stdAc::fanspeed_t::kMin: + case stdAc::fanspeed_t::kLow: return kHitachiAc264FanMin; + case stdAc::fanspeed_t::kMedium: return kHitachiAc264FanMedium; + case stdAc::fanspeed_t::kHigh: + case stdAc::fanspeed_t::kMax: return kHitachiAc424FanHigh; + default: return kHitachiAc424FanAuto; + } +} + +/// Convert a native fan speed into its stdAc equivalent. +/// @param[in] speed The native setting to be converted. +/// @return The stdAc equivalent of the native setting. +stdAc::fanspeed_t IRHitachiAc264::toCommonFanSpeed(const uint8_t speed) const { + switch (speed) { + case kHitachiAc264FanHigh: return stdAc::fanspeed_t::kHigh; + case kHitachiAc264FanMedium: return stdAc::fanspeed_t::kMedium; + case kHitachiAc264FanMin: return stdAc::fanspeed_t::kMin; + default: return stdAc::fanspeed_t::kAuto; + } +} + +/// Convert the current internal state into its stdAc::state_t equivalent. +/// @return The stdAc equivalent of the native settings. +stdAc::state_t IRHitachiAc264::toCommon(void) const { + stdAc::state_t result = IRHitachiAc424::toCommon(); + result.protocol = decode_type_t::HITACHI_AC264; + result.swingv = stdAc::swingv_t::kOff; + return result; +} + +/// Convert the internal state into a human readable string. +/// @return A string containing the settings in human-readable form. +String IRHitachiAc264::toString(void) const { + String result; + result.reserve(120); // Reserve some heap for the string to reduce fragging. + result += _toString(); + return result; +} + +#if DECODE_HITACHI_AC264 +// For Decoding HITACHI_AC264, see `decodeHitachiAC` +#endif // DECODE_HITACHI_AC264 + + +#if SEND_HITACHI_AC296 +/// Send a HitachiAc 37-byte/296-bit A/C message (HITACHI_AC296) +/// Status: STABLE / Working on a real device. +/// @param[in] data containing the IR command. +/// @param[in] nbytes Nr. of bytes to send. usually kHitachiAc296StateLength +/// @param[in] repeat Nr. of times the message is to be repeated. +void IRsend::sendHitachiAc296(const unsigned char data[], + const uint16_t nbytes, + const uint16_t repeat) { + if (nbytes < kHitachiAc296StateLength) + return; // Not enough bytes to send a proper message. + sendHitachiAC(data, nbytes, repeat); +} +#endif // SEND_HITACHIAC296 + +// Class constructor for handling detailed Hitachi_AC296 37 byte A/C messages. +/// @param[in] pin GPIO to be used when sending. +/// @param[in] inverted Is the output signal to be inverted? +/// @param[in] use_modulation Is frequency modulation to be used? +IRHitachiAc296::IRHitachiAc296(const uint16_t pin, const bool inverted, + const bool use_modulation) + : _irsend(pin, inverted, use_modulation) { stateReset(); } + +/// Reset the internal state to auto fan, heating, & 24° Celsius +void IRHitachiAc296::stateReset(void) { + // Header + _.raw[0] = 0x01; + _.raw[1] = 0x10; + _.raw[2] = 0x00; + + // Every next byte is a parity byte + _.raw[3] = 0x40; + _.raw[5] = 0xFF; + _.raw[7] = 0xCC; + _.raw[9] = 0x92; + _.raw[11] = 0x43; + // 13-14 is Temperature and parity + _.raw[15] = 0x00; + _.raw[17] = 0x00; // Off timer LSB + _.raw[19] = 0x00; // Off timer cont + _.raw[21] = 0x00; // On timer LSB + _.raw[23] = 0x00; // On timer cont + // 25-26 is Mode and fan + _.raw[27] = 0xF1; // Power on + _.raw[29] = 0x00; + _.raw[31] = 0x00; + _.raw[33] = 0x00; + _.raw[35] = 0x03; // Humidity + + setTemp(24); + setMode(kHitachiAc296Heat); + setFan(kHitachiAc296FanAuto); + + setInvertedStates(); +} + +/// Update the internal consistency check for the protocol. +void IRHitachiAc296::setInvertedStates(void) { + invertBytePairs(_.raw + 3, kHitachiAc296StateLength - 3); +} + +/// Check if every second byte of the state, after the fixed header +/// is inverted to the previous byte. +/// @param[in] state The state array to be checked. +/// @param[in] length The size of the state array. +/// @note This is this protocols integrity check. +bool IRHitachiAc296::hasInvertedStates(const uint8_t state[], + const uint16_t length) { + return IRHitachiAc3::hasInvertedStates(state, length); +} + +/// Set up hardware to be able to send a message. +void IRHitachiAc296::begin(void) { _irsend.begin(); } + +#if SEND_HITACHI_AC296 +/// Send the current internal state as an IR message. +/// @param[in] repeat Nr. of times the message will be repeated. +void IRHitachiAc296::send(const uint16_t repeat) { + _irsend.sendHitachiAc296(getRaw(), kHitachiAc296StateLength, repeat); +} +#endif // SEND_HITACHI_AC296 + +/// Get the value of the current power setting. +/// @return true, the setting is on. false, the setting is off. +bool IRHitachiAc296::getPower(void) const { return _.Power; } + +/// Change the power setting. +/// @param[in] on true, the setting is on. false, the setting is off. +void IRHitachiAc296::setPower(const bool on) { _.Power = on; } + +/// Change the power setting to On. +void IRHitachiAc296::on(void) { setPower(true); } + +/// Change the power setting to Off. +void IRHitachiAc296::off(void) { setPower(false); } + +/// Get the operating mode setting of the A/C. +/// @return The current operating mode setting. +uint8_t IRHitachiAc296::getMode(void) const { return _.Mode; } + +/// Set the operating mode of the A/C. +/// @param[in] mode The desired operating mode. +void IRHitachiAc296::setMode(const uint8_t mode) { + switch (mode) { + case kHitachiAc296Heat: + case kHitachiAc296Cool: + case kHitachiAc296Dehumidify: + case kHitachiAc296AutoDehumidifying: + case kHitachiAc296Auto: + _.Mode = mode; + setTemp(getTemp()); // Reset the temp to handle "Auto"'s special temp. + break; + default: + setMode(kHitachiAc296Auto); + } +} + +/// Convert a stdAc::opmode_t enum into its native mode. +/// @param[in] mode The enum to be converted. +/// @return The native equivalent of the enum. +uint8_t IRHitachiAc296::convertMode(const stdAc::opmode_t mode) { + switch (mode) { + case stdAc::opmode_t::kCool: return kHitachiAc296Cool; + case stdAc::opmode_t::kHeat: return kHitachiAc296Heat; + case stdAc::opmode_t::kDry: return kHitachiAc296Dehumidify; + default: return kHitachiAc296Auto; + } +} + +/// Convert a native mode into its stdAc equivalent. +/// @param[in] mode The native setting to be converted. +/// @return The stdAc equivalent of the native setting. +stdAc::opmode_t IRHitachiAc296::toCommonMode(const uint8_t mode) { + switch (mode) { + case kHitachiAc296DryCool: + case kHitachiAc296Cool: return stdAc::opmode_t::kCool; + case kHitachiAc296Heat: return stdAc::opmode_t::kHeat; + case kHitachiAc296AutoDehumidifying: + case kHitachiAc296Dehumidify: return stdAc::opmode_t::kDry; + default: return stdAc::opmode_t::kAuto; + } +} + +/// Get the current temperature setting. +/// @return The current setting for temp. in degrees celsius. +uint8_t IRHitachiAc296::getTemp(void) const { return _.Temp; } + +/// Set the temperature. +/// @param[in] celsius The temperature in degrees celsius. +void IRHitachiAc296::setTemp(const uint8_t celsius) { + uint8_t temp = celsius; + if (getMode() == kHitachiAc296Auto) { // Special temp for auto mode + temp = kHitachiAc296TempAuto; + } else { // Normal temp setting. + temp = std::min(temp, kHitachiAc296MaxTemp); + temp = std::max(temp, kHitachiAc296MinTemp); + } + _.Temp = temp; +} + +/// Get the current fan speed setting. +/// @return The current fan speed. +uint8_t IRHitachiAc296::getFan(void) const { return _.Fan; } + +/// Set the speed of the fan. +/// @param[in] speed The desired setting. +void IRHitachiAc296::setFan(const uint8_t speed) { + uint8_t newSpeed = std::max(speed, kHitachiAc296FanSilent); + _.Fan = std::min(newSpeed, kHitachiAc296FanAuto); +} + +/// Convert a stdAc::fanspeed_t enum into it's native speed. +/// @param[in] speed The enum to be converted. +/// @return The native equivalent of the enum. +uint8_t IRHitachiAc296::convertFan(const stdAc::fanspeed_t speed) { + switch (speed) { + case stdAc::fanspeed_t::kMin: return kHitachiAc296FanSilent; + case stdAc::fanspeed_t::kLow: return kHitachiAc296FanLow; + case stdAc::fanspeed_t::kMedium: return kHitachiAc296FanMedium; + case stdAc::fanspeed_t::kHigh: + case stdAc::fanspeed_t::kMax: return kHitachiAc296FanHigh; + default: return kHitachiAc296FanAuto; + } +} + +/// Convert a native fan speed into its stdAc equivalent. +/// @param[in] speed The native setting to be converted. +/// @return The stdAc equivalent of the native setting. +stdAc::fanspeed_t IRHitachiAc296::toCommonFanSpeed(const uint8_t speed) { + switch (speed) { + case kHitachiAc296FanHigh: return stdAc::fanspeed_t::kHigh; + case kHitachiAc296FanMedium: return stdAc::fanspeed_t::kMedium; + case kHitachiAc296FanLow: return stdAc::fanspeed_t::kLow; + case kHitachiAc296FanSilent: return stdAc::fanspeed_t::kMin; + default: return stdAc::fanspeed_t::kAuto; + } +} + +/// Get a PTR to the internal state/code for this protocol. +/// @return PTR to a code for this protocol based on the current internal state. +uint8_t *IRHitachiAc296::getRaw(void) { + setInvertedStates(); + return _.raw; +} + +/// Set the internal state from a valid code for this protocol. +/// @param[in] new_code A valid code for this protocol. +/// @param[in] length Size (in bytes) of the code for this protocol. +void IRHitachiAc296::setRaw(const uint8_t new_code[], const uint16_t length) { + memcpy(_.raw, new_code, std::min(length, kHitachiAc296StateLength)); +} + + +/// Convert the current internal state into its stdAc::state_t equivalent. +/// @return The stdAc equivalent of the native settings. +stdAc::state_t IRHitachiAc296::toCommon(void) const { + stdAc::state_t result{}; + result.protocol = decode_type_t::HITACHI_AC296; + result.model = -1; // No models used. + result.power = getPower(); + result.mode = toCommonMode(_.Mode); + result.celsius = true; + result.degrees = _.Temp; + result.fanspeed = toCommonFanSpeed(_.Fan); + result.quiet = _.Fan == kHitachiAc296FanSilent; + // Not supported. + result.swingv = stdAc::swingv_t::kOff; + result.swingh = stdAc::swingh_t::kOff; + result.turbo = false; + result.clean = false; + result.econo = false; + result.filter = false; + result.light = false; + result.beep = false; + result.sleep = -1; + result.clock = -1; + return result; +} + +/// Convert the current internal state into a human readable string. +/// @return A human readable string. +String IRHitachiAc296::toString(void) const { + String result = ""; + result.reserve(70); // Reserve some heap for the string to reduce fragging. + result += addBoolToString(_.Power, kPowerStr, false); + result += addModeToString(_.Mode, kHitachiAc296Auto, kHitachiAc296Cool, + kHitachiAc296Heat, kHitachiAc1Dry, + kHitachiAc296Auto); + result += addTempToString(getTemp()); + result += addFanToString(_.Fan, kHitachiAc296FanHigh, kHitachiAc296FanLow, + kHitachiAc296FanAuto, kHitachiAc296FanSilent, + kHitachiAc296FanMedium); + return result; +} + +#if DECODE_HITACHI_AC296 +/// Decode the supplied Hitachi 37-byte A/C message. +/// Status: STABLE / Working on a real device. +/// @param[in,out] results Ptr to the data to decode & where to store the result +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return True if it can decode it, false if it can't. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1757 +bool IRrecv::decodeHitachiAc296(decode_results *results, uint16_t offset, + const uint16_t nbits, + const bool strict) { + if (!matchGeneric(results->rawbuf + offset, results->state, + results->rawlen - offset, nbits, + kHitachiAcHdrMark, kHitachiAcHdrSpace, + kHitachiAcBitMark, kHitachiAcOneSpace, + kHitachiAcBitMark, kHitachiAcZeroSpace, + kHitachiAcBitMark, kHitachiAcMinGap, true, + kUseDefTol, 0, false)) return false; + + // Compliance + if (strict && !IRHitachiAc296::hasInvertedStates(results->state, nbits / 8)) + return false; + + // Success + results->decode_type = decode_type_t::HITACHI_AC296; + results->bits = nbits; + return true; +} +#endif // DECODE_HITACHI_AC296 diff --git a/lib/IRremoteESP8266/src/ir_Hitachi.h b/lib/IRremoteESP8266/src/ir_Hitachi.h index 32167596f..413ab75e8 100644 --- a/lib/IRremoteESP8266/src/ir_Hitachi.h +++ b/lib/IRremoteESP8266/src/ir_Hitachi.h @@ -7,6 +7,8 @@ /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1056 /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1060 /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1134 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1729 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1757 // Supports: // Brand: Hitachi, Model: RAS-35THA6 remote @@ -19,6 +21,10 @@ // Brand: Hitachi, Model: R-LT0541-HTA/Y.K.1.1-1 V2.3 remote (HITACHI_AC1) // Brand: Hitachi, Model: RAS-22NK A/C (HITACHI_AC344) // Brand: Hitachi, Model: RF11T1 remote (HITACHI_AC344) +// Brand: Hitachi, Model: RAR-2P2 remote (HITACHI_AC264) +// Brand: Hitachi, Model: RAK-25NH5 A/C (HITACHI_AC264) +// Brand: Hitachi, Model: RAR-3U3 remote (HITACHI_AC296) +// Brand: Hitachi, Model: RAS-70YHA3 A/C (HITACHI_AC296) #ifndef IR_HITACHI_H_ #define IR_HITACHI_H_ @@ -102,7 +108,9 @@ union Hitachi424Protocol{ // Byte 26 uint8_t :8; // Byte 27 - uint8_t Power :8; + uint8_t :4; + uint8_t Power :1; + uint8_t :3; // Byte 28~34 uint8_t pad2[7]; // Byte 35 @@ -160,9 +168,6 @@ const uint8_t kHitachiAc344FanHigh = kHitachiAc424FanHigh; const uint8_t kHitachiAc344FanAuto = kHitachiAc424FanAuto; const uint8_t kHitachiAc344FanMax = kHitachiAc424FanMax; -const uint8_t kHitachiAc424PowerOn = 0xF1; -const uint8_t kHitachiAc424PowerOff = 0xE1; - const uint8_t kHitachiAc344SwingHAuto = 0; // 0b000 const uint8_t kHitachiAc344SwingHRightMax = 1; // 0b001 const uint8_t kHitachiAc344SwingHRight = 2; // 0b010 @@ -240,6 +245,127 @@ const uint8_t kHitachiAc1Sleep4 = 0b100; const uint8_t kHitachiAc1ChecksumStartByte = 5; +/// Native representation of a Hitachi 164-bit A/C message. +union HitachiAC264Protocol{ + uint8_t raw[kHitachiAc264StateLength]; ///< The state in native code. + struct { + // Bytes 0~10 + uint8_t pad0[11]; + // Byte 11 + uint8_t Button :8; + // Byte 12 + uint8_t :8; + // Byte 13 + uint8_t :2; + uint8_t Temp :6; + // Byte 14 + uint8_t :8; + // Bytes 14~24 + uint8_t pad1[10]; + // Byte 25 + uint8_t Mode :4; + uint8_t Fan :4; + // Byte 26 + uint8_t :8; + // Byte 27 + uint8_t :4; + uint8_t Power :1; + uint8_t :3; + // Byte 28 + uint8_t :8; + // Bytes 29~32 + uint8_t pad2[4]; + }; +}; + +// HitachiAc264 +const uint8_t kHitachiAc264ButtonPowerMode = kHitachiAc424ButtonPowerMode; +const uint8_t kHitachiAc264ButtonFan = kHitachiAc424ButtonFan; +const uint8_t kHitachiAc264ButtonTempDown = kHitachiAc424ButtonTempDown; +const uint8_t kHitachiAc264ButtonTempUp = kHitachiAc424ButtonTempUp; +const uint8_t kHitachiAc264ButtonSwingV = kHitachiAc424ButtonSwingV; +const uint8_t kHitachiAc264MinTemp = kHitachiAc424MinTemp; // 16C +const uint8_t kHitachiAc264MaxTemp = kHitachiAc424MaxTemp; // 32C +const uint8_t kHitachiAc264Fan = kHitachiAc424Fan; +const uint8_t kHitachiAc264Cool = kHitachiAc424Cool; +const uint8_t kHitachiAc264Dry = kHitachiAc424Dry; +const uint8_t kHitachiAc264Heat = kHitachiAc424Heat; +const uint8_t kHitachiAc264FanMin = kHitachiAc424FanMin; +const uint8_t kHitachiAc264FanLow = kHitachiAc424FanMin; +const uint8_t kHitachiAc264FanMedium = kHitachiAc424FanMedium; +const uint8_t kHitachiAc264FanHigh = kHitachiAc424FanHigh; +const uint8_t kHitachiAc264FanAuto = kHitachiAc424FanAuto; + +// HitachiAc296 +union HitachiAC296Protocol{ + uint8_t raw[kHitachiAc296StateLength]; + struct { + // Byte 0~12 + uint8_t pad0[13]; + // Byte 13 + uint8_t :2; + uint8_t Temp :5; // LSB + uint8_t :1; + uint8_t :8; + // Byte 15~16 + uint8_t :8; + uint8_t :8; + // Byte 17~24 + uint8_t OffTimerLow :8; // LSB + uint8_t /* Parity */ :8; + uint8_t OffTimerHigh :8; + uint8_t /* Parity */ :8; + uint8_t OnTimerLow :8; // LSB + uint8_t /* Parity */ :8; + uint8_t OnTimerHigh :4; + uint8_t OffTimerActive :1; + uint8_t OnTimerActive :1; + uint8_t :2; + uint8_t /* Parity */ :8; + // Byte 25~26 + uint8_t Mode :4; + uint8_t Fan :3; + uint8_t :1; + uint8_t :8; + // Byte 27~28 + uint8_t :4; + uint8_t Power :1; + uint8_t :2; + uint8_t TimerActive :1; + uint8_t :8; + // Byte 29~34 + uint8_t pad1[6]; + // Byte 35~36 + uint8_t :4; + uint8_t Humidity :4; // LSB + uint8_t :8; + }; +}; + +// Mode & Fan +const uint8_t kHitachiAc296Cool = 0b0011; +const uint8_t kHitachiAc296DryCool = 0b0100; +const uint8_t kHitachiAc296Dehumidify = 0b0101; +const uint8_t kHitachiAc296Heat = 0b0110; +const uint8_t kHitachiAc296Auto = 0b0111; +const uint8_t kHitachiAc296AutoDehumidifying = 0b1001; +const uint8_t kHitachiAc296QuickLaundry = 0b1010; +const uint8_t kHitachiAc296CondensationControl = 0b1100; + +const uint8_t kHitachiAc296FanSilent = 0b001; +const uint8_t kHitachiAc296FanLow = 0b010; +const uint8_t kHitachiAc296FanMedium = 0b011; +const uint8_t kHitachiAc296FanHigh = 0b100; +const uint8_t kHitachiAc296FanAuto = 0b101; + +const uint8_t kHitachiAc296TempAuto = 1; // Special value for "Auto" op mode. +const uint8_t kHitachiAc296MinTemp = 16; +const uint8_t kHitachiAc296MaxTemp = 31; // Max value you can store in 5 bits. + +const uint8_t kHitachiAc296PowerOn = 1; +const uint8_t kHitachiAc296PowerOff = 0; + + // Classes /// Class for handling detailed Hitachi 224-bit A/C messages. /// @see https://github.com/ToniA/arduino-heatpumpir/blob/master/HitachiHeatpumpIR.cpp @@ -369,6 +495,7 @@ class IRHitachiAc1 { /// Class for handling detailed Hitachi 53-byte/424-bit A/C messages. class IRHitachiAc424 { + friend class IRHitachiAc264; friend class IRHitachiAc344; public: explicit IRHitachiAc424(const uint16_t pin, const bool inverted = false, @@ -389,7 +516,7 @@ class IRHitachiAc424 { bool getPower(void) const; void setTemp(const uint8_t temp, bool setPrevious = true); uint8_t getTemp(void) const; - void setFan(const uint8_t speed); + virtual void setFan(const uint8_t speed); uint8_t getFan(void) const; uint8_t getButton(void) const; void setButton(const uint8_t button); @@ -401,9 +528,9 @@ class IRHitachiAc424 { virtual void setRaw(const uint8_t new_code[], const uint16_t length = kHitachiAc424StateLength); static uint8_t convertMode(const stdAc::opmode_t mode); - static uint8_t convertFan(const stdAc::fanspeed_t speed); + virtual uint8_t convertFan(const stdAc::fanspeed_t speed) const; static stdAc::opmode_t toCommonMode(const uint8_t mode); - static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); + virtual stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed) const; virtual stdAc::state_t toCommon(void) const; virtual String toString(void) const; #ifndef UNIT_TEST @@ -475,4 +602,66 @@ class IRHitachiAc344: public IRHitachiAc424 { static stdAc::swingh_t toCommonSwingH(const uint8_t pos); String toString(void) const override; }; + +/// Class for handling detailed Hitachi 264-bit A/C messages. +class IRHitachiAc264: public IRHitachiAc424 { + public: + explicit IRHitachiAc264(const uint16_t pin, const bool inverted = false, + const bool use_modulation = true); + void stateReset(void) override; + void setRaw(const uint8_t new_code[], + const uint16_t length = kHitachiAc264StateLength) override; + void setFan(const uint8_t speed) override; + uint8_t convertFan(const stdAc::fanspeed_t speed) const override; + stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed) const override; + stdAc::state_t toCommon(void) const override; +#if SEND_HITACHI_AC264 + void send(const uint16_t repeat = kHitachiAcDefaultRepeat) override; +#endif // SEND_HITACHI_AC264 + String toString(void) const override; +}; + +class IRHitachiAc296 { + public: + explicit IRHitachiAc296(const uint16_t pin, const bool inverted = false, + const bool use_modulation = true); + void stateReset(void); + +#if SEND_HITACHI_AC296 + void send(const uint16_t repeat = kHitachiAcDefaultRepeat); +#endif // SEND_HITACHI_AC296 + void begin(void); + void on(void); + void off(void); + void setPower(const bool on); + bool getPower(void) const; + void setTemp(const uint8_t temp); + uint8_t getTemp(void) const; + void setFan(const uint8_t speed); + uint8_t getFan(void) const; + void setMode(const uint8_t mode); + uint8_t getMode(void) const; + static bool hasInvertedStates(const uint8_t state[], const uint16_t length); + uint8_t* getRaw(void); + void setRaw(const uint8_t new_code[], + const uint16_t length = kHitachiAc296StateLength); + static uint8_t convertMode(const stdAc::opmode_t mode); + static 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) const; + String toString(void) const; +#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 + + HitachiAC296Protocol _; + void setInvertedStates(void); +}; #endif // IR_HITACHI_H_ diff --git a/lib/IRremoteESP8266/src/ir_Kelon.cpp b/lib/IRremoteESP8266/src/ir_Kelon.cpp index 39b61744e..bb8f16093 100644 --- a/lib/IRremoteESP8266/src/ir_Kelon.cpp +++ b/lib/IRremoteESP8266/src/ir_Kelon.cpp @@ -1,7 +1,8 @@ // Copyright 2021 Davide Depau +// Copyright 2022 David Conran /// @file -/// @brief Support for Kelan AC protocol. +/// @brief Support for Kelon AC protocols. /// Both sending and decoding should be functional for models of series /// KELON ON/OFF 9000-12000. /// All features of the standard remote are implemented. @@ -12,6 +13,7 @@ /// - Fahrenheit. #include <algorithm> +#include <cassert> #include "ir_Kelon.h" @@ -39,9 +41,13 @@ const uint16_t kKelonZeroSpace = 600; const uint32_t kKelonGap = 2 * kDefaultMessageGap; const uint16_t kKelonFreq = 38000; -#if SEND_KELON +const uint32_t kKelon168FooterSpace = 8000; +const uint16_t kKelon168Section1Size = 6; +const uint16_t kKelon168Section2Size = 8; +const uint16_t kKelon168Section3Size = 7; -/// Send a Kelon message. +#if SEND_KELON +/// Send a Kelon 48-bit message. /// Status: STABLE / Working. /// @param[in] data The data to be transmitted. /// @param[in] nbits Nr. of bits of data to be sent. @@ -53,13 +59,12 @@ void IRsend::sendKelon(const uint64_t data, const uint16_t nbits, kKelonBitMark, kKelonZeroSpace, kKelonBitMark, kKelonGap, data, nbits, kKelonFreq, false, // LSB First. - repeat, 50); + repeat, kDutyDefault); } - #endif // SEND_KELON #if DECODE_KELON -/// Decode the supplied Kelon message. +/// Decode the supplied Kelon 48-bit message. /// Status: STABLE / Working. /// @param[in,out] results Ptr to the data to decode & where to store the result /// @param[in] offset The starting index to use when attempting to decode the @@ -67,27 +72,24 @@ void IRsend::sendKelon(const uint64_t data, const uint16_t nbits, /// @param[in] nbits The number of data bits to expect. /// @param[in] strict Flag indicating if we should perform strict matching. /// @return True if it can decode it, false if it can't. - bool IRrecv::decodeKelon(decode_results *results, uint16_t offset, const uint16_t nbits, const bool strict) { - if (strict && nbits != kKelonBits) { - return false; - } - if (!matchGeneric(results->rawbuf + offset, results->state, + if (strict && nbits != kKelonBits) return false; + + if (!matchGeneric(results->rawbuf + offset, &(results->value), results->rawlen - offset, nbits, kKelonHdrMark, kKelonHdrSpace, kKelonBitMark, kKelonOneSpace, kKelonBitMark, kKelonZeroSpace, - kKelonBitMark, 0, false, - _tolerance, 0, false)) { - return false; - } + kKelonBitMark, kKelonGap, true, + _tolerance, 0, false)) return false; results->decode_type = decode_type_t::KELON; + results->address = 0; + results->command = 0; results->bits = nbits; return true; } - #endif // DECODE_KELON /// Class constructor @@ -151,21 +153,15 @@ void IRKelonAc::ensurePower(bool on) { #endif // SEND_KELON /// Set up hardware to be able to send a message. -void IRKelonAc::begin() { - _irsend.begin(); -} +void IRKelonAc::begin() { _irsend.begin(); } /// Request toggling power - will be reset to false after sending /// @param[in] toggle Whether to toggle the power state -void IRKelonAc::setTogglePower(const bool toggle) { - _.PowerToggle = toggle; -} +void IRKelonAc::setTogglePower(const bool toggle) { _.PowerToggle = toggle; } /// Get whether toggling power will be requested /// @return The power toggle state -bool IRKelonAc::getTogglePower() const { - return _.PowerToggle; -} +bool IRKelonAc::getTogglePower() const { return _.PowerToggle; } /// Set the temperature setting. /// @param[in] degrees The temperature in degrees celsius. @@ -178,9 +174,7 @@ void IRKelonAc::setTemp(const uint8_t degrees) { /// Get the current temperature setting. /// @return Get current setting for temp. in degrees celsius. -uint8_t IRKelonAc::getTemp() const { - return _.Temperature + kKelonMinTemp; -} +uint8_t IRKelonAc::getTemp() const { return _.Temperature + kKelonMinTemp; } /// Set the speed of the fan. /// @param[in] speed 0 is auto, 1-5 is the speed @@ -207,11 +201,10 @@ void IRKelonAc::setDryGrade(const int8_t grade) { // Two's complement is clearly too bleeding edge for this manufacturer uint8_t outval; - if (drygrade < 0) { + if (drygrade < 0) outval = 0b100 | (-drygrade & 0b011); - } else { + else outval = drygrade & 0b011; - } _.DehumidifierGrade = outval; } @@ -260,9 +253,7 @@ void IRKelonAc::setMode(const uint8_t mode) { /// Get the current operation mode setting. /// @return The current operation mode. -uint8_t IRKelonAc::getMode() const { - return _.Mode; -} +uint8_t IRKelonAc::getMode() const { return _.Mode; } /// Request toggling the vertical swing - will be reset to false after sending /// @param[in] toggle If true, the swing mode will be toggled when sent. @@ -272,21 +263,15 @@ void IRKelonAc::setToggleSwingVertical(const bool toggle) { /// Get whether the swing mode is set to be toggled /// @return Whether the toggle bit is set -bool IRKelonAc::getToggleSwingVertical() const { - return _.SwingVToggle; -} +bool IRKelonAc::getToggleSwingVertical() const { return _.SwingVToggle; } /// Control the current sleep (quiet) setting. /// @param[in] on The desired setting. -void IRKelonAc::setSleep(const bool on) { - _.SleepEnabled = on; -} +void IRKelonAc::setSleep(const bool on) { _.SleepEnabled = on; } /// Is the sleep setting on? /// @return The current value. -bool IRKelonAc::getSleep() const { - return _.SleepEnabled; -} +bool IRKelonAc::getSleep() const { return _.SleepEnabled; } /// Control the current super cool mode setting. /// @param[in] on The desired setting. @@ -305,9 +290,7 @@ void IRKelonAc::setSupercool(const bool on) { /// Is the super cool mode setting on? /// @return The current value. -bool IRKelonAc::getSupercool() const { - return _.SuperCoolEnabled1; -} +bool IRKelonAc::getSupercool() const { return _.SuperCoolEnabled1; } /// Set the timer time and enable it. Timer is an off timer if the unit is on, /// it is an on timer if the unit is off. @@ -334,54 +317,39 @@ void IRKelonAc::setTimer(uint16_t mins) { /// later disabled. /// @return The timer set minutes uint16_t IRKelonAc::getTimer() const { - if (_.TimerHours >= 10) { + if (_.TimerHours >= 10) return ((uint16_t) ((_.TimerHours << 1) | _.TimerHalfHour) - 10) * 60; - } return (((uint16_t) _.TimerHours) * 60) + (_.TimerHalfHour ? 30 : 0); } /// Enable or disable the timer. Note that in order to enable the timer the /// minutes must be set with setTimer(). /// @param[in] on Whether to enable or disable the timer -void IRKelonAc::setTimerEnabled(bool on) { - _.TimerEnabled = on; -} +void IRKelonAc::setTimerEnabled(bool on) { _.TimerEnabled = on; } /// Get the current timer status /// @return Whether the timer is enabled. -bool IRKelonAc::getTimerEnabled() const { - return _.TimerEnabled; -} - +bool IRKelonAc::getTimerEnabled() const { return _.TimerEnabled; } /// Get the raw state of the object, suitable to be sent with the appropriate /// IRsend object method. /// @return A PTR to the internal state. -uint64_t IRKelonAc::getRaw() const { - return _.raw; -} +uint64_t IRKelonAc::getRaw() const { return _.raw; } /// Set the raw state of the object. /// @param[in] new_code The raw state from the native IR message. -void IRKelonAc::setRaw(const uint64_t new_code) { - _.raw = new_code; -} +void IRKelonAc::setRaw(const uint64_t new_code) { _.raw = new_code; } /// Convert a standard A/C mode (stdAc::opmode_t) into it a native mode. /// @param[in] mode A stdAc::opmode_t operation mode. /// @return The native mode equivalent. uint8_t IRKelonAc::convertMode(const stdAc::opmode_t mode) { switch (mode) { - case stdAc::opmode_t::kCool: - return kKelonModeCool; - case stdAc::opmode_t::kHeat: - return kKelonModeHeat; - case stdAc::opmode_t::kDry: - return kKelonModeDry; - case stdAc::opmode_t::kFan: - return kKelonModeFan; - default: - return kKelonModeSmart; + case stdAc::opmode_t::kCool: return kKelonModeCool; + case stdAc::opmode_t::kHeat: return kKelonModeHeat; + case stdAc::opmode_t::kDry: return kKelonModeDry; + case stdAc::opmode_t::kFan: return kKelonModeFan; + default: return kKelonModeSmart; // aka Auto. } } @@ -391,15 +359,11 @@ uint8_t IRKelonAc::convertMode(const stdAc::opmode_t mode) { uint8_t IRKelonAc::convertFan(stdAc::fanspeed_t fan) { switch (fan) { case stdAc::fanspeed_t::kMin: - case stdAc::fanspeed_t::kLow: - return kKelonFanMin; - case stdAc::fanspeed_t::kMedium: - return kKelonFanMedium; + case stdAc::fanspeed_t::kLow: return kKelonFanMin; + case stdAc::fanspeed_t::kMedium: return kKelonFanMedium; case stdAc::fanspeed_t::kHigh: - case stdAc::fanspeed_t::kMax: - return kKelonFanMax; - default: - return kKelonFanAuto; + case stdAc::fanspeed_t::kMax: return kKelonFanMax; + default: return kKelonFanAuto; } } @@ -408,16 +372,11 @@ uint8_t IRKelonAc::convertFan(stdAc::fanspeed_t fan) { /// @return The stdAc::opmode_t equivalent. stdAc::opmode_t IRKelonAc::toCommonMode(const uint8_t mode) { switch (mode) { - case kKelonModeCool: - return stdAc::opmode_t::kCool; - case kKelonModeHeat: - return stdAc::opmode_t::kHeat; - case kKelonModeDry: - return stdAc::opmode_t::kDry; - case kKelonModeFan: - return stdAc::opmode_t::kFan; - default: - return stdAc::opmode_t::kAuto; + case kKelonModeCool: return stdAc::opmode_t::kCool; + case kKelonModeHeat: return stdAc::opmode_t::kHeat; + case kKelonModeDry: return stdAc::opmode_t::kDry; + case kKelonModeFan: return stdAc::opmode_t::kFan; + default: return stdAc::opmode_t::kAuto; } } @@ -426,14 +385,10 @@ stdAc::opmode_t IRKelonAc::toCommonMode(const uint8_t mode) { /// @return The stdAc::fanspeed_t equivalent. stdAc::fanspeed_t IRKelonAc::toCommonFanSpeed(const uint8_t speed) { switch (speed) { - case kKelonFanMin: - return stdAc::fanspeed_t::kLow; - case kKelonFanMedium: - return stdAc::fanspeed_t::kMedium; - case kKelonFanMax: - return stdAc::fanspeed_t::kHigh; - default: - return stdAc::fanspeed_t::kAuto; + case kKelonFanMin: return stdAc::fanspeed_t::kLow; + case kKelonFanMedium: return stdAc::fanspeed_t::kMedium; + case kKelonFanMax: return stdAc::fanspeed_t::kHigh; + default: return stdAc::fanspeed_t::kAuto; } } @@ -443,21 +398,20 @@ stdAc::state_t IRKelonAc::toCommon(const stdAc::state_t *prev) const { stdAc::state_t result{}; result.protocol = decode_type_t::KELON; result.model = -1; // Unused. + // AC only supports toggling it + result.power = (prev == nullptr || prev->power) ^ _.PowerToggle; result.mode = toCommonMode(getMode()); result.celsius = true; result.degrees = getTemp(); result.fanspeed = toCommonFanSpeed(getFan()); + // AC only supports toggling it + result.swingv = stdAc::swingv_t::kAuto; + if (prev != nullptr && + (prev->swingv != stdAc::swingv_t::kAuto) ^ _.SwingVToggle) + result.swingv = stdAc::swingv_t::kOff; result.turbo = getSupercool(); result.sleep = getSleep() ? 0 : -1; // Not supported. - // N/A, AC only supports toggling it - result.power = (prev == nullptr || prev->power) ^ _.PowerToggle; - // N/A, AC only supports toggling it - result.swingv = stdAc::swingv_t::kAuto; - if (prev != nullptr && - (prev->swingv != stdAc::swingv_t::kAuto) ^ _.SwingVToggle) { - result.swingv = stdAc::swingv_t::kOff; - } result.swingh = stdAc::swingh_t::kOff; result.light = true; result.beep = true; @@ -483,20 +437,115 @@ String IRKelonAc::toString() const { result += addBoolToString(_.SleepEnabled, kSleepStr); result += addSignedIntToString(getDryGrade(), kDryStr); result += addLabeledString( - getTimerEnabled() - ? ( - getTimer() > 0 - ? minsToString(getTimer()) - : kOnStr - ) - : kOffStr, + getTimerEnabled() ? (getTimer() > 0 ? minsToString(getTimer()) : kOnStr) + : kOffStr, kTimerStr); result += addBoolToString(getSupercool(), kTurboStr); - if (getTogglePower()) { + if (getTogglePower()) result += addBoolToString(true, kPowerToggleStr); - } - if (getToggleSwingVertical()) { + if (getToggleSwingVertical()) result += addBoolToString(true, kSwingVToggleStr); - } return result; } + +#if SEND_KELON168 +/// Send a Kelon 168 bit / 21 byte message. +/// Status: BETA / Probably works. +/// @param[in] data The data to be transmitted. +/// @param[in] nbytes Nr. of bytes of data to be sent. +/// @param[in] repeat The number of times the command is to be repeated. +void IRsend::sendKelon168(const uint8_t data[], const uint16_t nbytes, + const uint16_t repeat) { + assert(kKelon168StateLength == kKelon168Section1Size + kKelon168Section2Size + + kKelon168Section3Size); + // Enough bytes to send a proper message? + if (nbytes < kKelon168StateLength) return; + + for (uint16_t r = 0; r <= repeat; r++) { + // Section #1 (48 bits) + sendGeneric(kKelonHdrMark, kKelonHdrSpace, + kKelonBitMark, kKelonOneSpace, + kKelonBitMark, kKelonZeroSpace, + kKelonBitMark, kKelon168FooterSpace, + data, kKelon168Section1Size, kKelonFreq, false, // LSB First. + 0, // No repeats here + kDutyDefault); + // Section #2 (64 bits) + sendGeneric(0, 0, + kKelonBitMark, kKelonOneSpace, + kKelonBitMark, kKelonZeroSpace, + kKelonBitMark, kKelon168FooterSpace, + data + kKelon168Section1Size, kKelon168Section2Size, + kKelonFreq, false, // LSB First. + 0, // No repeats here + kDutyDefault); + // Section #3 (56 bits) + sendGeneric(0, 0, + kKelonBitMark, kKelonOneSpace, + kKelonBitMark, kKelonZeroSpace, + kKelonBitMark, kKelonGap, + data + kKelon168Section1Size + kKelon168Section2Size, + nbytes - (kKelon168Section1Size + kKelon168Section2Size), + kKelonFreq, false, // LSB First. + 0, // No repeats here + kDutyDefault); + } +} +#endif // SEND_KELON168 + +#if DECODE_KELON168 +/// Decode the supplied Kelon 168 bit / 21 byte message. +/// Status: BETA / Probably Working. +/// @param[in,out] results Ptr to the data to decode & where to store the result +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return True if it can decode it, false if it can't. +bool IRrecv::decodeKelon168(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (strict && nbits != kKelon168Bits) return false; + if (results->rawlen <= 2 * nbits + kHeader + kFooter * 2 - 1 + offset) + return false; // Can't possibly be a valid Kelon 168 bit message. + + uint16_t used = 0; + + used = matchGeneric(results->rawbuf + offset, results->state, + results->rawlen - offset, kKelon168Section1Size * 8, + kKelonHdrMark, kKelonHdrSpace, + kKelonBitMark, kKelonOneSpace, + kKelonBitMark, kKelonZeroSpace, + kKelonBitMark, kKelon168FooterSpace, + false, _tolerance, 0, false); + if (!used) return false; // Failed to match. + offset += used; + + used = matchGeneric(results->rawbuf + offset, + results->state + kKelon168Section1Size, + results->rawlen - offset, kKelon168Section2Size * 8, + 0, 0, + kKelonBitMark, kKelonOneSpace, + kKelonBitMark, kKelonZeroSpace, + kKelonBitMark, kKelon168FooterSpace, + false, _tolerance, 0, false); + if (!used) return false; // Failed to match. + offset += used; + + used = matchGeneric(results->rawbuf + offset, + results->state + (kKelon168Section1Size + + kKelon168Section2Size), + results->rawlen - offset, + nbits - (kKelon168Section1Size + + kKelon168Section2Size) * 8, + 0, 0, + kKelonBitMark, kKelonOneSpace, + kKelonBitMark, kKelonZeroSpace, + kKelonBitMark, kKelonGap, + true, _tolerance, 0, false); + if (!used) return false; // Failed to match. + + results->decode_type = decode_type_t::KELON168; + results->bits = nbits; + return true; +} +#endif // DECODE_KELON168 diff --git a/lib/IRremoteESP8266/src/ir_Kelon.h b/lib/IRremoteESP8266/src/ir_Kelon.h index 498650623..126669940 100644 --- a/lib/IRremoteESP8266/src/ir_Kelon.h +++ b/lib/IRremoteESP8266/src/ir_Kelon.h @@ -2,16 +2,23 @@ /// @file /// @brief Support for Kelan AC protocol. -/// Both sending and decoding should be functional for models of series KELON -/// ON/OFF 9000-12000. +/// @note Both sending and decoding should be functional for models of series +/// KELON ON/OFF 9000-12000. /// All features of the standard remote are implemented. /// /// @note Unsupported: /// - Explicit on/off due to AC unit limitations /// - Explicit swing position due to AC unit limitations /// - Fahrenheit. +/// +/// For KELON168: +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1745 + // Supports: -// Brand: Kelon, Model: ON/OFF 9000-12000 +// Brand: Kelon, Model: ON/OFF 9000-12000 (KELON) +// Brand: Kelon, Model: DG11R2-01 remote (KELON168) +// Brand: Kelon, Model: AST-09UW4RVETG00A A/C (KELON168) +// Brand: Hisense, Model: AST-09UW4RVETG00A A/C (KELON168) #ifndef IR_KELON_H_ #define IR_KELON_H_ @@ -71,84 +78,50 @@ class IRKelonAc { public: explicit IRKelonAc(uint16_t pin, bool inverted = false, bool use_modulation = true); - void stateReset(void); - #if SEND_KELON - void send(const uint16_t repeat = kNoRepeat); - /// 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(); } - /// Since the AC does not support actually setting the power state to a known /// value, this utility allow ensuring the AC is on or off by exploiting /// the fact that the AC, according to the user manual, will always turn on /// when setting it to "smart" or "super" mode. void ensurePower(const bool on); - - #endif + #endif // SEND_KELON void begin(void); - void setTogglePower(const bool toggle); - bool getTogglePower(void) const; - void setTemp(const uint8_t degrees); - uint8_t getTemp(void) const; - void setFan(const uint8_t speed); - uint8_t getFan(void) const; - void setDryGrade(const int8_t grade); - int8_t getDryGrade(void) const; - void setMode(const uint8_t mode); - uint8_t getMode(void) const; - void setToggleSwingVertical(const bool toggle); - bool getToggleSwingVertical(void) const; - void setSleep(const bool on); - bool getSleep(void) const; - void setSupercool(const bool on); - bool getSupercool(void) const; - void setTimer(const uint16_t mins); - uint16_t getTimer(void) const; - void setTimerEnabled(const bool on); - bool getTimerEnabled(void) const; - uint64_t getRaw(void) const; - void setRaw(const uint64_t new_code); - static uint8_t convertMode(const stdAc::opmode_t mode); - static uint8_t convertFan(const stdAc::fanspeed_t fan); - static stdAc::opmode_t toCommonMode(const uint8_t mode); - static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); - stdAc::state_t toCommon(const stdAc::state_t *prev = nullptr) const; - String toString(void) const; private: @@ -166,5 +139,4 @@ class IRKelonAc { uint8_t _previousTemp = kKelonMinTemp; uint8_t _previousFan = kKelonFanAuto; }; - #endif // IR_KELON_H_ diff --git a/lib/IRremoteESP8266/src/ir_Kelvinator.cpp b/lib/IRremoteESP8266/src/ir_Kelvinator.cpp index 01d2e544c..c44f7c683 100644 --- a/lib/IRremoteESP8266/src/ir_Kelvinator.cpp +++ b/lib/IRremoteESP8266/src/ir_Kelvinator.cpp @@ -53,6 +53,7 @@ using irutils::addLabeledString; using irutils::addModeToString; using irutils::addFanToString; using irutils::addTempToString; +using irutils::addSwingVToString; #if SEND_KELVINATOR /// Send a Kelvinator A/C message. @@ -274,16 +275,47 @@ void IRKelvinatorAC::setMode(const uint8_t mode) { } } -/// Control the current vertical swing setting. -/// @param[in] on The desired setting. -void IRKelvinatorAC::setSwingVertical(const bool on) { - _.SwingV = on; - _.VentSwing = (on || _.SwingH); +/// Set the Vertical Swing mode of the A/C. +/// @param[in] automatic Do we use the automatic setting? +/// @param[in] position The position/mode to set the vanes to. +void IRKelvinatorAC::setSwingVertical(const bool automatic, + const uint8_t position) { + _.SwingAuto = (automatic || _.SwingH); + uint8_t new_position = position; + if (!automatic) { + switch (position) { + case kKelvinatorSwingVHighest: + case kKelvinatorSwingVUpperMiddle: + case kKelvinatorSwingVMiddle: + case kKelvinatorSwingVLowerMiddle: + case kKelvinatorSwingVLowest: + break; + default: + new_position = kKelvinatorSwingVOff; + } + } else { + switch (position) { + case kKelvinatorSwingVAuto: + case kKelvinatorSwingVLowAuto: + case kKelvinatorSwingVMiddleAuto: + case kKelvinatorSwingVHighAuto: + break; + default: + new_position = kKelvinatorSwingVAuto; + } + } + _.SwingV = new_position; } -/// Is the vertical swing setting on? -/// @return The current value. -bool IRKelvinatorAC::getSwingVertical(void) const { +/// Get the Vertical Swing Automatic mode setting of the A/C. +/// @return true, the setting is on. false, the setting is off. +bool IRKelvinatorAC::getSwingVerticalAuto(void) const { + return _.SwingV & 0b0001; +} + +/// Get the Vertical Swing position setting of the A/C. +/// @return The native position/mode. +uint8_t IRKelvinatorAC::getSwingVerticalPosition(void) const { return _.SwingV; } @@ -291,7 +323,7 @@ bool IRKelvinatorAC::getSwingVertical(void) const { /// @param[in] on The desired setting. void IRKelvinatorAC::setSwingHorizontal(const bool on) { _.SwingH = on; - _.VentSwing = (on || _.SwingV); + _.SwingAuto = (on || (_.SwingV & 0b0001)); } /// Is the horizontal swing setting on? @@ -378,6 +410,20 @@ uint8_t IRKelvinatorAC::convertMode(const stdAc::opmode_t mode) { } } +/// Convert a stdAc::swingv_t enum into it's native setting. +/// @param[in] swingv The enum to be converted. +/// @return The native equivalent of the enum. +uint8_t IRKelvinatorAC::convertSwingV(const stdAc::swingv_t swingv) { + switch (swingv) { + case stdAc::swingv_t::kHighest: return kKelvinatorSwingVHighest; + case stdAc::swingv_t::kHigh: return kKelvinatorSwingVHighAuto; + case stdAc::swingv_t::kMiddle: return kKelvinatorSwingVMiddle; + case stdAc::swingv_t::kLow: return kKelvinatorSwingVLowAuto; + case stdAc::swingv_t::kLowest: return kKelvinatorSwingVLowest; + default: return kKelvinatorSwingVAuto; + } +} + /// Convert a native mode to it's stdAc::opmode_t equivalent. /// @param[in] mode A native operating mode value. /// @return The stdAc::opmode_t equivalent. @@ -401,7 +447,7 @@ stdAc::fanspeed_t IRKelvinatorAC::toCommonFanSpeed(const uint8_t speed) { /// Convert the internal A/C object state to it's stdAc::state_t equivalent. /// @return A stdAc::state_t containing the current settings. stdAc::state_t IRKelvinatorAC::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::KELVINATOR; result.model = -1; // Unused. result.power = _.Power; @@ -442,7 +488,17 @@ String IRKelvinatorAC::toString(void) const { result += addBoolToString(_.IonFilter, kIonStr); result += addBoolToString(_.Light, kLightStr); result += addBoolToString(_.SwingH, kSwingHStr); - result += addBoolToString(_.SwingV, kSwingVStr); + result += addSwingVToString(_.SwingV, kKelvinatorSwingVAuto, + kKelvinatorSwingVHighest, + kKelvinatorSwingVHighAuto, + kKelvinatorSwingVUpperMiddle, + kKelvinatorSwingVMiddle, + kKelvinatorSwingVLowerMiddle, + kKelvinatorSwingVLowAuto, + kKelvinatorSwingVLowest, + kKelvinatorSwingVOff, + kKelvinatorSwingVAuto, kKelvinatorSwingVAuto, + kKelvinatorSwingVAuto); return result; } diff --git a/lib/IRremoteESP8266/src/ir_Kelvinator.h b/lib/IRremoteESP8266/src/ir_Kelvinator.h index 74371d8ef..32cb3e1fa 100644 --- a/lib/IRremoteESP8266/src/ir_Kelvinator.h +++ b/lib/IRremoteESP8266/src/ir_Kelvinator.h @@ -14,6 +14,7 @@ // Brand: Kelvinator, Model: KSV70HRC A/C // Brand: Kelvinator, Model: KSV80HRC A/C // Brand: Green, Model: YAPOF3 remote +// Brand: Gree, Model: YAP0F8 remote // Brand: Sharp, Model: YB1FA remote // Brand: Sharp, Model: A5VEY A/C @@ -39,7 +40,7 @@ union KelvinatorProtocol{ uint8_t Mode :3; uint8_t Power :1; uint8_t BasicFan :2; - uint8_t VentSwing :1; + uint8_t SwingAuto :1; uint8_t :1; // Sleep Modes 1 & 3 (1 = On, 0 = Off) // Byte 1 uint8_t Temp :4; // Degrees C. @@ -56,8 +57,7 @@ union KelvinatorProtocol{ uint8_t :2; // End of command block (B01) // (B010 marker and a gap of 20ms) // Byte 4 - uint8_t SwingV :1; - uint8_t :3; + uint8_t SwingV :4; uint8_t SwingH :1; uint8_t :3; // Byte 5~6 @@ -103,6 +103,17 @@ const uint8_t kKelvinatorMinTemp = 16; // 16C const uint8_t kKelvinatorMaxTemp = 30; // 30C const uint8_t kKelvinatorAutoTemp = 25; // 25C +const uint8_t kKelvinatorSwingVOff = 0b0000; // 0 +const uint8_t kKelvinatorSwingVAuto = 0b0001; // 1 +const uint8_t kKelvinatorSwingVHighest = 0b0010; // 2 +const uint8_t kKelvinatorSwingVUpperMiddle = 0b0011; // 3 +const uint8_t kKelvinatorSwingVMiddle = 0b0100; // 4 +const uint8_t kKelvinatorSwingVLowerMiddle = 0b0101; // 5 +const uint8_t kKelvinatorSwingVLowest = 0b0110; // 6 +const uint8_t kKelvinatorSwingVLowAuto = 0b0111; // 7 +const uint8_t kKelvinatorSwingVMiddleAuto = 0b1001; // 9 +const uint8_t kKelvinatorSwingVHighAuto = 0b1011; // 11 + // Legacy defines (Deprecated) #define KELVINATOR_MIN_TEMP kKelvinatorMinTemp #define KELVINATOR_MAX_TEMP kKelvinatorMaxTemp @@ -142,8 +153,11 @@ class IRKelvinatorAC { uint8_t getFan(void) const; void setMode(const uint8_t mode); uint8_t getMode(void) const; - void setSwingVertical(const bool on); - bool getSwingVertical(void) const; + void setSwingVertical(const bool automatic, const uint8_t position); + bool getSwingVerticalAuto(void) const; + uint8_t getSwingVerticalPosition(void) const; + static uint8_t convertSwingV(const stdAc::swingv_t swingv); + static stdAc::swingv_t toCommonSwingV(const uint8_t pos); void setSwingHorizontal(const bool on); bool getSwingHorizontal(void) const; void setQuiet(const bool on); diff --git a/lib/IRremoteESP8266/src/ir_LG.cpp b/lib/IRremoteESP8266/src/ir_LG.cpp index d817fbdb7..94cf01cd6 100644 --- a/lib/IRremoteESP8266/src/ir_LG.cpp +++ b/lib/IRremoteESP8266/src/ir_LG.cpp @@ -22,6 +22,7 @@ using irutils::addModeToString; using irutils::addModelToString; using irutils::addFanToString; using irutils::addTempToString; +using irutils::addToggleToString; using irutils::addSwingVToString; using irutils::addIntToString; @@ -255,6 +256,11 @@ void IRLgAc::send(const uint16_t repeat) { _irsend.send(_protocol, getRaw(), kLgBits, repeat); // Some models have extra/special settings & controls switch (getModel()) { + case lg_ac_remote_model_t::LG6711A20083V: + // Only send the swing setting if we need to. + if (_swingv != _swingv_prev) + _irsend.send(_protocol, _swingv, kLgBits, repeat); + break; case lg_ac_remote_model_t::AKB74955603: // Only send the swing setting if we need to. if (_swingv != _swingv_prev) @@ -309,6 +315,7 @@ void IRLgAc::setModel(const lg_ac_remote_model_t model) { _protocol = decode_type_t::LG2; break; case lg_ac_remote_model_t::GE6711AR2853M: + case lg_ac_remote_model_t::LG6711A20083V: _protocol = decode_type_t::LG; break; default: @@ -319,24 +326,25 @@ void IRLgAc::setModel(const lg_ac_remote_model_t model) { /// Get the model of the A/C. /// @return The enum of the compatible model. -lg_ac_remote_model_t IRLgAc::getModel(void) const { - return _model; -} +lg_ac_remote_model_t IRLgAc::getModel(void) const { return _model; } /// Check if the stored code must belong to a AKB74955603 model. /// @return true, if it is AKB74955603 message. Otherwise, false. /// @note Internal use only. bool IRLgAc::_isAKB74955603(void) const { return ((_.raw & kLgAcAKB74955603DetectionMask) && _isNormal()) || - isSwingV() || isLightToggle(); + (isSwingV() && !isSwingVToggle()) || isLightToggle(); } /// Check if the stored code must belong to a AKB73757604 model. /// @return true, if it is AKB73757604 message. Otherwise, false. /// @note Internal use only. -bool IRLgAc::_isAKB73757604(void) const { - return isSwingH() || isVaneSwingV(); -} +bool IRLgAc::_isAKB73757604(void) const { return isSwingH() || isVaneSwingV(); } + +/// Check if the stored code must belong to a LG6711A20083V model. +/// @return true, if it is LG6711A20083V message. Otherwise, false. +/// @note Internal use only. +bool IRLgAc::_isLG6711A20083V(void) const { return isSwingVToggle(); } /// Get a copy of the internal state/code for this protocol. /// @return The code for this protocol based on the current internal state. @@ -353,7 +361,10 @@ void IRLgAc::setRaw(const uint32_t new_code, const decode_type_t protocol) { // Set the default model for this protocol, if the protocol is supplied. switch (protocol) { case decode_type_t::LG: - setModel(lg_ac_remote_model_t::GE6711AR2853M); + if (isSwingVToggle()) // This model uses a swingv toggle message. + setModel(lg_ac_remote_model_t::LG6711A20083V); + else // Assume others are a different model. + setModel(lg_ac_remote_model_t::GE6711AR2853M); break; case decode_type_t::LG2: setModel(lg_ac_remote_model_t::AKB75215403); @@ -521,18 +532,22 @@ void IRLgAc::setMode(const uint8_t mode) { } } +/// Check if the stored code is a SwingV Toggle message. +/// @return true, if it is. Otherwise, false. +bool IRLgAc::isSwingVToggle(void) const { return _.raw == kLgAcSwingVToggle; } + /// Check if the stored code is a Swing message. /// @return true, if it is. Otherwise, false. bool IRLgAc::isSwing(void) const { - return (_.raw >> 12) == kLgAcSwingSignature; + return ((_.raw >> 12) == kLgAcSwingSignature) || isSwingVToggle(); } /// Check if the stored code is a non-vane SwingV message. /// @return true, if it is. Otherwise, false. bool IRLgAc::isSwingV(void) const { const uint32_t code = _.raw >> kLgAcChecksumSize; - return code >= (kLgAcSwingVLowest >> kLgAcChecksumSize) && - code < (kLgAcSwingHAuto >> kLgAcChecksumSize); + return (code >= (kLgAcSwingVLowest >> kLgAcChecksumSize) && + code < (kLgAcSwingHAuto >> kLgAcChecksumSize)) || isSwingVToggle(); } /// Check if the stored code is a SwingH message. @@ -562,7 +577,7 @@ bool IRLgAc::isVaneSwingV(void) const { /// @param[in] position The position/mode to set the vanes to. void IRLgAc::setSwingV(const uint32_t position) { // Is it a valid position code? - if (position == kLgAcSwingVOff || + if (position == kLgAcSwingVOff || position == kLgAcSwingVToggle || toCommonSwingV(position) != stdAc::swingv_t::kOff) { if (position <= 0xFF) { // It's a short code, convert it. _swingv = (kLgAcSwingSignature << 8 | position) << kLgAcChecksumSize; @@ -703,6 +718,7 @@ stdAc::swingv_t IRLgAc::toCommonSwingV(const uint32_t code) { case kLgAcSwingVLow: return stdAc::swingv_t::kLow; case kLgAcSwingVLowest_Short: case kLgAcSwingVLowest: return stdAc::swingv_t::kLowest; + case kLgAcSwingVToggle: case kLgAcSwingVSwing_Short: case kLgAcSwingVSwing: return stdAc::swingv_t::kAuto; default: return stdAc::swingv_t::kOff; @@ -740,7 +756,7 @@ uint8_t IRLgAc::convertVaneSwingV(const stdAc::swingv_t swingv) { /// @param[in] prev Ptr to the previous state if required. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRLgAc::toCommon(const stdAc::state_t *prev) const { - stdAc::state_t result; + stdAc::state_t result{}; // Start with the previous state if given it. if (prev != NULL) { result = *prev; @@ -752,13 +768,18 @@ stdAc::state_t IRLgAc::toCommon(const stdAc::state_t *prev) const { result.swingv = toCommonSwingV(getSwingV()); } result.protocol = _protocol; + if (isLightToggle()) { + result.light = !result.light; + return result; + } else { + result.light = _light; + } result.model = getModel(); result.power = getPower(); result.mode = toCommonMode(_.Mode); result.celsius = true; result.degrees = getTemp(); result.fanspeed = toCommonFanSpeed(_.Fan); - result.light = isLightToggle() ? !result.light : _light; if (isSwingV()) result.swingv = toCommonSwingV(getSwingV()); if (isVaneSwingV()) result.swingv = toCommonVaneSwingV(VANESWINGVPOS(getVaneCode(_.raw))); @@ -800,18 +821,21 @@ String IRLgAc::toString(void) const { } else if (isSwingH()) { result += addBoolToString(_swingh, kSwingHStr); } else if (isSwingV()) { - result += addSwingVToString((uint8_t)(_swingv >> kLgAcChecksumSize), - 0, // No Auto, See "swing". Unused - kLgAcSwingVHighest_Short, - kLgAcSwingVHigh_Short, - kLgAcSwingVUpperMiddle_Short, - kLgAcSwingVMiddle_Short, - 0, // Unused - kLgAcSwingVLow_Short, - kLgAcSwingVLowest_Short, - kLgAcSwingVOff_Short, - kLgAcSwingVSwing_Short, - 0, 0); + if (isSwingVToggle()) + result += addToggleToString(isSwingVToggle(), kSwingVStr); + else + result += addSwingVToString((uint8_t)(_swingv >> kLgAcChecksumSize), + 0, // No Auto, See "swing". Unused + kLgAcSwingVHighest_Short, + kLgAcSwingVHigh_Short, + kLgAcSwingVUpperMiddle_Short, + kLgAcSwingVMiddle_Short, + 0, // Unused + kLgAcSwingVLow_Short, + kLgAcSwingVLowest_Short, + kLgAcSwingVOff_Short, + kLgAcSwingVSwing_Short, + 0, 0); } else if (isVaneSwingV()) { const uint8_t vane = getVaneCode(_.raw) / kLgAcVaneSwingVSize; result += addIntToString(vane, kVaneStr); diff --git a/lib/IRremoteESP8266/src/ir_LG.h b/lib/IRremoteESP8266/src/ir_LG.h index 2bd7dbc1c..4f88ed2a8 100644 --- a/lib/IRremoteESP8266/src/ir_LG.h +++ b/lib/IRremoteESP8266/src/ir_LG.h @@ -6,7 +6,8 @@ /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1513 // Supports: -// Brand: LG, Model: 6711A20083V remote (LG) +// Brand: LG, Model: 6711A20083V remote (LG - LG6711A20083V) +// Brand: LG, Model: TS-H122ERM1 remote (LG - LG6711A20083V) // Brand: LG, Model: AKB74395308 remote (LG2) // Brand: LG, Model: S4-W12JA3AA A/C (LG2) // Brand: LG, Model: AKB75215403 remote (LG2) @@ -17,8 +18,8 @@ // Brand: LG, Model: AKB73757604 remote (LG2 - AKB73757604) // Brand: LG, Model: AKB73315611 remote (LG2 - AKB74955603) // Brand: LG, Model: MS05SQ NW0 A/C (LG2 - AKB74955603) -// Brand: General Electric, Model: AG1BH09AW101 Split A/C (LG) -// Brand: General Electric, Model: 6711AR2853M A/C Remote (LG) +// Brand: General Electric, Model: AG1BH09AW101 A/C (LG - GE6711AR2853M) +// Brand: General Electric, Model: 6711AR2853M Remote (LG - GE6711AR2853M) #ifndef IR_LG_H_ #define IR_LG_H_ @@ -73,6 +74,7 @@ const uint8_t kLgAcSignature = 0x88; const uint32_t kLgAcOffCommand = 0x88C0051; const uint32_t kLgAcLightToggle = 0x88C00A6; +const uint32_t kLgAcSwingVToggle = 0x8810001; const uint32_t kLgAcSwingSignature = 0x8813; const uint32_t kLgAcSwingVLowest = 0x8813048; const uint32_t kLgAcSwingVLow = 0x8813059; @@ -144,6 +146,7 @@ class IRLgAc { void setSwingH(const bool on); bool getSwingH(void) const; bool isSwingV(void) const; + bool isSwingVToggle(void) const; bool isVaneSwingV(void) const; void setSwingV(const uint32_t position); uint32_t getSwingV(void) const; @@ -192,6 +195,7 @@ class IRLgAc { void _setTemp(const uint8_t value); bool _isAKB74955603(void) const; bool _isAKB73757604(void) const; + bool _isLG6711A20083V(void) const; bool _isNormal(void) const; }; diff --git a/lib/IRremoteESP8266/src/ir_Midea.cpp b/lib/IRremoteESP8266/src/ir_Midea.cpp index 8b3b645d8..4fbc07973 100644 --- a/lib/IRremoteESP8266/src/ir_Midea.cpp +++ b/lib/IRremoteESP8266/src/ir_Midea.cpp @@ -42,6 +42,7 @@ using irutils::addIntToString; using irutils::addLabeledString; using irutils::addModeToString; using irutils::addTempToString; +using irutils::addToggleToString; using irutils::minsToString; #if SEND_MIDEA @@ -100,10 +101,13 @@ IRMideaAC::IRMideaAC(const uint16_t pin, const bool inverted, void IRMideaAC::stateReset(void) { // Power On, Mode Auto, Fan Auto, Temp = 25C/77F _.remote_state = 0xA1826FFFFF62; - _SwingVToggle = false; + _CleanToggle = false; _EconoToggle = false; - _TurboToggle = false; + _8CHeatToggle = false; _LightToggle = false; + _Quiet = _Quiet_prev = false; + _SwingVToggle = false; + _TurboToggle = false; #if KAYSUN_AC _SwingVStep = false; #endif // KAYSUN_AC @@ -135,6 +139,19 @@ void IRMideaAC::send(const uint16_t repeat) { if (_LightToggle && !isLightToggle()) _irsend.sendMidea(kMideaACToggleLight, kMideaBits, repeat); _LightToggle = false; + if (getMode() <= kMideaACAuto) { // Only available in Cool, Dry, or Auto mode + if (_CleanToggle && !isCleanToggle()) + _irsend.sendMidea(kMideaACToggleSelfClean, kMideaBits, repeat); + _CleanToggle = false; + } else if (getMode() == kMideaACHeat) { // Only available in Heat mode + if (_8CHeatToggle && !is8CHeatToggle()) + _irsend.sendMidea(kMideaACToggle8CHeat, kMideaBits, repeat); + _8CHeatToggle = false; + } + if (_Quiet != _Quiet_prev) + _irsend.sendMidea(_Quiet ? kMideaACQuietOn : kMideaACQuietOff, + kMideaBits, repeat); + _Quiet_prev = _Quiet; } #endif // SEND_MIDEA @@ -410,6 +427,75 @@ bool IRMideaAC::getLightToggle(void) { return _LightToggle; } +/// Is the current state a Self-Clean toggle message? +/// @return true, it is. false, it isn't. +bool IRMideaAC::isCleanToggle(void) const { + return _.remote_state == kMideaACToggleSelfClean; +} + +/// Set the A/C to toggle the Self Clean mode for the next send. +/// @note Only works in Cool, Dry, or Auto modes. +/// @param[in] on true, the setting is on. false, the setting is off. +void IRMideaAC::setCleanToggle(const bool on) { + _CleanToggle = on && getMode() <= kMideaACAuto; +} + +// Get the Self-Clean toggle state of the A/C. +/// @return true, the setting is on. false, the setting is off. +bool IRMideaAC::getCleanToggle(void) { + _CleanToggle |= isCleanToggle(); + return _CleanToggle; +} + +/// Is the current state a 8C Heat (Freeze Protect) toggle message? +/// @note Only works in Heat mode. +/// @return true, it is. false, it isn't. +bool IRMideaAC::is8CHeatToggle(void) const { + return _.remote_state == kMideaACToggle8CHeat; +} + +/// Set the A/C to toggle the 8C Heat (Freeze Protect) mode for the next send. +/// @note Only works in Heat mode. +/// @param[in] on true, the setting is on. false, the setting is off. +void IRMideaAC::set8CHeatToggle(const bool on) { + _8CHeatToggle = on && getMode() == kMideaACHeat; +} + +// Get the 8C Heat (Freeze Protect) toggle state of the A/C. +/// @return true, the setting is on. false, the setting is off. +bool IRMideaAC::get8CHeatToggle(void) { + _8CHeatToggle |= is8CHeatToggle(); + return _8CHeatToggle; +} + +/// Is the current state a Quiet(Silent) message? +/// @return true, it is. false, it isn't. +bool IRMideaAC::isQuiet(void) const { + return (_.remote_state == kMideaACQuietOff || + _.remote_state == kMideaACQuietOn); +} + +/// Set the Quiet (Silent) mode for the next send. +/// @param[in] on true, the setting is on. false, the setting is off. +void IRMideaAC::setQuiet(const bool on) { _Quiet = on; } + +/// Set the Quiet (Silent) mode for the next send. +/// @param[in] on true, the setting is on. false, the setting is off. +/// @param[in] prev true, previously the setting was on. false, setting was off. +void IRMideaAC::setQuiet(const bool on, const bool prev) { + setQuiet(on); + _Quiet_prev = prev; +} + +// Get the Quiet (Silent) mode state of the A/C. +/// @return true, the setting is on. false, the setting is off. +bool IRMideaAC::getQuiet(void) const { + if (isQuiet()) + return _.remote_state == kMideaACQuietOn; + else + return _Quiet; +} + /// Calculate the checksum for a given state. /// @param[in] state The value to calc the checksum of. /// @return The calculated checksum value. @@ -566,7 +652,7 @@ stdAc::fanspeed_t IRMideaAC::toCommonFanSpeed(const uint8_t speed) { /// @param[in] prev A Ptr to the previous state. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRMideaAC::toCommon(const stdAc::state_t *prev) { - stdAc::state_t result; + stdAc::state_t result{}; if (prev != NULL) { result = *prev; } else { @@ -577,7 +663,6 @@ stdAc::state_t IRMideaAC::toCommon(const stdAc::state_t *prev) { result.swingv = stdAc::swingv_t::kOff; result.quiet = false; result.turbo = false; - result.clean = false; result.econo = false; result.filter = false; result.light = false; @@ -597,6 +682,7 @@ stdAc::state_t IRMideaAC::toCommon(const stdAc::state_t *prev) { result.fanspeed = toCommonFanSpeed(_.Fan); result.sleep = _.Sleep ? 0 : -1; result.econo = getEconoToggle(); + result.clean ^= getCleanToggle(); return result; } @@ -612,7 +698,7 @@ String IRMideaAC::toString(void) { case kMideaACTypeCommand: result += kCommandStr; break; case kMideaACTypeSpecial: result += kSpecialStr; break; case kMideaACTypeFollow: result += kFollowStr; break; - default: result += kUnknownStr; + default: result += kUnknownStr; } result += ')'; if (message_type != kMideaACTypeSpecial) { @@ -643,13 +729,16 @@ String IRMideaAC::toString(void) { kMideaACFanAuto, kMideaACFanAuto, kMideaACFanMed); result += addBoolToString(_.Sleep, kSleepStr); } - result += addBoolToString(getSwingVToggle(), kSwingVToggleStr); + result += addToggleToString(getSwingVToggle(), kSwingVStr); #if KAYSUN_AC result += addBoolToString(getSwingVStep(), kStepStr); #endif // KAYSUN_AC - result += addBoolToString(getEconoToggle(), kEconoToggleStr); - result += addBoolToString(getTurboToggle(), kTurboToggleStr); - result += addBoolToString(getLightToggle(), kLightToggleStr); + result += addToggleToString(getEconoToggle(), kEconoStr); + result += addToggleToString(getTurboToggle(), kTurboStr); + result += addBoolToString(getQuiet(), kQuietStr); + result += addToggleToString(getLightToggle(), kLightStr); + result += addToggleToString(getCleanToggle(), kCleanStr); + result += addToggleToString(get8CHeatToggle(), k8CHeatStr); return result; } diff --git a/lib/IRremoteESP8266/src/ir_Midea.h b/lib/IRremoteESP8266/src/ir_Midea.h index eaeaa04d8..e44055e79 100644 --- a/lib/IRremoteESP8266/src/ir_Midea.h +++ b/lib/IRremoteESP8266/src/ir_Midea.h @@ -5,6 +5,7 @@ /// Midea added by crankyoldgit & bwze /// @see https://docs.google.com/spreadsheets/d/1TZh4jWrx4h9zzpYUI9aYXMl1fYOiqu-xVuOOMqagxrs/edit?usp=sharing /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1342#issuecomment-733721085 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1733 // Supports: // Brand: Pioneer System, Model: RYBO12GMFILCAD A/C (12K BTU) (MIDEA) @@ -22,8 +23,22 @@ // Brand: Danby, Model: DAC100BGUWDB (MIDEA) // Brand: Danby, Model: DAC120BGUWDB (MIDEA) // Brand: Danby, Model: R09C/BCGE remote (MIDEA) +// Brand: Trotec, Model: TROTEC PAC 2100 X (MIDEA) // Brand: Trotec, Model: TROTEC PAC 3900 X (MIDEA) // Brand: Trotec, Model: RG57H(B)/BGE remote (MIDEA) +// Brand: Trotec, Model: RG57H3(B)/BGCEF-M remote (MIDEA) +// Brand: Lennox, Model: RG57A6/BGEFU1 remote (MIDEA) +// Brand: Lennox, Model: MWMA009S4-3P A/C (MIDEA) +// Brand: Lennox, Model: MWMA012S4-3P A/C (MIDEA) +// Brand: Lennox, Model: MCFA indoor split A/C (MIDEA) +// Brand: Lennox, Model: MCFB indoor split A/C (MIDEA) +// Brand: Lennox, Model: MMDA indoor split A/C (MIDEA) +// Brand: Lennox, Model: MMDB indoor split A/C (MIDEA) +// Brand: Lennox, Model: MWMA indoor split A/C (MIDEA) +// Brand: Lennox, Model: MWMB indoor split A/C (MIDEA) +// Brand: Lennox, Model: M22A indoor split A/C (MIDEA) +// Brand: Lennox, Model: M33A indoor split A/C (MIDEA) +// Brand: Lennox, Model: M33B indoor split A/C (MIDEA) #ifndef IR_MIDEA_H_ #define IR_MIDEA_H_ @@ -123,9 +138,16 @@ const uint8_t kMideaACFanHigh = 3; // 0b11 // const uint64_t kMideaACToggleIonizer = 0xA201FFFFFF7C; kSwingVToggleStr = kIonStr; #endif // DANBY_DAC -const uint64_t kMideaACToggleEcono = 0xA202FFFFFF7E; -const uint64_t kMideaACToggleLight = 0xA208FFFFFF75; -const uint64_t kMideaACToggleTurbo = 0xA209FFFFFF74; +const uint64_t kMideaACToggleEcono = 0xA202FFFFFF7E; +const uint64_t kMideaACToggleLight = 0xA208FFFFFF75; +const uint64_t kMideaACToggleTurbo = 0xA209FFFFFF74; +// Mode must be Auto, Cool, or Dry +const uint64_t kMideaACToggleSelfClean = 0xA20DFFFFFF70; +// 8C Heat AKA Freeze Protection +const uint64_t kMideaACToggle8CHeat = 0xA20FFFFFFF73; // Only in Heat +const uint64_t kMideaACQuietOn = 0xA212FFFFFF6E; +const uint64_t kMideaACQuietOff = 0xA213FFFFFF6F; + const uint8_t kMideaACTypeCommand = 0b001; ///< Message type const uint8_t kMideaACTypeSpecial = 0b010; ///< Message type const uint8_t kMideaACTypeFollow = 0b100; ///< Message type @@ -202,6 +224,16 @@ class IRMideaAC { bool isLightToggle(void) const; void setLightToggle(const bool on); bool getLightToggle(void); + bool isCleanToggle(void) const; + void setCleanToggle(const bool on); + bool getCleanToggle(void); + bool is8CHeatToggle(void) const; + void set8CHeatToggle(const bool on); + bool get8CHeatToggle(void); + bool isQuiet(void) const; + void setQuiet(const bool on); + void setQuiet(const bool on, const bool prev); + bool getQuiet(void) const; uint8_t getType(void) const; bool isOnTimerEnabled(void) const; uint16_t getOnTimer(void) const; @@ -225,13 +257,17 @@ class IRMideaAC { /// @endcond #endif // UNIT_TEST MideaProtocol _; + bool _CleanToggle; + bool _EconoToggle; + bool _8CHeatToggle; + bool _LightToggle; + bool _Quiet; + bool _Quiet_prev; bool _SwingVToggle; #if KAYSUN_AC bool _SwingVStep; #endif // KAYSUN_AC - bool _EconoToggle; bool _TurboToggle; - bool _LightToggle; void checksum(void); static uint8_t calcChecksum(const uint64_t state); void setType(const uint8_t type); diff --git a/lib/IRremoteESP8266/src/ir_Mirage.cpp b/lib/IRremoteESP8266/src/ir_Mirage.cpp index a806937b1..e3e7c60d3 100644 --- a/lib/IRremoteESP8266/src/ir_Mirage.cpp +++ b/lib/IRremoteESP8266/src/ir_Mirage.cpp @@ -733,7 +733,7 @@ stdAc::swingv_t IRMirageAc::toCommonSwingV(const uint8_t pos) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRMirageAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::MIRAGE; result.model = _model; result.power = getPower(); diff --git a/lib/IRremoteESP8266/src/ir_Mitsubishi.cpp b/lib/IRremoteESP8266/src/ir_Mitsubishi.cpp index 1e826a72d..286072bdc 100644 --- a/lib/IRremoteESP8266/src/ir_Mitsubishi.cpp +++ b/lib/IRremoteESP8266/src/ir_Mitsubishi.cpp @@ -62,7 +62,7 @@ const uint16_t kMitsubishiAcBitMark = 450; const uint16_t kMitsubishiAcOneSpace = 1300; const uint16_t kMitsubishiAcZeroSpace = 420; const uint16_t kMitsubishiAcRptMark = 440; -const uint16_t kMitsubishiAcRptSpace = 17100; +const uint16_t kMitsubishiAcRptSpace = 15500; const uint8_t kMitsubishiAcExtraTolerance = 5; // Mitsubishi 136 bit A/C @@ -781,7 +781,7 @@ stdAc::swingh_t IRMitsubishiAC::toCommonSwingH(const uint8_t pos) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRMitsubishiAC::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::MITSUBISHI_AC; result.model = -1; // No models used. result.power = _.Power; @@ -1195,7 +1195,7 @@ stdAc::swingv_t IRMitsubishi136::toCommonSwingV(const uint8_t pos) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRMitsubishi136::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::MITSUBISHI136; result.model = -1; // No models used. result.power = _.Power; @@ -1660,7 +1660,7 @@ stdAc::swingh_t IRMitsubishi112::toCommonSwingH(const uint8_t pos) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRMitsubishi112::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::MITSUBISHI112; result.model = -1; // No models used. result.power = _.Power; diff --git a/lib/IRremoteESP8266/src/ir_Mitsubishi.h b/lib/IRremoteESP8266/src/ir_Mitsubishi.h index 55afcdce6..85e61eefd 100644 --- a/lib/IRremoteESP8266/src/ir_Mitsubishi.h +++ b/lib/IRremoteESP8266/src/ir_Mitsubishi.h @@ -35,6 +35,7 @@ // Brand: Mitsubishi Electric, Model: SG15D remote (MITSUBISHI_AC) // Brand: Mitsubishi Electric, Model: MSZ-ZW4017S A/C (MITSUBISHI_AC) // Brand: Mitsubishi Electric, Model: MSZ-FHnnVE A/C (MITSUBISHI_AC) +// Brand: Mitsubishi Electric, Model: RH151 remote (MITSUBISHI_AC) #ifndef IR_MITSUBISHI_H_ #define IR_MITSUBISHI_H_ diff --git a/lib/IRremoteESP8266/src/ir_MitsubishiHeavy.cpp b/lib/IRremoteESP8266/src/ir_MitsubishiHeavy.cpp index b4a6ffc35..8cefc0683 100644 --- a/lib/IRremoteESP8266/src/ir_MitsubishiHeavy.cpp +++ b/lib/IRremoteESP8266/src/ir_MitsubishiHeavy.cpp @@ -454,7 +454,7 @@ stdAc::swingv_t IRMitsubishiHeavy152Ac::toCommonSwingV(const uint8_t pos) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRMitsubishiHeavy152Ac::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::MITSUBISHI_HEAVY_152; result.model = -1; // No models used. result.power = _.Power; @@ -899,7 +899,7 @@ stdAc::swingv_t IRMitsubishiHeavy88Ac::toCommonSwingV(const uint8_t pos) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRMitsubishiHeavy88Ac::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::MITSUBISHI_HEAVY_88; result.model = -1; // No models used. result.power = _.Power; diff --git a/lib/IRremoteESP8266/src/ir_Neoclima.cpp b/lib/IRremoteESP8266/src/ir_Neoclima.cpp index ff26e6c64..ac57714e9 100644 --- a/lib/IRremoteESP8266/src/ir_Neoclima.cpp +++ b/lib/IRremoteESP8266/src/ir_Neoclima.cpp @@ -484,7 +484,7 @@ bool IRNeoclimaAc::getFollow(void) const { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRNeoclimaAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::NEOCLIMA; result.model = -1; // No models used. result.power = _.Power; diff --git a/lib/IRremoteESP8266/src/ir_Panasonic.cpp b/lib/IRremoteESP8266/src/ir_Panasonic.cpp index e2add03f1..a0a0b6b23 100644 --- a/lib/IRremoteESP8266/src/ir_Panasonic.cpp +++ b/lib/IRremoteESP8266/src/ir_Panasonic.cpp @@ -760,7 +760,7 @@ stdAc::swingv_t IRPanasonicAc::toCommonSwingV(const uint8_t pos) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRPanasonicAc::toCommon(void) { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::PANASONIC_AC; result.model = getModel(); result.power = getPower(); @@ -1307,7 +1307,7 @@ String IRPanasonicAc32::toString(void) const { /// @param[in] prev Ptr to the previous state if required. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRPanasonicAc32::toCommon(const stdAc::state_t *prev) const { - stdAc::state_t result; + stdAc::state_t result{}; // Start with the previous state if given it. if (prev != NULL) { result = *prev; diff --git a/lib/IRremoteESP8266/src/ir_Pioneer.cpp b/lib/IRremoteESP8266/src/ir_Pioneer.cpp index 90f58c6ed..6efe15c0a 100644 --- a/lib/IRremoteESP8266/src/ir_Pioneer.cpp +++ b/lib/IRremoteESP8266/src/ir_Pioneer.cpp @@ -9,6 +9,7 @@ /// @see https://github.com/crankyoldgit/IRremoteESP8266/pull/547 /// @see https://www.pioneerelectronics.com/PUSA/Support/Home-Entertainment-Custom-Install/IR+Codes/A+V+Receivers /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1220 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1749#issuecomment-1028122645 // Supports: // Brand: Pioneer, Model: AV Receivers @@ -74,6 +75,10 @@ void IRsend::sendPioneer(const uint64_t data, const uint16_t nbits, /// and the second the command. /// e.g. /// "A556+AF20" is an Address of 0xA556 & a Command of 0xAF20. +/// @note If the Address is 0, use it like the following: +/// `irsend.sendPioneer(irsend.encodePioneer(0, 0xAA1C), 32, 1);` or +/// `irsend.sendPioneer(irsend.encodePioneer(0xAA1C, 0xAA1C), 64, 0);` +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1749#issuecomment-1028122645 uint64_t IRsend::encodePioneer(const uint16_t address, const uint16_t command) { return (((uint64_t)encodeNEC(address >> 8, address & 0xFF)) << 32) | encodeNEC(command >> 8, command & 0xFF); diff --git a/lib/IRremoteESP8266/src/ir_Rhoss.cpp b/lib/IRremoteESP8266/src/ir_Rhoss.cpp index f906f49be..c4b4652b2 100644 --- a/lib/IRremoteESP8266/src/ir_Rhoss.cpp +++ b/lib/IRremoteESP8266/src/ir_Rhoss.cpp @@ -324,7 +324,7 @@ stdAc::fanspeed_t IRRhossAc::toCommonFanSpeed(const uint8_t speed) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRRhossAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::RHOSS; result.power = getPower(); result.mode = toCommonMode(_.Mode); diff --git a/lib/IRremoteESP8266/src/ir_Samsung.cpp b/lib/IRremoteESP8266/src/ir_Samsung.cpp index 94cb52bba..b3fe2a860 100644 --- a/lib/IRremoteESP8266/src/ir_Samsung.cpp +++ b/lib/IRremoteESP8266/src/ir_Samsung.cpp @@ -866,7 +866,7 @@ stdAc::fanspeed_t IRSamsungAc::toCommonFanSpeed(const uint8_t spd) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRSamsungAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::SAMSUNG_AC; result.model = -1; // Not supported. result.power = getPower(); diff --git a/lib/IRremoteESP8266/src/ir_Sanyo.cpp b/lib/IRremoteESP8266/src/ir_Sanyo.cpp index 7dbed5a58..4a38e8e09 100644 --- a/lib/IRremoteESP8266/src/ir_Sanyo.cpp +++ b/lib/IRremoteESP8266/src/ir_Sanyo.cpp @@ -77,6 +77,14 @@ const uint32_t kSanyoAc88Gap = 3675; ///< uSeconds const uint16_t kSanyoAc88Freq = 38000; ///< Hz. (Guess only) const uint8_t kSanyoAc88ExtraTolerance = 5; /// (%) Extra tolerance to use. +const uint16_t kSanyoAc152HdrMark = 3300; ///< uSeconds +const uint16_t kSanyoAc152BitMark = 440; ///< uSeconds +const uint16_t kSanyoAc152HdrSpace = 1725; ///< uSeconds +const uint16_t kSanyoAc152OneSpace = 1290; ///< uSeconds +const uint16_t kSanyoAc152ZeroSpace = 405; ///< uSeconds +const uint16_t kSanyoAc152Freq = 38000; ///< Hz. (Guess only) +const uint8_t kSanyoAc152ExtraTolerance = 13; /// (%) Extra tolerance to use. + #if SEND_SANYO /// Construct a Sanyo LC7461 message. /// @param[in] address The 13 bit value of the address(Custom) portion of the @@ -607,7 +615,7 @@ void IRSanyoAc::setOffTimer(const uint16_t mins) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRSanyoAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::SANYO_AC; result.model = -1; // Not supported. result.power = getPower(); @@ -687,7 +695,7 @@ void IRsend::sendSanyoAc88(const uint8_t data[], const uint16_t nbytes, #endif // SEND_SANYO_AC88 #if DECODE_SANYO_AC88 -/// Decode the supplied SanyoAc message. +/// Decode the supplied SanyoAc88 message. /// Status: ALPHA / Untested. /// @param[in,out] results Ptr to the data to decode & where to store the decode /// @warning data's bit order may change. It is not yet confirmed. @@ -935,7 +943,7 @@ bool IRSanyoAc88::getSleep(void) const { return _.Sleep; } /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRSanyoAc88::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::SANYO_AC88; result.model = -1; // Not supported. result.power = getPower(); @@ -976,3 +984,61 @@ String IRSanyoAc88::toString(void) const { result += addLabeledString(minsToString(getClock()), kClockStr); return result; } + +#if SEND_SANYO_AC152 +/// Send a SanyoAc152 formatted message. +/// Status: BETA / Probably works. +/// @param[in] data An array of bytes containing the IR command. +/// @warning data's bit order may change. It is not yet confirmed. +/// @param[in] nbytes Nr. of bytes of data in the array. +/// @param[in] repeat Nr. of times the message is to be repeated. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1826 +void IRsend::sendSanyoAc152(const uint8_t data[], const uint16_t nbytes, + const uint16_t repeat) { + // (Header + Data + Footer) per repeat + sendGeneric(kSanyoAc152HdrMark, kSanyoAc152HdrSpace, + kSanyoAc152BitMark, kSanyoAc152OneSpace, + kSanyoAc152BitMark, kSanyoAc152ZeroSpace, + kSanyoAc152BitMark, kDefaultMessageGap, + data, nbytes, kSanyoAc152Freq, false, repeat, kDutyDefault); + space(kDefaultMessageGap); // Make a guess at a post message gap. +} +#endif // SEND_SANYO_AC152 + +#if DECODE_SANYO_AC152 +/// Decode the supplied SanyoAc152 message. +/// Status: BETA / Probably works. +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// @warning data's bit order may change. It is not yet confirmed. +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1503 +bool IRrecv::decodeSanyoAc152(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (strict && nbits != kSanyoAc152Bits) + return false; + + // Header + Data + Footer + if (!matchGeneric(results->rawbuf + offset, results->state, + results->rawlen - offset, nbits, + kSanyoAc152HdrMark, kSanyoAc152HdrSpace, + kSanyoAc152BitMark, kSanyoAc152OneSpace, + kSanyoAc152BitMark, kSanyoAc152ZeroSpace, + kSanyoAc152BitMark, + kDefaultMessageGap, // Just a guess. + false, _tolerance + kSanyoAc152ExtraTolerance, + kMarkExcess, false)) + return false; // No match! + + // Success + results->decode_type = decode_type_t::SANYO_AC152; + results->bits = nbits; + // No need to record the state as we stored it as we decoded it. + // As we use result->state, we don't record value, address, or command as it + // is a union data type. + return true; +} +#endif // DECODE_SANYO_AC152 diff --git a/lib/IRremoteESP8266/src/ir_Sanyo.h b/lib/IRremoteESP8266/src/ir_Sanyo.h index 66376328f..42575cb3b 100644 --- a/lib/IRremoteESP8266/src/ir_Sanyo.h +++ b/lib/IRremoteESP8266/src/ir_Sanyo.h @@ -13,6 +13,7 @@ /// @see https://docs.google.com/spreadsheets/d/1dYfLsnYvpjV-SgO8pdinpfuBIpSzm8Q1R5SabrLeskw/edit?usp=sharing /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1503 /// @see https://docs.google.com/spreadsheets/d/1weUmGAsEpfX38gg5rlDN69Uchnbr6gQl9FqHffLBIRk/edit#gid=0 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1826 // Supports: // Brand: Sanyo, Model: SA 8650B - disabled @@ -21,6 +22,8 @@ // Brand: Sanyo, Model: RCS-2HS4E remote (SANYO_AC) // Brand: Sanyo, Model: SAP-K242AH A/C (SANYO_AC) // Brand: Sanyo, Model: RCS-2S4E remote (SANYO_AC) +// Brand: Sanyo, Model: RCS-4MHVPIS4EE remote (SANYO_AC152) +// Brand: Sanyo, Model: SAP-KMRV124EHE A/C (SANYO_AC152) #ifndef IR_SANYO_H_ #define IR_SANYO_H_ diff --git a/lib/IRremoteESP8266/src/ir_Sharp.cpp b/lib/IRremoteESP8266/src/ir_Sharp.cpp index 38f0ac32c..d184c9301 100644 --- a/lib/IRremoteESP8266/src/ir_Sharp.cpp +++ b/lib/IRremoteESP8266/src/ir_Sharp.cpp @@ -837,7 +837,7 @@ stdAc::swingv_t IRSharpAc::toCommonSwingV(const uint8_t pos, /// @param[in] prev Ptr to the previous state if required. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRSharpAc::toCommon(const stdAc::state_t *prev) const { - stdAc::state_t result; + stdAc::state_t result{}; // Start with the previous state if given it. if (prev != NULL) result = *prev; result.protocol = decode_type_t::SHARP_AC; diff --git a/lib/IRremoteESP8266/src/ir_Tcl.cpp b/lib/IRremoteESP8266/src/ir_Tcl.cpp index a9e8784a3..45e210f2b 100644 --- a/lib/IRremoteESP8266/src/ir_Tcl.cpp +++ b/lib/IRremoteESP8266/src/ir_Tcl.cpp @@ -1,4 +1,4 @@ -// Copyright 2019, 2021 David Conran +// Copyright 2019, 2021, 2022 David Conran /// @file /// @brief Support for TCL protocols. @@ -14,10 +14,19 @@ #include "IRutils.h" // Constants - const uint8_t kTcl112AcTimerResolution = 20; // Minutes const uint16_t kTcl112AcTimerMax = 720; // Minutes (12 hrs) +const uint16_t kTcl96AcHdrMark = 1056; // uSeconds. +const uint16_t kTcl96AcHdrSpace = 550; // uSeconds. +const uint16_t kTcl96AcBitMark = 600; // uSeconds. +const uint32_t kTcl96AcGap = kDefaultMessageGap; // Just a guess. +const uint8_t kTcl96AcSpaceCount = 4; +const uint16_t kTcl96AcBitSpaces[kTcl96AcSpaceCount] = {360, // 0b00 + 838, // 0b01 + 2182, // 0b10 + 1444}; // 0b11 + using irutils::addBoolToString; using irutils::addFanToString; using irutils::addIntToString; @@ -444,7 +453,7 @@ stdAc::swingv_t IRTcl112Ac::toCommonSwingV(const uint8_t setting) { /// @param[in] prev Ptr to the previous state if required. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRTcl112Ac::toCommon(const stdAc::state_t *prev) const { - stdAc::state_t result; + stdAc::state_t result{}; // Start with the previous state if given it. if (prev != NULL) result = *prev; result.protocol = decode_type_t::TCL112AC; @@ -527,3 +536,81 @@ String IRTcl112Ac::toString(void) const { /// It's the same as `decodeMitsubishi112()`. A shared routine is used. /// You can find it in: ir_Mitsubishi.cpp #endif // DECODE_TCL112AC + +#if SEND_TCL96AC +/// Send a TCL 96-bit A/C message. +/// Status: BETA / Untested on a real device working. +/// @param[in] data The message to be sent. +/// @param[in] nbytes The number of bytes of message to be sent. +/// @param[in] repeat The number of times the command is to be repeated. +void IRsend::sendTcl96Ac(const unsigned char data[], const uint16_t nbytes, + const uint16_t repeat) { + enableIROut(38); + for (uint16_t r = 0; r <= repeat; r++) { + // Header + mark(kTcl96AcHdrMark); + space(kTcl96AcHdrSpace); + // Data + for (uint16_t pos = 0; pos < nbytes; pos++) { + uint8_t databyte = data[pos]; + for (uint8_t bits = 0; bits < 8; bits += 2) { + mark(kTcl96AcBitMark); + space(kTcl96AcBitSpaces[GETBITS8(databyte, 8 - 2, 2)]); + databyte <<= 2; + } + } + // Footer + mark(kTcl96AcBitMark); + space(kTcl96AcGap); + } +} +#endif // SEND_TCL96AC + +#if DECODE_TCL96AC +/// Decode the supplied Tcl96Ac message. +/// Status: ALPHA / Experimental. +/// @param[in,out] results Ptr to the data to decode & where to store the result +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return True if it can decode it, false if it can't. +bool IRrecv::decodeTcl96Ac(decode_results* results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (results->rawlen < nbits + kHeader + kFooter - 1 + offset) + return false; // Message is smaller than we expected. + if (strict && nbits != kTcl96AcBits) + return false; // Not strictly a TCL96AC message. + uint8_t data = 0; + // Header. + if (!matchMark(results->rawbuf[offset++], kTcl96AcHdrMark)) return false; + if (!matchSpace(results->rawbuf[offset++], kTcl96AcHdrSpace)) return false; + // Data (2 bits at a time) + for (uint16_t bits_so_far = 0; bits_so_far < nbits; bits_so_far += 2) { + if (bits_so_far % 8) + data <<= 2; // Make space for the new data bits. + else + data = 0; + if (!matchMark(results->rawbuf[offset++], kTcl96AcBitMark)) return false; + uint8_t value = 0; + while (value < kTcl96AcSpaceCount) { + if (matchSpace(results->rawbuf[offset], kTcl96AcBitSpaces[value])) { + data += value; + break; + } + value++; + } + if (value >= kTcl96AcSpaceCount) return false; // No matches. + offset++; + *(results->state + bits_so_far / 8) = data; + } + // Footer + if (!matchMark(results->rawbuf[offset++], kTcl96AcBitMark)) return false; + if (offset < results->rawlen && + !matchAtLeast(results->rawbuf[offset], kTcl96AcGap)) return false; + // Success + results->decode_type = TCL96AC; + results->bits = nbits; + return true; +} +#endif // DECODE_TCL96AC diff --git a/lib/IRremoteESP8266/src/ir_Tcl.h b/lib/IRremoteESP8266/src/ir_Tcl.h index c7ae038d0..805270aa2 100644 --- a/lib/IRremoteESP8266/src/ir_Tcl.h +++ b/lib/IRremoteESP8266/src/ir_Tcl.h @@ -10,6 +10,7 @@ // Brand: Teknopoint, Model: GZ-055B-E1 remote (GZ055BE1) // Brand: Daewoo, Model: DSB-F0934ELH-V A/C // Brand: Daewoo, Model: GYKQ-52E remote +// Brand: TCL, Model: GYKQ-58(XM) remote (TCL96AC) #ifndef IR_TCL_H_ #define IR_TCL_H_ diff --git a/lib/IRremoteESP8266/src/ir_Technibel.cpp b/lib/IRremoteESP8266/src/ir_Technibel.cpp index d58cc7e05..bf9b799d5 100644 --- a/lib/IRremoteESP8266/src/ir_Technibel.cpp +++ b/lib/IRremoteESP8266/src/ir_Technibel.cpp @@ -363,7 +363,7 @@ uint16_t IRTechnibelAc::getTimer(void) const { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRTechnibelAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::TECHNIBEL_AC; result.power = _.Power; result.mode = toCommonMode(_.Mode); diff --git a/lib/IRremoteESP8266/src/ir_Teco.cpp b/lib/IRremoteESP8266/src/ir_Teco.cpp index 031691edd..289e15d52 100644 --- a/lib/IRremoteESP8266/src/ir_Teco.cpp +++ b/lib/IRremoteESP8266/src/ir_Teco.cpp @@ -294,7 +294,7 @@ stdAc::fanspeed_t IRTecoAc::toCommonFanSpeed(const uint8_t speed) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRTecoAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::TECO; result.model = -1; // Not supported. result.power = _.Power; diff --git a/lib/IRremoteESP8266/src/ir_Teknopoint.cpp b/lib/IRremoteESP8266/src/ir_Teknopoint.cpp index 0feee6d70..4a5eef9be 100644 --- a/lib/IRremoteESP8266/src/ir_Teknopoint.cpp +++ b/lib/IRremoteESP8266/src/ir_Teknopoint.cpp @@ -6,6 +6,7 @@ // Supports: // Brand: Teknopoint, Model: Allegro SSA-09H A/C // Brand: Teknopoint, Model: GZ-055B-E1 remote +// Brand: Teknopoint, Model: GZ01-BEJ0-000 remote #include "IRrecv.h" #include "IRsend.h" @@ -73,3 +74,8 @@ bool IRrecv::decodeTeknopoint(decode_results *results, uint16_t offset, return true; } #endif // DECODE_TEKNOPOINT + +// Looking for the IRTeknopoint/IRTeknopointAc class? +// It doesn't exist, it is instead part of the `IRTcl112Ac` class. +// i.e. use `IRTcl112Ac::setModel(tcl_ac_remote_model_t::GZ055BE1);` for +// Teknopoint A/Cs. diff --git a/lib/IRremoteESP8266/src/ir_Toshiba.cpp b/lib/IRremoteESP8266/src/ir_Toshiba.cpp index 7333493ef..c9672bcab 100644 --- a/lib/IRremoteESP8266/src/ir_Toshiba.cpp +++ b/lib/IRremoteESP8266/src/ir_Toshiba.cpp @@ -409,7 +409,7 @@ stdAc::fanspeed_t IRToshibaAC::toCommonFanSpeed(const uint8_t spd) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRToshibaAC::toCommon(const stdAc::state_t *prev) const { - stdAc::state_t result; + stdAc::state_t result{}; // Start with the previous state if given it. if (prev != NULL) { result = *prev; diff --git a/lib/IRremoteESP8266/src/ir_Toto.cpp b/lib/IRremoteESP8266/src/ir_Toto.cpp new file mode 100644 index 000000000..2997e760e --- /dev/null +++ b/lib/IRremoteESP8266/src/ir_Toto.cpp @@ -0,0 +1,131 @@ +// Copyright 2022 David Conran (crankyoldgit) +/// @file +/// @brief Support for the Toto Toilet IR protocols. +/// @see https://www.d-resi.jp/dt/nishi-shinjuku/limited/imgs/pdf/book6.pdf +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1806 + +// Supports: +// Brand: Toto, Model: Washlet Toilet NJ + +#include <algorithm> +#include "IRrecv.h" +#include "IRsend.h" +#include "IRutils.h" + +// Constants +const uint16_t kTotoHdrMark = 6197; +const uint16_t kTotoHdrSpace = 2754; +const uint16_t kTotoBitMark = 600; +const uint16_t kTotoOneSpace = 1634; +const uint16_t kTotoZeroSpace = 516; +const uint16_t kTotoGap = 38000; +const uint16_t kTotoSpecialGap = 42482; +const uint64_t kTotoPrefix = 0x0802; +const uint16_t kTotoPrefixBits = 15; + +#if SEND_TOTO +/// Send a Toto Toilet formatted message. +/// Status: BETA / Seems to work. +/// @param[in] data The message to be sent. +/// @param[in] nbits The number of bits of message to be sent. +/// @param[in] repeat The number of times the command is to be repeated. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1806 +void IRsend::sendToto(const uint64_t data, const uint16_t nbits, + const uint16_t repeat) { + if (nbits <= kTotoShortBits) { // Short code message. + sendGeneric(kTotoHdrMark, kTotoHdrSpace, + kTotoBitMark, kTotoOneSpace, + kTotoBitMark, kTotoZeroSpace, + kTotoBitMark, kTotoGap, + (data << kTotoPrefixBits) | kTotoPrefix, + nbits + kTotoPrefixBits, + 38, false, repeat, kDutyDefault); + } else { // Long code message + // This is really two messages sent at least one extra time each. + sendToto(data >> kTotoShortBits, nbits - kTotoShortBits, repeat + 1); + sendToto(GETBITS64(data, 0, kTotoShortBits), kTotoShortBits, repeat + 1); + } +} +#endif // SEND_TOTO + +#if DECODE_TOTO +/// Decode the supplied Toto Toilet message. +/// Status: ALPHA / Untested. +/// @param[in,out] results Ptr to the data to decode & where to store the result +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return True if it can decode it, false if it can't. +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1806 +bool IRrecv::decodeToto(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (strict && nbits != kTotoShortBits && nbits != kTotoLongBits) + return false; // We expect Toto to be a certain sized messages. + + const uint16_t repeats = (nbits > kTotoShortBits) ? kTotoDefaultRepeat + 1 + : kTotoDefaultRepeat; + const uint16_t ksections = (nbits > kTotoShortBits) ? 2 : 1; + const uint16_t ksection_bits = nbits / ksections; + + if (results->rawlen < (2 * (nbits + kTotoPrefixBits) + kHeader + kFooter) * + (repeats + 1) - 1 + offset) + return false; // We don't have enough entries to possibly match. + + uint16_t used = 0; + + // Long messages have two sections, short have only one. + for (uint16_t section = 1; section <= ksections; section++) { + results->value <<= ksection_bits; + uint64_t data = 0; + uint64_t repeat_data = 0; + for (uint16_t r = 0; r <= repeats; r++) { // We expect a repeat. + uint64_t prefix = 0; + // Header + Prefix + used = matchGeneric(results->rawbuf + offset, &prefix, + results->rawlen - offset, kTotoPrefixBits, + kTotoHdrMark, kTotoHdrSpace, + kTotoBitMark, kTotoOneSpace, + kTotoBitMark, kTotoZeroSpace, + 0, 0, false, // No Footer + kUseDefTol, kMarkExcess, false); + if (!used) return false; // Didn't match, so fail. + offset += used; + if (strict && (prefix != kTotoPrefix)) return false; + // Data + Footer + Gap + used = matchGeneric(results->rawbuf + offset, &data, + results->rawlen - offset, ksection_bits, + 0, 0, // No Header + kTotoBitMark, kTotoOneSpace, + kTotoBitMark, kTotoZeroSpace, + kTotoBitMark, kTotoGap, true, + kUseDefTol, kMarkExcess, false); + if (!used) return false; // Didn't match, so fail. + offset += used; + if (strict) { + if (r && data != repeat_data) return false; // Repeat didn't match. + // Integrity check. + uint8_t result = 0; + uint64_t check = data; + uint16_t bits = 0; + // Loop over the data 8 bits at a time. + while (bits < ksection_bits) { + result ^= (check & 0b111111111); // Xor with the last 8 bits. + bits += 8; + check >>= 8; + } + if (result) return false; // Intergrity check failed. + } + repeat_data = data; + } + results->value |= data; + } + // Success + results->bits = nbits; + results->decode_type = decode_type_t::TOTO; + results->command = GETBITS64(results->value, 0, ksection_bits - 8); + results->address = GETBITS64(results->value, ksection_bits, + ksection_bits - 8); + return true; +} +#endif // DECODE_TOTO diff --git a/lib/IRremoteESP8266/src/ir_Transcold.cpp b/lib/IRremoteESP8266/src/ir_Transcold.cpp index 14cc7f8bd..0de351368 100644 --- a/lib/IRremoteESP8266/src/ir_Transcold.cpp +++ b/lib/IRremoteESP8266/src/ir_Transcold.cpp @@ -339,7 +339,7 @@ stdAc::fanspeed_t IRTranscoldAc::toCommonFanSpeed(const uint8_t speed) { /// @param[in] prev Ptr to the previous state if required. /// @return A stdAc::state_t state. stdAc::state_t IRTranscoldAc::toCommon(const stdAc::state_t *prev) const { - stdAc::state_t result; + stdAc::state_t result{}; // Start with the previous state if given it. if (prev != NULL) { result = *prev; diff --git a/lib/IRremoteESP8266/src/ir_Trotec.cpp b/lib/IRremoteESP8266/src/ir_Trotec.cpp index 7cd6fff5e..c7de83aea 100644 --- a/lib/IRremoteESP8266/src/ir_Trotec.cpp +++ b/lib/IRremoteESP8266/src/ir_Trotec.cpp @@ -266,7 +266,7 @@ stdAc::fanspeed_t IRTrotecESP::toCommonFanSpeed(const uint8_t spd) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRTrotecESP::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::TROTEC; result.power = _.Power; result.mode = toCommonMode(_.Mode); @@ -601,7 +601,7 @@ stdAc::fanspeed_t IRTrotec3550::toCommonFanSpeed(const uint8_t spd) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRTrotec3550::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::TROTEC_3550; result.power = _.Power; result.mode = toCommonMode(_.Mode); diff --git a/lib/IRremoteESP8266/src/ir_Truma.cpp b/lib/IRremoteESP8266/src/ir_Truma.cpp index 853c640e1..55033efb8 100644 --- a/lib/IRremoteESP8266/src/ir_Truma.cpp +++ b/lib/IRremoteESP8266/src/ir_Truma.cpp @@ -295,7 +295,7 @@ stdAc::fanspeed_t IRTrumaAc::toCommonFanSpeed(const uint8_t spd) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRTrumaAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::TRUMA; result.model = -1; // Not supported. diff --git a/lib/IRremoteESP8266/src/ir_Vestel.cpp b/lib/IRremoteESP8266/src/ir_Vestel.cpp index 803363a16..c0b47078a 100644 --- a/lib/IRremoteESP8266/src/ir_Vestel.cpp +++ b/lib/IRremoteESP8266/src/ir_Vestel.cpp @@ -442,7 +442,7 @@ stdAc::fanspeed_t IRVestelAc::toCommonFanSpeed(const uint8_t spd) { /// Convert the current internal state into its stdAc::state_t equivalent. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRVestelAc::toCommon(void) const { - stdAc::state_t result; + stdAc::state_t result{}; result.protocol = decode_type_t::VESTEL_AC; result.model = -1; // Not supported. result.power = _.Power; diff --git a/lib/IRremoteESP8266/src/ir_Voltas.cpp b/lib/IRremoteESP8266/src/ir_Voltas.cpp index 847446f38..9837e0605 100644 --- a/lib/IRremoteESP8266/src/ir_Voltas.cpp +++ b/lib/IRremoteESP8266/src/ir_Voltas.cpp @@ -454,7 +454,7 @@ void IRVoltas::setOffTime(const uint16_t nr_of_mins) { /// @param[in] prev Ptr to the previous state if available. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRVoltas::toCommon(const stdAc::state_t *prev) { - stdAc::state_t result; + stdAc::state_t result{}; // Start with the previous state if given it. if (prev != NULL) { result = *prev; diff --git a/lib/IRremoteESP8266/src/ir_Voltas.h b/lib/IRremoteESP8266/src/ir_Voltas.h index cf79d3458..d8ad77bcb 100644 --- a/lib/IRremoteESP8266/src/ir_Voltas.h +++ b/lib/IRremoteESP8266/src/ir_Voltas.h @@ -9,6 +9,7 @@ // // Ref: https://docs.google.com/spreadsheets/d/1zzDEUQ52y7MZ7_xCU3pdjdqbRXOwZLsbTGvKWcicqCI/ // Ref: https://www.corona.co.jp/box/download.php?id=145060636229 +// Ref: https://github.com/crankyoldgit/IRremoteESP8266/files/8646964/Voltas.Window.AC.122LZF.Remote.Instructions.pdf #ifndef IR_VOLTAS_H_ #define IR_VOLTAS_H_ diff --git a/lib/IRremoteESP8266/src/ir_Whirlpool.cpp b/lib/IRremoteESP8266/src/ir_Whirlpool.cpp index 0bba57bfe..6dde68401 100644 --- a/lib/IRremoteESP8266/src/ir_Whirlpool.cpp +++ b/lib/IRremoteESP8266/src/ir_Whirlpool.cpp @@ -493,7 +493,7 @@ stdAc::fanspeed_t IRWhirlpoolAc::toCommonFanSpeed(const uint8_t speed) { /// @param[in] prev Ptr to the previous state if required. /// @return The stdAc equivalent of the native settings. stdAc::state_t IRWhirlpoolAc::toCommon(const stdAc::state_t *prev) const { - stdAc::state_t result; + stdAc::state_t result{}; // Start with the previous state if given it. if (prev != NULL) { result = *prev; diff --git a/lib/IRremoteESP8266/src/locale/defaults.h b/lib/IRremoteESP8266/src/locale/defaults.h index d8142e20e..40b85c27c 100644 --- a/lib/IRremoteESP8266/src/locale/defaults.h +++ b/lib/IRremoteESP8266/src/locale/defaults.h @@ -566,6 +566,9 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_YBOFB #define D_STR_YBOFB "YBOFB" #endif // D_STR_YBOFB +#ifndef D_STR_YX1FSF +#define D_STR_YX1FSF "YX1FSF" +#endif // D_STR_YX1FSF #ifndef D_STR_V9014557_A #define D_STR_V9014557_A "V9014557-A" #endif // D_STR_V9014557_A @@ -608,6 +611,9 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_AKB73757604 #define D_STR_AKB73757604 "AKB73757604" #endif // D_STR_AKB73757604 +#ifndef D_STR_LG6711A20083V +#define D_STR_LG6711A20083V "LG6711A20083V" +#endif // D_STR_LG6711A20083V #ifndef D_STR_KKG9AC1 #define D_STR_KKG9AC1 "KKG9AC1" #endif // D_STR_KKG9AC1 @@ -703,6 +709,12 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_ARRIS #define D_STR_ARRIS "ARRIS" #endif // D_STR_ARRIS +#ifndef D_STR_BOSCH +#define D_STR_BOSCH "BOSCH" +#endif // D_STR_BOSCH +#ifndef D_STR_BOSCH144 +#define D_STR_BOSCH144 D_STR_BOSCH "144" +#endif // D_STR_BOSCH144 #ifndef D_STR_BOSE #define D_STR_BOSE "BOSE" #endif // D_STR_BOSE @@ -715,6 +727,12 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_CARRIER_AC64 #define D_STR_CARRIER_AC64 D_STR_CARRIER_AC "64" #endif // D_STR_CARRIER_AC64 +#ifndef D_STR_CARRIER_AC128 +#define D_STR_CARRIER_AC128 D_STR_CARRIER_AC "128" +#endif // D_STR_CARRIER_AC128 +#ifndef D_STR_CLIMABUTLER +#define D_STR_CLIMABUTLER "CLIMABUTLER" +#endif // D_STR_CLIMABUTLER #ifndef D_STR_COOLIX #define D_STR_COOLIX "COOLIX" #endif // D_STR_COOLIX @@ -728,25 +746,31 @@ D_STR_INDIRECT " " D_STR_MODE #define D_STR_DAIKIN "DAIKIN" #endif // D_STR_DAIKIN #ifndef D_STR_DAIKIN128 -#define D_STR_DAIKIN128 "DAIKIN128" +#define D_STR_DAIKIN128 D_STR_DAIKIN "128" #endif // D_STR_DAIKIN128 #ifndef D_STR_DAIKIN152 -#define D_STR_DAIKIN152 "DAIKIN152" +#define D_STR_DAIKIN152 D_STR_DAIKIN "152" #endif // D_STR_DAIKIN152 #ifndef D_STR_DAIKIN160 -#define D_STR_DAIKIN160 "DAIKIN160" +#define D_STR_DAIKIN160 D_STR_DAIKIN "160" #endif // D_STR_DAIKIN160 #ifndef D_STR_DAIKIN176 -#define D_STR_DAIKIN176 "DAIKIN176" +#define D_STR_DAIKIN176 D_STR_DAIKIN "176" #endif // D_STR_DAIKIN176 #ifndef D_STR_DAIKIN2 -#define D_STR_DAIKIN2 "DAIKIN2" +#define D_STR_DAIKIN2 D_STR_DAIKIN "2" #endif // D_STR_DAIKIN2 +#ifndef D_STR_DAIKIN200 +#define D_STR_DAIKIN200 D_STR_DAIKIN "200" +#endif // D_STR_DAIKIN200 #ifndef D_STR_DAIKIN216 -#define D_STR_DAIKIN216 "DAIKIN216" +#define D_STR_DAIKIN216 D_STR_DAIKIN "216" #endif // D_STR_DAIKIN216 +#ifndef D_STR_DAIKIN312 +#define D_STR_DAIKIN312 D_STR_DAIKIN "312" +#endif // D_STR_DAIKIN312 #ifndef D_STR_DAIKIN64 -#define D_STR_DAIKIN64 "DAIKIN64" +#define D_STR_DAIKIN64 D_STR_DAIKIN "64" #endif // D_STR_DAIKIN64 #ifndef D_STR_DELONGHI_AC #define D_STR_DELONGHI_AC "DELONGHI_AC" @@ -791,28 +815,37 @@ D_STR_INDIRECT " " D_STR_MODE #define D_STR_HAIER_AC "HAIER_AC" #endif // D_STR_HAIER_AC #ifndef D_STR_HAIER_AC_YRW02 -#define D_STR_HAIER_AC_YRW02 "HAIER_AC_YRW02" +#define D_STR_HAIER_AC_YRW02 D_STR_HAIER_AC "_YRW02" #endif // D_STR_HAIER_AC_YRW02 +#ifndef D_STR_HAIER_AC160 +#define D_STR_HAIER_AC160 D_STR_HAIER_AC "160" +#endif // D_STR_HAIER_AC160 #ifndef D_STR_HAIER_AC176 -#define D_STR_HAIER_AC176 "HAIER_AC176" +#define D_STR_HAIER_AC176 D_STR_HAIER_AC "176" #endif // D_STR_HAIER_AC176 #ifndef D_STR_HITACHI_AC #define D_STR_HITACHI_AC "HITACHI_AC" #endif // D_STR_HITACHI_AC #ifndef D_STR_HITACHI_AC1 -#define D_STR_HITACHI_AC1 "HITACHI_AC1" +#define D_STR_HITACHI_AC1 D_STR_HITACHI_AC "1" #endif // D_STR_HITACHI_AC1 #ifndef D_STR_HITACHI_AC2 -#define D_STR_HITACHI_AC2 "HITACHI_AC2" +#define D_STR_HITACHI_AC2 D_STR_HITACHI_AC "2" #endif // D_STR_HITACHI_AC2 #ifndef D_STR_HITACHI_AC3 -#define D_STR_HITACHI_AC3 "HITACHI_AC3" +#define D_STR_HITACHI_AC3 D_STR_HITACHI_AC "3" #endif // D_STR_HITACHI_AC3 +#ifndef D_STR_HITACHI_AC264 +#define D_STR_HITACHI_AC264 D_STR_HITACHI_AC "264" +#endif // D_STR_HITACHI_AC264 +#ifndef D_STR_HITACHI_AC296 +#define D_STR_HITACHI_AC296 D_STR_HITACHI_AC "296" +#endif // D_STR_HITACHI_AC296 #ifndef D_STR_HITACHI_AC344 -#define D_STR_HITACHI_AC344 "HITACHI_AC344" +#define D_STR_HITACHI_AC344 D_STR_HITACHI_AC "344" #endif // D_STR_HITACHI_AC344 #ifndef D_STR_HITACHI_AC424 -#define D_STR_HITACHI_AC424 "HITACHI_AC424" +#define D_STR_HITACHI_AC424 D_STR_HITACHI_AC "424" #endif // D_STR_HITACHI_AC424 #ifndef D_STR_INAX #define D_STR_INAX "INAX" @@ -823,6 +856,9 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_KELON #define D_STR_KELON "KELON" #endif // D_STR_KELON +#ifndef D_STR_KELON168 +#define D_STR_KELON168 D_STR_KELON "168" +#endif // D_STR_KELON168 #ifndef D_STR_KELVINATOR #define D_STR_KELVINATOR "KELVINATOR" #endif // D_STR_KELVINATOR @@ -947,13 +983,16 @@ D_STR_INDIRECT " " D_STR_MODE #define D_STR_SANYO "SANYO" #endif // D_STR_SANYO #ifndef D_STR_SANYO_AC -#define D_STR_SANYO_AC "SANYO_AC" +#define D_STR_SANYO_AC D_STR_SANYO "_AC" #endif // D_STR_SANYO_AC #ifndef D_STR_SANYO_AC88 -#define D_STR_SANYO_AC88 "SANYO_AC88" +#define D_STR_SANYO_AC88 D_STR_SANYO_AC "88" #endif // D_STR_SANYO_AC88 +#ifndef D_STR_SANYO_AC152 +#define D_STR_SANYO_AC152 D_STR_SANYO_AC "152" +#endif // D_STR_SANYO_AC152 #ifndef D_STR_SANYO_LC7461 -#define D_STR_SANYO_LC7461 "SANYO_LC7461" +#define D_STR_SANYO_LC7461 D_STR_SANYO "_LC7461" #endif // D_STR_SANYO_LC7461 #ifndef D_STR_SHARP #define D_STR_SHARP "SHARP" @@ -973,6 +1012,9 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_SYMPHONY #define D_STR_SYMPHONY "SYMPHONY" #endif // D_STR_SYMPHONY +#ifndef D_STR_TCL96AC +#define D_STR_TCL96AC "TCL96AC" +#endif // D_STR_TCL96AC #ifndef D_STR_TCL112AC #define D_STR_TCL112AC "TCL112AC" #endif // D_STR_TCL112AC @@ -988,6 +1030,9 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_TOSHIBA_AC #define D_STR_TOSHIBA_AC "TOSHIBA_AC" #endif // D_STR_TOSHIBA_AC +#ifndef D_STR_TOTO +#define D_STR_TOTO "TOTO" +#endif // D_STR_TOTO #ifndef D_STR_TRANSCOLD #define D_STR_TRANSCOLD "TRANSCOLD" #endif // D_STR_TRANSCOLD diff --git a/lib/IRremoteESP8266/test/IRac_test.cpp b/lib/IRremoteESP8266/test/IRac_test.cpp index 2988e4b4b..30d9f7e4f 100644 --- a/lib/IRremoteESP8266/test/IRac_test.cpp +++ b/lib/IRremoteESP8266/test/IRac_test.cpp @@ -623,9 +623,9 @@ TEST(TestIRac, Fujitsu) { "Model: 2 (ARDB1), Id: 0, Power: On, Mode: 1 (Cool), Temp: 19C, " "Fan: 2 (Medium), Command: N/A"; std::string arrah2e_expected = - "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 1 (Cool), Temp: 19C, " - "Fan: 2 (Medium), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Sleep Timer: 03:00"; + "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 3 (Fan), Temp: 10C, " + "Fan: 0 (Auto), Clean: Off, Filter: Off, 10C Heat: On, " + "Swing: 0 (Off), Command: N/A, Sleep Timer: 03:00"; std::string arry4_expected = "Model: 5 (ARRY4), Id: 0, Power: On, Mode: 1 (Cool), Temp: 19C, " "Fan: 2 (Medium), Clean: On, Filter: On, Swing: 0 (Off), Command: N/A"; @@ -658,20 +658,21 @@ TEST(TestIRac, Fujitsu) { ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); ac._irsend.reset(); + // Try to set the device to 10C Heat mode. irac.fujitsu(&ac, ARRAH2E, // Model true, // Power - stdAc::opmode_t::kCool, // Mode + stdAc::opmode_t::kFan, // Mode (Fan needed for 10C Heat) true, // Celsius - 19, // Degrees - stdAc::fanspeed_t::kMedium, // Fan speed - stdAc::swingv_t::kOff, // Vertical swing - stdAc::swingh_t::kOff, // Horizontal swing + 19, // Degrees (Ignored in 10C Heat) + stdAc::fanspeed_t::kAuto, // Fan speed (Auto needed for 10C) + stdAc::swingv_t::kOff, // Vertical swing (Ditto) + stdAc::swingh_t::kOff, // Horizontal swing (Ditto) false, // Quiet false, // Turbo (Powerful) false, // Econo true, // Filter - true, // Clean + true, // Clean (Needed for 10C Heat) 3 * 60); // Sleep ASSERT_EQ(arrah2e_expected, ac.toString()); ac._irsend.makeDecodeResult(); @@ -944,6 +945,63 @@ TEST(TestIRac, Hitachi1) { ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); } +TEST(TestIRac, Hitachi264) { + IRHitachiAc264 ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); + char expected_swingon[] = + "Power: On, Mode: 6 (Heat), Temp: 25C, Fan: 4 (High), " + "Button: 19 (Power/Mode)"; + + ac.begin(); + irac.hitachi264(&ac, + true, // Power + stdAc::opmode_t::kHeat, // Mode + 25, // Celsius + stdAc::fanspeed_t::kMax); // Fan speed + + ASSERT_EQ(expected_swingon, ac.toString()); + ac._irsend.makeDecodeResult(); + EXPECT_TRUE(capture.decode(&ac._irsend.capture)); + ASSERT_EQ(HITACHI_AC264, ac._irsend.capture.decode_type); + ASSERT_EQ(kHitachiAc264Bits, ac._irsend.capture.bits); + ASSERT_EQ(expected_swingon, IRAcUtils::resultAcToString(&ac._irsend.capture)); + stdAc::state_t r, p; + ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + EXPECT_EQ(decode_type_t::HITACHI_AC264, r.protocol); + EXPECT_TRUE(r.power); + EXPECT_EQ(stdAc::opmode_t::kHeat, r.mode); + EXPECT_EQ(25, r.degrees); +} + +TEST(TestIRac, Hitachi296) { + IRHitachiAc296 ac(kGpioUnused); + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); + char expected[] = + "Power: On, Mode: 6 (Heat), Temp: 20C, Fan: 2 (Low)"; + + ac.begin(); + irac.hitachi296(&ac, + true, // Power + stdAc::opmode_t::kHeat, // Mode + 20, // Celsius + stdAc::fanspeed_t::kLow); // Fan speed + + ASSERT_EQ(expected, ac.toString()); + ac._irsend.makeDecodeResult(); + EXPECT_TRUE(capture.decode(&ac._irsend.capture)); + ASSERT_EQ(HITACHI_AC296, ac._irsend.capture.decode_type); + ASSERT_EQ(kHitachiAc296Bits, ac._irsend.capture.bits); + ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); + stdAc::state_t r, p; + ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + EXPECT_EQ(decode_type_t::HITACHI_AC296, r.protocol); + EXPECT_TRUE(r.power); + EXPECT_EQ(stdAc::opmode_t::kHeat, r.mode); + EXPECT_EQ(20, r.degrees); +} + TEST(TestIRac, Hitachi344) { IRHitachiAc344 ac(kGpioUnused); IRac irac(kGpioUnused); @@ -1047,7 +1105,7 @@ TEST(TestIRac, Kelvinator) { char expected[] = "Power: On, Mode: 1 (Cool), Temp: 19C, Fan: 3 (Medium), Turbo: Off, " "Quiet: Off, XFan: On, Ion: On, Light: On, " - "Swing(H): Off, Swing(V): Off"; + "Swing(H): Off, Swing(V): 0 (Off)"; ac.begin(); irac.kelvinator(&ac, @@ -1359,8 +1417,8 @@ TEST(TestIRac, Midea) { char expected[] = "Type: 1 (Command), Power: On, Mode: 1 (Dry), Celsius: On, " "Temp: 27C/80F, On Timer: Off, Off Timer: Off, Fan: 2 (Medium), " - "Sleep: On, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off"; + "Sleep: On, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -"; ac.begin(); irac.midea(&ac, @@ -1370,9 +1428,12 @@ TEST(TestIRac, Midea) { 27, // Degrees stdAc::fanspeed_t::kMedium, // Fan speed stdAc::swingv_t::kOff, // Swing(V) + false, // Silent/Quiet + false, // Previous Silent/Quiet setting false, // Turbo false, // Econo false, // Light + false, // Clean 8 * 60 + 0); // Sleep time ASSERT_EQ(expected, ac.toString()); @@ -2962,7 +3023,6 @@ TEST(TestIRac, Issue1250) { TEST(TestIRac, Issue1339) { IRac irac(kGpioUnused); stdAc::state_t to_send; - IRac::initState(&to_send); to_send.protocol = decode_type_t::SAMSUNG_AC; ASSERT_TRUE(irac.sendAc(to_send, NULL)); @@ -3027,3 +3087,20 @@ TEST(TestIRac, Issue1424) { // Confirm the state really did change. ASSERT_TRUE(IRac::cmpStates(irac.next, copy_of_next_pre_receive)); } + +// Confirm/check that the default initialisation of a state_t is as expected. +TEST(TestIRac, initState) { + IRac irac(kGpioUnused); + stdAc::state_t builtin_init{}; + stdAc::state_t custom_init; + stdAc::state_t no_init; + IRac::initState(&custom_init); + + EXPECT_FALSE(IRac::cmpStates(builtin_init, custom_init)); + builtin_init.protocol = decode_type_t::SAMSUNG_AC; + EXPECT_TRUE(IRac::cmpStates(builtin_init, custom_init)); + EXPECT_FALSE(IRac::cmpStates(no_init, custom_init)); + EXPECT_EQ(-1, builtin_init.model); + EXPECT_EQ(stdAc::swingv_t::kOff, builtin_init.swingv); + EXPECT_EQ(decode_type_t::UNKNOWN, no_init.protocol); +} diff --git a/lib/IRremoteESP8266/test/IRutils_test.cpp b/lib/IRremoteESP8266/test/IRutils_test.cpp index 73ba56999..c5a6d1339 100644 --- a/lib/IRremoteESP8266/test/IRutils_test.cpp +++ b/lib/IRremoteESP8266/test/IRutils_test.cpp @@ -780,3 +780,17 @@ TEST(TestUtils, InvertedBytePairs) { TEST(TestUtils, lowLevelSanityCheck) { ASSERT_EQ(0, irutils::lowLevelSanityCheck()); } + +TEST(TestUtils, VersionDefines) { + // String + String version_str = uint64ToString(_IRREMOTEESP8266_VERSION_MAJOR) + '.' + + uint64ToString(_IRREMOTEESP8266_VERSION_MINOR) + '.' + + uint64ToString(_IRREMOTEESP8266_VERSION_PATCH); // e.g. "2.8.1" + ASSERT_EQ(_IRREMOTEESP8266_VERSION_STR, version_str); + ASSERT_EQ(_IRREMOTEESP8266_VERSION_, version_str); + // Integer + uint64_t version_int = (_IRREMOTEESP8266_VERSION_MAJOR << 16) + + (_IRREMOTEESP8266_VERSION_MINOR << 8) + + _IRREMOTEESP8266_VERSION_PATCH; + ASSERT_EQ(_IRREMOTEESP8266_VERSION, version_int); +} diff --git a/lib/IRremoteESP8266/test/ir_Bosch_test.cpp b/lib/IRremoteESP8266/test/ir_Bosch_test.cpp new file mode 100644 index 000000000..e9b6dc9ce --- /dev/null +++ b/lib/IRremoteESP8266/test/ir_Bosch_test.cpp @@ -0,0 +1,100 @@ +// Copyright 2022 David Conran + +#include "IRac.h" +#include "IRrecv.h" +#include "IRrecv_test.h" +#include "IRsend.h" +#include "IRsend_test.h" +#include "gtest/gtest.h" + + +TEST(TestUtils, Housekeeping) { + // Bosch144 + ASSERT_EQ("BOSCH144", typeToString(decode_type_t::BOSCH144)); + ASSERT_EQ(decode_type_t::BOSCH144, strToDecodeType("BOSCH144")); + ASSERT_TRUE(hasACState(decode_type_t::BOSCH144)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::BOSCH144)); + ASSERT_EQ(kBosch144Bits, IRsend::defaultBits(decode_type_t::BOSCH144)); + ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::BOSCH144)); +} + +// Tests for decodeBosch144(). + +// Decode normal Bosch144 messages. +TEST(TestDecodeBosch144, RealExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1787#issuecomment-1099993189 + // Mode: Cool; Fan: 100% ; Temp: 16°C + const uint16_t rawData[299] = { + 4380, 4400, + 528, 1646, 504, 570, 504, 1646, 504, 1646, 504, 572, 502, 570, 504, 1646, + 504, 570, 504, 572, 502, 1646, 504, 570, 502, 570, 502, 1648, 502, 1646, + 502, 570, 502, 1646, 504, 572, 502, 572, 502, 1644, 504, 1646, 504, 1646, + 504, 1646, 502, 1648, 500, 1646, 504, 1646, 504, 1646, 504, 572, 502, 570, + 504, 570, 504, 570, 504, 570, 504, 570, 506, 570, 502, 572, 502, 570, 502, + 572, 502, 572, 502, 572, 502, 572, 502, 572, 500, 1648, 502, 1644, 502, + 1646, 504, 1646, 502, 1646, 504, 1646, 504, 1644, 504, 1646, + 504, 5234, + 4360, 4422, + 504, 1646, 502, 596, 478, 1670, 478, 1646, 504, 570, 504, 572, 500, 1646, + 502, 572, 502, 572, 502, 1644, 506, 570, 502, 570, 504, 1644, 506, 1644, + 502, 574, 502, 1644, 504, 570, 504, 570, 504, 1644, 504, 1646, 504, 1644, + 506, 1644, 504, 1646, 504, 1646, 504, 1644, 504, 1646, 502, 570, 504, 570, + 504, 570, 504, 570, 502, 570, 504, 570, 502, 572, 502, 570, 504, 570, 504, + 570, 504, 570, 502, 572, 502, 570, 506, 570, 504, 1646, 502, 1646, 504, + 1646, 504, 1646, 504, 1646, 502, 1644, 504, 1644, 504, 1646, + 502, 5236, + 4360, 4424, + 504, 1646, 504, 1646, 502, 572, 504, 1644, 504, 570, 504, 1646, 504, 570, + 502, 1644, 504, 570, 504, 1644, 506, 1646, 502, 572, 502, 572, 502, 1646, + 504, 570, 504, 570, 504, 570, 502, 572, 504, 570, 504, 570, 504, 570, 502, + 572, 502, 570, 504, 570, 502, 570, 504, 572, 502, 572, 502, 1646, 504, + 570, 504, 570, 504, 570, 502, 574, 502, 572, 502, 572, 502, 572, 502, 572, + 502, 572, 502, 570, 504, 572, 502, 572, 502, 572, 502, 1646, 504, 572, + 502, 570, 502, 1646, 504, 572, 504, 570, 504, 1644, + 504}; // COOLIX B23F00 + const uint8_t expectedState[kBosch144StateLength] = { + 0xB2, 0x4D, 0x3F, 0xC0, 0x00, 0xFF, + 0xB2, 0x4D, 0x3F, 0xC0, 0x00, 0xFF, + 0xD5, 0x64, 0x00, 0x10, 0x00, 0x49}; + irsend.begin(); + irsend.reset(); + + irsend.sendRaw(rawData, 299, 38000); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::BOSCH144, irsend.capture.decode_type); + EXPECT_EQ(kBosch144Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t result, prev; + ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &result, &prev)); +} + +TEST(TestDecodeBosch144, SyntheticSelfDecode) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + const uint8_t expectedState[kBosch144StateLength] = { + 0xB2, 0x4D, 0x3F, 0xC0, 0x00, 0xFF, + 0xB2, 0x4D, 0x3F, 0xC0, 0x00, 0xFF, + 0xD5, 0x64, 0x00, 0x10, 0x00, 0x49}; + irsend.sendBosch144(expectedState); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::BOSCH144, irsend.capture.decode_type); + EXPECT_EQ(kBosch144Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t result, prev; + ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &result, &prev)); +} diff --git a/lib/IRremoteESP8266/test/ir_Carrier_test.cpp b/lib/IRremoteESP8266/test/ir_Carrier_test.cpp index caf7e46d8..fa0f07b0c 100644 --- a/lib/IRremoteESP8266/test/ir_Carrier_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Carrier_test.cpp @@ -1,8 +1,9 @@ -// Copyright 2018, 2020 David Conran +// Copyright 2018-2022 David Conran #include "ir_Carrier.h" #include "IRac.h" #include "IRrecv.h" +#include "IRrecv_test.h" #include "IRsend.h" #include "IRsend_test.h" #include "gtest/gtest.h" @@ -11,7 +12,7 @@ // Test sending typical data only. TEST(TestSendCarrierAC, SendDataOnly) { - IRsendTest irsend(0); + IRsendTest irsend(kGpioUnused); irsend.begin(); irsend.reset(); @@ -88,7 +89,7 @@ TEST(TestSendCarrierAC, SendDataOnly) { // Test sending typical data only. TEST(TestSendCarrierAC, SendWithRepeats) { - IRsendTest irsend(0); + IRsendTest irsend(kGpioUnused); irsend.begin(); irsend.reset(); @@ -156,7 +157,7 @@ TEST(TestSendCarrierAC, SendWithRepeats) { // Decode normal "synthetic" messages. TEST(TestDecodeCarrierAC, NormalDecodeWithStrict) { - IRsendTest irsend(0); + IRsendTest irsend(kGpioUnused); IRrecv irrecv(0); irsend.begin(); @@ -196,7 +197,7 @@ TEST(TestDecodeCarrierAC, NormalDecodeWithStrict) { // Decode a "real" example message. TEST(TestDecodeCarrierAC, RealExamples) { - IRsendTest irsend(0); + IRsendTest irsend(kGpioUnused); IRrecv irrecv(0); irsend.begin(); @@ -262,6 +263,16 @@ TEST(TestUtils, Housekeeping) { IRsend::defaultBits(decode_type_t::CARRIER_AC64)); ASSERT_EQ(kCarrierAc64MinRepeat, IRsend::minRepeats(decode_type_t::CARRIER_AC64)); + + // CARRIER_AC128 + ASSERT_EQ("CARRIER_AC128", typeToString(decode_type_t::CARRIER_AC128)); + ASSERT_EQ(decode_type_t::CARRIER_AC128, strToDecodeType("CARRIER_AC128")); + ASSERT_TRUE(hasACState(decode_type_t::CARRIER_AC128)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::CARRIER_AC128)); + ASSERT_EQ(kCarrierAc128Bits, + IRsend::defaultBits(decode_type_t::CARRIER_AC128)); + ASSERT_EQ(kCarrierAc128MinRepeat, + IRsend::minRepeats(decode_type_t::CARRIER_AC128)); } /// Decode a "real" example message. @@ -610,3 +621,75 @@ TEST(TestCarrierAc64Class, ReconstructKnownState) { "Sleep: On, On Timer: Off, Off Timer: Off", ac.toString()); } + +// Decode a "real" Carrier 128bit example message. +TEST(TestDecodeCarrierAC128, RealExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + const uint8_t expected_state[kCarrierAc128StateLength] = { + 0x16, 0x22, 0x48, 0x19, 0x10, 0x10, 0x16, 0x28, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80}; + irsend.begin(); + + irsend.reset(); + // Data from: + // https://docs.google.com/spreadsheets/d/1lqs1UDAvUauzAyoVRAGhARKPaSk3pgOO7iHFw9M5HJE/edit#gid=0&range=F3 + const uint16_t rawData[267] = { + 4594, 2614, + 336, 418, 336, 998, 330, 1002, 338, 416, 336, 998, 332, 424, 328, 426, + 336, 416, 336, 418, 334, 1000, 332, 420, 330, 424, 338, 418, 336, 994, + 334, 420, 332, 424, 328, 424, 338, 416, 336, 418, 336, 996, 332, 422, 330, + 424, 338, 992, 338, 416, 336, 998, 332, 424, 336, 418, 336, 994, 336, 998, + 332, 420, 340, 416, 338, 416, 334, 420, 334, 420, 332, 424, 328, 426, 336, + 994, 336, 418, 334, 422, 330, 422, 332, 422, 338, 416, 338, 416, 336, 418, + 332, 1000, 332, 424, 336, 416, 338, 418, 334, 420, 332, 1000, 332, 1002, + 336, 416, 338, 994, 334, 422, 330, 424, 338, 416, 336, 416, 336, 420, 332, + 422, 330, 1000, 342, 412, 338, 996, 334, 422, 332, 402, + 338, 20636, + 4604, 6724, + 9296, 4976, + 356, 426, 336, 418, 334, 420, 332, 420, 330, 424, 340, 414, 338, 416, 336, + 420, 334, 418, 334, 420, 332, 422, 340, 416, 336, 418, 336, 416, 336, 420, + 332, 420, 332, 424, 338, 416, 336, 418, 336, 994, 334, 422, 332, 422, 340, + 412, 338, 418, 334, 418, 334, 420, 332, 422, 332, 424, 340, 414, 338, 414, + 336, 420, 334, 420, 330, 424, 328, 426, 336, 416, 336, 418, 334, 420, 366, + 388, 362, 392, 358, 392, 360, 394, 368, 386, 368, 388, 364, 388, 366, 390, + 360, 394, 358, 394, 368, 388, 366, 386, 366, 390, 362, 392, 358, 394, 360, + 394, 370, 384, 366, 388, 362, 390, 362, 390, 362, 392, 360, 396, 368, 384, + 366, 390, 364, 390, 362, 392, 360, 954, + 336, 20638, + 4622}; + + irsend.sendRaw(rawData, 267, 38000); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(CARRIER_AC128, irsend.capture.decode_type); + EXPECT_EQ(kCarrierAc128Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expected_state, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); +} + +// Decode a synthetic Carrier AC 128-bit message. +TEST(TestDecodeCarrierAC128, SyntheticExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + const uint8_t expected_state[kCarrierAc128StateLength] = { + 0x16, 0x22, 0x48, 0x19, 0x10, 0x10, 0x16, 0x28, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80}; + irsend.reset(); + irsend.sendCarrierAC128(expected_state); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(CARRIER_AC128, irsend.capture.decode_type); + ASSERT_EQ(kCarrierAc128Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expected_state, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); +} diff --git a/lib/IRremoteESP8266/test/ir_ClimaButler_test.cpp b/lib/IRremoteESP8266/test/ir_ClimaButler_test.cpp new file mode 100644 index 000000000..6a9841d27 --- /dev/null +++ b/lib/IRremoteESP8266/test/ir_ClimaButler_test.cpp @@ -0,0 +1,67 @@ +// Copyright 2022 crankyoldgit + +#include "IRac.h" +#include "IRrecv.h" +#include "IRrecv_test.h" +#include "IRsend.h" +#include "IRsend_test.h" +#include "gtest/gtest.h" + +// Tests for decodeClimaButler(). +TEST(TestDecodeClimaButler, RealExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + const uint16_t rawData[109] = { + 554, 3512, + 558, 1488, 580, 496, 522, 494, 546, 558, 552, 494, 548, 496, 546, 500, + 548, 558, 544, 504, 544, 502, 540, 506, 538, 570, 514, 530, 514, 532, 512, + 534, 512, 592, 512, 536, 510, 532, 510, 536, 510, 598, 510, 536, 506, 536, + 514, 534, 510, 594, 514, 534, 510, 536, 534, 510, 510, 598, 514, 534, 510, + 536, 508, 536, 534, 572, 534, 500, 512, 1536, 512, 526, 510, 1588, 512, + 1536, 510, 538, 512, 532, 510, 588, 510, 1536, 514, 532, 510, 536, 534, + 570, 512, 534, 510, 536, 514, 528, 540, 568, 540, 506, 512, 524, 510, + 1534, 516, 532, + 536, 3396, + 544}; // UNKNOWN E6CA5369 POWER OFF + irsend.begin(); + irsend.reset(); + irsend.sendRaw(rawData, 109, 38); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(decode_type_t::CLIMABUTLER, irsend.capture.decode_type); + ASSERT_EQ(kClimaButlerBits, irsend.capture.bits); + EXPECT_EQ(0x8000000058802, irsend.capture.value); + EXPECT_EQ(0x0, irsend.capture.address); + EXPECT_EQ(0x0, irsend.capture.command); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); +} + +TEST(TestDecodeClimaButler, SyntheticExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + irsend.reset(); + irsend.sendClimaButler(0x8000000058802); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(decode_type_t::CLIMABUTLER, irsend.capture.decode_type); + ASSERT_EQ(kClimaButlerBits, irsend.capture.bits); + EXPECT_EQ(0x8000000058802, irsend.capture.value); + EXPECT_EQ(0x0, irsend.capture.address); + EXPECT_EQ(0x0, irsend.capture.command); +} + +TEST(TestUtils, Housekeeping) { + ASSERT_EQ("CLIMABUTLER", typeToString(decode_type_t::CLIMABUTLER)); + ASSERT_EQ(decode_type_t::CLIMABUTLER, strToDecodeType("CLIMABUTLER")); + ASSERT_FALSE(hasACState(decode_type_t::CLIMABUTLER)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::CLIMABUTLER)); + ASSERT_EQ(kClimaButlerBits, IRsend::defaultBits(decode_type_t::CLIMABUTLER)); + ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::CLIMABUTLER)); +} diff --git a/lib/IRremoteESP8266/test/ir_Coolix_test.cpp b/lib/IRremoteESP8266/test/ir_Coolix_test.cpp index 62e0d6b0e..ba3610bc7 100644 --- a/lib/IRremoteESP8266/test/ir_Coolix_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Coolix_test.cpp @@ -600,6 +600,41 @@ TEST(TestDecodeCoolix, RealCaptureExample) { EXPECT_EQ(0x0, irsend.capture.command); } +TEST(TestDecodeCoolix, Issue1748Example) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1748#issuecomment-1024907551 + const uint16_t powerOffRawData[199] = { + 4642, 4502, 514, 1706, 516, 624, 488, 1704, 514, 1702, 516, 624, 488, 624, + 488, 1702, 514, 626, 488, 620, 488, 1702, 490, 620, 512, 620, 488, 1728, + 488, 1704, 514, 624, 488, 1704, 514, 620, 488, 1702, 490, 1722, 488, 1724, + 514, 1728, 488, 600, 512, 1728, 490, 1706, 512, 1698, 488, 646, 486, 622, + 462, 646, 488, 624, 488, 1704, 514, 626, 488, 628, 460, 1724, 514, 1702, + 514, 1724, 462, 646, 488, 624, 488, 624, 488, 626, 486, 602, 488, 646, + 460, 648, 486, 626, 488, 1704, 486, 1724, 488, 1748, 488, 1704, 514, 1708, + 488, 5312, 4648, 4494, 488, 1704, 486, 646, 486, 1698, 512, 1700, 488, + 646, 462, 646, 486, 1728, 462, 648, 484, 622, 462, 1724, 510, 622, 488, + 626, 488, 1702, 514, 1728, 490, 626, 488, 1730, 462, 646, 488, 1704, 512, + 1724, 486, 1698, 514, 1728, 488, 626, 488, 1728, 488, 1704, 514, 1700, + 512, 620, 486, 620, 488, 620, 486, 626, 490, 1728, 488, 626, 488, 628, + 460, 1750, 488, 1728, 488, 1704, 488, 646, 488, 620, 488, 624, 488, 626, + 488, 626, 462, 646, 462, 644, 488, 626, 488, 1728, 490, 1704, 486, 1724, + 514, 1724, 488, 1728, 488}; // COOLIX48 B24D7B84E01F + + irsend.begin(); + + irsend.reset(); + + irsend.sendRaw(powerOffRawData, 199, 38000); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(COOLIX, irsend.capture.decode_type); + EXPECT_EQ(kCoolixBits, irsend.capture.bits); + EXPECT_EQ(kCoolixOff, irsend.capture.value); + EXPECT_EQ(0x0, irsend.capture.address); + EXPECT_EQ(0x0, irsend.capture.command); +} // Tests to debug/fix: // https://github.com/crankyoldgit/IRremoteESP8266/issues/624 diff --git a/lib/IRremoteESP8266/test/ir_Daikin_test.cpp b/lib/IRremoteESP8266/test/ir_Daikin_test.cpp index 783bd4e66..71641d4dc 100644 --- a/lib/IRremoteESP8266/test/ir_Daikin_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Daikin_test.cpp @@ -1552,6 +1552,20 @@ TEST(TestUtils, Housekeeping) { ASSERT_EQ(decode_type_t::DAIKIN64, strToDecodeType("DAIKIN64")); ASSERT_FALSE(hasACState(decode_type_t::DAIKIN64)); ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::DAIKIN64)); + + ASSERT_EQ("DAIKIN200", typeToString(decode_type_t::DAIKIN200)); + ASSERT_EQ(decode_type_t::DAIKIN200, strToDecodeType("DAIKIN200")); + ASSERT_TRUE(hasACState(decode_type_t::DAIKIN200)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::DAIKIN200)); + ASSERT_EQ(kDaikin200Bits, IRsend::defaultBits(decode_type_t::DAIKIN200)); + ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::DAIKIN200)); + + ASSERT_EQ("DAIKIN312", typeToString(decode_type_t::DAIKIN312)); + ASSERT_EQ(decode_type_t::DAIKIN312, strToDecodeType("DAIKIN312")); + ASSERT_TRUE(hasACState(decode_type_t::DAIKIN312)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::DAIKIN312)); + ASSERT_EQ(kDaikin312Bits, IRsend::defaultBits(decode_type_t::DAIKIN312)); + ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::DAIKIN312)); } // https://github.com/crankyoldgit/IRremoteESP8266/issues/582#issuecomment-453863879 @@ -3879,3 +3893,228 @@ TEST(TestDaikin176Class, UnitId) { ASSERT_EQ(0, ac.getId()); EXPECT_STATE_EQ(unita, ac.getRaw(), kDaikin176Bits); } + +TEST(TestDaikin128Class, Issue1754_HeatMode) { + // Data from "MODE HEAT" + // Mesg Desc.: Power Toggle: Off, Mode: 8 (Heat), Temp: 19C, Fan: 4 (Medium), + // Powerful: Off, Quiet: Off, Swing(V): Off, Sleep: Off, Econo: Off, + // Clock: 20:22, On Timer: Off, On Timer: 10:00, Off Timer: Off, + // Off Timer: 16:30, Light Toggle: 0 (Off) + // Ref: https://docs.google.com/document/d/1bhPlwsUE4ppL1dlX6_aYmqCSxeE6HlOumYsR35S0CKA/edit#heading=h.luu34vdlzof1 + + const uint8_t heatmode[16] = { // As recorded from a real remote. + 0x16, 0x48, 0x22, 0x20, 0x10, 0x56, 0x19, 0x34, + 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B}; + + IRDaikin128 ac(kGpioUnused); + // Try to reproduce the exact same state. + ac.setClock(20 * 60 + 22); + ac.setOnTimer(10 * 60); + ac.setOnTimerEnabled(false); + ac.setOffTimer(16 * 60 + 30); + ac.setOffTimerEnabled(false); + ac.setPowerToggle(false); + ac.setTemp(19); + ac.setFan(kDaikin128FanMed); + ac.setPowerful(false); + ac.setQuiet(false); + ac.setSwingVertical(false); + ac.setSleep(false); + ac.setEcono(false); + ac.setLightToggle(0); + ac.setMode(kDaikin128Heat); + + EXPECT_EQ( + "Power Toggle: Off, Mode: 8 (Heat), Temp: 19C, Fan: 4 (Medium), " + "Powerful: Off, Quiet: Off, Swing(V): Off, Sleep: Off, Econo: Off, " + "Clock: 20:22, On Timer: Off, On Timer: 10:00, Off Timer: Off, " + "Off Timer: 16:30, Light Toggle: 0 (Off)", + ac.toString()); + // Compare the synthetic state to the captured one. + EXPECT_STATE_EQ(heatmode, ac.getRaw(), kDaikin128Bits); +} + +// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1802 +TEST(TestDecodeDaikin200, RealExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + const uint16_t rawData[407] = { + 4852, 2298, + 202, 1942, 202, 870, 200, 870, 202, 868, 202, 1942, 202, 870, 202, 870, + 202, 870, 202, 870, 202, 1942, 202, 870, 202, 1942, 202, 1942, 202, 868, + 202, 1942, 202, 1942, 202, 1912, 232, 1942, 202, 1942, 202, 868, 202, + 1942, 202, 870, 202, 870, 202, 868, 202, 868, 204, 868, 202, 870, 202, + 1942, 202, 868, 204, 868, 202, 1942, 202, 870, 202, 870, 200, 870, 202, + 1942, 202, 868, 202, 870, 202, 870, 202, 870, 202, 870, 202, 870, 202, + 870, 202, 870, 202, 868, 202, 868, 204, 868, 202, 870, 202, 870, 202, 870, + 202, 1942, 202, 1942, 202, 1942, 202, 868, 202, 868, 204, 1942, 202, 870, + 202, 29468, + 4880, 2266, + 256, 1888, 230, 844, 202, 868, 202, 870, 256, 1888, 230, 842, 228, 842, + 230, 842, 256, 814, 232, 1914, 254, 816, 230, 1916, 256, 1888, 256, 814, + 256, 1890, 254, 1888, 256, 1888, 256, 1888, 256, 1888, 256, 816, 230, + 1912, 258, 814, 256, 816, 256, 816, 282, 790, 280, 790, 282, 790, 282, + 1862, 258, 814, 280, 790, 282, 1862, 280, 792, 280, 790, 282, 788, 282, + 790, 282, 790, 282, 790, 282, 790, 282, 788, 282, 790, 282, 1862, 282, + 1862, 282, 790, 282, 788, 282, 1862, 282, 1864, 280, 1862, 282, 790, 280, + 790, 282, 790, 282, 790, 282, 788, 284, 790, 282, 760, 310, 790, 282, 788, + 282, 1862, 282, 788, 282, 790, 282, 788, 282, 788, 282, 1862, 284, 788, + 282, 788, 284, 788, 282, 790, 282, 788, 284, 788, 282, 790, 282, 788, 284, + 758, 312, 788, 284, 788, 282, 788, 284, 788, 282, 788, 284, 788, 282, 788, + 284, 788, 284, 758, 314, 786, 284, 788, 284, 1860, 282, 790, 282, 790, + 282, 1862, 282, 758, 312, 762, 310, 788, 284, 788, 282, 758, 314, 758, + 314, 1862, 282, 760, 312, 1860, 284, 760, 310, 788, 282, 760, 312, 788, + 284, 760, 312, 788, 282, 790, 282, 788, 284, 788, 282, 790, 282, 788, 282, + 758, 314, 788, 282, 758, 314, 1862, 282, 758, 312, 788, 284, 758, 312, + 758, 314, 788, 282, 758, 314, 758, 312, 788, 284, 788, 284, 758, 312, 760, + 312, 762, 310, 790, 284, 788, 282, 758, 314, 758, 312, 788, 282, 760, 312, + 760, 312, 760, 312, 788, 282, 758, 314, 788, 284, 788, 284, 758, 312, 788, + 282, 790, 282, 1832, 310, 758, 316, 788, 284, 1862, 282, 1862, 282, 1832, + 310, 788, 284}; // UNKNOWN 3BFB2888 + + const uint8_t expectedState[kDaikin200StateLength] = { + 0x11, 0xDA, 0x17, 0x48, 0x04, 0x00, 0x4E, // Section 1 + 0x11, 0xDA, 0x17, 0x48, 0x00, 0x73, 0x00, 0x21, 0x00, // Section 2 + 0x00, 0x24, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x72}; + irsend.begin(); + irsend.reset(); + irsend.sendRaw(rawData, 407, kDaikin64Freq); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(decode_type_t::DAIKIN200, irsend.capture.decode_type); + ASSERT_EQ(kDaikin200Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t result, prev; + ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &result, &prev)); +} + +// Decoding a message we entirely constructed based solely on a given state. +TEST(TestDecodeDaikin200, SyntheticExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + const uint8_t expectedState[kDaikin200StateLength] = { + 0x11, 0xDA, 0x17, 0x48, 0x04, 0x00, 0x4E, // Section 1 + 0x11, 0xDA, 0x17, 0x48, 0x00, 0x73, 0x00, 0x21, 0x00, // Section 2 + 0x00, 0x24, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x72}; + + irsend.reset(); + irsend.sendDaikin200(expectedState); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(DAIKIN200, irsend.capture.decode_type); + ASSERT_EQ(kDaikin200Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); +} + +/// https://github.com/crankyoldgit/IRremoteESP8266/issues/1829#issuecomment-1173077011 +TEST(TestDecodeDaikin312, RealExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/files/9034763/on_coling_210_fan_auto.txt.out.txt + const uint16_t rawData[643] = { + 508, 390, 452, 414, 452, 414, 452, 414, 452, 414, + 452, 25104, + 3518, 1688, + 478, 1256, 478, 414, 452, 414, 452, 414, 452, 1282, 452, 414, 452, 414, + 452, 414, 452, 414, 452, 1280, 454, 414, 452, 1256, 478, 1254, 478, 414, + 452, 1280, 452, 1282, 452, 1282, 452, 1282, 478, 1256, 480, 386, 452, 414, + 452, 1282, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, + 454, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 1280, 452, 414, + 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 1282, + 452, 414, 452, 414, 452, 414, 452, 1280, 452, 1280, 452, 418, 450, 1280, + 452, 1282, 452, 414, 452, 1282, 452, 414, 452, 416, 452, 1280, 454, 414, + 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, + 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 454, 414, + 452, 414, 452, 1282, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, + 452, 414, 454, 414, 452, 414, 452, 414, 452, 414, 452, 414, 478, 388, 452, + 414, 452, 414, 452, 414, 452, 414, 452, 414, 454, 414, 452, 414, 452, 414, + 452, 414, 452, 414, 452, 414, 452, 1282, 452, 414, 452, 414, 452, 414, + 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, + 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, + 478, 388, 452, 414, 478, 388, 452, 414, 452, 414, 452, 414, 452, 414, 452, + 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, + 452, 414, 452, 414, 452, 414, 452, 414, 448, 418, 448, 418, 448, 418, 448, + 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 418, + 448, 418, 448, 418, 448, 418, 448, 418, 448, 420, 448, 418, 450, 418, 448, + 1286, 448, 1286, 448, 420, 448, 418, 448, 418, 448, 418, 448, 1284, 448, + 1286, + 448, 35512, + 3518, 1688, + 478, 1282, 452, 414, 452, 414, 452, 414, 452, 1282, 452, 414, 452, 414, + 452, 414, 452, 414, 452, 1280, 452, 414, 452, 1256, 478, 1254, 478, 414, + 452, 1280, 452, 1282, 452, 1282, 452, 1282, 452, 1280, 452, 414, 452, 414, + 452, 1280, 452, 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 418, + 448, 418, 448, 418, 452, 414, 448, 418, 448, 418, 448, 418, 448, 418, 448, + 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 1286, 452, 414, 452, + 414, 452, 1280, 452, 1282, 452, 1282, 452, 414, 452, 414, 452, 414, 452, + 1256, 478, 414, 452, 1282, 452, 414, 452, 1256, 478, 414, 452, 414, 452, + 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, + 454, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 1282, 452, 414, + 452, 1256, 478, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, + 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, 414, 452, + 414, 452, 414, 452, 414, 452, 414, 452, 1286, 448, 1286, 448, 418, 448, + 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 418, + 448, 418, 448, 1286, 448, 1286, 448, 418, 448, 418, 448, 418, 448, 418, + 448, 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 420, 448, + 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 1260, 474, + 418, 448, 1264, 470, 418, 448, 418, 448, 418, 448, 1258, 474, 1260, 474, + 418, 448, 418, 448, 418, 448, 418, 448, 418, 448, 418, 452, 414, 452, 414, + 452, 414, 452, 416, 452, 414, 448, 1264, 478, 384, 474, 418, 448, 418, + 448, 418, 448, 418, 448, 418, 448, 418, 448, 1260, 504, 362, 474, 418, + 448, 1260, 478, 388, 474}; // UNKNOWN 34EEF8FF + + const uint8_t expectedState[kDaikin312StateLength] = { + // Section 1 + 0x11, 0xDA, 0x27, 0x00, 0x02, 0x62, 0x4B, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, + // Section 2 + 0x11, 0xDA, 0x27, 0x00, 0x00, 0x39, 0x2A, 0x00, 0xA0, 0x00, + 0x00, 0x06, 0x60, 0x00, 0x00, 0xC5, 0x00, 0x08, 0x48}; + irsend.begin(); + irsend.reset(); + irsend.sendRaw(rawData, 643, kDaikin64Freq); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(decode_type_t::DAIKIN312, irsend.capture.decode_type); + ASSERT_EQ(kDaikin312Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t result, prev; + ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &result, &prev)); +} + +// Decoding a message we entirely constructed based solely on a given state. +TEST(TestDecodeDaikin312, SyntheticExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + const uint8_t expectedState[kDaikin312StateLength] = { + // Section 1 + 0x11, 0xDA, 0x27, 0x00, 0x02, 0x62, 0x4B, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, + // Section 2 + 0x11, 0xDA, 0x27, 0x00, 0x00, 0x39, 0x2A, 0x00, 0xA0, 0x00, + 0x00, 0x06, 0x60, 0x00, 0x00, 0xC5, 0x00, 0x08, 0x48}; + + irsend.reset(); + irsend.sendDaikin312(expectedState); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(DAIKIN312, irsend.capture.decode_type); + ASSERT_EQ(kDaikin312Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); +} diff --git a/lib/IRremoteESP8266/test/ir_Fujitsu_test.cpp b/lib/IRremoteESP8266/test/ir_Fujitsu_test.cpp index caf4e53f1..ed5ee59f1 100644 --- a/lib/IRremoteESP8266/test/ir_Fujitsu_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Fujitsu_test.cpp @@ -22,7 +22,7 @@ TEST(TestIRFujitsuACClass, GetRawDefault) { EXPECT_STATE_EQ(expected_arrah2e, ac.getRaw(), 16 * 8); EXPECT_EQ(kFujitsuAcStateLength, ac.getStateLength()); EXPECT_EQ("Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 1 (Cool), Temp: 24C, " - "Fan: 1 (High), Clean: Off, Filter: Off, " + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " "Swing: 3 (Swing(V)+Swing(H)), Command: N/A, Timer: Off", ac.toString()); @@ -45,7 +45,7 @@ TEST(TestIRFujitsuACClass, GetRawTurnOff) { EXPECT_STATE_EQ(expected_arrah2e, ac.getRaw(), 7 * 8); EXPECT_EQ(kFujitsuAcStateLengthShort, ac.getStateLength()); EXPECT_EQ("Model: 1 (ARRAH2E), Id: 0, Power: Off, Mode: 1 (Cool), Temp: 24C, " - "Fan: 1 (High), Clean: Off, Filter: Off, " + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " "Swing: 3 (Swing(V)+Swing(H)), Command: N/A, Timer: Off", ac.toString()); @@ -66,8 +66,8 @@ TEST(TestIRFujitsuACClass, GetRawStepHoriz) { EXPECT_EQ(kFujitsuAcStateLengthShort, ac.getStateLength()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 1 (Cool), Temp: 24C, " - "Fan: 1 (High), Clean: Off, Filter: Off, Swing: 3 (Swing(V)+Swing(H)), " - "Command: Step Swing(H), Timer: Off", + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " + "Swing: 3 (Swing(V)+Swing(H)), Command: Step Swing(H), Timer: Off", ac.toString()); } @@ -80,8 +80,8 @@ TEST(TestIRFujitsuACClass, GetRawStepVert) { EXPECT_EQ(kFujitsuAcStateLengthShort, ac.getStateLength()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 1 (Cool), Temp: 24C, " - "Fan: 1 (High), Clean: Off, Filter: Off, Swing: 3 (Swing(V)+Swing(H)), " - "Command: Step Swing(V), Timer: Off", + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " + "Swing: 3 (Swing(V)+Swing(H)), Command: Step Swing(V), Timer: Off", ac.toString()); ac.setModel(ARDB1); @@ -106,7 +106,7 @@ TEST(TestIRFujitsuACClass, GetRawWithSwingHoriz) { 0x90, 0x1, 0x24, 0x0, 0x0, 0x0, 0x20, 0xFB}; EXPECT_STATE_EQ(expected, ac.getRaw(), 16 * 8); EXPECT_EQ("Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 1 (Cool), Temp: 25C, " - "Fan: 4 (Quiet), Clean: Off, Filter: Off, " + "Fan: 4 (Quiet), Clean: Off, Filter: Off, 10C Heat: Off, " "Swing: 2 (Swing(H)), Command: N/A, Timer: Off", ac.toString()); } @@ -126,7 +126,7 @@ TEST(TestIRFujitsuACClass, GetRawWithFan) { EXPECT_STATE_EQ(expected_arrah2e, ac.getRaw(), 16 * 8); EXPECT_EQ(kFujitsuAcStateLength, ac.getStateLength()); EXPECT_EQ("Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 3 (Fan), Temp: 20C, " - "Fan: 2 (Medium), Clean: Off, Filter: Off, " + "Fan: 2 (Medium), Clean: Off, Filter: Off, 10C Heat: Off, " "Swing: 2 (Swing(H)), Command: N/A, Timer: Off", ac.toString()); @@ -149,7 +149,7 @@ TEST(TestIRFujitsuACClass, SetRaw) { EXPECT_STATE_EQ(expected_default_arrah2e, ac.getRaw(), ac.getStateLength() * 8); EXPECT_EQ("Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 1 (Cool), Temp: 24C, " - "Fan: 1 (High), Clean: Off, Filter: Off, " + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " "Swing: 3 (Swing(V)+Swing(H)), Command: N/A, " "Timer: Off", ac.toString()); @@ -318,9 +318,7 @@ TEST(TestDecodeFujitsuAC, SyntheticShortMessages) { uint8_t expected_arrah2e[7] = {0x14, 0x63, 0x0, 0x10, 0x10, 0x02, 0xFD}; EXPECT_STATE_EQ(expected_arrah2e, irsend.capture.state, irsend.capture.bits); EXPECT_EQ( - "Model: 1 (ARRAH2E), Id: 0, Power: Off, Mode: 0 (Auto), Temp: 16C, " - "Fan: 0 (Auto), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Timer: Off", + "Model: 1 (ARRAH2E), Id: 0, Power: Off, Command: N/A", IRAcUtils::resultAcToString(&irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); @@ -365,7 +363,7 @@ TEST(TestDecodeFujitsuAC, SyntheticLongMessages) { ac.setRaw(irsend.capture.state, irsend.capture.bits / 8); EXPECT_EQ(kFujitsuAcStateLength, ac.getStateLength()); EXPECT_EQ("Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 1 (Cool), Temp: 18C, " - "Fan: 4 (Quiet), Clean: Off, Filter: Off, " + "Fan: 4 (Quiet), Clean: Off, Filter: Off, 10C Heat: Off, " "Swing: 1 (Swing(V)), Command: N/A, " "Timer: Off", ac.toString()); @@ -541,8 +539,8 @@ TEST(TestDecodeFujitsuAC, Issue414) { EXPECT_EQ(kFujitsuAcStateLength, ac.getStateLength()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 4 (Heat), Temp: 24C, " - "Fan: 0 (Auto), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Timer: Off", + "Fan: 0 (Auto), Clean: Off, Filter: Off, 10C Heat: Off, Swing: 0 (Off), " + "Command: N/A, Timer: Off", ac.toString()); // Resend it using the state this time. @@ -617,9 +615,7 @@ TEST(TestIRFujitsuACClass, toCommon) { // Now test it. EXPECT_EQ( // Off mode technically has no temp, mode, fan, etc. - "Model: 1 (ARRAH2E), Id: 0, Power: Off, Mode: 0 (Auto), Temp: 16C, " - "Fan: 0 (Auto), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Timer: Off", + "Model: 1 (ARRAH2E), Id: 0, Power: Off, Command: N/A", ac.toString()); ASSERT_EQ(decode_type_t::FUJITSU_AC, ac.toCommon().protocol); ASSERT_EQ(fujitsu_ac_remote_model_t::ARRAH2E, ac.toCommon().model); @@ -723,7 +719,7 @@ TEST(TestIRFujitsuACClass, OutsideQuiet) { // the option is set. Otheriwse they appear the same. EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 1 (Cool), Temp: 24C, " - "Fan: 0 (Auto), Clean: Off, Filter: Off, Swing: 0 (Off), " + "Fan: 0 (Auto), Clean: Off, Filter: Off, 10C Heat: Off, Swing: 0 (Off), " "Command: N/A, Timer: Off", ac.toString()); ac.setModel(fujitsu_ac_remote_model_t::ARREB1E); EXPECT_EQ( @@ -826,8 +822,8 @@ TEST(TestDecodeFujitsuAC, Issue726) { EXPECT_EQ(kFujitsuAcStateLength, ac.getStateLength()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 24C, " - "Fan: 0 (Auto), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Timer: Off", + "Fan: 0 (Auto), Clean: Off, Filter: Off, 10C Heat: Off, Swing: 0 (Off), " + "Command: N/A, Timer: Off", ac.toString()); } @@ -859,16 +855,16 @@ TEST(TestIRFujitsuACClass, Clean) { EXPECT_EQ(kFujitsuAcStateLength, ac.getStateLength()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 26C, " - "Fan: 0 (Auto), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Timer: Off", + "Fan: 0 (Auto), Clean: Off, Filter: Off, 10C Heat: Off, Swing: 0 (Off), " + "Command: N/A, Timer: Off", ac.toString()); // Now it is in ARRAH2E model mode, it shouldn't accept setting it on. ac.setClean(true); EXPECT_EQ(fujitsu_ac_remote_model_t::ARRAH2E, ac.getModel()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 26C, " - "Fan: 0 (Auto), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Timer: Off", + "Fan: 0 (Auto), Clean: Off, Filter: Off, 10C Heat: Off, Swing: 0 (Off), " + "Command: N/A, Timer: Off", ac.toString()); // But ARRY4 does. ac.setModel(fujitsu_ac_remote_model_t::ARRY4); @@ -905,8 +901,8 @@ TEST(TestIRFujitsuACClass, Filter) { EXPECT_EQ(kFujitsuAcStateLength, ac.getStateLength()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 26C, " - "Fan: 0 (Auto), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Timer: Off", + "Fan: 0 (Auto), Clean: Off, Filter: Off, 10C Heat: Off, Swing: 0 (Off), " + "Command: N/A, Timer: Off", ac.toString()); // Now it is in ARRAH2E model mode, it shouldn't accept setting it on. ac.setFilter(true); @@ -934,8 +930,8 @@ TEST(TestIRFujitsuACClass, Timers) { EXPECT_EQ(0, ac.getOffSleepTimer()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 26C, " - "Fan: 1 (High), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "On Timer: 12:00", + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, Swing: 0 (Off), " + "Command: N/A, On Timer: 12:00", ac.toString()); const uint8_t timer_on_8h30m[kFujitsuAcStateLength] = { @@ -948,8 +944,8 @@ TEST(TestIRFujitsuACClass, Timers) { EXPECT_EQ(0, ac.getOffSleepTimer()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 26C, " - "Fan: 1 (High), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "On Timer: 08:30", + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " + "Swing: 0 (Off), Command: N/A, On Timer: 08:30", ac.toString()); // TIMER OFF 11H @@ -963,8 +959,8 @@ TEST(TestIRFujitsuACClass, Timers) { EXPECT_EQ(0, ac.getOnTimer()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 26C, " - "Fan: 1 (High), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Off Timer: 11:00", + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " + "Swing: 0 (Off), Command: N/A, Off Timer: 11:00", ac.toString()); // TIMER OFF 0.5H @@ -978,8 +974,8 @@ TEST(TestIRFujitsuACClass, Timers) { EXPECT_EQ(0, ac.getOnTimer()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 26C, " - "Fan: 1 (High), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Off Timer: 00:30", + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " + "Swing: 0 (Off), Command: N/A, Off Timer: 00:30", ac.toString()); // TIMER SLEEP 3H @@ -993,8 +989,8 @@ TEST(TestIRFujitsuACClass, Timers) { EXPECT_EQ(0, ac.getOnTimer()); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 26C, " - "Fan: 1 (High), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Sleep Timer: 03:00", + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " + "Swing: 0 (Off), Command: N/A, Sleep Timer: 03:00", ac.toString()); // Re-construct a known timer state from scratch. @@ -1011,8 +1007,8 @@ TEST(TestIRFujitsuACClass, Timers) { ac.setOffTimer(30); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 26C, " - "Fan: 1 (High), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Off Timer: 00:30", + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " + "Swing: 0 (Off), Command: N/A, Off Timer: 00:30", ac.toString()); EXPECT_EQ(kFujitsuAcStateLength, ac.getStateLength()); EXPECT_STATE_EQ(timer_off_30m, ac.getRaw(), ac.getStateLength() * 8); @@ -1020,8 +1016,8 @@ TEST(TestIRFujitsuACClass, Timers) { ac.setOnTimer(12 * 60); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 26C, " - "Fan: 1 (High), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "On Timer: 12:00", + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " + "Swing: 0 (Off), Command: N/A, On Timer: 12:00", ac.toString()); EXPECT_EQ(kFujitsuAcStateLength, ac.getStateLength()); EXPECT_EQ(12 * 60, ac.getOnTimer()); @@ -1033,8 +1029,8 @@ TEST(TestIRFujitsuACClass, Timers) { ac.setSleepTimer(3 * 60); EXPECT_EQ( "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 0 (Auto), Temp: 26C, " - "Fan: 1 (High), Clean: Off, Filter: Off, Swing: 0 (Off), Command: N/A, " - "Sleep Timer: 03:00", + "Fan: 1 (High), Clean: Off, Filter: Off, 10C Heat: Off, " + "Swing: 0 (Off), Command: N/A, Sleep Timer: 03:00", ac.toString()); EXPECT_EQ(kFujitsuAcStateLength, ac.getStateLength()); EXPECT_STATE_EQ(timer_sleep_3h, ac.getRaw(), ac.getStateLength() * 8); @@ -1122,7 +1118,7 @@ TEST(TestIRFujitsuACClass, Heat10Deg) { 0x69, 0x0B, 0x00, 0x23, 0x06, 0x23, 0x20, 0xEF}; ac.setRaw(heat_on, kFujitsuAcStateLength); EXPECT_EQ( - "Model: 6 (ARREW4E), Id: 1, Power: On, Mode: 3 (Fan), Temp: 21C, " + "Model: 6 (ARREW4E), Id: 1, Power: On, Mode: 3 (Fan), Temp: 10C, " "Fan: 0 (Auto), 10C Heat: On, Swing: 0 (Off), Command: N/A, " "Outside Quiet: Off, Timer: Off", ac.toString()); @@ -1138,7 +1134,7 @@ TEST(TestIRFujitsuACClass, Heat10Deg) { ac.set10CHeat(true); EXPECT_TRUE(ac.get10CHeat()); EXPECT_EQ( - "Model: 6 (ARREW4E), Id: 1, Power: On, Mode: 3 (Fan), Temp: 21C, " + "Model: 6 (ARREW4E), Id: 1, Power: On, Mode: 3 (Fan), Temp: 10C, " "Fan: 0 (Auto), 10C Heat: On, Swing: 0 (Off), Command: N/A, " "Outside Quiet: Off, Timer: Off", ac.toString()); @@ -1271,3 +1267,182 @@ TEST(TestIRFujitsuACClass, ARREW4EShortCodes) { ASSERT_EQ(kFujitsuAcStateLengthShort, ac.getStateLength()); EXPECT_STATE_EQ(stepvert, ac.getRaw(), kFujitsuAcStateLengthShort * 8); } + +// https://github.com/crankyoldgit/IRremoteESP8266/discussions/1701#discussioncomment-1910164 +TEST(TestIRFujitsuACClass, Discussion1701) { + IRFujitsuAC ac(kGpioUnused); + IRrecv irrecv(kGpioUnused); + IRac irac(kGpioUnused); + + const String expected_raw_output = + "f38000d50" + "m3324s1574" + "m448s390m448s390m448s1182m448s390m448s1182m448s390m448s390m448s390" + "m448s1182m448s1182m448s390m448s390m448s390m448s1182m448s1182m448s390" + "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390" + "m448s390m448s390m448s390m448s390m448s1182m448s390m448s390m448s390" + "m448s390m448s390m448s390m448s390m448s1182m448s390m448s390m448s390" + "m448s390m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182m448s1182" + "m448s1182m448s390m448s390m448s1182m448s390m448s390m448s390m448s390" + "m448s1182m448s390m448s390m448s390m448s1182m448s1182m448s390m448s390" + "m448s1182m448s390m448s390m448s390m448s390m448s390m448s390m448s1182" + "m448s1182m448s390m448s390m448s390m448s390m448s390m448s390m448s390" + "m448s1182m448s390m448s390m448s390m448s390m448s390m448s390m448s390" + "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390" + "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390" + "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390" + "m448s390m448s390m448s390m448s390m448s390m448s390m448s390m448s390" + "m448s390m448s390m448s1182m448s1182m448s390m448s390m448s1182m448s390" + "m448s8100"; + const String expected_arrew4e_str = + "Model: 6 (ARREW4E), Id: 0, Power: On, Mode: 1 (Cool), Temp: 24C, " + "Fan: 1 (High), 10C Heat: Off, Swing: 0 (Off), Command: N/A, " + "Outside Quiet: Off, Timer: Off"; + const uint8_t expected_arrew4e_state[kFujitsuAcStateLength] = + {0x14, 0x63, 0x00, 0x10, 0x10, 0xFE, 0x09, 0x31, + 0x81, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4C}; + + // Method used in `TurnOnFujitsuAC` + ac.begin(); + ac.setModel(ARREW4E); + ac.setSwing(kFujitsuAcSwingOff); + ac.setMode(kFujitsuAcModeCool); + ac.setFanSpeed(kFujitsuAcFanHigh); + ac.setTemp(24); // 24C + ac.setCmd(kFujitsuAcCmdTurnOn); + ASSERT_EQ(expected_arrew4e_str, ac.toString()); + ac.send(); + ac._irsend.makeDecodeResult(); + // 260 = 16 (bytes) * 8 (bits) * 2 (per bit) + kHeader (2) + kFooter (2) + EXPECT_EQ(1 + 260, ac._irsend.capture.rawlen); + EXPECT_TRUE(irrecv.decode(&ac._irsend.capture)); + ASSERT_EQ(FUJITSU_AC, ac._irsend.capture.decode_type); + ASSERT_EQ(kFujitsuAcStateLength * 8, ac._irsend.capture.bits); + EXPECT_EQ(expected_arrew4e_str, + IRAcUtils::resultAcToString(&ac._irsend.capture)); + EXPECT_STATE_EQ(expected_arrew4e_state, ac._irsend.capture.state, + ac._irsend.capture.bits); + EXPECT_EQ(expected_raw_output, ac._irsend.outputStr()); + + // Now try to reproduce it via the IRac class. + ac._irsend.reset(); + ac.stateReset(); + ASSERT_NE(expected_arrew4e_str, ac.toString()); + + irac.fujitsu(&ac, + ARREW4E, // Model + true, // Power + stdAc::opmode_t::kCool, // Mode + true, // Celsius + 24, // Degrees + stdAc::fanspeed_t::kHigh, // Fan speed + stdAc::swingv_t::kOff, // Vertical swing + stdAc::swingh_t::kOff, // Horizontal swing + false, // Quiet + false, // Turbo (Powerful) + false, // Econo + false, // Filter + false); // Clean + ASSERT_EQ(expected_arrew4e_str, ac.toString()); + ac._irsend.makeDecodeResult(); + // 260 = 16 (bytes) * 8 (bits) * 2 (per bit) + kHeader (2) + kFooter (2) + EXPECT_EQ(1 + 260, ac._irsend.capture.rawlen); + EXPECT_TRUE(irrecv.decode(&ac._irsend.capture)); + ASSERT_EQ(FUJITSU_AC, ac._irsend.capture.decode_type); + ASSERT_EQ(kFujitsuAcStateLength * 8, ac._irsend.capture.bits); + EXPECT_EQ(expected_arrew4e_str, + IRAcUtils::resultAcToString(&ac._irsend.capture)); + EXPECT_STATE_EQ(expected_arrew4e_state, ac._irsend.capture.state, + ac._irsend.capture.bits); + EXPECT_EQ(expected_raw_output, ac._irsend.outputStr()); + // Success. +} + +TEST(TestIRFujitsuACClass, toCommon_Issue1780HandlePrev) { + IRFujitsuAC ac(kGpioUnused); + ac.setMode(kFujitsuAcModeCool); + ac.setTemp(20); + ac.setFanSpeed(kFujitsuAcFanQuiet); + ac.setSwing(kFujitsuAcSwingBoth); + ac.on(); + ASSERT_TRUE(ac.toCommon().power); + stdAc::state_t prev = ac.toCommon(); // Copy in the state. + ac.off(); + ASSERT_FALSE(ac.toCommon().power); + ac.send(); // This should send a short code. + prev.degrees = 27; + ac.stateReset(); + IRrecv irrecv(kGpioUnused); + ac._irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&ac._irsend.capture)); + ASSERT_EQ(FUJITSU_AC, ac._irsend.capture.decode_type); + ac.setRaw(ac._irsend.capture.state, ac._irsend.capture.bits / 8); + ASSERT_EQ(decode_type_t::FUJITSU_AC, ac.toCommon().protocol); + ASSERT_EQ(fujitsu_ac_remote_model_t::ARRAH2E, ac.toCommon().model); + ASSERT_FALSE(ac.toCommon().power); + ASSERT_TRUE(ac.toCommon().celsius); + ASSERT_EQ(16, ac.toCommon().degrees); + ASSERT_EQ(27, ac.toCommon(&prev).degrees); + ASSERT_FALSE(ac.toCommon().quiet); + + ASSERT_EQ(stdAc::opmode_t::kAuto, ac.toCommon().mode); + ASSERT_EQ(stdAc::opmode_t::kCool, ac.toCommon(&prev).mode); + ASSERT_EQ(stdAc::fanspeed_t::kAuto, ac.toCommon().fanspeed); + ASSERT_EQ(stdAc::fanspeed_t::kMin, ac.toCommon(&prev).fanspeed); + ASSERT_EQ(stdAc::swingv_t::kOff, ac.toCommon().swingv); + ASSERT_EQ(stdAc::swingh_t::kOff, ac.toCommon().swingh); + // Unsupported. + ASSERT_FALSE(ac.toCommon().filter); + ASSERT_FALSE(ac.toCommon().clean); + ASSERT_FALSE(ac.toCommon().turbo); + ASSERT_FALSE(ac.toCommon().light); + ASSERT_FALSE(ac.toCommon().econo); + ASSERT_FALSE(ac.toCommon().beep); + ASSERT_EQ(-1, ac.toCommon().sleep); + ASSERT_EQ(-1, ac.toCommon().clock); + + stdAc::state_t result_inc_prev; + ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &result_inc_prev, + &prev)); + ASSERT_EQ(27, result_inc_prev.degrees); + ASSERT_EQ(stdAc::opmode_t::kCool, result_inc_prev.mode); + ASSERT_EQ(stdAc::fanspeed_t::kMin, result_inc_prev.fanspeed); +} + +TEST(TestIRFujitsuACClass, Improve10CHeat) { + IRFujitsuAC ac(kGpioUnused); + // Data from https://docs.google.com/spreadsheets/d/1RdmJdOZ3zxYlLXzluKTp4L6VVdjDXKgizwwIyTTG8MA/edit#gid=0&range=G2 + const uint8_t Arrah2u_10CHeatOn[16] = { + 0x14, 0x63, 0x00, 0x10, 0x10, 0xFE, 0x09, 0x30, + 0x41, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x20, 0x64}; + ASSERT_FALSE(ac.get10CHeat()); + ac.setRaw(Arrah2u_10CHeatOn, 16); + ASSERT_TRUE(ac.get10CHeat()); + ASSERT_EQ( + "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 3 (Fan), Temp: 10C, " + "Fan: 0 (Auto), Clean: Off, Filter: Off, 10C Heat: On, Swing: 0 (Off), " + "Command: N/A, Timer: Off", + ac.toString()); + EXPECT_EQ(decode_type_t::FUJITSU_AC, ac.toCommon().protocol); + ASSERT_TRUE(ac.get10CHeat()); + EXPECT_EQ(fujitsu_ac_remote_model_t::ARRAH2E, ac.toCommon().model); + EXPECT_EQ(kFujitsuAcMinHeat, ac.toCommon().degrees); + + ac.stateReset(); + // Data from https://docs.google.com/spreadsheets/d/1RdmJdOZ3zxYlLXzluKTp4L6VVdjDXKgizwwIyTTG8MA/edit#gid=0&range=G8 + const uint8_t Arreg1u_10CHeatOn[16] = { + 0x14, 0x63, 0x00, 0x10, 0x10, 0xFE, 0x09, 0x30, + 0x61, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x20, 0x44}; + ASSERT_FALSE(ac.get10CHeat()); + ac.setRaw(Arreg1u_10CHeatOn, 16); + ASSERT_TRUE(ac.get10CHeat()); + ASSERT_EQ( + "Model: 1 (ARRAH2E), Id: 0, Power: On, Mode: 3 (Fan), Temp: 10C, " + "Fan: 0 (Auto), Clean: Off, Filter: Off, 10C Heat: On, Swing: 0 (Off), " + "Command: N/A, Timer: Off", + ac.toString()); + EXPECT_EQ(decode_type_t::FUJITSU_AC, ac.toCommon().protocol); + ASSERT_TRUE(ac.get10CHeat()); + EXPECT_EQ(fujitsu_ac_remote_model_t::ARRAH2E, ac.toCommon().model); + EXPECT_EQ(kFujitsuAcMinHeat, ac.toCommon().degrees); +} diff --git a/lib/IRremoteESP8266/test/ir_Gree_test.cpp b/lib/IRremoteESP8266/test/ir_Gree_test.cpp index cb1832f61..e0160577e 100644 --- a/lib/IRremoteESP8266/test/ir_Gree_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Gree_test.cpp @@ -326,6 +326,9 @@ TEST(TestGreeClass, OperatingMode) { ac.setMode(kGreeHeat); EXPECT_EQ(kGreeHeat, ac.getMode()); + ac.setMode(kGreeEcono); + EXPECT_EQ(kGreeEcono, ac.getMode()); + ASSERT_NE(kGreeFanMax, 1); ac.setFan(kGreeFanMax); ac.setMode(kGreeDry); // Dry should lock the fan to speed 1. @@ -337,7 +340,7 @@ TEST(TestGreeClass, OperatingMode) { ac.setMode(kGreeFan); EXPECT_EQ(kGreeFan, ac.getMode()); - ac.setMode(kGreeHeat + 1); + ac.setMode(kGreeEcono + 1); EXPECT_EQ(kGreeAuto, ac.getMode()); ac.setMode(255); @@ -798,3 +801,40 @@ TEST(TestGreeClass, DisplayTempSource) { ac.setRaw(state); EXPECT_EQ(2, ac.getDisplayTempSource()); } + +TEST(TestUtils, Housekeeping) { + ASSERT_EQ("GREE", typeToString(decode_type_t::GREE)); + ASSERT_EQ(decode_type_t::GREE, strToDecodeType("GREE")); + ASSERT_TRUE(hasACState(decode_type_t::GREE)); + ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::GREE)); + ASSERT_EQ(kGreeBits, IRsend::defaultBits(decode_type_t::GREE)); + ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::GREE)); + ASSERT_EQ(gree_ac_remote_model_t::YAW1F, IRac::strToModel("YAW1F")); + ASSERT_EQ(irutils::modelToStr(decode_type_t::GREE, + gree_ac_remote_model_t::YAW1F), "YAW1F"); + ASSERT_EQ(gree_ac_remote_model_t::YBOFB, IRac::strToModel("YBOFB")); + ASSERT_EQ(irutils::modelToStr(decode_type_t::GREE, + gree_ac_remote_model_t::YBOFB), "YBOFB"); + ASSERT_EQ(gree_ac_remote_model_t::YX1FSF, IRac::strToModel("YX1FSF")); + ASSERT_EQ(irutils::modelToStr(decode_type_t::GREE, + gree_ac_remote_model_t::YX1FSF), "YX1FSF"); +} + +TEST(TestGreeClass, Issue1821EnergySaver) { + IRGreeAC ac(kGpioUnused); + ac.begin(); + + // https://github.com/crankyoldgit/IRremoteESP8266/issues/1821#issue-1271458457 + const uint8_t energy[8] = {0x1D, 0x09, 0x60, 0x58, 0x00, 0x20, 0x00, 0xA0}; + + ac.setRaw(energy); + EXPECT_EQ(kGreeEcono, ac.getMode()); + EXPECT_TRUE(ac.getEcono()); + EXPECT_EQ(gree_ac_remote_model_t::YX1FSF, ac.getModel()); + EXPECT_EQ( + "Model: 3 (YX1FSF), Power: On, Mode: 5 (Econo), Temp: 77F, Fan: 1 (Low), " + "Turbo: Off, Econo: Off, IFeel: Off, WiFi: Off, XFan: Off, Light: On, " + "Sleep: Off, Swing(V) Mode: Manual, Swing(V): 0 (Last), " + "Swing(H): 0 (Off), Timer: Off, Display Temp: 0 (Off)", + ac.toString()); +} diff --git a/lib/IRremoteESP8266/test/ir_Haier_test.cpp b/lib/IRremoteESP8266/test/ir_Haier_test.cpp index b60a08f23..57c813c0d 100644 --- a/lib/IRremoteESP8266/test/ir_Haier_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Haier_test.cpp @@ -1357,6 +1357,13 @@ TEST(TestUtils, Housekeeping) { ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::HAIER_AC176)); ASSERT_EQ(kHaierAC176Bits, IRsend::defaultBits(decode_type_t::HAIER_AC176)); ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::HAIER_AC176)); + + ASSERT_EQ("HAIER_AC160", typeToString(decode_type_t::HAIER_AC160)); + ASSERT_EQ(decode_type_t::HAIER_AC160, strToDecodeType("HAIER_AC160")); + ASSERT_TRUE(hasACState(decode_type_t::HAIER_AC160)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::HAIER_AC160)); + ASSERT_EQ(kHaierAC160Bits, IRsend::defaultBits(decode_type_t::HAIER_AC160)); + ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::HAIER_AC160)); } TEST(TestHaierAC176Class, BuildKnownState) { @@ -1535,3 +1542,79 @@ TEST(TestHaierAC176Class, Models) { "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off", ac.toString()); } + +TEST(TestDecodeHaierAC160, RealExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1804#issue-1236115063 + const uint16_t rawData[325] = { + 3078, 3002, + 3058, 4338, + 590, 1612, 588, 516, 584, 1588, 586, 542, 560, 540, 560, 1590, 584, 1618, + 584, 542, 558, 1592, 584, 542, 582, 1594, 584, 542, 582, 1592, 560, 1642, + 560, 516, 558, 544, 558, 542, 558, 542, 582, 518, 558, 542, 558, 516, 558, + 542, 558, 542, 582, 520, 558, 542, 558, 542, 564, 510, 608, 492, 558, 542, + 582, 520, 558, 542, 558, 544, 582, 492, 608, 1594, 558, 544, 558, 542, + 582, 494, 608, 494, 558, 544, 558, 542, 558, 544, 558, 1616, 582, 1620, + 560, 542, 558, 542, 582, 494, 558, 542, 558, 542, 558, 544, 556, 542, 582, + 520, 580, 494, 582, 520, 582, 520, 558, 542, 558, 542, 582, 520, 582, 492, + 608, 1592, 582, 520, 558, 544, 558, 516, 584, 518, 558, 542, 582, 520, + 580, 520, 582, 520, 580, 492, 584, 516, 556, 544, 582, 518, 580, 520, 580, + 520, 580, 494, 606, 494, 580, 520, 580, 520, 582, 520, 580, 520, 556, 518, + 608, 492, 580, 520, 556, 544, 580, 520, 580, 520, 580, 494, 606, 494, 580, + 520, 580, 520, 580, 520, 580, 520, 580, 494, 606, 496, 578, 522, 580, 520, + 580, 520, 580, 520, 580, 494, 606, 494, 580, 520, 580, 520, 580, 1594, + 608, 494, 580, 1620, 580, 522, 580, 520, 580, 494, 578, 1620, 582, 520, + 580, 1596, 582, 1620, 582, 1594, 608, 1594, 582, 522, 580, 1594, 582, + 1620, 582, 520, 580, 1596, 582, 520, 580, 1620, 582, 494, 606, 496, 580, + 522, 580, 522, 580, 520, 580, 520, 580, 496, 604, 496, 580, 520, 580, + 1620, 582, 1594, 582, 522, 578, 522, 580, 522, 578, 522, 580, 496, 580, + 522, 578, 522, 578, 522, 578, 524, 578, 522, 578, 496, 578, 522, 578, 522, + 578, 546, 554, 522, 578, 522, 578, 520, 556, 546, 554, 546, 554, 546, 556, + 544, 556, 546, 554, 520, 554, 544, 556, 1620, 582, 544, 556, 1594, 580, + 546, 556, 1594, 580}; // UNKNOWN B6B57D85 + const uint8_t expectedState[kHaierAC160StateLength] = { + 0xA6, 0xAC, 0x00, 0x00, 0x40, 0x60, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x17, 0xB5, 0x00, 0x60, 0x00, 0x00, 0x15}; + + irsend.sendRaw(rawData, 325, 38000); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(HAIER_AC160, irsend.capture.decode_type); + ASSERT_EQ(kHaierAC160Bits, irsend.capture.bits); + EXPECT_FALSE(irsend.capture.repeat); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t result, prev; + ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &result, &prev)); +} + +// Decoding a message we entirely constructed based solely on a given state. +TEST(TestDecodeHaierAC160, SyntheticExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + const uint8_t expectedState[kHaierAC160StateLength] = { + 0xA6, 0xAC, 0x00, 0x00, 0x40, 0x60, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x17, 0xB5, 0x00, 0x60, 0x00, 0x00, 0x15}; + + irsend.reset(); + irsend.sendHaierAC160(expectedState); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(HAIER_AC160, irsend.capture.decode_type); + ASSERT_EQ(kHaierAC160Bits, irsend.capture.bits); + EXPECT_FALSE(irsend.capture.repeat); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t result, prev; + ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &result, &prev)); +} diff --git a/lib/IRremoteESP8266/test/ir_Hitachi_test.cpp b/lib/IRremoteESP8266/test/ir_Hitachi_test.cpp index 2bbbd29e9..51664688a 100644 --- a/lib/IRremoteESP8266/test/ir_Hitachi_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Hitachi_test.cpp @@ -191,7 +191,7 @@ TEST(TestSendHitachiAC, SendUnexpectedSizes) { // Tests for IRHitachiAc class. TEST(TestIRHitachiAcClass, SetAndGetPower) { - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); ac.on(); EXPECT_TRUE(ac.getPower()); ac.off(); @@ -203,7 +203,7 @@ TEST(TestIRHitachiAcClass, SetAndGetPower) { } TEST(TestIRHitachiAcClass, SetAndGetSwing) { - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); ac.setSwingVertical(true); ac.setSwingHorizontal(true); EXPECT_TRUE(ac.getSwingVertical()); @@ -222,7 +222,7 @@ TEST(TestIRHitachiAcClass, SetAndGetSwing) { } TEST(TestIRHitachiAcClass, SetAndGetTemp) { - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); ac.setTemp(25); EXPECT_EQ(25, ac.getTemp()); ac.setTemp(kHitachiAcMinTemp); @@ -238,7 +238,7 @@ TEST(TestIRHitachiAcClass, SetAndGetTemp) { } TEST(TestIRHitachiAcClass, SetAndGetMode) { - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); ac.setMode(kHitachiAcCool); ac.setFan(kHitachiAcFanAuto); EXPECT_EQ(kHitachiAcCool, ac.getMode()); @@ -261,7 +261,7 @@ TEST(TestIRHitachiAcClass, SetAndGetMode) { } TEST(TestIRHitachiAcClass, SetAndGetFan) { - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); ac.setMode(kHitachiAcCool); // All fan options are available in this mode. ac.setFan(kHitachiAcFanAuto); EXPECT_EQ(kHitachiAcFanAuto, ac.getFan()); @@ -293,7 +293,7 @@ TEST(TestIRHitachiAcClass, SetAndGetFan) { } TEST(TestIRHitachiAcClass, HumanReadable) { - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); ac.setMode(kHitachiAcHeat); ac.setTemp(kHitachiAcMaxTemp); @@ -316,7 +316,7 @@ TEST(TestIRHitachiAcClass, HumanReadable) { } TEST(TestIRHitachiAcClass, ChecksumCalculation) { - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); const uint8_t originalstate[kHitachiAcStateLength] = { 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80, @@ -426,7 +426,7 @@ TEST(TestDecodeHitachiAC, NormalRealExample1) { EXPECT_EQ(HITACHI_AC, irsend.capture.decode_type); ASSERT_EQ(kHitachiAcBits, irsend.capture.bits); EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAcBits); - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); ac.setRaw(irsend.capture.state); EXPECT_EQ( "Power: On, Mode: 4 (Cool), Temp: 16C, Fan: 1 (Auto), " @@ -494,7 +494,7 @@ TEST(TestDecodeHitachiAC, NormalRealExample2) { EXPECT_EQ(HITACHI_AC, irsend.capture.decode_type); ASSERT_EQ(kHitachiAcBits, irsend.capture.bits); EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAcBits); - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); ac.setRaw(irsend.capture.state); EXPECT_EQ( "Power: On, Mode: 3 (Heat), Temp: 32C, Fan: 5 (High), " @@ -777,7 +777,7 @@ TEST(TestDecodeHitachiAC2, NormalRealExample) { } TEST(TestIRHitachiAcClass, toCommon) { - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); ac.setPower(true); ac.setMode(kHitachiAcCool); ac.setTemp(20); @@ -856,6 +856,24 @@ TEST(TestUtils, Housekeeping) { IRsend::defaultBits(decode_type_t::HITACHI_AC344)); ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::HITACHI_AC344)); + + ASSERT_EQ("HITACHI_AC264", typeToString(decode_type_t::HITACHI_AC264)); + ASSERT_EQ(decode_type_t::HITACHI_AC264, strToDecodeType("HITACHI_AC264")); + ASSERT_TRUE(hasACState(decode_type_t::HITACHI_AC264)); + ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::HITACHI_AC264)); + ASSERT_EQ(kHitachiAc264Bits, + IRsend::defaultBits(decode_type_t::HITACHI_AC264)); + ASSERT_EQ(kNoRepeat, + IRsend::minRepeats(decode_type_t::HITACHI_AC264)); + + ASSERT_EQ("HITACHI_AC296", typeToString(decode_type_t::HITACHI_AC296)); + ASSERT_EQ(decode_type_t::HITACHI_AC296, strToDecodeType("HITACHI_AC296")); + ASSERT_TRUE(hasACState(decode_type_t::HITACHI_AC296)); + ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::HITACHI_AC296)); + ASSERT_EQ(kHitachiAc296Bits, + IRsend::defaultBits(decode_type_t::HITACHI_AC296)); + ASSERT_EQ(kNoRepeat, + IRsend::minRepeats(decode_type_t::HITACHI_AC296)); } // Decode a 'real' HitachiAc424 message. @@ -945,7 +963,7 @@ TEST(TestDecodeHitachiAc424, RealExample) { EXPECT_EQ(HITACHI_AC424, irsend.capture.decode_type); ASSERT_EQ(kHitachiAc424Bits, irsend.capture.bits); EXPECT_STATE_EQ(expected, irsend.capture.state, kHitachiAc424Bits); - IRHitachiAc ac(0); + IRHitachiAc ac(kGpioUnused); ac.setRaw(irsend.capture.state); EXPECT_EQ( "Power: On, Mode: 3 (Cool), Temp: 23C, Fan: 5 (Auto), " @@ -979,7 +997,7 @@ TEST(TestDecodeHitachiAc424, SyntheticExample) { // Tests for IRHitachiAc424 class. TEST(TestIRHitachiAc424Class, SetInvertedStates) { - IRHitachiAc424 ac(0); + IRHitachiAc424 ac(kGpioUnused); uint8_t raw[kHitachiAc424StateLength] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1001,7 +1019,7 @@ TEST(TestIRHitachiAc424Class, SetInvertedStates) { } TEST(TestIRHitachiAc424Class, SetAndGetPower) { - IRHitachiAc424 ac(0); + IRHitachiAc424 ac(kGpioUnused); ac.on(); EXPECT_TRUE(ac.getPower()); ac.off(); @@ -1015,7 +1033,7 @@ TEST(TestIRHitachiAc424Class, SetAndGetPower) { } TEST(TestIRHitachiAc424Class, SetAndGetTemp) { - IRHitachiAc424 ac(0); + IRHitachiAc424 ac(kGpioUnused); ac.setTemp(25); EXPECT_EQ(25, ac.getTemp()); ac.setTemp(kHitachiAc424MinTemp); @@ -1029,7 +1047,7 @@ TEST(TestIRHitachiAc424Class, SetAndGetTemp) { } TEST(TestIRHitachiAc424Class, SetAndGetMode) { - IRHitachiAc424 ac(0); + IRHitachiAc424 ac(kGpioUnused); ac.setMode(kHitachiAc424Cool); ac.setFan(kHitachiAc424FanAuto); ac.setTemp(25); @@ -1049,7 +1067,7 @@ TEST(TestIRHitachiAc424Class, SetAndGetMode) { } TEST(TestIRHitachiAc424Class, SetAndGetFan) { - IRHitachiAc424 ac(0); + IRHitachiAc424 ac(kGpioUnused); ac.setMode(kHitachiAc424Cool); // All fan options are available in this mode. ac.setFan(kHitachiAc424FanAuto); EXPECT_EQ(kHitachiAc424FanAuto, ac.getFan()); @@ -1094,7 +1112,7 @@ TEST(TestIRHitachiAc424Class, SetAndGetFan) { TEST(TestIRHitachiAc424Class, SetAndGetButton) { - IRHitachiAc424 ac(0); + IRHitachiAc424 ac(kGpioUnused); ac.on(); EXPECT_EQ(ac.getButton(), kHitachiAc424ButtonPowerMode); ac.setButton(kHitachiAc424ButtonTempUp); @@ -1104,7 +1122,7 @@ TEST(TestIRHitachiAc424Class, SetAndGetButton) { } TEST(TestIRHitachiAc424Class, ToggleSwingVertical) { - IRHitachiAc424 ac(0); + IRHitachiAc424 ac(kGpioUnused); ac.on(); EXPECT_EQ(ac.getButton(), kHitachiAc424ButtonPowerMode); ac.setSwingVToggle(true); @@ -1116,7 +1134,7 @@ TEST(TestIRHitachiAc424Class, ToggleSwingVertical) { } TEST(TestIRHitachiAc424Class, HumanReadable) { - IRHitachiAc424 ac(0); + IRHitachiAc424 ac(kGpioUnused); ac.setMode(kHitachiAc424Heat); ac.setTemp(kHitachiAc424MaxTemp); @@ -1984,3 +2002,410 @@ TEST(TestIRHitachiAc344Class, SwingV) { ac.setSwingV(false); EXPECT_FALSE(ac.getSwingV()); } + +// Decode a 'real' HitachiAc264 message. +TEST(TestDecodeHitachiAc264, RealExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + const uint8_t expected[kHitachiAc264StateLength] = { + 0x01, 0x10, 0x00, 0x40, 0xBF, 0xFF, 0x00, 0xCC, 0x33, 0x92, + 0x6D, 0x13, 0xEC, 0x6C, 0x93, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x16, 0xE9, 0xC1, 0x3E, 0x00, + 0xFF, 0x00, 0xFF}; + + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1729#issuecomment-1006938712 + const uint16_t rawData[531] = { + 3392, 1752, 372, 1356, 344, 504, 344, 504, 344, 480, 370, 480, 370, 478, + 370, 478, 372, 480, 370, 478, 370, 480, 370, 478, 370, 480, 370, 1330, + 370, 478, 370, 480, 370, 478, 370, 478, 370, 480, 370, 478, 370, 480, 370, + 504, 346, 504, 344, 480, 370, 504, 346, 478, 370, 478, 370, 478, 372, 480, + 370, 480, 370, 504, 346, 1330, 370, 480, 370, 1356, 346, 1330, 370, 1354, + 346, 1328, 370, 1330, 370, 1328, 370, 478, 372, 1330, 370, 1328, 370, + 1356, 346, 1354, 344, 1328, 372, 1354, 344, 1356, 344, 1330, 370, 1328, + 372, 480, 370, 478, 370, 504, 346, 478, 372, 476, 372, 504, 346, 480, 370, + 504, 344, 478, 372, 504, 344, 1328, 372, 1328, 372, 478, 370, 504, 346, + 1330, 370, 1328, 372, 1328, 370, 1356, 344, 478, 370, 478, 370, 1356, 344, + 1328, 372, 480, 370, 478, 372, 504, 346, 1330, 370, 478, 370, 480, 370, + 1330, 370, 478, 370, 480, 370, 1328, 370, 1330, 370, 480, 372, 1352, 346, + 1328, 372, 504, 346, 1328, 370, 1328, 370, 480, 370, 1328, 372, 1328, 370, + 504, 344, 478, 372, 1330, 370, 478, 370, 480, 370, 480, 370, 478, 370, + 480, 370, 1356, 346, 1328, 370, 480, 370, 1330, 370, 1330, 370, 1330, 370, + 478, 370, 506, 344, 1328, 372, 1328, 372, 478, 372, 1330, 370, 1328, 372, + 478, 370, 1330, 370, 1328, 372, 504, 344, 480, 370, 1330, 370, 504, 344, + 504, 346, 1354, 346, 504, 346, 478, 372, 478, 370, 480, 370, 478, 370, + 492, 358, 478, 370, 478, 370, 1328, 372, 1330, 370, 1328, 372, 1354, 346, + 1328, 372, 1328, 370, 1330, 370, 1328, 372, 476, 372, 504, 346, 478, 372, + 480, 370, 480, 370, 504, 344, 478, 370, 480, 370, 1328, 370, 1330, 372, + 1328, 370, 1330, 370, 1330, 370, 1330, 368, 1330, 370, 1330, 370, 480, + 370, 480, 370, 478, 370, 504, 344, 480, 370, 478, 370, 504, 344, 478, 372, + 1328, 370, 1330, 370, 1330, 370, 1330, 370, 1328, 372, 1356, 344, 1330, + 370, 1330, 370, 480, 370, 478, 370, 482, 368, 480, 370, 480, 370, 480, + 370, 480, 370, 480, 370, 1330, 370, 1354, 346, 1330, 370, 1354, 346, 1330, + 370, 1330, 370, 1330, 370, 1330, 370, 504, 346, 480, 370, 478, 372, 478, + 372, 504, 344, 480, 370, 480, 370, 504, 344, 1330, 370, 1328, 370, 1330, + 372, 1328, 370, 1354, 346, 1328, 370, 1330, 370, 1330, 370, 478, 370, + 1330, 370, 1328, 372, 480, 370, 1330, 370, 480, 370, 480, 370, 480, 370, + 1356, 344, 478, 370, 506, 344, 1330, 370, 478, 370, 1330, 372, 1354, 346, + 1354, 346, 1328, 370, 478, 372, 478, 370, 480, 370, 504, 346, 480, 370, + 1328, 370, 1330, 370, 478, 370, 1330, 370, 1328, 370, 1330, 372, 1354, + 344, 1328, 372, 504, 346, 478, 370, 504, 346, 504, 346, 478, 370, 478, + 370, 482, 368, 480, 370, 478, 370, 480, 370, 1328, 372, 1328, 370, 1330, + 370, 1328, 370, 1328, 370, 1330, 370, 1354, 346, 1328, 372, 478, 370, 478, + 370, 478, 372, 478, 372, 478, 372, 478, 372, 478, 370, 478, 372, 1330, + 370, 1328, 370, 1328, 372, 1328, 372, 1330, 444, 1256, 370, 1330, 370, + 1330, 442}; + + irsend.reset(); + irsend.sendRaw(rawData, 531, kHitachiAcFreq); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(HITACHI_AC264, irsend.capture.decode_type); + ASSERT_EQ(kHitachiAc264Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expected, irsend.capture.state, kHitachiAc264Bits); + EXPECT_EQ( + "Power: Off, Mode: 6 (Heat), Temp: 27C, Fan: 1 (Min), " + "Button: 19 (Power/Mode)", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); +} + +// Decode a 'Synthetic' HitachiAc264 message. +TEST(TestDecodeHitachiAc264, SyntheticExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1729#issuecomment-1006938712 + const uint8_t expected[kHitachiAc264StateLength] = { + 0x01, 0x10, 0x00, 0x40, 0xBF, 0xFF, 0x00, 0xCC, 0x33, 0x92, + 0x6D, 0x13, 0xEC, 0x6C, 0x93, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x16, 0xE9, 0xC1, 0x3E, 0x00, + 0xFF, 0x00, 0xFF}; + + irsend.reset(); + irsend.sendHitachiAc264(expected); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(HITACHI_AC264, irsend.capture.decode_type); + ASSERT_EQ(kHitachiAc264Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expected, irsend.capture.state, kHitachiAc264Bits); + EXPECT_EQ( + "Power: Off, Mode: 6 (Heat), Temp: 27C, Fan: 1 (Min), " + "Button: 19 (Power/Mode)", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); +} + +TEST(TestIRHitachiAc264Class, ConstructKnownState) { + IRHitachiAc264 ac(kGpioUnused); + // hot/power off/ fan 1 /27°C + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1729#issuecomment-1006938712 + const uint8_t expected[kHitachiAc264StateLength] = { + 0x01, 0x10, 0x00, 0x40, 0xBF, 0xFF, 0x00, 0xCC, 0x33, 0x92, + 0x6D, 0x13, 0xEC, 0x6C, 0x93, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x16, 0xE9, 0xC1, 0x3E, 0x00, + 0xFF, 0x00, 0xFF}; + ac.stateReset(); + ac.setMode(kHitachiAc264Heat); + ac.setFan(kHitachiAc264FanMin); + ac.setTemp(27); + ac.setPower(false); + EXPECT_EQ( + "Power: Off, Mode: 6 (Heat), Temp: 27C, Fan: 1 (Min), " + "Button: 19 (Power/Mode)", + ac.toString()); + EXPECT_STATE_EQ(expected, ac.getRaw(), kHitachiAc264Bits); +} + +TEST(TestIRHitachiAc264Class, Issue1729_PowerOntoOff) { + IRHitachiAc264 ac(kGpioUnused); + + const String on_str = "Power: On, Mode: 6 (Heat), Temp: 25C, Fan: 5 (Auto), " + "Button: 19 (Power/Mode)"; + const String off_str = "Power: Off, Mode: 6 (Heat), Temp: 25C, " + "Fan: 5 (Auto), Button: 19 (Power/Mode)"; + const uint8_t off_state[kHitachiAc264StateLength] = { + 0x01, 0x10, 0x00, 0x40, 0xBF, 0xFF, 0x00, 0xCC, 0x33, 0x92, + 0x6D, 0x13, 0xEC, 0x64, 0x9B, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x56, 0xA9, 0xC1, 0x3E, 0x00, + 0xFF, 0x00, 0xFF}; + // Simulate at the `IRHitachiAc264` class level. + ac.stateReset(); + // Create an On state. + ac.setMode(kHitachiAc264Heat); + ac.setTemp(25); + ac.setFan(kHitachiAc264FanAuto); + ac.setPower(true); + EXPECT_EQ(on_str, ac.toString()); + ac.send(); // Send it + EXPECT_EQ(on_str, ac.toString()); // Check it is still the same. + + // Now construct the "Off" state. + ac.setMode(kHitachiAc264Heat); + ac.setTemp(25); + ac.setFan(kHitachiAc264FanAuto); + ac.setPower(false); + + EXPECT_EQ(off_str, ac.toString()); + EXPECT_STATE_EQ(off_state, ac.getRaw(), kHitachiAc264Bits); + ac.send(); // Send it + EXPECT_EQ(off_str, ac.toString()); // Check it is still the same "off" state. + EXPECT_STATE_EQ(off_state, ac.getRaw(), kHitachiAc264Bits); + + // Simulate at the `IRac` class level. + IRac irac(kGpioUnused); + IRrecv capture(kGpioUnused); + + ac.stateReset(); + ac._irsend.reset(); + + // Create a power on state & send it. + irac.hitachi264(&ac, + true, // Power + stdAc::opmode_t::kHeat, // Mode + 25, // Celsius + stdAc::fanspeed_t::kAuto); // Fan speed + + ASSERT_EQ(on_str, ac.toString()); + ac._irsend.makeDecodeResult(); + EXPECT_TRUE(capture.decode(&ac._irsend.capture)); + ASSERT_EQ(HITACHI_AC264, ac._irsend.capture.decode_type); + ASSERT_EQ(kHitachiAc264Bits, ac._irsend.capture.bits); + ASSERT_EQ(on_str, IRAcUtils::resultAcToString(&ac._irsend.capture)); + stdAc::state_t on, prev; + ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &on, &prev)); + EXPECT_EQ(decode_type_t::HITACHI_AC264, on.protocol); + EXPECT_TRUE(on.power); + EXPECT_EQ(stdAc::opmode_t::kHeat, on.mode); + EXPECT_EQ(25, on.degrees); + + ac.stateReset(); + ac._irsend.reset(); + // Create a power off state & send it. + prev = on; + irac.hitachi264(&ac, + false, // Power + stdAc::opmode_t::kHeat, // Mode + 25, // Celsius + stdAc::fanspeed_t::kAuto); // Fan speed + + ASSERT_EQ(off_str, ac.toString()); + ac._irsend.makeDecodeResult(); + EXPECT_TRUE(capture.decode(&ac._irsend.capture)); + ASSERT_EQ(HITACHI_AC264, ac._irsend.capture.decode_type); + ASSERT_EQ(kHitachiAc264Bits, ac._irsend.capture.bits); + ASSERT_EQ(off_str, IRAcUtils::resultAcToString(&ac._irsend.capture)); + EXPECT_STATE_EQ(off_state, ac._irsend.capture.state, ac._irsend.capture.bits); + stdAc::state_t off; + ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &off, &prev)); + EXPECT_EQ(decode_type_t::HITACHI_AC264, off.protocol); + EXPECT_FALSE(off.power); + EXPECT_EQ(stdAc::opmode_t::kHeat, off.mode); + EXPECT_EQ(25, off.degrees); + + // Verify that handleToggles() isn't screwing anything up. + stdAc::state_t toggle_state; + toggle_state = irac.handleToggles(on, &prev); + EXPECT_FALSE(irac.cmpStates(on, prev)); // They are the same. + EXPECT_FALSE(irac.cmpStates(on, toggle_state)); // They are the same. + toggle_state = irac.handleToggles(off, &on); + EXPECT_TRUE(irac.cmpStates(off, on)); // They are different. + EXPECT_FALSE(irac.cmpStates(off, toggle_state)); // They are the same. + EXPECT_EQ(off.protocol, decode_type_t::HITACHI_AC264); + EXPECT_FALSE(off.power); + // That confirms handleToggles() isn't causing any grief. + + // Check that IRac copies & modifies the states as we expect. + irac.next = on; // Copy in the "on" state we constructed earlier. + irac.sendAc(); // Send it. + irac.markAsSent(); // Confirm it was sent. + EXPECT_FALSE(irac.cmpStates(on, irac.getStatePrev())); // They are the same. + EXPECT_FALSE(irac.cmpStates(on, irac.getState())); // They are the same. + + irac.next.power = false; // Turn off the power. + EXPECT_TRUE(irac.cmpStates(on, irac.getState())); // They are the different. + EXPECT_FALSE(off.power); + EXPECT_FALSE(irac.cmpStates(off, irac.getState())); // They are the same. + EXPECT_FALSE(irac.cmpStates(off, irac.next)); // They are the same. + irac.sendAc(); // Send it. + irac.markAsSent(); // Confirm it was sent. + EXPECT_FALSE(irac.cmpStates(off, irac.getStatePrev())); // They are the same. + EXPECT_FALSE(irac.cmpStates(off, irac.getState())); // They are the same. + EXPECT_FALSE(irac.cmpStates(off, irac.next)); // They are the same. + EXPECT_FALSE(irac.getStatePrev().power); + EXPECT_FALSE(irac.getState().power); + EXPECT_FALSE(irac.next.power); +} + +// Decode a 'real' HitachiAc296 message. +TEST(TestDecodeHitachiAc296, RealExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + const uint8_t expected[kHitachiAc296StateLength] = { + 0x01, 0x10, 0x00, 0x40, 0xBF, 0xFF, 0x00, 0xCC, 0x33, 0x92, + 0x6D, 0x44, 0xBB, 0x04, 0xFB, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x57, 0xA8, 0xF1, 0x0E, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x03, 0xFC}; + + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/pull/1758#issuecomment-1066017940 + // Power: ON, Temp: -- (not used in auto mode), Fan: Auto, Mode: Auto + const uint16_t rawData[595] = { + 3298, 1712, 358, 1278, 362, 516, 356, 518, 358, 514, 358, 518, 358, 516, + 360, 516, 358, 520, 362, 514, 358, 516, 360, 514, 362, 514, 360, 1280, + 358, 518, 358, 514, 362, 518, 360, 516, 358, 516, 358, 516, 360, 516, 358, + 516, 358, 518, 358, 516, 360, 518, 362, 516, 358, 514, 360, 514, 360, 516, + 360, 516, 358, 516, 362, 1280, 356, 520, 360, 1276, 362, 1276, 360, 1282, + 360, 1280, 356, 1280, 358, 1278, 362, 514, 362, 1280, 360, 1280, 360, + 1278, 358, 1280, 358, 1280, 358, 1278, 360, 1280, 358, 1278, 360, 1282, + 360, 514, 360, 514, 362, 516, 356, 516, 362, 514, 360, 516, 358, 516, 358, + 520, 360, 516, 358, 516, 362, 1276, 360, 1278, 360, 514, 358, 516, 360, + 1278, 360, 1282, 360, 1276, 362, 1278, 360, 514, 358, 518, 358, 1278, 360, + 1278, 360, 514, 360, 518, 360, 516, 358, 1280, 358, 516, 360, 516, 360, + 1278, 360, 518, 356, 516, 360, 1282, 360, 1278, 362, 514, 360, 1278, 360, + 1278, 360, 516, 358, 1278, 360, 1280, 358, 520, 358, 516, 358, 516, 360, + 1276, 360, 516, 358, 514, 360, 514, 364, 1276, 358, 522, 358, 1278, 360, + 1280, 358, 516, 360, 1278, 360, 1276, 360, 1278, 362, 514, 358, 1286, 358, + 514, 358, 514, 362, 1278, 360, 514, 360, 518, 358, 516, 358, 518, 358, + 518, 360, 1276, 360, 1278, 362, 514, 360, 1276, 360, 1276, 362, 1280, 358, + 1276, 360, 1284, 358, 516, 358, 516, 360, 516, 360, 514, 360, 516, 358, + 516, 360, 518, 356, 518, 358, 1280, 358, 1278, 362, 1276, 360, 1280, 360, + 1276, 360, 1278, 362, 1278, 358, 1282, 358, 516, 358, 518, 358, 514, 360, + 516, 358, 516, 360, 514, 360, 514, 358, 520, 360, 1278, 360, 1280, 358, + 1280, 360, 1278, 360, 1278, 358, 1278, 360, 1278, 362, 1282, 360, 516, + 360, 516, 358, 516, 360, 518, 356, 516, 358, 516, 362, 514, 358, 520, 358, + 1280, 358, 1278, 362, 1276, 362, 1276, 360, 1276, 360, 1278, 360, 1278, + 360, 1282, 360, 514, 362, 514, 360, 516, 360, 514, 360, 516, 360, 516, + 360, 516, 358, 520, 362, 1278, 358, 1278, 362, 1276, 360, 1280, 358, 1276, + 362, 1276, 362, 1278, 360, 1284, 358, 516, 358, 514, 360, 516, 360, 514, + 360, 516, 360, 512, 362, 514, 360, 518, 360, 1276, 362, 1276, 362, 1278, + 358, 1280, 360, 1278, 360, 1278, 360, 1276, 362, 1282, 360, 1278, 362, + 1278, 362, 1276, 362, 512, 360, 1278, 362, 514, 360, 1278, 358, 520, 358, + 516, 360, 514, 360, 516, 358, 1278, 362, 514, 360, 1278, 358, 516, 362, + 1282, 360, 1276, 360, 516, 360, 516, 358, 518, 358, 1276, 362, 1278, 360, + 1278, 360, 1284, 358, 516, 360, 1278, 362, 1276, 360, 1278, 360, 516, 360, + 512, 362, 512, 362, 518, 362, 514, 362, 514, 358, 514, 360, 514, 360, 518, + 358, 514, 358, 516, 360, 518, 360, 1278, 360, 1278, 360, 1276, 362, 1276, + 362, 1276, 362, 1278, 358, 1278, 362, 1284, 358, 514, 362, 512, 360, 514, + 362, 516, 360, 514, 360, 514, 360, 512, 362, 520, 360, 1276, 362, 1278, + 362, 1276, 364, 1274, 360, 1278, 362, 1278, 360, 1278, 360, 1282, 362, + 512, 360, 514, 362, 512, 362, 514, 360, 516, 362, 512, 362, 516, 360, 518, + 360, 1278, 360, 1276, 362, 1278, 360, 1274, 364, 1276, 362, 1276, 360, + 1278, 360, 1280, 362, 1276, 362, 1276, 364, 512, 360, 514, 362, 512, 362, + 512, 362, 512, 362, 520, 358, 516, 360, 514, 360, 1276, 360, 1276, 362, + 1276, 362, 1278, 360, 1278, 360, 1280, 362}; // HITACHI_AC296 + + irsend.reset(); + irsend.sendRaw(rawData, 595, kHitachiAcFreq); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(HITACHI_AC296, irsend.capture.decode_type); + ASSERT_EQ(kHitachiAc296Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expected, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "Power: On, Mode: 7 (Auto), Temp: 1C, Fan: 5 (Auto)", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); +} + +// Decode a 'Synthetic' HitachiAc296 message. +TEST(TestDecodeHitachiAc296, SyntheticExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/pull/1758#issuecomment-1066017940 + // Power: ON, Temp: 24, Fan: Quiet (1), Mode: Cool + const uint8_t expected[kHitachiAc296StateLength] = { + 0x01, 0x10, 0x00, 0x40, 0xBF, 0xFF, 0x00, 0xCC, 0x33, 0x98, + 0x67, 0x42, 0xBD, 0x60, 0x9F, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x13, 0xEC, 0xF1, 0x0E, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x03, 0xFC}; + + irsend.reset(); + irsend.sendHitachiAc296(expected); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(HITACHI_AC296, irsend.capture.decode_type); + ASSERT_EQ(kHitachiAc296Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expected, irsend.capture.state, kHitachiAc296Bits); + EXPECT_EQ( + "Power: On, Mode: 3 (Cool), Temp: 24C, Fan: 1 (Quiet)", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); +} + +TEST(TestIRHitachiAc296Class, SetAndGetPower) { + IRHitachiAc296 ac(kGpioUnused); + ac.on(); + EXPECT_TRUE(ac.getPower()); + ac.off(); + EXPECT_FALSE(ac.getPower()); + ac.setPower(true); + EXPECT_TRUE(ac.getPower()); + ac.setPower(false); + EXPECT_FALSE(ac.getPower()); +} + +TEST(TestIRHitachiAc296Class, SetAndGetTemp) { + IRHitachiAc296 ac(kGpioUnused); + ac.setTemp(25); + EXPECT_EQ(25, ac.getTemp()); + ac.setTemp(kHitachiAc296MinTemp); + EXPECT_EQ(kHitachiAc296MinTemp, ac.getTemp()); + ac.setTemp(kHitachiAc296MinTemp - 1); + EXPECT_EQ(kHitachiAc296MinTemp, ac.getTemp()); + ac.setTemp(kHitachiAc296MaxTemp); + EXPECT_EQ(kHitachiAc296MaxTemp, ac.getTemp()); + ac.setTemp(kHitachiAc296MaxTemp + 1); + EXPECT_EQ(kHitachiAc296MaxTemp, ac.getTemp()); + // Check the handling of the special temp value for auto operation mode, + ac.setMode(kHitachiAc296Cool); + ac.setTemp(kHitachiAc296TempAuto); + EXPECT_EQ(kHitachiAc296MinTemp, ac.getTemp()); + ac.setMode(kHitachiAc296Auto); + EXPECT_EQ(kHitachiAc296TempAuto, ac.getTemp()); + ac.setTemp(kHitachiAc296TempAuto); + EXPECT_EQ(kHitachiAc296TempAuto, ac.getTemp()); + ac.setTemp(kHitachiAc296MinTemp); + EXPECT_EQ(kHitachiAc296TempAuto, ac.getTemp()); + ac.setMode(kHitachiAc296Cool); + EXPECT_NE(kHitachiAc296TempAuto, ac.getTemp()); +} + +TEST(TestIRHitachiAc296Class, SetAndGetMode) { + IRHitachiAc296 ac(kGpioUnused); + ac.setMode(kHitachiAc296Cool); + ac.setFan(kHitachiAc296FanAuto); + ac.setTemp(25); + EXPECT_EQ(25, ac.getTemp()); + EXPECT_EQ(kHitachiAc296Cool, ac.getMode()); + EXPECT_EQ(kHitachiAc296FanAuto, ac.getFan()); + ac.setMode(kHitachiAc296Heat); + EXPECT_EQ(25, ac.getTemp()); + EXPECT_EQ(kHitachiAc296Heat, ac.getMode()); + ac.setMode(kHitachiAc296Dehumidify); + EXPECT_EQ(kHitachiAc296Dehumidify, ac.getMode()); +} + +TEST(TestIRHitachiAc296Class, SetAndGetFan) { + IRHitachiAc296 ac(kGpioUnused); + ac.setMode(kHitachiAc296Cool); + ac.setFan(kHitachiAc296FanAuto); + EXPECT_EQ(kHitachiAc296FanAuto, ac.getFan()); + ac.setFan(kHitachiAc296FanLow); + EXPECT_EQ(kHitachiAc296FanLow, ac.getFan()); + ac.setFan(kHitachiAc296FanHigh); + EXPECT_EQ(kHitachiAc296FanHigh, ac.getFan()); + ac.setFan(kHitachiAc296FanAuto + 1); + EXPECT_EQ(kHitachiAc296FanAuto, ac.getFan()); + ac.setFan(kHitachiAc296FanSilent - 1); + EXPECT_EQ(kHitachiAc296FanSilent, ac.getFan()); +} diff --git a/lib/IRremoteESP8266/test/ir_Kelon_test.cpp b/lib/IRremoteESP8266/test/ir_Kelon_test.cpp index 7212d49ee..dec439a24 100644 --- a/lib/IRremoteESP8266/test/ir_Kelon_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Kelon_test.cpp @@ -105,6 +105,7 @@ TEST(TestDecodeKelon, Timer12HSmartMode) { EXPECT_TRUE(irrecv.decode(&irsend.capture)); EXPECT_EQ(KELON, irsend.capture.decode_type); EXPECT_EQ(kKelonBits, irsend.capture.bits); + EXPECT_EQ(0x1679030683, irsend.capture.value); EXPECT_EQ( "Temp: 25C, Mode: 1 (Auto), Fan: 3 (High), Sleep: Off, Dry: 0, " "Timer: 12:00, Turbo: Off", @@ -124,6 +125,7 @@ TEST(TestDecodeKelon, Timer5_5hSuperCoolMode) { EXPECT_TRUE(irrecv.decode(&irsend.capture)); EXPECT_EQ(KELON, irsend.capture.decode_type); EXPECT_EQ(kKelonBits, irsend.capture.bits); + EXPECT_EQ(0x100B0A010683, irsend.capture.value); EXPECT_EQ( "Temp: 18C, Mode: 2 (Cool), Fan: 1 (Low), Sleep: Off, Dry: 0, " "Timer: 05:30, Turbo: On", @@ -143,6 +145,7 @@ TEST(TestDecodeKelon, ChangeSettingsWithTimerSetHeatMode) { EXPECT_TRUE(irrecv.decode(&irsend.capture)); EXPECT_EQ(KELON, irsend.capture.decode_type); EXPECT_EQ(kKelonBits, irsend.capture.bits); + EXPECT_EQ(0x58000683, irsend.capture.value); EXPECT_EQ( "Temp: 23C, Mode: 0 (Heat), Fan: 0 (Auto), Sleep: Off, Dry: 0, " "Timer: On, Turbo: Off", @@ -162,6 +165,7 @@ TEST(TestDecodeKelon, TestPowerToggleDryMode) { EXPECT_TRUE(irrecv.decode(&irsend.capture)); EXPECT_EQ(KELON, irsend.capture.decode_type); EXPECT_EQ(kKelonBits, irsend.capture.bits); + EXPECT_EQ(0x83040683, irsend.capture.value); EXPECT_EQ( "Temp: 26C, Mode: 3 (Dry), Fan: 0 (Auto), Sleep: Off, Dry: 0, Timer:" " Off, Turbo: Off, Power Toggle: On", @@ -181,6 +185,7 @@ TEST(TestDecodeKelon, TestSwingToggleDryMode) { EXPECT_TRUE(irrecv.decode(&irsend.capture)); EXPECT_EQ(KELON, irsend.capture.decode_type); EXPECT_EQ(kKelonBits, irsend.capture.bits); + EXPECT_EQ(0x83800683, irsend.capture.value); EXPECT_EQ( "Temp: 26C, Mode: 3 (Dry), Fan: 0 (Auto), Sleep: Off, Dry: 0, Timer:" " Off, Turbo: Off, Swing(V) Toggle: On", @@ -200,6 +205,7 @@ TEST(TestDecodeKelon, TestDryGradeNegativeValue) { EXPECT_TRUE(irrecv.decode(&irsend.capture)); EXPECT_EQ(KELON, irsend.capture.decode_type); EXPECT_EQ(kKelonBits, irsend.capture.bits); + EXPECT_EQ(0x83600683, irsend.capture.value); EXPECT_EQ( "Temp: 26C, Mode: 3 (Dry), Fan: 0 (Auto), Sleep: Off, Dry: -2," " Timer: Off, Turbo: Off", @@ -419,10 +425,177 @@ TEST(TestIRKelonClass, toCommonToggles) { } TEST(TestUtils, Housekeeping) { + // KELON ASSERT_EQ("KELON", typeToString(decode_type_t::KELON)); ASSERT_EQ(decode_type_t::KELON, strToDecodeType("KELON")); ASSERT_FALSE(hasACState(decode_type_t::KELON)); ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::KELON)); ASSERT_EQ(kKelonBits, IRsend::defaultBits(decode_type_t::KELON)); ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::KELON)); + + // KELON168 + ASSERT_EQ("KELON168", typeToString(decode_type_t::KELON168)); + ASSERT_EQ(decode_type_t::KELON168, strToDecodeType("KELON168")); + ASSERT_TRUE(hasACState(decode_type_t::KELON168)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::KELON168)); + ASSERT_EQ(kKelon168Bits, IRsend::defaultBits(decode_type_t::KELON168)); + ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::KELON168)); +} + +TEST(TestDecodeKelon, Discussion1744) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/discussions/1744#discussioncomment-2061968 + // Note: This message is NOT at 48-bit Kelon protocol message. + // It is actually 48 + 64 + 56 = 168 bit (21 byte) message. + // i.e. A different protocol all together. + const uint16_t rawData[343] = { + 8922, 4494, // Header + 548, 1714, 524, 1718, 524, 572, 524, 550, // Byte 0 + 550, 556, 550, 560, 548, 586, 524, 1724, + 526, 564, 524, 1692, 550, 1696, 550, 552, // Byte 1 + 550, 554, 550, 560, 548, 586, 524, 550, + 548, 1688, 550, 1694, 548, 548, 550, 552, // Byte 2 + 548, 556, 548, 582, 524, 586, 524, 576, + 524, 540, 548, 568, 526, 572, 526, 548, // Byte 3 + 550, 1702, 550, 1706, 550, 1734, 526, 574, + 526, 564, 526, 544, 550, 548, 548, 550, // Byte 4 + 550, 554, 550, 582, 526, 586, 524, 550, + 548, 540, 550, 544, 550, 570, 526, 550, // Byte 5 + 550, 558, 546, 582, 524, 586, 524, 562, + 524, 7978, // Section Footer + 548, 1690, 548, 568, 524, 1696, 548, 1700, // Byte 6 + 548, 554, 550, 560, 548, 560, 550, 1722, + 526, 1686, 550, 1692, 548, 1696, 550, 576, // Byte 7 + 524, 1704, 548, 558, 550, 562, 548, 550, + 550, 564, 524, 570, 524, 548, 548, 576, // Byte 8 + 524, 578, 526, 558, 550, 586, 524, 574, + 524, 566, 524, 568, 526, 548, 548, 576, // Byte 9 + 526, 556, 548, 558, 550, 560, 550, 550, + 550, 564, 526, 544, 548, 548, 548, 552, // Byte 10 + 548, 556, 548, 582, 526, 564, 548, 550, + 550, 540, 548, 568, 526, 546, 550, 550, // Byte 11 + 550, 580, 524, 558, 550, 560, 550, 1698, + 550, 542, 548, 542, 550, 546, 550, 1722, // Byte 12 + 524, 1706, 548, 582, 526, 586, 524, 574, + 526, 1690, 548, 544, 550, 546, 550, 552, // Byte 13 + 548, 1726, 526, 1730, 524, 1734, 526, 562, + 524, 7976, // Section footer + 550, 566, 524, 544, 550, 570, 526, 550, // Byte 14 + 548, 554, 550, 1706, 550, 562, 548, 574, + 526, 542, 548, 544, 550, 572, 526, 548, // Byte 15 + 552, 554, 550, 582, 526, 584, 526, 574, + 524, 542, 548, 544, 548, 572, 524, 552, // Byte 16 + 548, 578, 524, 560, 548, 562, 548, 550, + 550, 540, 550, 546, 548, 572, 524, 576, // Byte 17 + 526, 556, 548, 560, 546, 564, 548, 574, + 526, 540, 550, 546, 546, 546, 550, 1698, // Byte 18 + 550, 1728, 524, 1706, 548, 564, 548, 574, + 524, 544, 548, 568, 526, 548, 548, 574, // Byte 19 + 524, 554, 550, 558, 550, 562, 548, 550, + 550, 566, 524, 544, 548, 546, 552, 1698, // Byte 20 + 548, 1702, 550, 560, 546, 586, 524, 538, + 546 // Footer + }; // KELON 178D000070030683 + + irsend.begin(); + irsend.reset(); + irsend.sendRaw(rawData, 343, 38000); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_NE(KELON, irsend.capture.decode_type); // Not a KELON message + EXPECT_NE(kKelonBits, irsend.capture.bits); // Not a 48 bit message. +} + +TEST(TestDecodeKelon168, RealExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/discussions/1744#discussioncomment-2061968 + const uint16_t rawData[343] = { + 8922, 4494, // Header + 548, 1714, 524, 1718, 524, 572, 524, 550, // Byte 0 + 550, 556, 550, 560, 548, 586, 524, 1724, + 526, 564, 524, 1692, 550, 1696, 550, 552, // Byte 1 + 550, 554, 550, 560, 548, 586, 524, 550, + 548, 1688, 550, 1694, 548, 548, 550, 552, // Byte 2 + 548, 556, 548, 582, 524, 586, 524, 576, + 524, 540, 548, 568, 526, 572, 526, 548, // Byte 3 + 550, 1702, 550, 1706, 550, 1734, 526, 574, + 526, 564, 526, 544, 550, 548, 548, 550, // Byte 4 + 550, 554, 550, 582, 526, 586, 524, 550, + 548, 540, 550, 544, 550, 570, 526, 550, // Byte 5 + 550, 558, 546, 582, 524, 586, 524, 562, + 524, 7978, // Section Footer + 548, 1690, 548, 568, 524, 1696, 548, 1700, // Byte 6 + 548, 554, 550, 560, 548, 560, 550, 1722, + 526, 1686, 550, 1692, 548, 1696, 550, 576, // Byte 7 + 524, 1704, 548, 558, 550, 562, 548, 550, + 550, 564, 524, 570, 524, 548, 548, 576, // Byte 8 + 524, 578, 526, 558, 550, 586, 524, 574, + 524, 566, 524, 568, 526, 548, 548, 576, // Byte 9 + 526, 556, 548, 558, 550, 560, 550, 550, + 550, 564, 526, 544, 548, 548, 548, 552, // Byte 10 + 548, 556, 548, 582, 526, 564, 548, 550, + 550, 540, 548, 568, 526, 546, 550, 550, // Byte 11 + 550, 580, 524, 558, 550, 560, 550, 1698, + 550, 542, 548, 542, 550, 546, 550, 1722, // Byte 12 + 524, 1706, 548, 582, 526, 586, 524, 574, + 526, 1690, 548, 544, 550, 546, 550, 552, // Byte 13 + 548, 1726, 526, 1730, 524, 1734, 526, 562, + 524, 7976, // Section footer + 550, 566, 524, 544, 550, 570, 526, 550, // Byte 14 + 548, 554, 550, 1706, 550, 562, 548, 574, + 526, 542, 548, 544, 550, 572, 526, 548, // Byte 15 + 552, 554, 550, 582, 526, 584, 526, 574, + 524, 542, 548, 544, 548, 572, 524, 552, // Byte 16 + 548, 578, 524, 560, 548, 562, 548, 550, + 550, 540, 550, 546, 548, 572, 524, 576, // Byte 17 + 526, 556, 548, 560, 546, 564, 548, 574, + 526, 540, 550, 546, 546, 546, 550, 1698, // Byte 18 + 550, 1728, 524, 1706, 548, 564, 548, 574, + 524, 544, 548, 568, 526, 548, 548, 574, // Byte 19 + 524, 554, 550, 558, 550, 562, 548, 550, + 550, 566, 524, 544, 548, 546, 552, 1698, // Byte 20 + 548, 1702, 550, 560, 546, 586, 524, 538, + 546 // Footer + }; // KELON 178D000070030683 + + const uint8_t expected[kKelon168StateLength] = { + 0x83, 0x06, 0x03, 0x70, 0x00, 0x00, 0x8D, + 0x17, 0x00, 0x00, 0x00, 0x80, 0x18, 0x71, + 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18}; + + irsend.begin(); + irsend.reset(); + irsend.sendRaw(rawData, 343, 38000); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::KELON168, irsend.capture.decode_type); + EXPECT_EQ(kKelon168Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expected, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ("", IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); +} + +TEST(TestDecodeKelon168, SyntheticExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + + const uint8_t expected[kKelon168StateLength] = { + 0x83, 0x06, 0x03, 0x70, 0x00, 0x00, 0x8D, + 0x17, 0x00, 0x00, 0x00, 0x80, 0x18, 0x71, + 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18}; + + irsend.begin(); + irsend.reset(); + irsend.sendKelon168(expected); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::KELON168, irsend.capture.decode_type); + EXPECT_EQ(kKelon168Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expected, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ("", IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); } diff --git a/lib/IRremoteESP8266/test/ir_Kelvinator_test.cpp b/lib/IRremoteESP8266/test/ir_Kelvinator_test.cpp index 73ad6581d..e4a335db0 100644 --- a/lib/IRremoteESP8266/test/ir_Kelvinator_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Kelvinator_test.cpp @@ -250,24 +250,44 @@ TEST(TestKelvinatorClass, VaneSwing) { IRKelvinatorAC irkelv(0); irkelv.begin(); - irkelv.setSwingHorizontal(true); - irkelv.setSwingVertical(false); - irkelv.setSwingHorizontal(true); EXPECT_TRUE(irkelv.getSwingHorizontal()); - EXPECT_FALSE(irkelv.getSwingVertical()); - irkelv.setSwingVertical(true); + EXPECT_FALSE(irkelv.getSwingVerticalAuto()); + EXPECT_EQ(kKelvinatorSwingVOff, irkelv.getSwingVerticalPosition()); + + irkelv.setSwingVertical(true, kKelvinatorSwingVAuto); + EXPECT_TRUE(irkelv.getSwingVerticalAuto()); + EXPECT_EQ(kKelvinatorSwingVAuto, irkelv.getSwingVerticalPosition()); + EXPECT_TRUE(irkelv.getSwingHorizontal()); + + irkelv.setSwingVertical(false, kKelvinatorSwingVMiddle); + EXPECT_FALSE(irkelv.getSwingVerticalAuto()); + EXPECT_EQ(kKelvinatorSwingVMiddle, irkelv.getSwingVerticalPosition()); EXPECT_TRUE(irkelv.getSwingHorizontal()); - EXPECT_TRUE(irkelv.getSwingVertical()); irkelv.setSwingHorizontal(false); EXPECT_FALSE(irkelv.getSwingHorizontal()); - EXPECT_TRUE(irkelv.getSwingVertical()); - irkelv.setSwingVertical(false); + irkelv.setSwingVertical(true, kKelvinatorSwingVLowAuto); + EXPECT_TRUE(irkelv.getSwingVerticalAuto()); + EXPECT_EQ(kKelvinatorSwingVLowAuto, irkelv.getSwingVerticalPosition()); EXPECT_FALSE(irkelv.getSwingHorizontal()); - EXPECT_FALSE(irkelv.getSwingVertical()); + + // Out of bounds. + irkelv.setSwingVertical(false, 255); + EXPECT_FALSE(irkelv.getSwingVerticalAuto()); + EXPECT_EQ(kKelvinatorSwingVOff, irkelv.getSwingVerticalPosition()); + irkelv.setSwingVertical(false, kKelvinatorSwingVAuto); + EXPECT_FALSE(irkelv.getSwingVerticalAuto()); + EXPECT_EQ(kKelvinatorSwingVOff, irkelv.getSwingVerticalPosition()); + + irkelv.setSwingVertical(true, 255); + EXPECT_TRUE(irkelv.getSwingVerticalAuto()); + EXPECT_EQ(kKelvinatorSwingVAuto, irkelv.getSwingVerticalPosition()); + irkelv.setSwingVertical(true, kKelvinatorSwingVLowest); + EXPECT_TRUE(irkelv.getSwingVerticalAuto()); + EXPECT_EQ(kKelvinatorSwingVAuto, irkelv.getSwingVerticalPosition()); } TEST(TestKelvinatorClass, QuietMode) { @@ -425,7 +445,7 @@ TEST(TestKelvinatorClass, HumanReadable) { EXPECT_EQ( "Power: Off, Mode: 0 (Auto), Temp: 16C, Fan: 0 (Auto), Turbo: Off, " "Quiet: Off, XFan: Off, Ion: Off, Light: Off, " - "Swing(H): Off, Swing(V): Off", + "Swing(H): Off, Swing(V): 0 (Off)", irkelv.toString()); irkelv.on(); irkelv.setMode(kKelvinatorCool); @@ -438,7 +458,7 @@ TEST(TestKelvinatorClass, HumanReadable) { EXPECT_EQ( "Power: On, Mode: 1 (Cool), Temp: 25C, Fan: 5 (High), Turbo: Off, " "Quiet: Off, XFan: On, Ion: On, Light: On, " - "Swing(H): On, Swing(V): Off", + "Swing(H): On, Swing(V): 0 (Off)", irkelv.toString()); } @@ -451,7 +471,7 @@ TEST(TestKelvinatorClass, MessageConstuction) { irkelv.setFan(1); irkelv.setMode(kKelvinatorCool); irkelv.setTemp(27); - irkelv.setSwingVertical(false); + irkelv.setSwingVertical(false, kKelvinatorSwingVOff); irkelv.setSwingHorizontal(true); irkelv.setIonFilter(true); irkelv.setQuiet(false); @@ -464,7 +484,7 @@ TEST(TestKelvinatorClass, MessageConstuction) { EXPECT_EQ(1, irkelv.getFan()); EXPECT_EQ(kKelvinatorCool, irkelv.getMode()); EXPECT_EQ(27, irkelv.getTemp()); - EXPECT_FALSE(irkelv.getSwingVertical()); + EXPECT_FALSE(irkelv.getSwingVerticalAuto()); EXPECT_TRUE(irkelv.getSwingHorizontal()); EXPECT_TRUE(irkelv.getIonFilter()); EXPECT_FALSE(irkelv.getQuiet()); @@ -523,7 +543,7 @@ TEST(TestDecodeKelvinator, NormalSynthetic) { EXPECT_EQ( "Power: On, Mode: 1 (Cool), Temp: 27C, Fan: 1 (Low), Turbo: Off, " "Quiet: Off, XFan: On, Ion: Off, Light: Off, " - "Swing(H): Off, Swing(V): Off", + "Swing(H): Off, Swing(V): 0 (Off)", IRAcUtils::resultAcToString(&irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); @@ -541,7 +561,7 @@ TEST(TestKelvinatorClass, toCommon) { ac.setTurbo(true); ac.setLight(true); ac.setSwingHorizontal(false); - ac.setSwingVertical(true); + ac.setSwingVertical(true, kKelvinatorSwingVAuto); // Now test it. ASSERT_EQ(decode_type_t::KELVINATOR, ac.toCommon().protocol); diff --git a/lib/IRremoteESP8266/test/ir_LG_test.cpp b/lib/IRremoteESP8266/test/ir_LG_test.cpp index 808f7b83a..9652f702c 100644 --- a/lib/IRremoteESP8266/test/ir_LG_test.cpp +++ b/lib/IRremoteESP8266/test/ir_LG_test.cpp @@ -693,6 +693,10 @@ TEST(TestUtils, Housekeeping) { IRac::strToModel(irutils::modelToStr( decode_type_t::LG2, lg_ac_remote_model_t::AKB73757604).c_str())); + ASSERT_EQ(lg_ac_remote_model_t::LG6711A20083V, + IRac::strToModel(irutils::modelToStr( + decode_type_t::LG, + lg_ac_remote_model_t::LG6711A20083V).c_str())); } TEST(TestIRLgAcClass, KnownExamples) { @@ -1126,3 +1130,63 @@ TEST(TestIRLgAcClass, SwingVOffAfterAuto) { ASSERT_EQ("Model: 3 (AKB74955603), Swing(V): 21 (Off)", IRAcUtils::resultAcToString(&ac._irsend.capture)); } + +TEST(TestIRLgAcClass, Issue1737) { + // Simulate getting a light toggle while the ac class/prev state thinks the + // device is on. + IRLgAc ac(kGpioUnused); + ac.begin(); + + ac.setModel(lg_ac_remote_model_t::AKB74955603); + ac.setPower(true); + ac.setMode(kLgAcFan); + ac.setTemp(18); + ac.setFan(kLgAcFanLowest); + stdAc::state_t prev = ac.toCommon(); + EXPECT_TRUE(prev.power); + EXPECT_TRUE(ac.toCommon().power); + EXPECT_TRUE(ac.toCommon(&prev).power); + + ac.setRaw(kLgAcLightToggle); + EXPECT_TRUE(ac.isLightToggle()); + + EXPECT_FALSE(ac.toCommon().power); // No previous state, so should be false. + EXPECT_TRUE(ac.toCommon(&prev).power); + + // A better simulation of the desired use case. + IRsendTest irsend(kGpioUnused); + IRrecv capture(kGpioUnused); + irsend.begin(); + irsend.reset(); + irsend.sendLG2(kLgAcLightToggle); + irsend.makeDecodeResult(); + EXPECT_TRUE(capture.decode(&irsend.capture)); + ASSERT_EQ(LG2, irsend.capture.decode_type); // Not "LG" + ASSERT_EQ(kLgBits, irsend.capture.bits); + stdAc::state_t result; + ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &result, &prev)); + EXPECT_TRUE(result.power); +} + +TEST(TestIRLgAcClass, SwingVToggle) { + IRLgAc ac(kGpioUnused); + ac.begin(); + + ac.setModel(lg_ac_remote_model_t::GE6711AR2853M); + EXPECT_FALSE(ac.isSwingVToggle()); + EXPECT_FALSE(ac._isLG6711A20083V()); + EXPECT_EQ(lg_ac_remote_model_t::GE6711AR2853M, ac.getModel()); + + ac.setRaw(kLgAcSwingVToggle, decode_type_t::LG); + EXPECT_TRUE(ac.isSwingVToggle()); + EXPECT_TRUE(ac._isLG6711A20083V()); + EXPECT_EQ(lg_ac_remote_model_t::LG6711A20083V, ac.getModel()); + + EXPECT_EQ("Model: 5 (LG6711A20083V), Swing(V): Toggle", ac.toString()); + + ac.stateReset(); + ac.setModel(lg_ac_remote_model_t::LG6711A20083V); + ac.setSwingV(kLgAcSwingVToggle); + EXPECT_EQ(ac._swingv, kLgAcSwingVToggle); + EXPECT_NE(ac._swingv_prev, kLgAcSwingVToggle); +} diff --git a/lib/IRremoteESP8266/test/ir_Midea_test.cpp b/lib/IRremoteESP8266/test/ir_Midea_test.cpp index 713fcd0e4..0660f8afc 100644 --- a/lib/IRremoteESP8266/test/ir_Midea_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Midea_test.cpp @@ -448,8 +448,8 @@ TEST(TestMideaACClass, HumanReadableOutput) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.off(); ac.setTemp(25, true); ac.setFan(kMideaACFanHigh); @@ -458,21 +458,21 @@ TEST(TestMideaACClass, HumanReadableOutput) { EXPECT_EQ( "Type: 1 (Command), Power: Off, Mode: 1 (Dry), Celsius: Off, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 3 (High), " - "Sleep: On, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: On, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setUseCelsius(true); EXPECT_EQ( "Type: 1 (Command), Power: Off, Mode: 1 (Dry), Celsius: On, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 3 (High), " - "Sleep: On, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: On, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setRaw(0xA19867FFFF7E); EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 0 (Cool), Celsius: Off, " "Temp: 21C/69F, On Timer: Off, Off Timer: Off, Fan: 3 (High), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); } // Tests for decodeMidea(). @@ -681,8 +681,8 @@ TEST(TestDecodeMidea, DecodeRealExample) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 18C/65F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", IRAcUtils::resultAcToString(&irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); @@ -733,16 +733,16 @@ TEST(TestMideaACClass, CelsiusRemoteTemp) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 0 (Cool), Celsius: On, " "Temp: 17C/62F, On Timer: Off, Off Timer: Off, Fan: 1 (Low), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setRaw(on_cool_low_17c); EXPECT_EQ(17, ac.getTemp(true)); EXPECT_EQ(62, ac.getTemp(false)); EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 0 (Cool), Celsius: On, " "Temp: 17C/62F, On Timer: Off, Off Timer: Off, Fan: 1 (Low), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setTemp(17, true); EXPECT_EQ(17, ac.getTemp(true)); EXPECT_EQ(62, ac.getTemp(false)); @@ -752,8 +752,8 @@ TEST(TestMideaACClass, CelsiusRemoteTemp) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 0 (Cool), Celsius: On, " "Temp: 30C/86F, On Timer: Off, Off Timer: Off, Fan: 1 (Low), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); } // https://github.com/crankyoldgit/IRremoteESP8266/issues/819 @@ -766,18 +766,18 @@ TEST(TestMideaACClass, SwingV) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: On, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): Toggle, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setSwingVToggle(false); ASSERT_FALSE(ac.getSwingVToggle()); EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setRaw(kMideaACToggleSwingV); - EXPECT_EQ("Type: 2 (Special), Swing(V) Toggle: On, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", + EXPECT_EQ("Type: 2 (Special), Swing(V): Toggle, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); } @@ -791,18 +791,18 @@ TEST(TestMideaACClass, Econo) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: On, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: Toggle, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setEconoToggle(false); ASSERT_FALSE(ac.getEconoToggle()); EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setRaw(kMideaACToggleEcono); - EXPECT_EQ("Type: 2 (Special), Swing(V) Toggle: Off, Econo Toggle: On, " - "Turbo Toggle: Off, Light Toggle: Off", + EXPECT_EQ("Type: 2 (Special), Swing(V): -, Econo: Toggle, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); } @@ -815,18 +815,20 @@ TEST(TestMideaACClass, Turbo) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: On, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: Toggle, Quiet: Off, Light: -, Clean: -, 8C Heat: -", + ac.toString()); ac.setTurboToggle(false); ASSERT_FALSE(ac.getTurboToggle()); EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", + ac.toString()); ac.setRaw(kMideaACToggleTurbo); - EXPECT_EQ("Type: 2 (Special), Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: On, Light Toggle: Off", + EXPECT_EQ("Type: 2 (Special), Swing(V): -, Econo: -, " + "Turbo: Toggle, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); } @@ -839,18 +841,105 @@ TEST(TestMideaACClass, Light) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: On", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: Toggle, Clean: -, 8C Heat: -", + ac.toString()); ac.setLightToggle(false); ASSERT_FALSE(ac.getLightToggle()); EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", + ac.toString()); ac.setRaw(kMideaACToggleLight); - EXPECT_EQ("Type: 2 (Special), Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: On", + EXPECT_EQ("Type: 2 (Special), Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: Toggle, Clean: -, 8C Heat: -", + ac.toString()); +} + +TEST(TestMideaACClass, Clean) { + IRMideaAC ac(kGpioUnused); + ac.setCleanToggle(false); + ASSERT_FALSE(ac.getCleanToggle()); + ac.setCleanToggle(true); + ASSERT_TRUE(ac.getCleanToggle()); + EXPECT_EQ( + "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " + "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: Toggle, 8C Heat: -", + ac.toString()); + ac.setCleanToggle(false); + ASSERT_FALSE(ac.getCleanToggle()); + EXPECT_EQ( + "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " + "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", + ac.toString()); + ac.setRaw(kMideaACToggleSelfClean); + EXPECT_EQ("Type: 2 (Special), Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: Toggle, 8C Heat: -", + ac.toString()); +} + +TEST(TestMideaACClass, FreezeProtectionAKA8CHeat) { + IRMideaAC ac(kGpioUnused); + ac.set8CHeatToggle(false); + ASSERT_FALSE(ac.get8CHeatToggle()); + ASSERT_NE(kMideaACHeat, ac.getMode()); + ac.set8CHeatToggle(true); // Not in heat mode so it should not work. + ASSERT_FALSE(ac.get8CHeatToggle()); + ac.setMode(kMideaACHeat); // Now it should work + ac.set8CHeatToggle(true); + ASSERT_TRUE(ac.get8CHeatToggle()); + EXPECT_EQ( + "Type: 1 (Command), Power: On, Mode: 3 (Heat), Celsius: Off, " + "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: Toggle", + ac.toString()); + ac.set8CHeatToggle(false); + ASSERT_FALSE(ac.get8CHeatToggle()); + EXPECT_EQ( + "Type: 1 (Command), Power: On, Mode: 3 (Heat), Celsius: Off, " + "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", + ac.toString()); + ac.setRaw(kMideaACToggle8CHeat); + EXPECT_EQ("Type: 2 (Special), Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: Toggle", + ac.toString()); +} + +TEST(TestMideaACClass, Quiet) { + IRMideaAC ac(kGpioUnused); + ac.setQuiet(false); + ASSERT_FALSE(ac.getQuiet()); + ac.setQuiet(true); + ASSERT_TRUE(ac.getQuiet()); + EXPECT_EQ( + "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " + "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: On, Light: -, Clean: -, 8C Heat: -", + ac.toString()); + ac.setQuiet(false); + ASSERT_FALSE(ac.getQuiet()); + EXPECT_EQ( + "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " + "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); + ac.setRaw(kMideaACQuietOn); + EXPECT_EQ("Type: 2 (Special), Swing(V): -, Econo: -, " + "Turbo: -, Quiet: On, Light: -, Clean: -, 8C Heat: -", + ac.toString()); + ac.setRaw(kMideaACQuietOff); + EXPECT_EQ("Type: 2 (Special), Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); } @@ -1067,8 +1156,8 @@ TEST(TestDecodeMidea, Issue1318_self_decode) { EXPECT_EQ( "Type: 4 (Follow), Power: On, Mode: 3 (Heat), Celsius: On, " "Temp: 24C/75F, SensorTemp: 24C/75F, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", IRAcUtils::resultAcToString(&irsend.capture)); EXPECT_EQ( "f38000d50" @@ -1146,32 +1235,32 @@ TEST(TestMideaACClass, SensorTemp) { EXPECT_EQ( "Type: 4 (Follow), Power: On, Mode: 2 (Auto), Celsius: On, " "Temp: 23C/73F, SensorTemp: 0C/32F, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setRaw(0xA482467F134E); // 18C EXPECT_EQ(18, ac.getSensorTemp(true)); EXPECT_TRUE(ac.getEnableSensorTemp()); EXPECT_EQ( "Type: 4 (Follow), Power: On, Mode: 2 (Auto), Celsius: On, " "Temp: 23C/73F, SensorTemp: 18C/64F, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setRaw(0xA482467F266B); // 37C EXPECT_EQ(37, ac.getSensorTemp(true)); EXPECT_TRUE(ac.getEnableSensorTemp()); EXPECT_EQ( "Type: 4 (Follow), Power: On, Mode: 2 (Auto), Celsius: On, " "Temp: 23C/73F, SensorTemp: 37C/98F, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setRaw(0xA482607F2B43); // 74F EXPECT_EQ(74, ac.getSensorTemp(false)); EXPECT_TRUE(ac.getEnableSensorTemp()); EXPECT_EQ( "Type: 4 (Follow), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 17C/62F, SensorTemp: 23C/74F, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); } TEST(TestMideaACClass, MessageType) { @@ -1202,8 +1291,8 @@ TEST(TestMideaACClass, ConstructKnownMessage) { EXPECT_EQ( "Type: 4 (Follow), Power: On, Mode: 2 (Auto), Celsius: On, " "Temp: 23C/73F, SensorTemp: 25C/77F, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); EXPECT_EQ(followme_25C, ac.getRaw()); } @@ -1217,8 +1306,8 @@ TEST(TestMideaACClass, OnTimer) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 3 (Heat), Celsius: On, " "Temp: 30C/86F, On Timer: 07:00, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setOnTimer(0); // Disable / Timer off. EXPECT_FALSE(ac.isOnTimerEnabled()); EXPECT_EQ(kMideaACTypeCommand, ac.getType()); @@ -1229,8 +1318,8 @@ TEST(TestMideaACClass, OnTimer) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 3 (Heat), Celsius: On, " "Temp: 30C/86F, On Timer: 03:30, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); // Limit to max time. ac.setOnTimer(25 * 60); // 25h EXPECT_TRUE(ac.isOnTimerEnabled()); @@ -1239,8 +1328,8 @@ TEST(TestMideaACClass, OnTimer) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 3 (Heat), Celsius: On, " "Temp: 30C/86F, On Timer: 24:00, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); } @@ -1254,8 +1343,8 @@ TEST(TestMideaACClass, OffTimer) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 3 (Heat), Celsius: On, " "Temp: 30C/86F, On Timer: Off, Off Timer: 00:30, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.setOffTimer(0); // Disable / Timer off. EXPECT_FALSE(ac.isOffTimerEnabled()); EXPECT_EQ(kMideaACTypeCommand, ac.getType()); @@ -1266,8 +1355,8 @@ TEST(TestMideaACClass, OffTimer) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 3 (Heat), Celsius: On, " "Temp: 30C/86F, On Timer: Off, Off Timer: 03:30, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); // Limit to max time. ac.setOffTimer(25 * 60); // 25h EXPECT_TRUE(ac.isOffTimerEnabled()); @@ -1276,8 +1365,8 @@ TEST(TestMideaACClass, OffTimer) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 3 (Heat), Celsius: On, " "Temp: 30C/86F, On Timer: Off, Off Timer: 24:00, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", ac.toString()); + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", ac.toString()); } // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1318#issuecomment-725406813 @@ -1294,16 +1383,16 @@ TEST(TestMideaACClass, SendingSwingV) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 2 (Auto), Celsius: Off, " "Temp: 25C/77F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), " - "Sleep: Off, Swing(V) Toggle: Off, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", + "Sleep: Off, Swing(V): -, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", IRAcUtils::resultAcToString(&ac._irsend.capture)); // Decode the second/following message which should be the swing toggle. EXPECT_TRUE(irrecv.decodeMidea(&ac._irsend.capture, 201)); EXPECT_EQ(MIDEA, ac._irsend.capture.decode_type); EXPECT_EQ(kMideaBits, ac._irsend.capture.bits); EXPECT_EQ( - "Type: 2 (Special), Swing(V) Toggle: On, Econo Toggle: Off, " - "Turbo Toggle: Off, Light Toggle: Off", + "Type: 2 (Special), Swing(V): Toggle, Econo: -, " + "Turbo: -, Quiet: Off, Light: -, Clean: -, 8C Heat: -", IRAcUtils::resultAcToString(&ac._irsend.capture)); } @@ -1318,8 +1407,8 @@ TEST(TestMideaACClass, Issue1342) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 3 (Heat), Celsius: Off, " "Temp: 21C/70F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), Sleep: Off, " - "Swing(V) Toggle: Off, Econo Toggle: Off, Turbo Toggle: Off, " - "Light Toggle: Off", + "Swing(V): -, Econo: -, Turbo: -, Quiet: Off, " + "Light: -, Clean: -, 8C Heat: -", ac.toString()); ac.stateReset(); // Remove any existing info so we can build from scratch. ASSERT_NE(0xA1A368FFFF45, ac.getRaw()); @@ -1337,8 +1426,8 @@ TEST(TestMideaACClass, Issue1342) { EXPECT_EQ( "Type: 1 (Command), Power: On, Mode: 3 (Heat), Celsius: Off, " "Temp: 21C/70F, On Timer: Off, Off Timer: Off, Fan: 0 (Auto), Sleep: Off, " - "Swing(V) Toggle: Off, Econo Toggle: Off, Turbo Toggle: Off, " - "Light Toggle: Off", + "Swing(V): -, Econo: -, Turbo: -, Quiet: Off, " + "Light: -, Clean: -, 8C Heat: -", ac.toString()); EXPECT_EQ(0xA1A368FFFF45, ac.getRaw()); } diff --git a/lib/IRremoteESP8266/test/ir_Mitsubishi_test.cpp b/lib/IRremoteESP8266/test/ir_Mitsubishi_test.cpp index 815d4f996..cbed3084e 100644 --- a/lib/IRremoteESP8266/test/ir_Mitsubishi_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Mitsubishi_test.cpp @@ -353,7 +353,7 @@ TEST(TestSendMitsubishiAC, SendDataOnly) { "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420" - "m440s17100" + "m440s15500" "m3400s1750" "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420" "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300" @@ -373,7 +373,7 @@ TEST(TestSendMitsubishiAC, SendDataOnly) { "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420" - "m440s17100", + "m440s15500", irsend.outputStr()); } @@ -409,7 +409,7 @@ TEST(TestSendMitsubishiAC, SendWithRepeats) { "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420" - "m440s17100", + "m440s15500", irsend.outputStr()); irsend.reset(); @@ -435,7 +435,7 @@ TEST(TestSendMitsubishiAC, SendWithRepeats) { "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420" - "m440s17100" + "m440s15500" "m3400s1750" "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420" "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300" @@ -455,7 +455,7 @@ TEST(TestSendMitsubishiAC, SendWithRepeats) { "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420" - "m440s17100" + "m440s15500" "m3400s1750" "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420" "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300" @@ -475,7 +475,7 @@ TEST(TestSendMitsubishiAC, SendWithRepeats) { "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420" - "m440s17100", + "m440s15500", irsend.outputStr()); } @@ -518,7 +518,7 @@ TEST(TestSendMitsubishiAC, SendUnexpectedSizes) { "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420" "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" - "m440s17100" + "m440s15500" "m3400s1750" "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420" "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300" @@ -539,7 +539,7 @@ TEST(TestSendMitsubishiAC, SendUnexpectedSizes) { "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s1300m450s1300m450s1300m450s1300m450s1300m450s420m450s420m450s420" "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" - "m440s17100", + "m440s15500", irsend.outputStr()); } @@ -751,7 +751,7 @@ TEST(TestMitsubishiACClass, MessageConstuction) { "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s420m450s420m450s420m450s420m450s1300m450s420m450s420m450s420" "m450s420m450s1300m450s1300m450s1300m450s1300m450s420m450s1300m450s420" - "m440s17100" + "m440s15500" "m3400s1750" "m450s1300m450s1300m450s420m450s420m450s420m450s1300m450s420m450s420" "m450s1300m450s1300m450s420m450s1300m450s420m450s420m450s1300m450s1300" @@ -771,7 +771,7 @@ TEST(TestMitsubishiACClass, MessageConstuction) { "m450s420m450s420m450s420m450s420m450s420m450s420m450s420m450s420" "m450s420m450s420m450s420m450s420m450s1300m450s420m450s420m450s420" "m450s420m450s1300m450s1300m450s1300m450s1300m450s420m450s1300m450s420" - "m440s17100", + "m440s15500", irsend.outputStr()); } @@ -1712,3 +1712,74 @@ TEST(TestMitsubishiACClass, WeeklyTimerEnabled) { ac.setRaw(weekly_off); EXPECT_FALSE(ac.getWeeklyTimerEnabled()); } + +// Decode a 'real' example for a MLZ-RX5017AS A/C +TEST(TestDecodeMitsubishiAC, Issue1759) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + const uint16_t rawData[583] = { + 3392, 1638, 456, 1220, 456, 1220, 456, 382, 454, 382, 456, 380, 456, 1222, + 454, 380, 456, 382, 456, 1220, 456, 1220, 456, 382, 454, 1222, 454, 382, + 456, 384, 454, 1222, 454, 1220, 454, 382, 456, 1220, 456, 1220, 456, 382, + 456, 382, 456, 1220, 456, 380, 456, 382, 456, 1220, 456, 380, 456, 382, + 456, 382, 456, 380, 456, 382, 456, 380, 458, 382, 456, 380, 456, 382, 456, + 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, 382, + 456, 380, 458, 382, 456, 380, 456, 1220, 456, 380, 456, 382, 456, 382, + 456, 382, 456, 382, 456, 1220, 456, 382, 456, 382, 456, 382, 456, 380, + 456, 382, 456, 382, 456, 1220, 456, 382, 456, 382, 456, 382, 456, 382, + 454, 382, 456, 382, 456, 382, 456, 382, 454, 384, 454, 382, 456, 380, 456, + 382, 456, 382, 456, 382, 456, 382, 454, 382, 456, 382, 456, 382, 456, 382, + 456, 1222, 454, 1220, 456, 382, 456, 382, 456, 382, 454, 1220, 456, 1220, + 454, 1222, 454, 1220, 454, 382, 456, 382, 456, 382, 454, 382, 454, 382, + 456, 382, 456, 382, 456, 382, 454, 382, 456, 380, 456, 382, 454, 382, 454, + 384, 454, 382, 456, 382, 454, 384, 454, 382, 456, 382, 456, 382, 456, 384, + 454, 384, 454, 382, 456, 382, 454, 382, 454, 384, 454, 382, 456, 1220, + 456, 382, 456, 382, 454, 382, 456, 382, 456, 382, 454, 1220, 456, 382, + 456, 382, 456, 382, 456, 382, 454, 382, 456, 382, 456, 382, 454, 382, 456, + 382, 454, 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, 382, + 454, 1220, 456, 1220, 456, 380, 456, 1220, 456, 1220, 456, 1222, 454, + 1220, 456, 1220, 456, 11280, + 3392, 1638, 454, 1220, 456, 1220, 456, 382, 456, 382, 456, 382, 456, 1220, + 456, 380, 456, 382, 456, 1220, 456, 1220, 454, 382, 456, 1220, 456, 382, + 456, 382, 456, 1220, 456, 1222, 454, 382, 456, 1220, 456, 1220, 454, 382, + 456, 382, 456, 1220, 454, 382, 456, 382, 456, 1220, 456, 382, 456, 382, + 454, 382, 456, 382, 454, 382, 456, 382, 456, 382, 456, 382, 456, 382, 454, + 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, 382, 454, 382, + 456, 382, 456, 382, 456, 382, 456, 1220, 456, 382, 456, 382, 456, 382, + 454, 382, 456, 382, 456, 1220, 456, 380, 456, 382, 456, 382, 456, 382, + 456, 382, 456, 382, 456, 1220, 456, 382, 454, 382, 456, 382, 454, 382, + 456, 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, 380, 456, 382, 456, + 380, 456, 382, 456, 382, 456, 382, 454, 382, 456, 382, 454, 382, 456, 382, + 456, 1220, 454, 1220, 456, 382, 456, 382, 456, 382, 454, 1220, 456, 1220, + 454, 1222, 454, 1220, 454, 382, 456, 382, 456, 382, 456, 382, 456, 382, + 456, 382, 456, 382, 454, 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, + 382, 456, 382, 456, 382, 454, 382, 456, 382, 456, 382, 456, 382, 456, 382, + 456, 382, 456, 382, 456, 380, 456, 382, 456, 382, 456, 382, 456, 1220, + 456, 382, 456, 382, 456, 382, 454, 382, 456, 382, 456, 1222, 454, 380, + 456, 382, 456, 382, 456, 382, 456, 380, 456, 382, 456, 382, 454, 382, 454, + 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, 382, 456, 382, + 456, 1220, 456, 1220, 454, 382, 456, 1222, 454, 1220, 454, 1220, 454, + 1222, 454, 1220, 456}; // UNKNOWN 76CCC723 + irsend.sendRaw(rawData, 583, 38); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(MITSUBISHI_AC, irsend.capture.decode_type); + EXPECT_EQ(kMitsubishiACBits, irsend.capture.bits); + uint8_t expected[kMitsubishiACStateLength] = { + 0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x08, 0x04, 0x00, 0xC0, + 0x78, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFB}; + EXPECT_STATE_EQ(expected, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "Power: On, Mode: 1 (Heat), Temp: 20C, Fan: 0 (Auto), " + "Swing(V): 0 (Auto), Swing(H): 0 (UNKNOWN), Clock: 20:00, " + "On Timer: 00:00, Off Timer: 00:00, Timer: -, Weekly Timer: Off, " + "10C Heat: Off, ISee: Off, Econo: Off, Absense detect: Off, " + "Direct / Indirect Mode: 0, Fresh: Off", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); +} diff --git a/lib/IRremoteESP8266/test/ir_Sanyo_test.cpp b/lib/IRremoteESP8266/test/ir_Sanyo_test.cpp index 6378e7679..bcfaef972 100644 --- a/lib/IRremoteESP8266/test/ir_Sanyo_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Sanyo_test.cpp @@ -284,6 +284,14 @@ TEST(TestUtils, Housekeeping) { ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::SANYO_AC88)); ASSERT_EQ(kSanyoAc88Bits, IRsend::defaultBits(decode_type_t::SANYO_AC88)); ASSERT_EQ(kSanyoAc88MinRepeat, IRsend::minRepeats(decode_type_t::SANYO_AC88)); + // Sanyo A/C 152 Bit. + ASSERT_EQ("SANYO_AC152", typeToString(decode_type_t::SANYO_AC152)); + ASSERT_EQ(decode_type_t::SANYO_AC152, strToDecodeType("SANYO_AC152")); + ASSERT_TRUE(hasACState(decode_type_t::SANYO_AC152)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::SANYO_AC152)); + ASSERT_EQ(kSanyoAc152Bits, IRsend::defaultBits(decode_type_t::SANYO_AC152)); + ASSERT_EQ(kSanyoAc152MinRepeat, + IRsend::minRepeats(decode_type_t::SANYO_AC152)); } TEST(TestDecodeSanyoAc, DecodeRealExamples) { @@ -820,3 +828,70 @@ TEST(TestSanyoAc88Class, Clock) { ac.setClock(25 * 60 + 61); EXPECT_EQ(23 * 60 + 59, ac.getClock()); } + +TEST(TestDecodeSanyoAc152, DecodeRealExamples) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + // Ref: "16c" from https://github.com/crankyoldgit/IRremoteESP8266/issues/1826#issuecomment-1160708653 + const uint16_t rawData[307] = { + 3294, 1726, 420, 330, 458, 462, 382, 452, 438, 330, 456, 458, 384, 454, + 384, 1312, 422, 324, 512, 336, 454, 458, 384, 450, 438, 358, 436, 464, + 424, 326, 458, 476, 372, 458, 430, 328, 458, 464, 382, 1308, 424, 326, + 510, 1264, 424, 268, 520, 460, 380, 460, 436, 324, 462, 400, 436, 474, + 372, 456, 430, 342, 452, 450, 388, 446, 442, 1262, 422, 266, 520, 1314, + 372, 1306, 424, 1258, 370, 390, 448, 1314, 372, 1310, 426, 308, 522, 338, + 454, 470, 370, 454, 438, 330, 456, 468, 370, 456, 384, 464, 384, 1306, + 422, 328, 460, 472, 374, 448, 442, 1258, 426, 1256, 426, 268, 520, 464, + 382, 460, 430, 328, 508, 1264, 426, 262, 572, 1262, 424, 228, 604, 1262, + 372, 1312, 372, 1310, 426, 1256, 422, 1258, 424, 262, 524, 418, 428, 456, + 382, 1308, 372, 456, 386, 456, 382, 464, 378, 1308, 424, 360, 436, 454, + 430, 344, 450, 1306, 372, 1310, 424, 326, 510, 338, 452, 456, 384, 456, + 436, 328, 510, 1258, 372, 1310, 422, 338, 454, 466, 424, 328, 460, 1310, + 372, 1312, 424, 1258, 450, 262, 496, 1310, 372, 1310, 426, 1260, 424, 260, + 526, 442, 442, 1264, 426, 268, 520, 458, 380, 450, 386, 462, 436, 320, + 518, 1256, 372, 394, 446, 398, 494, 334, 506, 326, 510, 276, 518, 460, + 430, 332, 508, 326, 510, 356, 440, 448, 444, 264, 572, 336, 456, 408, 434, + 454, 438, 332, 506, 336, 454, 460, 384, 448, 444, 326, 510, 332, 456, 442, + 400, 456, 384, 456, 386, 452, 388, 454, 440, 326, 512, 272, 518, 450, 440, + 334, 454, 458, 440, 320, 516, 268, 570, 340, 452, 468, 424, 260, 574, 336, + 456, 394, 444, 458, 438, 328, 508, 1258, 370, 1312, 372, 1312, 424, 314, + 468, 1312, 450, 1232, 370, 1314, 420, 324, 514}; // UNKNOWN 584FBE80 + + const uint8_t expectedState[kSanyoAc152StateLength] = { + 0x40, 0x00, 0x14, 0x80, 0x6E, 0x80, 0x18, 0xEA, 0x23, 0x62, + 0x30, 0xEE, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x77}; + irsend.begin(); + irsend.reset(); + irsend.sendRaw(rawData, 307, 38000); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(SANYO_AC152, irsend.capture.decode_type); + EXPECT_EQ(kSanyoAc152Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_FALSE(irsend.capture.repeat); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); +} + +TEST(TestDecodeSanyoAc152, SyntheticSelfDecode) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + const uint8_t expectedState[kSanyoAc152StateLength] = { + 0x40, 0x00, 0x14, 0x80, 0x6E, 0x80, 0x18, 0xEA, 0x23, 0x62, + 0x30, 0xEE, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x77}; + irsend.begin(); + irsend.reset(); + irsend.sendSanyoAc152(expectedState); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(SANYO_AC152, irsend.capture.decode_type); + EXPECT_EQ(kSanyoAc152Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_FALSE(irsend.capture.repeat); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); +} diff --git a/lib/IRremoteESP8266/test/ir_Tcl_test.cpp b/lib/IRremoteESP8266/test/ir_Tcl_test.cpp index b7ab5301f..f1a4cf393 100644 --- a/lib/IRremoteESP8266/test/ir_Tcl_test.cpp +++ b/lib/IRremoteESP8266/test/ir_Tcl_test.cpp @@ -1,4 +1,4 @@ -// Copyright 2019 David Conran +// Copyright 2019-2022 David Conran #include "ir_Tcl.h" #include "IRac.h" @@ -22,6 +22,13 @@ TEST(TestTcl112Ac, Housekeeping) { ASSERT_EQ(tcl_ac_remote_model_t::GZ055BE1, IRac::strToModel("GZ055BE1")); ASSERT_EQ(irutils::modelToStr(decode_type_t::TCL112AC, tcl_ac_remote_model_t::GZ055BE1), "GZ055BE1"); + + ASSERT_EQ("TCL96AC", typeToString(decode_type_t::TCL96AC)); + ASSERT_EQ(decode_type_t::TCL96AC, strToDecodeType("TCL96AC")); + ASSERT_TRUE(hasACState(decode_type_t::TCL96AC)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::TCL96AC)); + ASSERT_EQ(kTcl96AcBits, IRsend::defaultBits(decode_type_t::TCL96AC)); + ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::TCL96AC)); } // Tests for decodeTcl112Ac(). @@ -703,3 +710,64 @@ TEST(TestTcl112AcClass, Timers) { "On Timer: Off, Off Timer: 02:00", ac.toString()); } + +// Decode a real Tcl96Ac A/C example from Issue #619 +TEST(TestDecodeTcl96Ac, DecodeRealExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + // Tcl96Ac A/C example from Issue #1810 row_data.txt + const uint16_t rawData[99] = { + 1056, 550, + 608, 2182, 608, 1444, 606, 840, 608, 2182, + 608, 360, 612, 2182, 608, 356, 616, 1446, + 608, 354, 618, 366, 608, 366, 606, 356, + 618, 356, 618, 838, 608, 364, 608, 364, + 608, 2182, 608, 360, 612, 840, 608, 838, + 610, 364, 608, 360, 612, 2182, 608, 838, + 608, 838, 608, 2182, 608, 366, 606, 1444, + 608, 358, 614, 1444, 608, 838, 608, 366, + 606, 368, 606, 366, 606, 366, 606, 366, + 608, 364, 608, 342, 632, 840, 606, 340, + 606, 364, 634, 338, 634, 340, 632, 340, + 634, 814, 632, 814, 632, 2156, 634, 2156, + 634}; // UNKNOWN AE10E0CB + + const uint8_t expectedState[kTcl96AcStateLength] = { + 0xB6, 0x23, 0x00, 0x10, 0x85, 0x09, 0x63, 0x34, 0x00, 0x04, 0x00, 0x5A}; + + irsend.sendRaw(rawData, 99, 38000); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(TCL96AC, irsend.capture.decode_type); + EXPECT_EQ(kTcl96AcBits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); +} + +// Decode a synthetic Tcl96Ac A/C message +TEST(TestDecodeTcl96Ac, SyntheticExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + irsend.reset(); + + const uint8_t expectedState[kTcl96AcStateLength] = { + 0xB6, 0x23, 0x00, 0x10, 0x85, 0x09, 0x63, 0x34, 0x00, 0x04, 0x00, 0x5A}; + + irsend.sendTcl96Ac(expectedState); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(TCL96AC, irsend.capture.decode_type); + EXPECT_EQ(kTcl96AcBits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); +} diff --git a/lib/IRremoteESP8266/test/ir_Toto_test.cpp b/lib/IRremoteESP8266/test/ir_Toto_test.cpp new file mode 100644 index 000000000..050bd01e6 --- /dev/null +++ b/lib/IRremoteESP8266/test/ir_Toto_test.cpp @@ -0,0 +1,159 @@ +// Copyright 2022 crankyoldgit (David Conran) + +#include "IRac.h" +#include "IRsend.h" +#include "IRsend_test.h" +#include "IRutils.h" +#include "gtest/gtest.h" + + +// General housekeeping +TEST(TestToto, Housekeeping) { + ASSERT_EQ("TOTO", typeToString(TOTO)); + ASSERT_FALSE(hasACState(TOTO)); + ASSERT_EQ(kTotoBits, IRsend::defaultBits(decode_type_t::TOTO)); + ASSERT_EQ(kSingleRepeat, IRsend::minRepeats(decode_type_t::TOTO)); +} + +// Tests for decodeToto(). + +// Decode normal Toto messages. +TEST(TestDecodeToto, SyntheticShortDecode) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + // Short Toto 24-bit message. + irsend.reset(); + irsend.sendToto(0x0D0D00); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(TOTO, irsend.capture.decode_type); + EXPECT_EQ(kTotoBits, irsend.capture.bits); + EXPECT_EQ(0x0D0D00, irsend.capture.value); + EXPECT_EQ(0, irsend.capture.address); + EXPECT_EQ(0x0D00, irsend.capture.command); +} + +// Decode real example via Issue #1806 +TEST(TestDecodeToto, RealShortDecode) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + // Toto Full Flush from Issue #1806 + const uint16_t rawData[163] = { + 6266, 2734, + 598, 540, 598, 1626, 598, 512, 622, 516, 598, 514, 598, 510, 598, 514, + 628, 512, 596, 514, 600, 512, 598, 538, 600, 1622, 600, 512, 598, 540, + 602, 510, 598, 512, 598, 512, 624, 514, 598, 512, 598, 512, 598, 514, + 624, 512, 598, 514, 598, 1652, 596, 514, 598, 1626, 598, 1650, 598, 514, + 598, 512, 598, 540, 598, 514, 596, 1626, 626, 512, 574, 1648, 598, 1650, + 598, 514, 598, 512, 594, 544, 596, 514, + 598, 37996, + 6182, 2764, + 598, 514, 600, 1648, 600, 512, 596, 514, 598, 540, 598, 512, 600, 512, + 598, 512, 624, 514, 598, 514, 598, 512, 596, 1652, 598, 514, 598, 512, + 596, 540, 598, 514, 598, 512, 598, 512, 598, 540, 596, 516, 596, 514, 598, + 512, 574, 564, 598, 1626, 568, 542, 624, 1624, 626, 1622, 598, 514, 596, + 514, 598, 514, 596, 540, 600, 1622, 598, 512, 600, 1650, 598, 1624, 596, + 540, 600, 512, 598, 514, 596, 514, + 622}; // UNKNOWN 43BD67B3 + + irsend.sendRaw(rawData, 163, 38); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(TOTO, irsend.capture.decode_type); + EXPECT_EQ(kTotoBits, irsend.capture.bits); + EXPECT_EQ(0x0D0D00, irsend.capture.value); + EXPECT_EQ(0, irsend.capture.address); + EXPECT_EQ(0x0D00, irsend.capture.command); +} + +// Decode real example via Issue #1806 +TEST(TestDecodeToto, RealLongDecode) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + // Oscillate Bidet Function from Issue #1806 + const uint16_t rawData[491] = { + 6262, 2738, + 600, 538, 596, 1624, 598, 512, 652, 486, 628, 484, 600, 510, 596, 516, + 650, 488, 622, 488, 626, 484, 598, 540, 600, 1624, 602, 510, 596, 540, + 602, 510, 598, 514, 598, 512, 626, 512, 598, 512, 598, 512, 598, 514, + 626, 510, 598, 514, 598, 512, 598, 1650, 600, 1622, 600, 538, 596, 514, + 600, 510, 596, 514, 596, 542, 598, 514, 598, 1624, 626, 1622, 598, 512, + 600, 512, 620, 516, 598, 512, 598, 514, + 598, 40244, + 6184, 2764, + 598, 514, 598, 1650, 598, 514, 596, 516, 596, 542, 598, 512, 596, 516, + 600, 510, 624, 512, 598, 512, 596, 516, 598, 1652, 600, 512, 598, 512, + 598, 540, 596, 518, 594, 514, 598, 512, 596, 542, 598, 512, 596, 514, + 598, 512, 598, 540, 598, 514, 598, 1622, 624, 1626, 598, 514, 598, 512, + 626, 512, 596, 514, 596, 514, 596, 540, 598, 1624, 600, 1650, 600, 512, + 600, 510, 598, 512, 596, 540, 598, 512, + 600, 40244, + 6186, 2760, + 600, 512, 596, 1626, 624, 514, 598, 512, 600, 512, 598, 512, 626, 512, + 598, 512, 598, 512, 596, 540, 600, 510, 600, 1622, 600, 538, 596, 514, + 596, 514, 598, 514, 624, 514, 596, 516, 596, 514, 600, 512, 622, 514, 600, + 512, 600, 510, 600, 538, 602, 1622, 600, 1648, 626, 512, 572, 512, 598, + 514, 650, 488, 598, 512, 594, 516, 598, 1652, 598, 1626, 598, 514, 624, + 514, 596, 512, 600, 512, 598, 540, + 596, 40246, + 6184, 2736, + 598, 538, 598, 1624, 598, 512, 598, 540, 598, 512, 600, 512, 596, 514, + 600, 538, 626, 486, 598, 514, 596, 514, 652, 1596, 594, 516, 624, 514, + 594, 516, 598, 514, 622, 490, 596, 540, 596, 514, 624, 488, 594, 514, 598, + 538, 598, 512, 598, 514, 594, 516, 596, 540, 600, 1622, 572, 566, 600, + 512, 570, 542, 598, 512, 598, 540, 600, 512, 594, 516, 598, 1652, 600, + 512, 598, 514, 596, 514, 624, 514, + 598, 42468, + 6182, 2764, + 624, 490, 594, 1652, 600, 512, 596, 514, 596, 540, 600, 512, 598, 516, + 596, 514, 598, 538, 598, 516, 598, 512, 570, 1678, 596, 514, 596, 514, + 598, 512, 624, 512, 594, 516, 596, 514, 600, 510, 626, 512, 596, 516, + 594, 516, 598, 538, 598, 512, 596, 514, 596, 514, 596, 1652, 600, 514, + 594, 516, 622, 514, 600, 512, 598, 514, 596, 514, 624, 514, 596, 1626, + 598, 514, 622, 516, 594, 516, 598, 514, + 596, 42496, + 6184, 2764, + 596, 516, 598, 1624, 626, 512, 598, 512, 596, 516, 600, 512, 624, 514, + 598, 514, 594, 516, 596, 516, 620, 516, 600, 1624, 596, 540, 598, 514, + 600, 512, 596, 516, 596, 542, 594, 516, 598, 514, 594, 516, 624, 512, 598, + 512, 596, 514, 596, 514, 624, 514, 596, 516, 598, 1650, 594, 518, 596, + 514, 596, 516, 596, 542, 596, 514, 596, 516, 596, 514, 596, 1652, 598, + 514, 596, 514, 624, 514, 622, 488, 596}; // UNKNOWN 4AC5E8B3 + + + irsend.sendRaw(rawData, 491, 38); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(TOTO, irsend.capture.decode_type); + EXPECT_EQ(kTotoLongBits, irsend.capture.bits); + EXPECT_EQ(0x60600080800, irsend.capture.value); + EXPECT_EQ(0x0600, irsend.capture.address); + EXPECT_EQ(0x0800, irsend.capture.command); +} + +TEST(TestDecodeToto, SyntheticLongDecode) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + // Long Toto 48-bit message. + irsend.reset(); + irsend.sendToto(0x60600080800, kTotoLongBits); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(TOTO, irsend.capture.decode_type); + EXPECT_EQ(kTotoLongBits, irsend.capture.bits); + EXPECT_EQ(0x60600080800, irsend.capture.value); + EXPECT_EQ(0x0600, irsend.capture.address); + EXPECT_EQ(0x0800, irsend.capture.command); +} diff --git a/lib/IRremoteESP8266/tools/auto_analyse_raw_data.py b/lib/IRremoteESP8266/tools/auto_analyse_raw_data.py index e061d3c42..69149215d 100644 --- a/lib/IRremoteESP8266/tools/auto_analyse_raw_data.py +++ b/lib/IRremoteESP8266/tools/auto_analyse_raw_data.py @@ -100,7 +100,6 @@ class RawIRMessage(): def add_data_code(self, bin_str, name="", footer=True): """Add the common "data" sequence of code to send the bulk of a message.""" - # pylint: disable=no-self-use code = [] nbits = len(bin_str) code.append(f" // Data Section #{self.section_count}") @@ -115,7 +114,6 @@ class RawIRMessage(): def add_data_decode_code(self, bin_str, name="", footer=True): """Add the common "data" sequence code to decode the bulk of a message.""" - # pylint: disable=no-self-use code = [] nbits = len(bin_str) code.extend([ @@ -139,7 +137,6 @@ class RawIRMessage(): def add_data_byte_code(self, bin_str, name="", ambles=None): """Add the code to send the data from an array.""" - # pylint: disable=no-self-use code = [] nbits = len(bin_str) nbytes = nbits / 8 @@ -173,7 +170,6 @@ class RawIRMessage(): def add_data_byte_decode_code(self, bin_str, name="", ambles=None): """Add the common byte-wise "data" sequence decode code.""" - # pylint: disable=no-self-use code = [] nbits = len(bin_str) nbytes = nbits / 8 diff --git a/lib/IRremoteESP8266/tools/code_to_raw_test.sh b/lib/IRremoteESP8266/tools/code_to_raw_test.sh index fd587f2ad..c95b3da8b 100644 --- a/lib/IRremoteESP8266/tools/code_to_raw_test.sh +++ b/lib/IRremoteESP8266/tools/code_to_raw_test.sh @@ -56,7 +56,7 @@ unittest_success "${CODE_TO_RAW} --protocol SAMSUNG --code 0xE0E09966" "${OUT}" read -r -d '' OUT << xEOMx Code type: 18 (KELVINATOR) Code bits: 128 -Description: Power: On, Mode: 1 (Cool), Temp: 27C, Fan: 1 (Low), Turbo: Off, Quiet: Off, XFan: On, Ion: Off, Light: Off, Swing(H): Off, Swing(V): Off +Description: Power: On, Mode: 1 (Cool), Temp: 27C, Fan: 1 (Low), Turbo: Off, Quiet: Off, XFan: On, Ion: Off, Light: Off, Swing(H): Off, Swing(V): 0 (Off) uint16_t rawData[280] = {9010, 4504, 680, 1530, 680, 510, 680, 510, 680, 1530, 680, 1530, 680, 510, 680, 510, 680, 510, 680, 1530, 680, 1530, 680, 510, 680, 1530, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 1530, 680, 510, 680, 510, 680, 510, 680, 510, 680, 1530, 680, 510, 680, 1530, 680, 510, 680, 510, 680, 1530, 680, 510, 680, 19974, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 1530, 680, 1530, 680, 1530, 680, 39950, 9010, 4504, 680, 1530, 680, 510, 680, 510, 680, 1530, 680, 1530, 680, 510, 680, 510, 680, 510, 680, 1530, 680, 1530, 680, 510, 680, 1530, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 1530, 680, 510, 680, 510, 680, 510, 680, 510, 680, 1530, 680, 1530, 680, 1530, 680, 510, 680, 510, 680, 1530, 680, 510, 680, 19974, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 1530, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 510, 680, 1530, 680, 1530, 680, 1530, 680, 1530, 680, 39950 }; // KELVINATOR uint8_t state[16] = {0x19, 0x0B, 0x80, 0x50, 0x00, 0x00, 0x00, 0xE0, 0x19, 0x0B, 0x80, 0x70, 0x00, 0x00, 0x10, 0xF0}; diff --git a/lib/IRremoteESP8266/tools/mkkeywords b/lib/IRremoteESP8266/tools/mkkeywords index 34def1332..af4314f19 100644 --- a/lib/IRremoteESP8266/tools/mkkeywords +++ b/lib/IRremoteESP8266/tools/mkkeywords @@ -32,8 +32,8 @@ EndOfTextEndOfTextEndOfText CLASSES=$(egrep -h \ "^ *((enum|class|struct) [a-zA-Z0-9_]+|} [a-zA-Z0-9_]+_t;$)" src/*.h | - sed 's/^ *//;s/enum class//;s/\;$//' | cut -d' ' -f2 | sort -u | - grep -v "^__") + sed 's/^ *//;s/enum class//;s/\;$//' | cut -d' ' -f2 | sed 's/:$//' | + sort -u | grep -v "^__") for i in ${CLASSES}; do echo -e "${i}\tKEYWORD1" done | sort -du From 3f2b0e771d4ed54f2c3093d0c6c85280f1fe2236 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 7 Aug 2022 20:29:01 +0200 Subject: [PATCH 74/89] [IR] Correct some defines for SEND-ONLY protocols --- src/CustomIR-sample.h | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/CustomIR-sample.h b/src/CustomIR-sample.h index 863892044..1b1681e2e 100644 --- a/src/CustomIR-sample.h +++ b/src/CustomIR-sample.h @@ -13,8 +13,12 @@ // Set flags to enable (1) or disable (0) the DECODE_ and/or SEND_ feature for a specific IR device // To limit ESPEasy build-size you can disable DECODE_ or SEND_ flags for devices not needed -// #define DECODE_RAW 0 // RAW support should be left to default unless explicitly disabled via P016_P035_USE_RAW_RAW2 -// #define SEND_RAW 0 +// SEND-ONLY protocols: +// #define SEND_GLOBALCACHE 0 +// #define SEND_PRONTO 0 +// #define SEND_RAW 0 // SEND_RAW support should be left to default unless explicitly disabled via P016_P035_USE_RAW_RAW2 +// #define SEND_SHERWOOD 0 +// #define SEND_SONY_38K 0 // Standard: Use defaults for up to library version 2.8.2 // Change as desired after copying CustomIR-sample.h to CustomIR.h @@ -55,8 +59,6 @@ // #define SEND_DENON 0 // #define DECODE_KELVINATOR 0 // #define SEND_KELVINATOR 0 -// #define DECODE_SHERWOOD 0 -// #define SEND_SHERWOOD 0 // #define DECODE_MITSUBISHI_AC 0 // #define SEND_MITSUBISHI_AC 0 // #define DECODE_RCMM 0 @@ -67,8 +69,6 @@ // #define SEND_RC5X 0 // #define DECODE_GREE 0 // #define SEND_GREE 0 -// #define DECODE_PRONTO 0 -// #define SEND_PRONTO 0 // #define DECODE_NEC_LIKE 0 // #define SEND_NEC_LIKE 0 // #define DECODE_ARGO 0 @@ -77,8 +77,6 @@ // #define SEND_TROTEC 0 // #define DECODE_NIKAI 0 // #define SEND_NIKAI 0 -// #define DECODE_GLOBALCACHE 0 -// #define SEND_GLOBALCACHE 0 // #define DECODE_TOSHIBA_AC 0 // #define SEND_TOSHIBA_AC 0 // #define DECODE_FUJITSU_AC 0 @@ -163,8 +161,6 @@ // #define SEND_MITSUBISHI112 0 // #define DECODE_HITACHI_AC424 0 // #define SEND_HITACHI_AC424 0 -// #define DECODE_SONY_38K 0 -// #define SEND_SONY_38K 0 // #define DECODE_EPSON 0 // #define SEND_EPSON 0 // #define DECODE_SYMPHONY 0 From 7404d74d255558b74cf092cc739f43d923b953ab Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 7 Aug 2022 21:21:13 +0200 Subject: [PATCH 75/89] [Build] Fix extra_scripts environment chaining --- platformio_esp82xx_base.ini | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platformio_esp82xx_base.ini b/platformio_esp82xx_base.ini index b645bad4b..f4075e314 100644 --- a/platformio_esp82xx_base.ini +++ b/platformio_esp82xx_base.ini @@ -236,11 +236,13 @@ build_flags = -DBUILD_NO_DEBUG -Os -s ${esp82xx_common.build_flags} +extra_scripts = ${esp82xx_common.extra_scripts} [esp8266_1M] extends = esp82xx_1M board = esp8266_1M128k build_flags = ${esp82xx_1M.build_flags} +extra_scripts = ${esp82xx_1M.extra_scripts} ;;; Minimal *********************************************************** @@ -284,11 +286,13 @@ build_flags = ${esp82xx_common.build_flags} extends = esp82xx_common board = esp8266_4M1M_board build_flags = ${esp82xx_common.build_flags} +extra_scripts = ${esp82xx_common.extra_scripts} [esp8266_4M2M] extends = esp82xx_common board = esp8266_4M2M_board build_flags = ${esp82xx_common.build_flags} +extra_scripts = ${esp82xx_common.extra_scripts} From d438e59384fde35c04a0ccf90325a7298ef271b8 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 7 Aug 2022 23:10:45 +0200 Subject: [PATCH 76/89] [LIB] IRremoteESP8266 proposed solution for limiting combobox list --- lib/IRremoteESP8266/src/IRtext.cpp | 489 +++++++++++++++++++++++++++++ 1 file changed, 489 insertions(+) diff --git a/lib/IRremoteESP8266/src/IRtext.cpp b/lib/IRremoteESP8266/src/IRtext.cpp index d16e4465e..405ad0aea 100644 --- a/lib/IRremoteESP8266/src/IRtext.cpp +++ b/lib/IRremoteESP8266/src/IRtext.cpp @@ -280,132 +280,621 @@ IRTEXT_CONST_STRING(kDg11j13aStr, D_STR_DG11J13A); ///< "DG11J13A" IRTEXT_CONST_STRING(kDg11j104Str, D_STR_DG11J104); ///< "DG11J104" IRTEXT_CONST_STRING(kDg11j191Str, D_STR_DG11J191); ///< "DG11J191" +#define D_STR_UNSUPPORTED "?" // Unsupported protocols will be showing as a question mark, check for length > 1 to show only currently included protocols // Protocol Names // Needs to be in decode_type_t order. IRTEXT_CONST_BLOB_DECL(kAllProtocolNamesStr) { D_STR_UNUSED "\x0" + #if DECODE_RC5 || SEND_RC5 D_STR_RC5 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_RC6 || SEND_RC6 D_STR_RC6 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_NEC || SEND_NEC D_STR_NEC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SONY || SEND_SONY D_STR_SONY "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_PANASONIC || SEND_PANASONIC D_STR_PANASONIC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_JVC || SEND_JVC D_STR_JVC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SAMSUNG || SEND_SAMSUNG D_STR_SAMSUNG "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_WHYNTER || SEND_WHYNTER D_STR_WHYNTER "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_AIWA_RC_T501 || SEND_AIWA_RC_T501 D_STR_AIWA_RC_T501 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_LG || SEND_LG D_STR_LG "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SANYO || SEND_SANYO D_STR_SANYO "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MITSUBISHI || SEND_MITSUBISHI D_STR_MITSUBISHI "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DISH || SEND_DISH D_STR_DISH "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SHARP || SEND_SHARP D_STR_SHARP "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_COOLIX || SEND_COOLIX D_STR_COOLIX "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DAIKIN || SEND_DAIKIN D_STR_DAIKIN "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DENON || SEND_DENON D_STR_DENON "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_KELVINATOR || SEND_KELVINATOR D_STR_KELVINATOR "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if SEND_SHERWOOD // SEND-ONLY D_STR_SHERWOOD "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MITSUBISHI_AC || SEND_MITSUBISHI_AC D_STR_MITSUBISHI_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_RCMM || SEND_RCMM D_STR_RCMM "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SANYO_LC7461 || SEND_SANYO_LC7461 D_STR_SANYO_LC7461 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_RC5X || SEND_RC5X D_STR_RC5X "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_GREE || SEND_GREE D_STR_GREE "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if SEND_PRONTO // SEND-ONLY D_STR_PRONTO "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_NEC_LIKE || SEND_NEC_LIKE D_STR_NEC_LIKE "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_ARGO || SEND_ARGO D_STR_ARGO "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_TROTEC || SEND_TROTEC D_STR_TROTEC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_NIKAI || SEND_NIKAI D_STR_NIKAI "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if SEND_RAW // SEND-ONLY D_STR_RAW "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if SEND_GLOBALCACHE // SEND-ONLY D_STR_GLOBALCACHE "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_TOSHIBA_AC || SEND_TOSHIBA_AC D_STR_TOSHIBA_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_FUJITSU_AC || SEND_FUJITSU_AC D_STR_FUJITSU_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MIDEA || SEND_MIDEA D_STR_MIDEA "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MAGIQUEST || SEND_MAGIQUEST D_STR_MAGIQUEST "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_LASERTAG || SEND_LASERTAG D_STR_LASERTAG "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_CARRIER_AC || SEND_CARRIER_AC D_STR_CARRIER_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HAIER_AC || SEND_HAIER_AC D_STR_HAIER_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MITSUBISHI2 || SEND_MITSUBISHI2 D_STR_MITSUBISHI2 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HITACHI_AC || SEND_HITACHI_AC D_STR_HITACHI_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HITACHI_AC1 || SEND_HITACHI_AC1 D_STR_HITACHI_AC1 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HITACHI_AC2 || SEND_HITACHI_AC2 D_STR_HITACHI_AC2 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_GICABLE || SEND_GICABLE D_STR_GICABLE "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HAIER_AC_YRW02 || SEND_HAIER_AC_YRW02 D_STR_HAIER_AC_YRW02 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_WHIRLPOOL_AC || SEND_WHIRLPOOL_AC D_STR_WHIRLPOOL_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SAMSUNG_AC || SEND_SAMSUNG_AC D_STR_SAMSUNG_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_LUTRON || SEND_LUTRON D_STR_LUTRON "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_ELECTRA_AC || SEND_ELECTRA_AC D_STR_ELECTRA_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_PANASONIC_AC || SEND_PANASONIC_AC D_STR_PANASONIC_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_PIONEER || SEND_PIONEER D_STR_PIONEER "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_LG2 || SEND_LG2 D_STR_LG2 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MWM || SEND_MWM D_STR_MWM "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DAIKIN2 || SEND_DAIKIN2 D_STR_DAIKIN2 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_VESTEL_AC || SEND_VESTEL_AC D_STR_VESTEL_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_TECO || SEND_TECO D_STR_TECO "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SAMSUNG36 || SEND_SAMSUNG36 D_STR_SAMSUNG36 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_TCL112AC || SEND_TCL112AC D_STR_TCL112AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_LEGOPF || SEND_LEGO D_STR_LEGOPF "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MITSUBISHI_HEAVY || SEND_MITSUBISHI_HEAVY // Exception D_STR_MITSUBISHI_HEAVY_88 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MITSUBISHI_HEAVY || SEND_MITSUBISHI_HEAVY // Exception D_STR_MITSUBISHI_HEAVY_152 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DAIKIN216 || SEND_DAIKIN216 D_STR_DAIKIN216 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SHARP_AC || SEND_SHARP_AC D_STR_SHARP_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_GOODWEATHER || SEND_GOODWEATHER D_STR_GOODWEATHER "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_INAX || SEND_INAX D_STR_INAX "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DAIKIN160 || SEND_DAIKIN160 D_STR_DAIKIN160 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_NEOCLIMA || SEND_NEOCLIMA D_STR_NEOCLIMA "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DAIKIN176 || SEND_DAIKIN176 D_STR_DAIKIN176 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DAIKIN128 || SEND_DAIKIN128 D_STR_DAIKIN128 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_AMCOR || SEND_AMCOR D_STR_AMCOR "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DAIKIN152 || SEND_DAIKIN152 D_STR_DAIKIN152 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MITSUBISHI136 || SEND_MITSUBISHI136 D_STR_MITSUBISHI136 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MITSUBISHI112 || SEND_MITSUBISHI112 D_STR_MITSUBISHI112 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HITACHI_AC424 || SEND_HITACHI_AC424 D_STR_HITACHI_AC424 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if SEND_SONY // Exception D_STR_SONY_38K "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_EPSON || SEND_EPSON D_STR_EPSON "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SYMPHONY || SEND_SYMPHONY D_STR_SYMPHONY "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HITACHI_AC3 || SEND_HITACHI_AC3 D_STR_HITACHI_AC3 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DAIKIN64 || SEND_DAIKIN64 D_STR_DAIKIN64 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_AIRWELL || SEND_AIRWELL D_STR_AIRWELL "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DELONGHI_AC || SEND_DELONGHI_AC D_STR_DELONGHI_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DOSHISHA || SEND_DOSHISHA D_STR_DOSHISHA "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MULTIBRACKETS || SEND_MULTIBRACKETS D_STR_MULTIBRACKETS "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_CARRIER_AC40 || SEND_CARRIER_AC40 D_STR_CARRIER_AC40 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_CARRIER_AC64 || SEND_CARRIER_AC64 D_STR_CARRIER_AC64 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HITACHI_AC344 || SEND_HITACHI_AC344 D_STR_HITACHI_AC344 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_CORONA_AC || SEND_CORONA_AC D_STR_CORONA_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MIDEA24 || SEND_MIDEA24 D_STR_MIDEA24 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_ZEPEAL || SEND_ZEPEAL D_STR_ZEPEAL "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SANYO_AC || SEND_SANYO_AC D_STR_SANYO_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_VOLTAS || SEND_VOLTAS D_STR_VOLTAS "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_METZ || SEND_METZ D_STR_METZ "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_TRANSCOLD || SEND_TRANSCOLD D_STR_TRANSCOLD "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_TECHNIBEL_AC || SEND_TECHNIBEL_AC D_STR_TECHNIBEL_AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MIRAGE || SEND_MIRAGE D_STR_MIRAGE "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_ELITESCREENS || SEND_ELITESCREENS D_STR_ELITESCREENS "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_PANASONIC_AC32 || SEND_PANASONIC_AC32 D_STR_PANASONIC_AC32 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_MILESTAG2 || SEND_MILESTAG2 D_STR_MILESTAG2 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_ECOCLIM || SEND_ECOCLIM D_STR_ECOCLIM "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_XMP || SEND_XMP D_STR_XMP "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_TRUMA || SEND_TRUMA D_STR_TRUMA "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HAIER_AC176 || SEND_HAIER_AC176 D_STR_HAIER_AC176 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_TEKNOPOINT || SEND_TEKNOPOINT D_STR_TEKNOPOINT "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_KELON || SEND_KELON D_STR_KELON "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_TROTEC_3550 || SEND_TROTEC_3550 D_STR_TROTEC_3550 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SANYO_AC88 || SEND_SANYO_AC88 D_STR_SANYO_AC88 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_BOSE || SEND_BOSE D_STR_BOSE "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_ARRIS || SEND_ARRIS D_STR_ARRIS "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_RHOSS || SEND_RHOSS D_STR_RHOSS "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_AIRTON || SEND_AIRTON D_STR_AIRTON "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_COOLIX48 || SEND_COOLIX48 D_STR_COOLIX48 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HITACHI_AC264 || SEND_HITACHI_AC264 D_STR_HITACHI_AC264 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_KELON168 || SEND_KELON168 D_STR_KELON168 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HITACHI_AC296 || SEND_HITACHI_AC296 D_STR_HITACHI_AC296 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DAIKIN200 || SEND_DAIKIN200 D_STR_DAIKIN200 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_HAIER_AC160 || SEND_HAIER_AC160 D_STR_HAIER_AC160 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_CARRIER_AC128 || SEND_CARRIER_AC128 D_STR_CARRIER_AC128 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_TOTO || SEND_TOTO D_STR_TOTO "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_CLIMABUTLER || SEND_CLIMABUTLER D_STR_CLIMABUTLER "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_TCL96AC || SEND_TCL96AC D_STR_TCL96AC "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_BOSCH144 || SEND_BOSCH144 D_STR_BOSCH144 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_SANYO_AC152 || SEND_SANYO_AC152 D_STR_SANYO_AC152 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif + #if DECODE_DAIKIN312 || SEND_DAIKIN312 D_STR_DAIKIN312 "\x0" + #else + D_STR_UNSUPPORTED "\x0" + #endif ///< New protocol strings should be added just above this line. "\x0" ///< This string requires double null termination. }; From 4a2a01ade682b7a043f4126548645d97e4c186c5 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Sun, 7 Aug 2022 23:11:48 +0200 Subject: [PATCH 77/89] [P016] Limit list of supported protocols to what is actually included in build (proposal), update CustomIR-sample.h --- src/CustomIR-sample.h | 4 ++-- src/_P016_IR.ino | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/CustomIR-sample.h b/src/CustomIR-sample.h index 1b1681e2e..6195b41d9 100644 --- a/src/CustomIR-sample.h +++ b/src/CustomIR-sample.h @@ -14,11 +14,11 @@ // To limit ESPEasy build-size you can disable DECODE_ or SEND_ flags for devices not needed // SEND-ONLY protocols: -// #define SEND_GLOBALCACHE 0 +// #define SEND_GLOBALCACHE 0 // Is used by many sending protocols, so should probably be left to default // #define SEND_PRONTO 0 // #define SEND_RAW 0 // SEND_RAW support should be left to default unless explicitly disabled via P016_P035_USE_RAW_RAW2 // #define SEND_SHERWOOD 0 -// #define SEND_SONY_38K 0 +// UNUSED (exception) // #define SEND_SONY_38K 0 // is enabled/disabled via SEND_SONY // Standard: Use defaults for up to library version 2.8.2 // Change as desired after copying CustomIR-sample.h to CustomIR.h diff --git a/src/_P016_IR.ino b/src/_P016_IR.ino index 12551640a..e57c538ff 100644 --- a/src/_P016_IR.ino +++ b/src/_P016_IR.ino @@ -335,9 +335,14 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) std::vector<String> decodeTypes; std::vector<int> decodeTypeOptions; + int protocolCount = 0; for (int i = 0; i < size; i++) { - decodeTypeOptions.push_back(i); - decodeTypes.push_back(typeToString(static_cast<decode_type_t>(i), false)); + const String protocol = typeToString(static_cast<decode_type_t>(i), false); + if (protocol.length() > 1) { + decodeTypeOptions.push_back(i); + decodeTypes.push_back(protocol); + protocolCount++; + } // addLog(LOG_LEVEL_INFO, decodeTypes[i]); // For development debugging purposes delay(0); @@ -372,7 +377,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) addHtmlInt(varNr + 1); // # html_TD(); { // Decode type - addSelector(getPluginCustomArgName(rowCnt + 0), size, &decodeTypes[0], &decodeTypeOptions[0], nullptr, + addSelector(getPluginCustomArgName(rowCnt + 0), protocolCount, &decodeTypes[0], &decodeTypeOptions[0], nullptr, static_cast<int>(line.CodeDecodeType), false, true, EMPTY_STRING); } html_TD(); @@ -387,7 +392,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) html_TD(); { - addSelector(getPluginCustomArgName(rowCnt + 3), size, &decodeTypes[0], &decodeTypeOptions[0], nullptr, + addSelector(getPluginCustomArgName(rowCnt + 3), protocolCount, &decodeTypes[0], &decodeTypeOptions[0], nullptr, static_cast<int>(line.AlternativeCodeDecodeType), false, true, EMPTY_STRING); } html_TD(); From a356450921ba2f39f1d6d06864e35c6e43fb9d11 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Mon, 8 Aug 2022 14:53:48 +0200 Subject: [PATCH 78/89] [P016] Make buffersize configurable, we usually don't need max buffer size --- src/_P016_IR.ino | 197 +++++++++++++---------- src/src/PluginStructs/P016_data_struct.h | 7 +- 2 files changed, 117 insertions(+), 87 deletions(-) diff --git a/src/_P016_IR.ino b/src/_P016_IR.ino index e57c538ff..02368d94b 100644 --- a/src/_P016_IR.ino +++ b/src/_P016_IR.ino @@ -41,6 +41,7 @@ # define PLUGIN_NAME_016 "Communication - IR Receive (TSOP4838)" # define PLUGIN_VALUENAME1_016 "IR" # define P016_CMDINHIBIT PCONFIG(1) +# define P016_BUFFERSIZE PCONFIG(2) # define P016_SETTINGS_VERSION PCONFIG(7) // 0 = V1, 2 = V2 # ifndef P016_SEND_IR_TO_CONTROLLER @@ -48,6 +49,8 @@ # endif // ifndef P016_SEND_IR_TO_CONTROLLER // History +// @tonhuisman: 2022-08-08 +// FIX: Resolve high memory use bu having the default buffer size reduced from 1024 to 100, and make that a setting // @tonhuisman: 2021-08-05 // FIX: Resolve stack size issues by replacing 2 arrays by std::vectors // CHG: Remove unneeded #define for nr. of decoding types @@ -78,7 +81,7 @@ // ==================== start of TUNEABLE PARAMETERS ==================== // As this program is a special purpose capture/decoder, let us use a larger // than normal buffer so we can handle Air Conditioner remote codes. -const uint16_t kCaptureBufferSize = 1024; +// const uint16_t kCaptureBufferSize = 1024; // Replaced by setting P016_BUFFERSIZE // kTimeout is the Nr. of milli-Seconds of no-more-data before we consider a // message ended. @@ -143,9 +146,10 @@ boolean displayRawToReadableB32Hex(String& outputStr, decode_results results); # endif // ifdef P016_P035_USE_RAW_RAW2 # ifdef PLUGIN_016_DEBUG -void P016_infoLogMemory(const __FlashStringHelper * text) { +void P016_infoLogMemory(const __FlashStringHelper *text) { if (loglevelActiveFor(LOG_LEVEL_INFO)) { String log; + if (log.reserve(40 + strlen_P((PGM_P)text))) { log += F("P016: Free memory "); log += text; @@ -228,14 +232,19 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) addLog(LOG_LEVEL_INFO, F("INIT: IR RX")); addLog(LOG_LEVEL_INFO, F("IR lib Version: " _IRREMOTEESP8266_VERSION_)); } - irReceiver = new (std::nothrow) IRrecv(irPin, kCaptureBufferSize, P016_TIMEOUT, true); + + uint16_t bufsize = P016_BUFFERSIZE; + + if ((bufsize < 100) || (bufsize > 1024)) { bufsize = 100u; } // safety check + + irReceiver = new (std::nothrow) IRrecv(irPin, bufsize, P016_TIMEOUT, true); # ifdef PLUGIN_016_DEBUG addLog(LOG_LEVEL_INFO, F("P016_PLUGIN_INIT IR receiver created")); # endif // PLUGIN_016_DEBUG if (nullptr != irReceiver) { irReceiver->setUnknownThreshold(kMinUnknownSize); // Ignore messages with less than minimum on or off pulses. - irReceiver->enableIRIn(); // Start the receiver + irReceiver->enableIRIn(); // Start the receiver # ifdef PLUGIN_016_DEBUG addLog(LOG_LEVEL_INFO, F("P016_PLUGIN_INIT IR receiver initialized")); # endif // PLUGIN_016_DEBUG @@ -302,16 +311,20 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) addRowLabel(F("Info")); addHtml(F("Check serial or web log for replay solutions via Communication - IR Transmit plugin")); + addFormNumericBox(F("Receiver buffer size"), F("pbuffersize"), P016_BUFFERSIZE, 100, 1024); + addUnit(F("100..1024")); + addFormNote(F("Increase buffer size if IR commands are received incomplete.")); + addFormSubHeader(F("Content")); bool bAddNewCode = bitRead(PCONFIG_LONG(0), P016_BitAddNewCode); - addFormCheckBox(F("Add new received code to command lines"), F("p016_AddNewCode"), bAddNewCode); + addFormCheckBox(F("Add new received code to command lines"), F("pAddNewCode"), bAddNewCode); bool bExecuteCmd = bitRead(PCONFIG_LONG(0), P016_BitExecuteCmd); - addFormCheckBox(F("Execute commands"), F("p016_ExecuteCmd"), bExecuteCmd); + addFormCheckBox(F("Execute commands"), F("pExecuteCmd"), bExecuteCmd); bool bAcceptUnknownType = bitRead(PCONFIG_LONG(0), P016_BitAcceptUnknownType); - addFormCheckBox(F("Accept DecodeType UNKNOWN"), F("p016_AcceptUnknownType"), bAcceptUnknownType); + addFormCheckBox(F("Accept DecodeType UNKNOWN"), F("pAcceptUnknownType"), bAcceptUnknownType); addFormNumericBox(F("Inhibit time for the same command [ms]"), - F("p016_cmdinhibit"), + F("pcmdinhibit"), P016_CMDINHIBIT, 1, 2000); @@ -322,22 +335,15 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) int size = static_cast<int>(decode_type_t::kLastDecodeType) + 1; - if (loglevelActiveFor(LOG_LEVEL_INFO)) { - String log; // Log this always - if (log.reserve(30)) { - log += F("IR: available decodetypes: "); - log += size; - addLogMove(LOG_LEVEL_INFO, log); - } - } - // Fill a vector with all supported decode_type_t names - std::vector<String> decodeTypes; - std::vector<int> decodeTypeOptions; + std::vector<String>decodeTypes; + std::vector<int>decodeTypeOptions; int protocolCount = 0; + for (int i = 0; i < size; i++) { const String protocol = typeToString(static_cast<decode_type_t>(i), false); + if (protocol.length() > 1) { decodeTypeOptions.push_back(i); decodeTypes.push_back(protocol); @@ -347,6 +353,17 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) // addLog(LOG_LEVEL_INFO, decodeTypes[i]); // For development debugging purposes delay(0); } + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + String log; // Log this always + + if (log.reserve(30)) { + log += F("IR: available decodetypes: "); + log += protocolCount; + addLogMove(LOG_LEVEL_INFO, log); + } + } + const String P016_HEX_INPUT_PATTERN = F("(0x)?[0-9a-fA-F]{0,16}"); // 16 nibbles = 64 bit, 0x prefix is allowed but not added by // default addRowLabel(F("Code - command map")); @@ -446,79 +463,81 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) Scheduler.schedule_task_device_timer(event->TaskIndex, millis() + 10); uint32_t lSettings = 0; - bitWrite(lSettings, P016_BitAddNewCode, isFormItemChecked(F("p016_AddNewCode"))); - bitWrite(lSettings, P016_BitExecuteCmd, isFormItemChecked(F("p016_ExecuteCmd"))); - bitWrite(lSettings, P016_BitAcceptUnknownType, isFormItemChecked(F("p016_AcceptUnknownType"))); + bitWrite(lSettings, P016_BitAddNewCode, isFormItemChecked(F("pAddNewCode"))); + bitWrite(lSettings, P016_BitExecuteCmd, isFormItemChecked(F("pExecuteCmd"))); + bitWrite(lSettings, P016_BitAcceptUnknownType, isFormItemChecked(F("pAcceptUnknownType"))); bEnableIRcodeAdding = true; PCONFIG_LONG(0) = lSettings; - P016_CMDINHIBIT = getFormItemInt(F("p016_cmdinhibit")); + P016_CMDINHIBIT = getFormItemInt(F("pcmdinhibit")); + P016_BUFFERSIZE = getFormItemInt(F("pbuffersize")); # ifdef PLUGIN_016_DEBUG P016_infoLogMemory(F("before save")); # endif // ifdef PLUGIN_016_DEBUG { - String strError; - strError.reserve(30); // Length of expected string, needed for strings > 11 chars + String strError; + strError.reserve(30); // Length of expected string, needed for strings > 11 chars - int rowCnt = 0; + int rowCnt = 0; - for (uint8_t varNr = 0; varNr < P16_Nlines; varNr++) { - tCommandLinesV2 line; + for (uint8_t varNr = 0; varNr < P16_Nlines; varNr++) { + tCommandLinesV2 line; - strError.clear(); + strError.clear(); - // Normal Code & flags - line.CodeDecodeType = static_cast<decode_type_t>(getFormItemInt(getPluginCustomArgName(rowCnt + 0))); - bitWrite(line.CodeFlags, P16_FLAGS_REPEAT, isFormItemChecked(getPluginCustomArgName(rowCnt + 1))); - line.Code = 0; + // Normal Code & flags + line.CodeDecodeType = static_cast<decode_type_t>(getFormItemInt(getPluginCustomArgName(rowCnt + 0))); + bitWrite(line.CodeFlags, P16_FLAGS_REPEAT, isFormItemChecked(getPluginCustomArgName(rowCnt + 1))); + line.Code = 0; - char strCode[P16_Cchars] = {0}; - if (!safe_strncpy(strCode, webArg(getPluginCustomArgName(rowCnt + 2)), P16_Cchars)) { - strError += F("Code "); - strError += (varNr + 1); - strError += ' '; - } else { - line.Code = hexToULL(strCode); // convert string with hexnumbers to uint64_t - } + char strCode[P16_Cchars] = { 0 }; - delay(0); - - // Alternate Code & flags - line.AlternativeCodeDecodeType = - static_cast<decode_type_t>(getFormItemInt(getPluginCustomArgName(rowCnt + 3))); - bitWrite(line.AlternativeCodeFlags, P16_FLAGS_REPEAT, - isFormItemChecked(getPluginCustomArgName(rowCnt + 4))); - line.AlternativeCode = 0; - - if (!safe_strncpy(strCode, webArg(getPluginCustomArgName(rowCnt + 5)), P16_Cchars)) { - strError += F("Alt.Code "); - strError += (varNr + 1); - strError += ' '; - } else { - line.AlternativeCode = hexToULL(strCode); // convert string with hexnumbers to uint64_t - } - - // Command - if (!safe_strncpy(line.Command, webArg(getPluginCustomArgName(rowCnt + 6)), P16_Nchars)) { - strError += F("Command "); - strError += (varNr + 1); - } - line.Command[P16_Nchars - 1] = 0; // Terminate string - - if (!strError.isEmpty()) { - addHtmlError(strError); - } - - rowCnt += 7; - delay(0); - - P016_data_struct::saveCommandLine(event, line, varNr); + if (!safe_strncpy(strCode, webArg(getPluginCustomArgName(rowCnt + 2)), P16_Cchars)) { + strError += F("Code "); + strError += (varNr + 1); + strError += ' '; + } else { + line.Code = hexToULL(strCode); // convert string with hexnumbers to uint64_t } + delay(0); + + // Alternate Code & flags + line.AlternativeCodeDecodeType = + static_cast<decode_type_t>(getFormItemInt(getPluginCustomArgName(rowCnt + 3))); + bitWrite(line.AlternativeCodeFlags, P16_FLAGS_REPEAT, + isFormItemChecked(getPluginCustomArgName(rowCnt + 4))); + line.AlternativeCode = 0; + + if (!safe_strncpy(strCode, webArg(getPluginCustomArgName(rowCnt + 5)), P16_Cchars)) { + strError += F("Alt.Code "); + strError += (varNr + 1); + strError += ' '; + } else { + line.AlternativeCode = hexToULL(strCode); // convert string with hexnumbers to uint64_t + } + + // Command + if (!safe_strncpy(line.Command, webArg(getPluginCustomArgName(rowCnt + 6)), P16_Nchars)) { + strError += F("Command "); + strError += (varNr + 1); + } + line.Command[P16_Nchars - 1] = 0; // Terminate string + + if (!strError.isEmpty()) { + addHtmlError(strError); + } + + rowCnt += 7; + delay(0); + + P016_data_struct::saveCommandLine(event, line, varNr); + } + # ifdef PLUGIN_016_DEBUG - P016_infoLogMemory(F("after save")); + P016_infoLogMemory(F("after save")); # endif // ifdef PLUGIN_016_DEBUG } @@ -559,7 +578,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) { addLog(LOG_LEVEL_ERROR, F("IR: WARNING, IR code is too big for buffer. Try pressing the transmiter button only momenteraly")); success = false; - break; // Do not continue and risk hanging the ESP + break; // Do not continue and risk hanging the ESP } // Display the basic output of what we found. @@ -568,9 +587,11 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) { String output; output.reserve(100); // Length of expected string, needed for strings > 11 chars - // String output = String(F("IRSEND,")) + typeToString(results.decode_type, results.repeat) + ',' + resultToHexidecimal(&results) + // String output = String(F("IRSEND,")) + typeToString(results.decode_type, results.repeat) + ',' + + // resultToHexidecimal(&results) // + ',' + uint64ToString(results.bits); - // addLog(LOG_LEVEL_INFO, output); //Show the appropriate command to the user, so he can replay the message via P035 // Old style + // addLog(LOG_LEVEL_INFO, output); //Show the appropriate command to the user, so he can replay the message via P035 // Old + // style // command output += F("{\"protocol\":\""); output += typeToString(results.decode_type, results.repeat); @@ -582,6 +603,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) if (loglevelActiveFor(LOG_LEVEL_INFO)) { String Log; + if (Log.reserve(output.length() + 22)) { Log += F("IRSEND,\'"); Log += output; @@ -610,7 +632,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) if (iCodeDecodeType == decode_type_t::UNKNOWN) { // set iCodeDecodeType UNKNOWN to RAW, otherwise AddCode() or ExecuteCode() will fail - iCodeDecodeType=decode_type_t::RAW; + iCodeDecodeType = decode_type_t::RAW; } if (bitRead(PCONFIG_LONG(0), P016_BitAddNewCode) && bEnableIRcodeAdding) { @@ -636,13 +658,14 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) # endif // ifdef P016_P035_USE_RAW_RAW2 { addLog(LOG_LEVEL_INFO, - F("IR: No replay solutions found! Press button again or try RAW encoding (timings are in the serial output)")); + F("IR: No replay solutions found! Press button again or try RAW encoding (timings are in the serial output)")); serialPrint(F("IR: RAW TIMINGS: ")); serialPrint(resultToSourceCode(&results)); event->String2 = F("NaN"); yield(); // Feed the WDT as it can take a while to print. - // addLog(LOG_LEVEL_DEBUG,(String(F("IR: RAW TIMINGS: ")) + resultToSourceCode(&results))); // Output the results as RAW - // source code //not showing up nicely in the web log + // addLog(LOG_LEVEL_DEBUG,(String(F("IR: RAW TIMINGS: ")) + resultToSourceCode(&results))); // Output the results as + // RAW + // source code //not showing up nicely in the web log } } @@ -678,6 +701,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) if (loglevelActiveFor(LOG_LEVEL_INFO)) { // If we got a human-readable description of the message, display it. String log; + if (log.reserve(10 + description.length())) { log += F("AC State: "); log += description; @@ -759,6 +783,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) if (loglevelActiveFor(LOG_LEVEL_INFO)) { // Show the command that the user can put to replay the AC state with P035 String log; + if (log.reserve(12 + event->String2.length())) { log += F("IRSENDAC,'"); log += event->String2; @@ -805,7 +830,8 @@ boolean displayRawToReadableB32Hex(String& outputStr, decode_results results) { uint16_t div[2]; - #ifndef BUILD_NO_DEBUG + # ifndef BUILD_NO_DEBUG + // print the values: either pulses or blanks if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { String line; @@ -815,7 +841,7 @@ boolean displayRawToReadableB32Hex(String& outputStr, decode_results results) } addLogMove(LOG_LEVEL_DEBUG, line); // Display the RAW timings } - #endif + # endif // ifndef BUILD_NO_DEBUG // Find a common denominator divisor for odd indexes (pulses) and then even indexes (blanks). for (uint16_t p = 0; p < 2; p++) @@ -882,7 +908,8 @@ boolean displayRawToReadableB32Hex(String& outputStr, decode_results results) } div[p] = bstDiv; - #ifndef BUILD_NO_DEBUG + # ifndef BUILD_NO_DEBUG + if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { String line; line = p ? F("Blank: ") : F("Pulse: "); @@ -896,7 +923,7 @@ boolean displayRawToReadableB32Hex(String& outputStr, decode_results results) line += ((char)((bstMul - (uint16_t)bstMul) * 10) + '0'); addLogMove(LOG_LEVEL_DEBUG, line); } - #endif + # endif // ifndef BUILD_NO_DEBUG } // Generate the B32 Hex string, per the divisors found. diff --git a/src/src/PluginStructs/P016_data_struct.h b/src/src/PluginStructs/P016_data_struct.h index e7e7ca033..4be9902fe 100644 --- a/src/src/PluginStructs/P016_data_struct.h +++ b/src/src/PluginStructs/P016_data_struct.h @@ -6,9 +6,12 @@ # include <IRremoteESP8266.h> -#include <vector> +# include <vector> -# define PLUGIN_016_DEBUG // additional debug messages in the log +# define PLUGIN_016_DEBUG // additional debug messages in the log +# if defined(LIMIT_BUILD_SIZE) && defined(PLUGIN_016_DEBUG) +# undef PLUGIN_016_DEBUG +# endif // if defined(LIMIT_BUILD_SIZE) && defined(PLUGIN_016_DEBUG) // bit definition in PCONFIG_LONG(0) # define P016_BitAddNewCode 0 // Add automatically new code into Code of the command structure From 391ec24b933b90c5bb75d21ad6dfe1158a81e4c8 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Mon, 8 Aug 2022 14:55:14 +0200 Subject: [PATCH 79/89] [P035] Fix list of supported protocols, comment unreachable code --- src/_P035_IRTX.ino | 3 +- src/src/PluginStructs/P035_data_struct.cpp | 51 ++++++++++++++-------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/_P035_IRTX.ino b/src/_P035_IRTX.ino index 52c66ef22..597eaf535 100644 --- a/src/_P035_IRTX.ino +++ b/src/_P035_IRTX.ino @@ -6,6 +6,7 @@ // ####################################################################################################### // // Changelog: +// 2022-08-08, tonhuisman: Fix listProtocols()/listACProtocols() to ignore 1-character type names // 2022-01-11, tonhuisman: Move all code and globals to PluginStructs/P035_data_struct to enable multi-instance use // No previous changelog recorded. @@ -75,7 +76,7 @@ boolean Plugin_035(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_WEBFORM_LOAD: { addRowLabel(F("Command")); - addHtml(F("IRSEND,[PROTOCOL],[DATA],[BITS optional],[REPEATS optional]<BR>BITS and REPEATS are optional and default to 0")); + addHtml(F("IRSEND,[PROTOCOL],[DATA],[BITS optional],[REPEATS optional]<BR>BITS and REPEATS are optional and default to 0<BR/>")); addHtml(F("IRSENDAC,{JSON formated AC command}")); success = true; diff --git a/src/src/PluginStructs/P035_data_struct.cpp b/src/src/PluginStructs/P035_data_struct.cpp index 90a0a35a9..50b993c05 100644 --- a/src/src/PluginStructs/P035_data_struct.cpp +++ b/src/src/PluginStructs/P035_data_struct.cpp @@ -44,12 +44,12 @@ bool P035_data_struct::plugin_init(struct EventStruct *event) { } } - if ((Plugin_035_irSender != nullptr) && (_gpioPin == -1)) { - addLog(LOG_LEVEL_INFO, F("INIT: IR TX Removed")); - delete Plugin_035_irSender; - Plugin_035_irSender = nullptr; - success = false; - } + // if ((Plugin_035_irSender != nullptr) && (_gpioPin == -1)) { // This can never be true because of the validGpio() check above + // addLog(LOG_LEVEL_INFO, F("INIT: IR TX Removed")); + // delete Plugin_035_irSender; + // Plugin_035_irSender = nullptr; + // success = false; + // } # ifdef P016_P035_Extended_AC @@ -63,12 +63,12 @@ bool P035_data_struct::plugin_init(struct EventStruct *event) { Plugin_035_commonAc = new (std::nothrow) IRac(_gpioPin); } - if ((Plugin_035_commonAc != nullptr) && (_gpioPin == -1)) { - addLog(LOG_LEVEL_INFO, F("INIT AC: IR TX Removed")); - delete Plugin_035_commonAc; - Plugin_035_commonAc = nullptr; - success = false; - } + // if ((Plugin_035_commonAc != nullptr) && (_gpioPin == -1)) { // This can never be true because of the validGpio() check above + // addLog(LOG_LEVEL_INFO, F("INIT AC: IR TX Removed")); + // delete Plugin_035_commonAc; + // Plugin_035_commonAc = nullptr; + // success = false; + // } # endif // ifdef P016_P035_Extended_AC return success; } @@ -425,6 +425,7 @@ void P035_data_struct::printToLog(const String& protocol, const String& data, in tmp += F(" Repeats: "); tmp += repeats; } + if (printToWeb) { printWebString = tmp; } @@ -435,9 +436,16 @@ void P035_data_struct::printToLog(const String& protocol, const String& data, in String P035_data_struct::listProtocols() { String temp; - for (uint32_t i = 0; i <= kLastDecodeType; i++) { - if (IRsend::defaultBits((decode_type_t)i) > 0) { - temp += typeToString((decode_type_t)i) + ' '; + if (temp.reserve(1024)) { + for (uint32_t i = 0; i <= kLastDecodeType; i++) { + if (IRsend::defaultBits((decode_type_t)i) > 0) { + String typ = typeToString((decode_type_t)i); + + if (typ.length() > 1) { + temp += typ; + temp += ' '; + } + } } } return temp; @@ -449,9 +457,16 @@ String P035_data_struct::listProtocols() { String P035_data_struct::listACProtocols() { String temp; - for (uint32_t i = 0; i <= kLastDecodeType; i++) { - if (hasACState((decode_type_t)i)) { - temp += typeToString((decode_type_t)i) + ' '; + if (temp.reserve(1024)) { + for (uint32_t i = 0; i <= kLastDecodeType; i++) { + if (hasACState((decode_type_t)i)) { + const String typ = typeToString((decode_type_t)i); + + if (typ.length() > 1) { + temp += typ; + temp += ' '; + } + } } } return temp; From ea40d4f70d430a0c2b1c3bbd19aa9e34308f5a13 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Mon, 8 Aug 2022 17:27:39 +0200 Subject: [PATCH 80/89] [P016] Increase default buffersize to 150 to avoid log message for nearly every received code --- src/_P016_IR.ino | 3 ++- src/src/PluginStructs/P016_data_struct.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/_P016_IR.ino b/src/_P016_IR.ino index 02368d94b..9c753aa0e 100644 --- a/src/_P016_IR.ino +++ b/src/_P016_IR.ino @@ -235,7 +235,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) uint16_t bufsize = P016_BUFFERSIZE; - if ((bufsize < 100) || (bufsize > 1024)) { bufsize = 100u; } // safety check + if ((bufsize < 100) || (bufsize > 1024)) { bufsize = P016_DEFAULT_BUFFERSIZE; } // safety check irReceiver = new (std::nothrow) IRrecv(irPin, bufsize, P016_TIMEOUT, true); # ifdef PLUGIN_016_DEBUG @@ -297,6 +297,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) addLog(LOG_LEVEL_INFO, F("P016_PLUGIN_SET_DEFAULTS ...")); # endif // PLUGIN_016_DEBUG + P016_BUFFERSIZE = P016_DEFAULT_BUFFERSIZE; P016_SETTINGS_VERSION = P16_SETTINGS_LATEST; // New installs don't need conversion break; } diff --git a/src/src/PluginStructs/P016_data_struct.h b/src/src/PluginStructs/P016_data_struct.h index 4be9902fe..1cb76dfa2 100644 --- a/src/src/PluginStructs/P016_data_struct.h +++ b/src/src/PluginStructs/P016_data_struct.h @@ -22,6 +22,7 @@ # define P16_Nlines 10 // The number of different lines which can be displayed - each line is 64 chars max # define P16_Nchars 64 // max chars per command line # define P16_Cchars 20 // max chars per code +# define P016_DEFAULT_BUFFERSIZE 150 // default buffer size, range: 100..1024 # define P16_SETTINGS_V1 // Settings v1 original settings when enabled, settings conversion is also enabled // Settings v2 includes 64 bit codes and some separated flags From da77f3758eeaf2d650666dbc64d4a57eea316223 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Mon, 8 Aug 2022 17:28:57 +0200 Subject: [PATCH 81/89] [P016] Add feature flag P016_FEATURE_COMMAND_HANDLING to optionally disable command processing --- src/Custom-sample.h | 1 + src/_P016_IR.ino | 58 ++++++++++++++-------- src/src/PluginStructs/P016_data_struct.cpp | 36 +++++++++----- src/src/PluginStructs/P016_data_struct.h | 25 +++++++--- 4 files changed, 82 insertions(+), 38 deletions(-) diff --git a/src/Custom-sample.h b/src/Custom-sample.h index 4f1781219..e00ee8404 100644 --- a/src/Custom-sample.h +++ b/src/Custom-sample.h @@ -464,6 +464,7 @@ static const char DATA_ESPEASY_DEFAULT_MIN_CSS[] PROGMEM = { // Special plugins needing IR library // #define USES_P016 // IR // #define P016_SEND_IR_TO_CONTROLLER false //IF true then the JSON replay solution is transmited back to the condroller. +// #define P016_FEATURE_COMMAND_HANDLING 0 // By default set to 1 to have the command table, that can be dsabled here // #define USES_P035 // IRTX // #define P016_P035_Extended_AC // The following define is needed for extended decoding of A/C Messages and or using standardised //common arguments for controlling all deeply supported A/C units diff --git a/src/_P016_IR.ino b/src/_P016_IR.ino index 9c753aa0e..23140c620 100644 --- a/src/_P016_IR.ino +++ b/src/_P016_IR.ino @@ -251,15 +251,15 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) } } - if ((nullptr != irReceiver) && (irPin == -1)) - { - irReceiver->disableIRIn(); - delete irReceiver; - irReceiver = nullptr; - # ifdef PLUGIN_016_DEBUG - addLog(LOG_LEVEL_INFO, F("P016_PLUGIN_INIT IR receiver destroyed")); - # endif // PLUGIN_016_DEBUG - } + // if ((nullptr != irReceiver) && (irPin == -1)) // Unreachable code + // { + // irReceiver->disableIRIn(); + // delete irReceiver; + // irReceiver = nullptr; + // # ifdef PLUGIN_016_DEBUG + // addLog(LOG_LEVEL_INFO, F("P016_PLUGIN_INIT IR receiver destroyed")); + // # endif // PLUGIN_016_DEBUG + // } # ifdef PLUGIN_016_DEBUG addLog(LOG_LEVEL_INFO, F("P016_PLUGIN_INIT done")); @@ -316,14 +316,18 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) addUnit(F("100..1024")); addFormNote(F("Increase buffer size if IR commands are received incomplete.")); + addFormSubHeader(F("Content")); + # if P016_FEATURE_COMMAND_HANDLING bool bAddNewCode = bitRead(PCONFIG_LONG(0), P016_BitAddNewCode); addFormCheckBox(F("Add new received code to command lines"), F("pAddNewCode"), bAddNewCode); bool bExecuteCmd = bitRead(PCONFIG_LONG(0), P016_BitExecuteCmd); addFormCheckBox(F("Execute commands"), F("pExecuteCmd"), bExecuteCmd); + # endif // if P016_FEATURE_COMMAND_HANDLING bool bAcceptUnknownType = bitRead(PCONFIG_LONG(0), P016_BitAcceptUnknownType); addFormCheckBox(F("Accept DecodeType UNKNOWN"), F("pAcceptUnknownType"), bAcceptUnknownType); + # if P016_FEATURE_COMMAND_HANDLING addFormNumericBox(F("Inhibit time for the same command [ms]"), F("pcmdinhibit"), P016_CMDINHIBIT, @@ -443,6 +447,8 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) } } + # endif // if P016_FEATURE_COMMAND_HANDLING + # ifdef PLUGIN_016_DEBUG P016_infoLogMemory(F("after load")); addLog(LOG_LEVEL_INFO, F("P016_PLUGIN_WEBFORM_LOAD done")); @@ -464,20 +470,26 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) Scheduler.schedule_task_device_timer(event->TaskIndex, millis() + 10); uint32_t lSettings = 0; + # if P016_FEATURE_COMMAND_HANDLING bitWrite(lSettings, P016_BitAddNewCode, isFormItemChecked(F("pAddNewCode"))); bitWrite(lSettings, P016_BitExecuteCmd, isFormItemChecked(F("pExecuteCmd"))); + # endif // if P016_FEATURE_COMMAND_HANDLING bitWrite(lSettings, P016_BitAcceptUnknownType, isFormItemChecked(F("pAcceptUnknownType"))); bEnableIRcodeAdding = true; PCONFIG_LONG(0) = lSettings; - P016_CMDINHIBIT = getFormItemInt(F("pcmdinhibit")); - P016_BUFFERSIZE = getFormItemInt(F("pbuffersize")); + # if P016_FEATURE_COMMAND_HANDLING + P016_CMDINHIBIT = getFormItemInt(F("pcmdinhibit")); + # endif // if P016_FEATURE_COMMAND_HANDLING + P016_BUFFERSIZE = getFormItemInt(F("pbuffersize")); - # ifdef PLUGIN_016_DEBUG - P016_infoLogMemory(F("before save")); - # endif // ifdef PLUGIN_016_DEBUG + # if P016_FEATURE_COMMAND_HANDLING { + # ifdef PLUGIN_016_DEBUG + P016_infoLogMemory(F("before save")); + # endif // ifdef PLUGIN_016_DEBUG + String strError; strError.reserve(30); // Length of expected string, needed for strings > 11 chars @@ -537,10 +549,11 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) P016_data_struct::saveCommandLine(event, line, varNr); } - # ifdef PLUGIN_016_DEBUG + # ifdef PLUGIN_016_DEBUG P016_infoLogMemory(F("after save")); - # endif // ifdef PLUGIN_016_DEBUG + # endif // ifdef PLUGIN_016_DEBUG } + # endif // if P016_FEATURE_COMMAND_HANDLING # ifdef PLUGIN_016_DEBUG addLog(LOG_LEVEL_INFO, F("P016_PLUGIN_WEBFORM_SAVE Done")); @@ -549,6 +562,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) break; } + # if P016_FEATURE_COMMAND_HANDLING case PLUGIN_ONCE_A_SECOND: { P016_data_struct *P016_data = @@ -558,14 +572,15 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) if (P016_data->bCodeChanged) { // code has been added -> SaveCustomTaskSettings P016_data->saveCommandLines(event); P016_data->bCodeChanged = false; - # ifdef PLUGIN_016_DEBUG + # ifdef PLUGIN_016_DEBUG addLog(LOG_LEVEL_INFO, F("P016_PLUGIN_ONCE_A_SECOND CustomTaskSettings Saved")); - # endif // PLUGIN_016_DEBUG + # endif // PLUGIN_016_DEBUG } } success = true; break; } + # endif // if P016_FEATURE_COMMAND_HANDLING case PLUGIN_TEN_PER_SECOND: { @@ -616,6 +631,8 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) event->String2 = std::move(output); } + # if P016_FEATURE_COMMAND_HANDLING + // Check if this is a code we have a command for or we have to add P016_data_struct *P016_data = static_cast<P016_data_struct *>(getPluginTaskData(event->TaskIndex)); @@ -645,6 +662,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) } } } + # endif // if P016_FEATURE_COMMAND_HANDLING } if (!bitRead(PCONFIG_LONG(0), P016_BitAcceptUnknownType)) { @@ -711,8 +729,8 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) } } - if (IRac::isProtocolSupported(results.decode_type)) // Check If there is a replayable AC state and show the JSON command that can be - // send + if (IRac::isProtocolSupported(results.decode_type) && // Check If there is a replayable AC state and show the JSON command that can + (typeToString(results.decode_type).length() > 1)) // be sent { IRAcUtils::decodeToState(&results, &state); StaticJsonDocument<300> doc; diff --git a/src/src/PluginStructs/P016_data_struct.cpp b/src/src/PluginStructs/P016_data_struct.cpp index 9d3a96835..c730f1fe5 100644 --- a/src/src/PluginStructs/P016_data_struct.cpp +++ b/src/src/PluginStructs/P016_data_struct.cpp @@ -69,20 +69,23 @@ tCommandLinesV2::tCommandLinesV2(const tCommandLinesV1& lineV1, uint8_t i) P016_data_struct::P016_data_struct() {} void P016_data_struct::init(struct EventStruct *event, uint16_t CmdInhibitTime) { + # if P016_FEATURE_COMMAND_HANDLING loadCommandLines(event); iCmdInhibitTime = CmdInhibitTime; iLastCmd = 0; iLastCmdTime = 0; + # endif // if P016_FEATURE_COMMAND_HANDLING } +# if P016_FEATURE_COMMAND_HANDLING void P016_data_struct::loadCommandLines(struct EventStruct *event) { - # ifdef P16_SETTINGS_V1 + # ifdef P16_SETTINGS_V1 // Convert the settings if both versions are defined and PCONFIG(7) != latest version if (PCONFIG(7) != P16_SETTINGS_LATEST) { addLog(LOG_LEVEL_ERROR, F("P016 IR: Settings conversion, save task settings to store in new format.")); } - # endif // ifdef P16_SETTINGS_V1 + # endif // ifdef P16_SETTINGS_V1 CommandLines.clear(); // Start fresh for (uint8_t i = 0; i < P16_Nlines; i++) { @@ -99,13 +102,13 @@ void P016_data_struct::saveCommandLines(struct EventStruct *event) { void P016_data_struct::loadCommandLine(struct EventStruct *event, tCommandLinesV2& line, uint8_t lineNr) { - # ifdef P16_SETTINGS_V1 + # ifdef P16_SETTINGS_V1 if (PCONFIG(7) != P16_SETTINGS_LATEST) { loadCommandLinev1(event, line, lineNr); return; } - # endif // ifdef P16_SETTINGS_V1 + # endif // ifdef P16_SETTINGS_V1 const int loadOffset = lineNr * sizeof(tCommandLinesV2); LoadFromFile(SettingsType::Enum::CustomTaskSettings_Type, @@ -116,6 +119,8 @@ void P016_data_struct::loadCommandLine(struct EventStruct *event, tCommandLinesV line.Command[P16_Nchars - 1] = 0; // Terminate in case of uninitalized data } +# endif // if P016_FEATURE_COMMAND_HANDLING + # ifdef P16_SETTINGS_V1 void P016_data_struct::loadCommandLinev1(struct EventStruct *event, tCommandLinesV2& line, uint8_t lineNr) { @@ -129,12 +134,14 @@ void P016_data_struct::loadCommandLinev1(struct EventStruct *event, tCommandLine sizeof(tCommandLinesV2), loadOffsetV1); } + line = tCommandLinesV2(lineV1, lineNr); line.Command[P16_Nchars - 1] = 0; } # endif // ifdef P16_SETTINGS_V1 +# if P016_FEATURE_COMMAND_HANDLING void P016_data_struct::saveCommandLine(struct EventStruct *event, const tCommandLinesV2& line, uint8_t lineNr) { const int saveOffset = lineNr * sizeof(tCommandLinesV2); @@ -174,10 +181,11 @@ void P016_data_struct::AddCode(uint64_t Code, decode_type_t DecodeType, uint16_t CommandLines[_index].CodeDecodeType = DecodeType; CommandLines[_index].CodeFlags = CodeFlags; bCodeChanged = true; - # ifdef PLUGIN_016_DEBUG + # ifdef PLUGIN_016_DEBUG if (loglevelActiveFor(LOG_LEVEL_INFO)) { String log; + if (log.reserve(80)) { // estimated log = F("[P36] AddCode: "); log += typeToString(DecodeType, bitRead(CodeFlags, P16_FLAGS_REPEAT)); @@ -188,7 +196,7 @@ void P016_data_struct::AddCode(uint64_t Code, decode_type_t DecodeType, uint16_t addLogMove(LOG_LEVEL_INFO, log); } } - # endif // PLUGIN_016_DEBUG + # endif // PLUGIN_016_DEBUG } void P016_data_struct::ExecuteCode(uint64_t Code, decode_type_t DecodeType, uint16_t CodeFlags) { @@ -213,14 +221,15 @@ void P016_data_struct::ExecuteCode(uint64_t Code, decode_type_t DecodeType, uint iLastCmdTime = millis(); if (CommandLines[i].Command[0] != 0) { - # ifdef PLUGIN_016_DEBUG + # ifdef PLUGIN_016_DEBUG bool _success = - # endif // ifdef PLUGIN_016_DEBUG + # endif // ifdef PLUGIN_016_DEBUG ExecuteCommand_all(EventValueSource::Enum::VALUE_SOURCE_SYSTEM, CommandLines[i].Command); - # ifdef PLUGIN_016_DEBUG + # ifdef PLUGIN_016_DEBUG if (loglevelActiveFor(LOG_LEVEL_INFO)) { String log; + if (log.reserve(128)) { // estimated log = F("[P36] Execute: "); log += typeToString(DecodeType, bitRead(CodeFlags, P16_FLAGS_REPEAT)); @@ -238,14 +247,15 @@ void P016_data_struct::ExecuteCode(uint64_t Code, decode_type_t DecodeType, uint addLogMove(LOG_LEVEL_INFO, log); } } - # endif // PLUGIN_016_DEBUG + # endif // PLUGIN_016_DEBUG } return; } - # ifdef PLUGIN_016_DEBUG + # ifdef PLUGIN_016_DEBUG if (loglevelActiveFor(LOG_LEVEL_INFO)) { String log; + if (log.reserve(128)) { // estimated log = F("[P36] ValidateCode failed: "); log += typeToString(DecodeType, bitRead(CodeFlags, P16_FLAGS_REPEAT)); @@ -261,7 +271,7 @@ void P016_data_struct::ExecuteCode(uint64_t Code, decode_type_t DecodeType, uint addLogMove(LOG_LEVEL_INFO, log); } } - # endif // PLUGIN_016_DEBUG + # endif // PLUGIN_016_DEBUG } } @@ -274,4 +284,6 @@ bool P016_data_struct::validateCode(int i, uint64_t Code, decode_type_t DecodeTy && (CommandLines[i].AlternativeCodeFlags == CodeFlags)); } +# endif // if P016_FEATURE_COMMAND_HANDLING + #endif // ifdef USES_P016 diff --git a/src/src/PluginStructs/P016_data_struct.h b/src/src/PluginStructs/P016_data_struct.h index 1cb76dfa2..76e17ffbf 100644 --- a/src/src/PluginStructs/P016_data_struct.h +++ b/src/src/PluginStructs/P016_data_struct.h @@ -37,6 +37,14 @@ # define P16_FLAGS_REPEAT 0 // Repeat code // # define P16_FLAGS_HASH 1 // Code is a Hash +# ifndef P016_FEATURE_COMMAND_HANDLING +# define P016_FEATURE_COMMAND_HANDLING 1 // Enable Command handling and table +# endif // ifndef P016_FEATURE_COMMAND_HANDLING + +# if !P016_FEATURE_COMMAND_HANDLING && defined(P16_SETTINGS_V1) +# undef P16_SETTINGS_V1 +# endif // if !P016_FEATURE_COMMAND_HANDLING && defined(P16_SETTINGS_V1) + # ifdef P16_SETTINGS_V1 typedef struct { char Command[P16_Nchars] = { 0 }; @@ -45,12 +53,13 @@ typedef struct { } tCommandLinesV1; # endif // ifdef P16_SETTINGS_V1 +# if P016_FEATURE_COMMAND_HANDLING struct tCommandLinesV2 { - # ifdef P16_SETTINGS_V1 + # ifdef P16_SETTINGS_V1 tCommandLinesV2() = default; tCommandLinesV2(const tCommandLinesV1& lineV1, uint8_t i); - # endif // ifdef P16_SETTINGS_V1 + # endif // ifdef P16_SETTINGS_V1 char Command[P16_Nchars] = { 0 }; uint64_t Code = 0; // received code (can be added automatically) @@ -60,7 +69,7 @@ struct tCommandLinesV2 { uint16_t CodeFlags = 0; uint16_t AlternativeCodeFlags = 0; }; - +# endif // if P016_FEATURE_COMMAND_HANDLING struct P016_data_struct : public PluginTaskData_base { public: @@ -69,17 +78,18 @@ public: void init(struct EventStruct *event, uint16_t CmdInhibitTime); + # if P016_FEATURE_COMMAND_HANDLING void loadCommandLines(struct EventStruct *event); void saveCommandLines(struct EventStruct *event); static void loadCommandLine(struct EventStruct *event, tCommandLinesV2 & line, uint8_t lineNr); - # ifdef P16_SETTINGS_V1 + # ifdef P16_SETTINGS_V1 static void loadCommandLinev1(struct EventStruct *event, tCommandLinesV2 & line, uint8_t lineNr); - # endif // ifdef P16_SETTINGS_V1 + # endif // ifdef P16_SETTINGS_V1 static void saveCommandLine(struct EventStruct *event, const tCommandLinesV2& line, uint8_t lineNr); @@ -95,19 +105,22 @@ public: std::vector<tCommandLinesV2>CommandLines; // holds the CustomTaskSettings V2 bool bCodeChanged = false; // set if code has been added and CommandLines need to be saved (in PLUGIN_ONCE_A_SECOND) + # endif // if P016_FEATURE_COMMAND_HANDLING private: + # if P016_FEATURE_COMMAND_HANDLING bool validateCode(int i, uint64_t Code, decode_type_t DecodeType, uint16_t CodeFlags); - uint64_t iLastCmd = 0; // last command send + uint64_t iLastCmd = 0; // last command send uint32_t iLastCmdTime = 0; // time while last command was send decode_type_t iLastDecodeType = decode_type_t::UNKNOWN; // last decode_type sent uint16_t iCmdInhibitTime = 0; // inhibit time for sending the same command again uint16_t iLastCodeFlags = 0; // last flags sent + # endif // if P016_FEATURE_COMMAND_HANDLING }; #endif // ifdef USES_P016 From 8d3df1ad027729b3594fa5fafe526a1de0824f62 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Mon, 8 Aug 2022 20:56:05 +0200 Subject: [PATCH 82/89] [P016] Change display/entry of buffer size to bytes instead of unnamed 'units' (2 bytes) --- src/_P016_IR.ino | 20 ++++++++++++++++---- src/src/PluginStructs/P016_data_struct.h | 4 +++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/_P016_IR.ino b/src/_P016_IR.ino index 23140c620..609f93da3 100644 --- a/src/_P016_IR.ino +++ b/src/_P016_IR.ino @@ -21,6 +21,13 @@ // If the IR library can encode those kind of messages then a JSON formated command will be given, that can be replayed by P035 as well. // That commands format is: // IRSENDAC,'{"protocol":"COOLIX","power":"on","mode":"dry","fanspeed":"auto","temp":22,"swingv":"max","swingh":"off"}' + +/** Changelog: + * 2022-08-08 tonhuisman: Optionally (compile-time) disable command handling by setting #define P016_FEATURE_COMMAND_HDNLING 0 + * Make reserved buffer size for receiver configurable 100..1024 uint16_t = 200-2048 bytes + * Change UI to show buffer size in bytes instead of 'units' to avoid confusion. + * 2022-08-08 tonhuisman: Add Changelog, older changes not clearly registered, add newer changelog lines on the top of this list. + */ # include <ArduinoJson.h> # include <IRremoteESP8266.h> # include <IRutils.h> @@ -235,7 +242,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) uint16_t bufsize = P016_BUFFERSIZE; - if ((bufsize < 100) || (bufsize > 1024)) { bufsize = P016_DEFAULT_BUFFERSIZE; } // safety check + if ((bufsize < P016_MIN_BUFFERSIZE) || (bufsize > P016_MAX_BUFFERSIZE)) { bufsize = P016_DEFAULT_BUFFERSIZE; } // safety check irReceiver = new (std::nothrow) IRrecv(irPin, bufsize, P016_TIMEOUT, true); # ifdef PLUGIN_016_DEBUG @@ -312,8 +319,13 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) addRowLabel(F("Info")); addHtml(F("Check serial or web log for replay solutions via Communication - IR Transmit plugin")); - addFormNumericBox(F("Receiver buffer size"), F("pbuffersize"), P016_BUFFERSIZE, 100, 1024); - addUnit(F("100..1024")); + addFormNumericBox(F("Receiver buffer size"), F("pbuffersize"), P016_BUFFERSIZE * 2, P016_MIN_BUFFERSIZE * 2, P016_MAX_BUFFERSIZE * 2); + String unit; + unit += P016_MIN_BUFFERSIZE * 2; + unit += F(".."); + unit += P016_MAX_BUFFERSIZE * 2; + unit += F(" bytes"); + addUnit(unit); addFormNote(F("Increase buffer size if IR commands are received incomplete.")); @@ -481,7 +493,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) # if P016_FEATURE_COMMAND_HANDLING P016_CMDINHIBIT = getFormItemInt(F("pcmdinhibit")); # endif // if P016_FEATURE_COMMAND_HANDLING - P016_BUFFERSIZE = getFormItemInt(F("pbuffersize")); + P016_BUFFERSIZE = ceil(getFormItemInt(F("pbuffersize")) / 2.0f); // UI shows bytes, we store buffer unit = uint16_t # if P016_FEATURE_COMMAND_HANDLING diff --git a/src/src/PluginStructs/P016_data_struct.h b/src/src/PluginStructs/P016_data_struct.h index 76e17ffbf..43a92ebe0 100644 --- a/src/src/PluginStructs/P016_data_struct.h +++ b/src/src/PluginStructs/P016_data_struct.h @@ -23,6 +23,8 @@ # define P16_Nchars 64 // max chars per command line # define P16_Cchars 20 // max chars per code # define P016_DEFAULT_BUFFERSIZE 150 // default buffer size, range: 100..1024 +# define P016_MIN_BUFFERSIZE 100 // Minimum +# define P016_MAX_BUFFERSIZE 1024 // Maximum buffer size # define P16_SETTINGS_V1 // Settings v1 original settings when enabled, settings conversion is also enabled // Settings v2 includes 64 bit codes and some separated flags @@ -115,7 +117,7 @@ private: decode_type_t DecodeType, uint16_t CodeFlags); - uint64_t iLastCmd = 0; // last command send + uint64_t iLastCmd = 0; // last command send uint32_t iLastCmdTime = 0; // time while last command was send decode_type_t iLastDecodeType = decode_type_t::UNKNOWN; // last decode_type sent uint16_t iCmdInhibitTime = 0; // inhibit time for sending the same command again From ac305fdf7f38ea945edbe21b89761e71c846a32b Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Mon, 8 Aug 2022 22:00:09 +0200 Subject: [PATCH 83/89] [P016] Update documentation --- docs/source/Plugin/P016.rst | 9 ++- .../Plugin/P016_DeviceConfiguration.png | Bin 0 -> 92549 bytes docs/source/Plugin/P016_Setup.png | Bin 39662 -> 0 bytes docs/source/Plugin/P016_TSOP4838.rst | 71 +++++++----------- 4 files changed, 34 insertions(+), 46 deletions(-) create mode 100644 docs/source/Plugin/P016_DeviceConfiguration.png delete mode 100644 docs/source/Plugin/P016_Setup.png diff --git a/docs/source/Plugin/P016.rst b/docs/source/Plugin/P016.rst index c4fe76c59..1a8df528b 100644 --- a/docs/source/Plugin/P016.rst +++ b/docs/source/Plugin/P016.rst @@ -44,14 +44,21 @@ Change log .. versionchanged:: 2.0 ... + 2022-08-08: + |added| - Major overhaul for 2.0 release. + The buffer used for receiving and processing the incoming data can now be manually configured. 2021-05-24: |added| Support for IR codes up to 64 bit with separated Decode type and Repeat option, existing settings are converted, reworked the settings UI to reflect those changes. + . + + |added| + Major overhaul for 2.0 release. + .. versionadded:: 1.0 ... diff --git a/docs/source/Plugin/P016_DeviceConfiguration.png b/docs/source/Plugin/P016_DeviceConfiguration.png new file mode 100644 index 0000000000000000000000000000000000000000..a33895fc90741214620fa8518d7e8d04fb6ff14a GIT binary patch literal 92549 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%0A`t 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 b53&9~&_UMt#Rl*600000NkvXXu0mjfH`yz@ literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P016_Setup.png b/docs/source/Plugin/P016_Setup.png deleted file mode 100644 index 3e2ea0e1d59dca7b787b702cb564d760d15cde0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39662 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 diff --git a/docs/source/Plugin/P016_TSOP4838.rst b/docs/source/Plugin/P016_TSOP4838.rst index 008fafe10..b0aa06010 100644 --- a/docs/source/Plugin/P016_TSOP4838.rst +++ b/docs/source/Plugin/P016_TSOP4838.rst @@ -19,7 +19,7 @@ A datasheet for the TSOP4838 receiver can be found here: http://www.vishay.com/d Setup ----- -.. image:: P016_Setup.png +.. image:: P016_DeviceConfiguration.png Task settings ~~~~~~~~~~~~~ @@ -31,71 +31,52 @@ Task settings Sensor ^^^^^^ -* **Sensor**: standard definition for a GPIO pin setting +* **Internal PullUp**: To enable the internal pull-up resistor of the ESP. Usually not needed for the TSOP4838 as it has a built-in pull-up mechanism. + +* **Inversed Logic**: Can be used to invert the signal if a different type of receiver is used. + +* **GPIO <- IR**: Select the pin that the TSOP is connected to. Avoid selecting a pin that has a warning sign next to it, as that may block the boot process or normal working of the ESP. + +* **Receiver buffer size**: For receiving and decoding the data from the sensor, a buffer is needed. For more complex protocols, like often used for Air Conditioner remote controls, a larger buffer may be needed. By default this buffer is dimensioned at 300 bytes (will be rounded up to the next even number when stored), and needs to be enlarged if a message of this intent is shown in the log at INFO level (Either Web or serial log). Content ^^^^^^^ -Add new received code to command lines -"""""""""""""""""""""""""""""""""""""" +* **Add new received code to command lines**: After receiving a valid IR code the code is automatically added to the following table if it not already exists. -After receiving a valid IR code the code is automatically added to the following table if it not already exists. +* **Execute commands**: After receiving a valid IR the command that is assigned to this code (**Code [Hex]** or **Alt. Code [Hex]**) is executed. -Execute commands -"""""""""""""""" +* **Inhibit time for the same command [ms]**: The time that a same command will be ignored if receiving it multiple times. When set too high, often repeated commands like volume-up or volume-down will respond slower than expected. -After receiving a valid IR the command that is assigned to this code (**Code [Hex]** or **Alt. Code [Hex]**) is executed. - -Inhibit time for the same command [ms] -"""""""""""""""""""""""""""""""""""""" - -The time that a same command will be ignored if receiving it multiple times. When set too high, often repeated commands like volume-up or volume-down will respond slower than expected. - -.. note:: The code is only added automatically to field **Code [Hex]**! +.. note:: The code is *only* added automatically to field **Code [Hex]**! Code - command map ^^^^^^^^^^^^^^^^^^ -Decode type -"""""""""""" +* **Decode type**: The type as detected by the receiver, the list contains all supported types. -The type as detected by the receiver, the list contains all supported types. +* **Repeat**: If a repeat code is detected, this is checked. -Repeat -"""""" +* **Code [Hex]**: If the received valid IR code matches this setting the **Command nn** is executed. -If a repeat code is detected, this is checked. +* **Alt. Decode type**: The type as detected by the receiver, the list contains all supported types. -Code [Hex] -""""""""""""" +* **Repeat**: If a repeat code is detected, this is checked. -If the received valid IR code matches this setting the **Command nn** is executed. +* **Alt. Code [Hex]**: If the received valid IR code matches this setting the **Command nn** is executed. -Alt. Decode type -"""""""""""""""" - -The type as detected by the receiver, the list contains all supported types. - -Repeat -"""""" - -If a repeat code is detected, this is checked. - -Alt. Code [Hex] -""""""""""""""" - -If the received valid IR code matches this setting the **Command nn** is executed. - -Command nn -"""""""""" - -If the received valid IR code matches the code in **Code [Hex]** or **Alt. Code [Hex]** this command is executed. +* **Command nn**:If the received valid IR code matches the code in **Code [Hex]** or **Alt. Code [Hex]** this command is executed. .. note:: Up to 10 commands can be set ! +.. note:: Using compile-time options, the **Code - command map** and related options can be disabled. + Data acquisition -^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~ + +This group of settings, **Single event with all values** settings are standard available configuration items. Values -^^^^^^ +~~~~~~ +The last received code is available in numeric for in the Value that's selected here. It can be used in rules and other template processing plugins like Display devices. From 92058d18a404b3488e1b0c739e6d0d4a57adc87d Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Tue, 9 Aug 2022 15:15:22 +0200 Subject: [PATCH 84/89] [JSON] Add variables to /json output --- src/src/WebServer/JSON.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/src/WebServer/JSON.cpp b/src/src/WebServer/JSON.cpp index 5a37bddb2..a720cbbfb 100644 --- a/src/src/WebServer/JSON.cpp +++ b/src/src/WebServer/JSON.cpp @@ -154,6 +154,8 @@ void handle_json() LabelType::SYSTEM_LIBRARIES, LabelType::PLUGIN_COUNT, LabelType::PLUGIN_DESCRIPTION, + LabelType::BUILD_TIME, + LabelType::BINARY_FILENAME, LabelType::LOCAL_TIME, LabelType::TIME_SOURCE, LabelType::TIME_WANDER, @@ -198,6 +200,12 @@ void handle_json() LabelType::TIMEZONE_OFFSET, LabelType::LATITUDE, LabelType::LONGITUDE, + LabelType::SYSLOG_LOG_LEVEL, + LabelType::SERIAL_LOG_LEVEL, + LabelType::WEB_LOG_LEVEL, + #if FEATURE_SD + LabelType::SD_LOG_LEVEL, + #endif // if FEATURE_SD LabelType::MAX_LABEL From ef4636c0222c14a1c8c570deb81ffd6ef29c683b Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Tue, 9 Aug 2022 17:29:31 +0200 Subject: [PATCH 85/89] [Build] Upgrade SparkFun MAX1704x to latest --- platformio_core_defs.ini | 3 +++ platformio_esp32_envs.ini | 2 +- platformio_esp82xx_base.ini | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/platformio_core_defs.ini b/platformio_core_defs.ini index e9f7646ea..024d85ae1 100644 --- a/platformio_core_defs.ini +++ b/platformio_core_defs.ini @@ -56,6 +56,7 @@ build_flags = -DNDEBUG -DPUYA_SUPPORT=1 -DCORE_POST_2_5_0 -fno-strict-aliasing + -DLIBRARIES_NO_LOG=1 lib_ignore = ${esp82xx_defaults.lib_ignore} [esp82xx_2_6_x] @@ -220,9 +221,11 @@ platform = https://github.com/tasmota/platform-espressif32/re platform_packages = build_flags = -DESP32_STAGE -DMUSTFIX_CLIENT_TIMEOUT_IN_SECONDS + -DLIBRARIES_NO_LOG=1 [core_esp32_stage] platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.4.1/platform-espressif32-2.0.4.1.zip platform_packages = build_flags = -DESP32_STAGE -DMUSTFIX_CLIENT_TIMEOUT_IN_SECONDS + -DLIBRARIES_NO_LOG=1 diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index 1fd28d9bd..305a6bf27 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -40,7 +40,7 @@ lib_deps = ccronexpr rlogiacco/CircularBuffer td-er/ESPeasySerial @ 2.0.13 - td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1 + sparkfun/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.3 RAK12019_LTR390_UV_Light extra_scripts = post:tools/pio/post_esp32.py ${extra_scripts_default.extra_scripts} diff --git a/platformio_esp82xx_base.ini b/platformio_esp82xx_base.ini index b645bad4b..3dd6e7f9d 100644 --- a/platformio_esp82xx_base.ini +++ b/platformio_esp82xx_base.ini @@ -81,7 +81,7 @@ lib_deps = rlogiacco/CircularBuffer td-er/ESPeasySerial @ 2.0.13 td-er/RABurton ESP8266 Mutex @ ^1.0.2 - td-er/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.1 + sparkfun/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.3 RAK12019_LTR390_UV_Light lib_ignore = ${esp82xx_defaults.lib_ignore} IRremoteESP8266 From 4ed2afa98f77b19f043c769722402c3c98d38be5 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Tue, 9 Aug 2022 21:13:03 +0200 Subject: [PATCH 86/89] [P095] Optimize code and reduce string use to make build fit --- src/_P095_ILI9341.ino | 118 ++++++++++----------- src/src/PluginStructs/P095_data_struct.cpp | 54 ++++------ 2 files changed, 79 insertions(+), 93 deletions(-) diff --git a/src/_P095_ILI9341.ino b/src/_P095_ILI9341.ino index 818d13645..bf84f1f5a 100644 --- a/src/_P095_ILI9341.ino +++ b/src/_P095_ILI9341.ino @@ -15,7 +15,7 @@ /** * Changelog: - * 2022-07-20 tonhuisman: Made support for ILI9486/ILI9488 optional and excluded by default as these are not available as + * 2022-07-20 tonhuisman: Made support for ILI9486/ILI9488 optional and excluded by default as these are not available as * regular SPI devices (3/4 wire SPI) * NOTE: Renumbered enum with display types. * 2022-07-16 tonhuisman: Add support for some more ILI9481 sub-types (Again cloned from TFT_eSPI library) @@ -217,12 +217,12 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[1], PSTR(PLUGIN_VALUENAME2_095)); } - AdaGFXFormBacklight(F("p095_backlight"), P095_CONFIG_BACKLIGHT_PIN, - F("p095_backpercentage"), P095_CONFIG_BACKLIGHT_PERCENT); + AdaGFXFormBacklight(F("pbacklight"), P095_CONFIG_BACKLIGHT_PIN, + F("pbkpercent"), P095_CONFIG_BACKLIGHT_PERCENT); - AdaGFXFormDisplayButton(F("p095_button"), P095_CONFIG_BUTTON_PIN, - F("p095_buttonInverse"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_INVERT_BUTTON), - F("p095_timer"), P095_CONFIG_DISPLAY_TIMEOUT); + AdaGFXFormDisplayButton(F("pbutton"), P095_CONFIG_BUTTON_PIN, + F("pbtnInverse"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_INVERT_BUTTON), + F("ptimer"), P095_CONFIG_DISPLAY_TIMEOUT); { const __FlashStringHelper *hardwareTypes[] = { @@ -258,7 +258,7 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) # endif // ifdef P095_ENABLE_ILI948X }; addFormSelector(F("TFT display model"), - F("p095_type"), + F("ptype"), static_cast<int>(ILI9xxx_type_e::ILI9xxx_MAX), hardwareTypes, hardwareOptions, @@ -267,17 +267,17 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) addFormSubHeader(F("Layout")); - AdaGFXFormRotation(F("p095_rotate"), P095_CONFIG_ROTATION); + AdaGFXFormRotation(F("protate"), P095_CONFIG_ROTATION); - AdaGFXFormTextPrintMode(F("p095_mode"), P095_CONFIG_FLAG_GET_MODE); + AdaGFXFormTextPrintMode(F("pmode"), P095_CONFIG_FLAG_GET_MODE); - AdaGFXFormFontScaling(F("p095_fontscale"), P095_CONFIG_FLAG_GET_FONTSCALE); + AdaGFXFormFontScaling(F("pfontscale"), P095_CONFIG_FLAG_GET_FONTSCALE); # ifdef P095_SHOW_SPLASH - addFormCheckBox(F("Show splash on start"), F("p095_splash"), P095_CONFIG_FLAG_GET_SHOW_SPLASH); + addFormCheckBox(F("Show splash on start"), F("psplash"), P095_CONFIG_FLAG_GET_SHOW_SPLASH); # endif // ifdef P095_SHOW_SPLASH - addFormCheckBox(F("Clear display on exit"), F("p095_clearOnExit"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_CLEAR_ON_EXIT)); + addFormCheckBox(F("Clear display on exit"), F("pclrOnExit"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_CLEAR_ON_EXIT)); { const __FlashStringHelper *commandTriggers[] = { // Be sure to use all options available in the enum (except MAX)! @@ -301,45 +301,50 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) # endif // ifdef P095_ENABLE_ILI948X }; addFormSelector(F("Write Command trigger"), - F("p095_commandtrigger"), + F("pcmdtrigger"), static_cast<int>(P095_CommandTrigger::MAX), commandTriggers, commandTriggerOptions, P095_CONFIG_FLAG_GET_CMD_TRIGGER); + # ifndef BUILD_NO_DEBUG addFormNote(F("Select the command that is used to handle commands for this display.")); + # endif // ifndef BUILD_NO_DEBUG } // Inverted state! - addFormCheckBox(F("Wake display on receiving text"), F("p095_NoDisplay"), !bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_NO_WAKE)); + addFormCheckBox(F("Wake display on receiving text"), F("pNoDisplay"), !bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_NO_WAKE)); + # ifndef BUILD_NO_DEBUG addFormNote(F("When checked, the display wakes up at receiving remote updates.")); + # endif // ifndef BUILD_NO_DEBUG - AdaGFXFormTextColRowMode(F("p095_colrow"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_USE_COL_ROW) == 1); + AdaGFXFormTextColRowMode(F("pcolrow"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_USE_COL_ROW) == 1); - AdaGFXFormOnePixelCompatibilityOption(F("p095_compat"), !bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_COMPAT_P095)); // Inverse + AdaGFXFormOnePixelCompatibilityOption(F("pcompat"), !bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_COMPAT_P095)); // Inverse - AdaGFXFormTextBackgroundFill(F("p095_backfill"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_BACK_FILL) == 0); // Inverse + AdaGFXFormTextBackgroundFill(F("pbackfill"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_BACK_FILL) == 0); // Inverse addFormSubHeader(F("Content")); if (P095_CONFIG_COLORS == 0) { // For migrating from older release task settings P095_CONFIG_COLORS = ADAGFX_WHITE | (ADAGFX_BLACK << 16); } - AdaGFXFormForeAndBackColors(F("p095_foregroundcolor"), + AdaGFXFormForeAndBackColors(F("pfgcolor"), P095_CONFIG_GET_COLOR_FOREGROUND, - F("p095_backgroundcolor"), + F("pbgcolor"), P095_CONFIG_GET_COLOR_BACKGROUND); - String strings[P095_Nlines]; - LoadCustomTaskSettings(event->TaskIndex, strings, P095_Nlines, 0); - - String line; // Default reserved length is plenty uint16_t remain = DAT_TASKS_CUSTOM_SIZE; + { + String strings[P095_Nlines]; + LoadCustomTaskSettings(event->TaskIndex, strings, P095_Nlines, 0); - for (uint8_t varNr = 0; varNr < P095_Nlines; varNr++) { - line = F("Line "); - line += (varNr + 1); - addFormTextBox(line, getPluginCustomArgName(varNr), strings[varNr], P095_Nchars); - remain -= (strings[varNr].length() + 1); + + for (uint8_t varNr = 0; varNr < P095_Nlines; varNr++) { + String line = F("Line "); + line += (varNr + 1); + addFormTextBox(line, getPluginCustomArgName(varNr), strings[varNr], P095_Nchars); + remain -= (strings[varNr].length() + 1); + } } String remainStr; remainStr.reserve(15); @@ -356,51 +361,46 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) P095_CONFIG_VERSION = 2; // mark config V2 as already saved (next time, will not convert 'invalid' values) // PIN(0)..(2) are already set - P095_CONFIG_ROTATION = getFormItemInt(F("p095_rotate")); - P095_CONFIG_BUTTON_PIN = getFormItemInt(F("p095_button")); - P095_CONFIG_DISPLAY_TIMEOUT = getFormItemInt(F("p095_timer")); - P095_CONFIG_BACKLIGHT_PIN = getFormItemInt(F("p095_backlight")); - P095_CONFIG_BACKLIGHT_PERCENT = getFormItemInt(F("p095_backpercentage")); + P095_CONFIG_ROTATION = getFormItemInt(F("protate")); + P095_CONFIG_BUTTON_PIN = getFormItemInt(F("pbutton")); + P095_CONFIG_DISPLAY_TIMEOUT = getFormItemInt(F("ptimer")); + P095_CONFIG_BACKLIGHT_PIN = getFormItemInt(F("pbacklight")); + P095_CONFIG_BACKLIGHT_PERCENT = getFormItemInt(F("pbkpercent")); - uint32_t lSettings = 0; - bitWrite(lSettings, P095_CONFIG_FLAG_NO_WAKE, !isFormItemChecked(F("p095_NoDisplay"))); // Bit 0 - // NoDisplayOnReceivingText, - // reverse logic, - // default=checked! - bitWrite(lSettings, P095_CONFIG_FLAG_INVERT_BUTTON, isFormItemChecked(F("p095_buttonInverse"))); // Bit 1 buttonInverse - bitWrite(lSettings, P095_CONFIG_FLAG_CLEAR_ON_EXIT, isFormItemChecked(F("p095_clearOnExit"))); // Bit 2 ClearOnExit - bitWrite(lSettings, P095_CONFIG_FLAG_USE_COL_ROW, isFormItemChecked(F("p095_colrow"))); // Bit 3 Col/Row addressing - bitWrite(lSettings, P095_CONFIG_FLAG_COMPAT_P095, !isFormItemChecked(F("p095_compat"))); // Bit 4 Compat_P095 (inv) - bitWrite(lSettings, P095_CONFIG_FLAG_BACK_FILL, !isFormItemChecked(F("p095_backfill"))); // Bit 5 Back fill text (inv) + bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_NO_WAKE, !isFormItemChecked(F("pNoDisplay"))); // Bit 0 NoDisplayOnReceivingText, + // reverse logic, default=checked! + bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_INVERT_BUTTON, isFormItemChecked(F("pbtnInverse"))); // Bit 1 buttonInverse + bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_CLEAR_ON_EXIT, isFormItemChecked(F("pclrOnExit"))); // Bit 2 ClearOnExit + bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_USE_COL_ROW, isFormItemChecked(F("pcolrow"))); // Bit 3 Col/Row addressing + bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_COMPAT_P095, !isFormItemChecked(F("pcompat"))); // Bit 4 Compat_P095 (inv) + bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_BACK_FILL, !isFormItemChecked(F("pbackfill"))); // Bit 5 Back fill text (inv) # ifdef P095_SHOW_SPLASH - bitWrite(lSettings, P095_CONFIG_FLAG_SHOW_SPLASH, !isFormItemChecked(F("p095_splash"))); // Bit 6 Show splash on startup (inv) + bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_SHOW_SPLASH, !isFormItemChecked(F("psplash"))); // Bit 6 Splash on start (inv) # endif // ifdef P095_SHOW_SPLASH - set4BitToUL(lSettings, P095_CONFIG_FLAG_CMD_TRIGGER, getFormItemInt(F("p095_commandtrigger"))); // Bit 8..11 Command trigger - set4BitToUL(lSettings, P095_CONFIG_FLAG_FONTSCALE, getFormItemInt(F("p095_fontscale"))); // Bit 12..15 Font scale - set4BitToUL(lSettings, P095_CONFIG_FLAG_MODE, getFormItemInt(F("p095_mode"))); // Bit 16..19 Text print mode - set4BitToUL(lSettings, P095_CONFIG_FLAG_TYPE, getFormItemInt(F("p095_type"))); // Bit 20..24 Hardwaretype - P095_CONFIG_FLAGS = lSettings; + set4BitToUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_CMD_TRIGGER, getFormItemInt(F("pcmdtrigger"))); // Bit 8..11 Command trigger + set4BitToUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_FONTSCALE, getFormItemInt(F("pfontscale"))); // Bit 12..15 Font scale + set4BitToUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_MODE, getFormItemInt(F("pmode"))); // Bit 16..19 Text print mode + set4BitToUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_TYPE, getFormItemInt(F("ptype"))); // Bit 20..24 Hardwaretype - String color = web_server.arg(F("p095_foregroundcolor")); - uint16_t fgcolor = ADAGFX_WHITE; // Default to white when empty + String color = web_server.arg(F("pfgcolor")); + uint16_t fgcolor = ADAGFX_WHITE; // Default to white when empty if (!color.isEmpty()) { - fgcolor = AdaGFXparseColor(color); // Reduce to rgb565 + fgcolor = AdaGFXparseColor(color); // Reduce to rgb565 } - color = web_server.arg(F("p095_backgroundcolor")); + color = web_server.arg(F("pbgcolor")); uint16_t bgcolor = AdaGFXparseColor(color); P095_CONFIG_COLORS = fgcolor | (bgcolor << 16); // Store as a single setting String strings[P095_Nlines]; - String error; for (uint8_t varNr = 0; varNr < P095_Nlines; varNr++) { strings[varNr] = web_server.arg(getPluginCustomArgName(varNr)); } - error = SaveCustomTaskSettings(event->TaskIndex, strings, P095_Nlines, 0); + String error = SaveCustomTaskSettings(event->TaskIndex, strings, P095_Nlines, 0); if (error.length() > 0) { addHtmlError(error); @@ -467,12 +467,10 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) if (P095_CONFIG_BUTTON_PIN != -1) { P095_data_struct *P095_data = static_cast<P095_data_struct *>(getPluginTaskData(event->TaskIndex)); - if (nullptr == P095_data) { - return success; + if (nullptr != P095_data) { + P095_data->registerButtonState(digitalRead(P095_CONFIG_BUTTON_PIN), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_INVERT_BUTTON)); + success = true; } - - P095_data->registerButtonState(digitalRead(P095_CONFIG_BUTTON_PIN), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_INVERT_BUTTON)); - success = true; } break; } diff --git a/src/src/PluginStructs/P095_data_struct.cpp b/src/src/PluginStructs/P095_data_struct.cpp index 28aa13cf5..9308e1265 100644 --- a/src/src/PluginStructs/P095_data_struct.cpp +++ b/src/src/PluginStructs/P095_data_struct.cpp @@ -24,7 +24,11 @@ const __FlashStringHelper* ILI9xxx_type_toString(ILI9xxx_type_e device) { # endif // ifdef P095_ENABLE_ILI948X case ILI9xxx_type_e::ILI9xxx_MAX: break; } + # ifndef BUILD_NO_DEBUG return F("Unsupported type!"); + # else // ifndef BUILD_NO_DEBUG + return F(""); + # endif // ifndef BUILD_NO_DEBUG } /**************************************************************************** @@ -119,7 +123,9 @@ bool P095_data_struct::plugin_init(struct EventStruct *event) { bool success = false; if (nullptr == tft) { + # ifndef BUILD_NO_DEBUG addLog(LOG_LEVEL_INFO, F("ILI9341: Init start.")); + # endif // ifndef BUILD_NO_DEBUG tft = new (std::nothrow) Adafruit_ILI9341(PIN(0), PIN(1), PIN(2), static_cast<uint8_t>(_displayType), _xpix, _ypix); @@ -216,7 +222,9 @@ void P095_data_struct::updateFontMetrics() { * plugin_exit: De-initialize before destruction ***************************************************************************/ bool P095_data_struct::plugin_exit(struct EventStruct *event) { + # ifndef BUILD_NO_DEBUG addLog(LOG_LEVEL_INFO, F("ILI9341: Exit.")); + # endif // ifndef BUILD_NO_DEBUG if ((nullptr != tft) && bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_CLEAR_ON_EXIT)) { tft->fillScreen(ADAGFX_BLACK); // fill screen with black color @@ -348,45 +356,29 @@ bool P095_data_struct::plugin_write(struct EventStruct *event, const String& str } } else if (arg1.equals(F("backlight"))) { - String arg2 = parseString(string, 3); - int nArg2; - - if ((P095_CONFIG_BACKLIGHT_PIN != -1) && // All is valid? - validIntFromString(arg2, nArg2) && - (nArg2 > 0) && - (nArg2 <= 100)) { - P095_CONFIG_BACKLIGHT_PERCENT = nArg2; // Set but don't store + if ((P095_CONFIG_BACKLIGHT_PIN != -1) && // All is valid? + (event->Par2 > 0) && + (event->Par2 <= 100)) { + P095_CONFIG_BACKLIGHT_PERCENT = event->Par2; // Set but don't store displayOnOff(true); } else { success = false; } } - else if (arg1.equals(F("inv"))) - { - String arg2 = parseString(string, 3); - int nArg2; - - if (validIntFromString(arg2, nArg2) && - (nArg2 >= 0) && - (nArg2 <= 1)) { - tft->invertDisplay(nArg2); + else if (arg1.equals(F("inv"))) { + if ((event->Par2 >= 0) && + (event->Par2 <= 1)) { + tft->invertDisplay(event->Par2); } else { success = false; } } - else if (arg1.equals(F("rot"))) - { - ///control?cmd=tftcmd,rot,0 - // not working to verify - String arg2 = parseString(string, 3); - int nArg2; - - if (validIntFromString(arg2, nArg2) && - (nArg2 >= 0)) { + else if (arg1.equals(F("rot"))) { + if ((event->Par2 >= 0)) { if (nullptr != gfxHelper) { - gfxHelper->setRotation(nArg2 % 4); + gfxHelper->setRotation(event->Par2 % 4); } else { - tft->setRotation(nArg2 % 4); + tft->setRotation(event->Par2 % 4); } } else { success = false; @@ -435,11 +427,7 @@ void P095_data_struct::displayOnOff(bool state) { # endif // if defined(ESP32) } - if (state) { - tft->sendCommand(ILI9341_DISPON); - } else { - tft->sendCommand(ILI9341_DISPOFF); - } + tft->sendCommand(state ? ILI9341_DISPON : ILI9341_DISPOFF); _displayTimer = (state ? _displayTimeout : 0); } From fb8846ff703df99e22e1d371c0f5a94ca8075623 Mon Sep 17 00:00:00 2001 From: Max Prokhorov <prokhorov.max@outlook.com> Date: Wed, 10 Aug 2022 13:25:16 +0300 Subject: [PATCH 87/89] Fix github-script v5 breaking change Since v5, rest methods have their own namespace https://github.com/actions/github-script#breaking-changes-in-v5 Fixing latest release that broke on this step https://github.com/letscontrolit/ESPEasy/runs/7740919347?check_suite_focus=true#step:2:21 --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6e22d1c0f..36bac0018 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -112,12 +112,12 @@ jobs: with: result-encoding: string script: | - const tagRefObj = await github.git.getRef({ + const tagRefObj = await github.rest.git.getRef({ ...context.repo, ref: context.ref.replace('refs/', '') }); - const tagObj = await github.git.getTag({ + const tagObj = await github.rest.git.getTag({ ...context.repo, tag_sha: tagRefObj.data.object.sha }); From 3987c4dac87825e606cf021aabaad20556d35ef4 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Wed, 10 Aug 2022 13:44:28 +0200 Subject: [PATCH 88/89] [I2C] Improve visibility of I2C Configuration errors, few minor code enhancements --- src/src/Helpers/I2C_Plugin_Helper.cpp | 25 ++++++++++++++++++++++ src/src/Helpers/I2C_Plugin_Helper.h | 16 ++++++++++++++ src/src/WebServer/DevicesPage.cpp | 28 +++++++++++++------------ src/src/WebServer/DevicesPage.h | 3 ++- src/src/WebServer/HardwarePage.cpp | 30 +++++++++++++++------------ 5 files changed, 75 insertions(+), 27 deletions(-) create mode 100644 src/src/Helpers/I2C_Plugin_Helper.cpp create mode 100644 src/src/Helpers/I2C_Plugin_Helper.h diff --git a/src/src/Helpers/I2C_Plugin_Helper.cpp b/src/src/Helpers/I2C_Plugin_Helper.cpp new file mode 100644 index 000000000..e15356994 --- /dev/null +++ b/src/src/Helpers/I2C_Plugin_Helper.cpp @@ -0,0 +1,25 @@ +#include "../Helpers/I2C_Plugin_Helper.h" + +/*********************************************************************** + * checkI2CConfigValid_toHtml(taskIndex, onlyCheck) + * Check if I2C is correctly configured and usable for this task + * taskIndex: will be used in planned enhancements + * onlyCheck = true: no html output is generated + * Outputs an error message and returns false if not correct + **********************************************************************/ +bool checkI2CConfigValid_toHtml(taskIndex_t taskIndex, + bool onlyCheck) { + if ((Settings.Pin_i2c_sda == -1) || (Settings.Pin_i2c_scl == -1)) { + if (!onlyCheck) { addHtml(F("Incomplete I2C configuration.")); } + return false; + } + #if FEATURE_I2CMULTIPLEXER + + if ((Settings.I2C_Multiplexer_Type != I2C_MULTIPLEXER_NONE) && + (Settings.I2C_Multiplexer_Addr == -1)) { // Multiplexer selected, but no port configured + if (!onlyCheck) { addHtml(F("Incomplete I2C Multiplexer configuration.")); } + return false; + } + #endif // if FEATURE_I2CMULTIPLEXER + return true; +} diff --git a/src/src/Helpers/I2C_Plugin_Helper.h b/src/src/Helpers/I2C_Plugin_Helper.h new file mode 100644 index 000000000..4b15ec503 --- /dev/null +++ b/src/src/Helpers/I2C_Plugin_Helper.h @@ -0,0 +1,16 @@ +#ifndef _SRC_HELPERS_I2C_PLUGIN_HELPER_H +#define _SRC_HELPERS_I2C_PLUGIN_HELPER_H + +#include <Arduino.h> + +#include "../../ESPEasy_common.h" + +#include "../Globals/Plugins.h" +#include "../Globals/Settings.h" + +#include "../WebServer/HTML_wrappers.h" + +bool checkI2CConfigValid_toHtml(taskIndex_t taskIndex, + bool onlyCheck = false); + +#endif // ifndef _SRC_HELPERS_I2C_PLUGIN_HELPER_H diff --git a/src/src/WebServer/DevicesPage.cpp b/src/src/WebServer/DevicesPage.cpp index 620c92808..02e6635d3 100644 --- a/src/src/WebServer/DevicesPage.cpp +++ b/src/src/WebServer/DevicesPage.cpp @@ -619,7 +619,7 @@ void handle_devicess_ShowAllTasksTable(uint8_t page) switch (Device[DeviceIndex].Type) { case DEVICE_TYPE_I2C: { - format_I2C_pin_description(); + format_I2C_pin_description(x); break; } case DEVICE_TYPE_SPI3: @@ -636,11 +636,11 @@ void handle_devicess_ShowAllTasksTable(uint8_t page) case DEVICE_TYPE_ANALOG: { # ifdef ESP8266 - # if FEATURE_ADC_VCC + # if FEATURE_ADC_VCC addHtml(F("ADC (VDD)")); - # else // if FEATURE_ADC_VCC + # else // if FEATURE_ADC_VCC addHtml(F("ADC (TOUT)")); - # endif // if FEATURE_ADC_VCC + # endif // if FEATURE_ADC_VCC # endif // ifdef ESP8266 # ifdef ESP32 showpin1 = true; @@ -815,11 +815,13 @@ void format_SPI_port_description(int8_t spi_gpios[3]) # endif // ifdef ESP8266 } -void format_I2C_pin_description() +void format_I2C_pin_description(taskIndex_t x) { - Label_Gpio_toHtml(F("SDA"), formatGpioLabel(Settings.Pin_i2c_sda, false)); - html_BR(); - Label_Gpio_toHtml(F("SCL"), formatGpioLabel(Settings.Pin_i2c_scl, false)); + if (checkI2CConfigValid_toHtml(x)) { + Label_Gpio_toHtml(F("SDA"), formatGpioLabel(Settings.Pin_i2c_sda, false)); + html_BR(); + Label_Gpio_toHtml(F("SCL"), formatGpioLabel(Settings.Pin_i2c_scl, false)); + } } void format_SPI_pin_description(int8_t spi_gpios[3], taskIndex_t x) @@ -1040,11 +1042,6 @@ void devicePage_show_pin_config(taskIndex_t taskIndex, deviceIndex_t DeviceIndex addFormNote(F("SPI Interface is not configured yet (Hardware page).")); } - if ((Device[DeviceIndex].Type == DEVICE_TYPE_I2C) - && !Settings.isI2CEnabled()) { - addFormNote(F("I2C Interface is not configured yet (Hardware page).")); - } - if (Device[DeviceIndex].connectedToGPIOpins()) { // get descriptive GPIO-names from plugin struct EventStruct TempEvent(taskIndex); @@ -1104,6 +1101,11 @@ void devicePage_show_I2C_config(taskIndex_t taskIndex) struct EventStruct TempEvent(taskIndex); addFormSubHeader(F("I2C options")); + + if (!Settings.isI2CEnabled()) { + addFormNote(F("I2C Interface is not configured yet (Hardware page).")); + } + String dummy; PluginCall(PLUGIN_WEBFORM_SHOW_I2C_PARAMS, &TempEvent, dummy); diff --git a/src/src/WebServer/DevicesPage.h b/src/src/WebServer/DevicesPage.h index 697941ddb..33710041b 100644 --- a/src/src/WebServer/DevicesPage.h +++ b/src/src/WebServer/DevicesPage.h @@ -14,6 +14,7 @@ #include "../Static/WebStaticData.h" #include "../Helpers/_Plugin_SensorTypeHelper.h" +#include "../Helpers/I2C_Plugin_Helper.h" #include "../Helpers/StringGenerator_GPIO.h" @@ -43,7 +44,7 @@ void format_I2C_port_description(taskIndex_t x); void format_SPI_port_description(int8_t spi_gpios[3]); -void format_I2C_pin_description(); +void format_I2C_pin_description(taskIndex_t x); void format_SPI_pin_description(int8_t spi_gpios[3], taskIndex_t x); diff --git a/src/src/WebServer/HardwarePage.cpp b/src/src/WebServer/HardwarePage.cpp index c57e14338..1db17b82f 100644 --- a/src/src/WebServer/HardwarePage.cpp +++ b/src/src/WebServer/HardwarePage.cpp @@ -121,19 +121,23 @@ void handle_hardware() { addFormSubHeader(F("I2C Multiplexer")); // Select the type of multiplexer to use { - const __FlashStringHelper * i2c_muxtype_options[5]; - int i2c_muxtype_choices[5]; - i2c_muxtype_options[0] = F("- None -"); - i2c_muxtype_choices[0] = -1; - i2c_muxtype_options[1] = F("TCA9548a - 8 channel"); - i2c_muxtype_choices[1] = I2C_MULTIPLEXER_TCA9548A; - i2c_muxtype_options[2] = F("TCA9546a - 4 channel"); - i2c_muxtype_choices[2] = I2C_MULTIPLEXER_TCA9546A; - i2c_muxtype_options[3] = F("TCA9543a - 2 channel"); - i2c_muxtype_choices[3] = I2C_MULTIPLEXER_TCA9543A; - i2c_muxtype_options[4] = F("PCA9540 - 2 channel (experimental)"); - i2c_muxtype_choices[4] = I2C_MULTIPLEXER_PCA9540; - addFormSelector(F("I2C Multiplexer type"), F("pi2cmuxtype"), 5, i2c_muxtype_options, i2c_muxtype_choices, Settings.I2C_Multiplexer_Type); + # define I2C_MULTIPLEXER_OPTIONCOUNT 5 // Nr. of supported devices + 'None' + const __FlashStringHelper *i2c_muxtype_options[] = { + F("- None -"), + F("TCA9548a - 8 channel"), + F("TCA9546a - 4 channel"), + F("TCA9543a - 2 channel"), + F("PCA9540 - 2 channel (experimental)") + }; + const int i2c_muxtype_choices[] = { + -1, + I2C_MULTIPLEXER_TCA9548A, + I2C_MULTIPLEXER_TCA9546A, + I2C_MULTIPLEXER_TCA9543A, + I2C_MULTIPLEXER_PCA9540 + }; + addFormSelector(F("I2C Multiplexer type"), F("pi2cmuxtype"), I2C_MULTIPLEXER_OPTIONCOUNT, + i2c_muxtype_options, i2c_muxtype_choices, Settings.I2C_Multiplexer_Type); } // Select the I2C address for a port multiplexer { From acbcfc2f3a2485d8fb9e6f719fa5ef870e4fad81 Mon Sep 17 00:00:00 2001 From: Ton Huisman <tonhu2004@hotmail.com> Date: Wed, 10 Aug 2022 13:58:19 +0200 Subject: [PATCH 89/89] [I2C] invert bool argument name and value for readability --- src/src/Helpers/I2C_Plugin_Helper.cpp | 8 ++++---- src/src/Helpers/I2C_Plugin_Helper.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/src/Helpers/I2C_Plugin_Helper.cpp b/src/src/Helpers/I2C_Plugin_Helper.cpp index e15356994..86b239374 100644 --- a/src/src/Helpers/I2C_Plugin_Helper.cpp +++ b/src/src/Helpers/I2C_Plugin_Helper.cpp @@ -4,20 +4,20 @@ * checkI2CConfigValid_toHtml(taskIndex, onlyCheck) * Check if I2C is correctly configured and usable for this task * taskIndex: will be used in planned enhancements - * onlyCheck = true: no html output is generated + * outputToHtml = false: no html output is generated * Outputs an error message and returns false if not correct **********************************************************************/ bool checkI2CConfigValid_toHtml(taskIndex_t taskIndex, - bool onlyCheck) { + bool outputToHtml) { if ((Settings.Pin_i2c_sda == -1) || (Settings.Pin_i2c_scl == -1)) { - if (!onlyCheck) { addHtml(F("Incomplete I2C configuration.")); } + if (outputToHtml) { addHtml(F("Incomplete I2C configuration.")); } return false; } #if FEATURE_I2CMULTIPLEXER if ((Settings.I2C_Multiplexer_Type != I2C_MULTIPLEXER_NONE) && (Settings.I2C_Multiplexer_Addr == -1)) { // Multiplexer selected, but no port configured - if (!onlyCheck) { addHtml(F("Incomplete I2C Multiplexer configuration.")); } + if (outputToHtml) { addHtml(F("Incomplete I2C Multiplexer configuration.")); } return false; } #endif // if FEATURE_I2CMULTIPLEXER diff --git a/src/src/Helpers/I2C_Plugin_Helper.h b/src/src/Helpers/I2C_Plugin_Helper.h index 4b15ec503..601e84c4b 100644 --- a/src/src/Helpers/I2C_Plugin_Helper.h +++ b/src/src/Helpers/I2C_Plugin_Helper.h @@ -11,6 +11,6 @@ #include "../WebServer/HTML_wrappers.h" bool checkI2CConfigValid_toHtml(taskIndex_t taskIndex, - bool onlyCheck = false); + bool outputToHtml = true); #endif // ifndef _SRC_HELPERS_I2C_PLUGIN_HELPER_H