From a9fe99f08e59fbb6ee6ca56d208e94e63ab27f78 Mon Sep 17 00:00:00 2001 From: Mats Linander Date: Wed, 28 Aug 2024 11:05:45 -0400 Subject: [PATCH] gen2: basic audio support (#16) Play a sample on boot. --- .gitmodules | 10 + CMakeLists.txt | 5 + components/esp-audio-player | 1 + components/esp-libhelix-mp3 | 1 + dependencies.lock | 10 +- lib/HUB75 | 1 + .../.github/workflows/pio_build.yml | 48 - .../CMakeLists.txt | 25 - .../ESP32-HUB75-MatrixPanel-I2S-DMA.cpp | 1035 ------- .../ESP32-HUB75-MatrixPanel-I2S-DMA.h | 820 ------ .../ESP32-HUB75-MatrixPanel-leddrivers.cpp | 94 - .../ESP32-VirtualMatrixPanel-I2S-DMA.h | 315 --- .../LICENSE.txt | 19 - .../ESP32-HUB75-MatrixPanel-I2S-DMA/README.md | 230 -- .../WiringExample.jpg | Bin 73124 -> 0 bytes .../component.mk | 1 - .../doc/BuildOptions.md | 31 - .../doc/fillrate.md | 27 - .../doc/i2s_memcalc.md | 40 - .../doc/i2s_memcalc.xlsm | Bin 10758 -> 0 bytes .../doc/i2scalc.png | Bin 28618 -> 0 bytes .../esp32_i2s_parallel_dma.c | 444 --- .../esp32_i2s_parallel_dma.h | 106 - .../esp32_i2s_parallel_mcu_def.h | 35 - .../1_SimpleTestShapes/1_SimpleTestShapes.ino | 166 -- .../2_PatternPlasma/2_PatternPlasma.ino | 207 -- .../examples/2_PatternPlasma/PatternWave.jpg | Bin 34981 -> 0 bytes .../examples/2_PatternPlasma/README.md | 5 - .../examples/3_FM6126Panel/3_FM6126Panel.ino | 102 - .../examples/3_FM6126Panel/FM6126A.md | 51 - .../examples/3_FM6126Panel/README.md | 3 - .../AnimatedGIFPanel/AnimatedGIFPanel.ino | 294 -- .../examples/AnimatedGIFPanel/README.md | 13 - .../AnimatedGIFPanel/data/gifs/cartoon.gif | Bin 29727 -> 0 bytes .../data/gifs/ezgif.com-pacmn.gif | Bin 44831 -> 0 bytes .../data/gifs/loading.io-64x32px.gif | Bin 39645 -> 0 bytes .../data/gifs/matrix-spin.gif | Bin 174779 -> 0 bytes .../AnimatedGIFPanel/data/gifs/parasite1.gif | Bin 58970 -> 0 bytes .../AnimatedGIFPanel/data/gifs/parasite2.gif | Bin 32135 -> 0 bytes .../AnimatedGIFPanel/data/gifs/shock-gs.gif | Bin 34454 -> 0 bytes .../examples/AuroraDemo/Attractor.h | 50 - .../examples/AuroraDemo/AuroraDemo.ino | 150 -- .../examples/AuroraDemo/Boid.h | 326 --- .../examples/AuroraDemo/Drawable.h | 55 - .../examples/AuroraDemo/Effects.h | 848 ------ .../examples/AuroraDemo/Geometry.h | 150 -- .../examples/AuroraDemo/PatternAttract.h | 74 - .../examples/AuroraDemo/PatternBounce.h | 73 - .../examples/AuroraDemo/PatternCube.h | 219 -- .../AuroraDemo/PatternElectricMandala.h | 116 - .../examples/AuroraDemo/PatternFire.h | 118 - .../examples/AuroraDemo/PatternFlock.h | 125 - .../examples/AuroraDemo/PatternFlowField.h | 92 - .../AuroraDemo/PatternIncrementalDrift.h | 51 - .../AuroraDemo/PatternIncrementalDrift2.h | 63 - .../examples/AuroraDemo/PatternInfinity.h | 61 - .../examples/AuroraDemo/PatternInvaders.h | 154 -- .../examples/AuroraDemo/PatternLife.h | 129 - .../examples/AuroraDemo/PatternMaze.h | 264 -- .../examples/AuroraDemo/PatternMunch.h | 73 - .../AuroraDemo/PatternNoiseSmearing.h | 338 --- .../examples/AuroraDemo/PatternPendulumWave.h | 66 - .../examples/AuroraDemo/PatternPlasma.h | 66 - .../examples/AuroraDemo/PatternPulse.h | 82 - .../examples/AuroraDemo/PatternRadar.h | 56 - .../examples/AuroraDemo/PatternSimplexNoise.h | 79 - .../examples/AuroraDemo/PatternSnake.h | 145 - .../examples/AuroraDemo/PatternSpark.h | 113 - .../examples/AuroraDemo/PatternSpin.h | 100 - .../examples/AuroraDemo/PatternSpiral.h | 138 - .../examples/AuroraDemo/PatternSpiro.h | 112 - .../examples/AuroraDemo/PatternSwirl.h | 79 - .../examples/AuroraDemo/PatternTest.h | 20 - .../examples/AuroraDemo/PatternWave.h | 120 - .../examples/AuroraDemo/Patterns.h | 299 -- .../examples/AuroraDemo/Playlist.h | 39 - .../examples/AuroraDemo/README.md | 6 - .../examples/AuroraDemo/Vector.h | 169 -- .../examples/BitmapIcons/BitmapIcons.ino | 204 -- .../BitmapIcons/Dhole_weather_icons32px.h | 308 --- .../examples/BitmapIcons/README.md | 13 - .../examples/BitmapIcons/WiFi1bit.bmp | Bin 318 -> 0 bytes .../examples/BitmapIcons/bmp2hex.py | 248 -- .../examples/BitmapIcons/screenshot.jpg | Bin 133201 -> 0 bytes .../BouncingSquares/BouncingSquares.ino | 84 - .../examples/ChainedPanels/ChainedPanels.ino | 239 -- .../examples/ChainedPanels/README.md | 41 - .../ChainedPanels/VirtualMatrixPanel.odp | Bin 129540 -> 0 bytes .../ChainedPanels/VirtualMatrixPanel.pdf | Bin 372927 -> 0 bytes .../ChainedPanelsAuroraDemo/Attractor.h | 50 - .../examples/ChainedPanelsAuroraDemo/Boid.h | 326 --- .../ChainedPanelsAuroraDemo.ino | 209 -- .../ChainedPanelsAuroraDemo/Drawable.h | 55 - .../ChainedPanelsAuroraDemo/Effects.h | 852 ------ .../ChainedPanelsAuroraDemo/Geometry.h | 150 -- .../ChainedPanelsAuroraDemo/PaletteFireKoz.h | 3 - .../ChainedPanelsAuroraDemo/PatternAttract.h | 74 - .../ChainedPanelsAuroraDemo/PatternBounce.h | 73 - .../ChainedPanelsAuroraDemo/PatternCube.h | 219 -- .../PatternElectricMandala.h | 116 - .../ChainedPanelsAuroraDemo/PatternFire.h | 118 - .../ChainedPanelsAuroraDemo/PatternFireKoz.h | 109 - .../ChainedPanelsAuroraDemo/PatternFlock.h | 125 - .../PatternFlowField.h | 92 - .../PatternIncrementalDrift.h | 51 - .../PatternIncrementalDrift2.h | 64 - .../ChainedPanelsAuroraDemo/PatternInfinity.h | 61 - .../ChainedPanelsAuroraDemo/PatternInvaders.h | 154 -- .../ChainedPanelsAuroraDemo/PatternLife.h | 129 - .../ChainedPanelsAuroraDemo/PatternMaze.h | 264 -- .../ChainedPanelsAuroraDemo/PatternMunch.h | 73 - .../PatternNoiseSmearing.h | 338 --- .../PatternPendulumWave.h | 66 - .../ChainedPanelsAuroraDemo/PatternPlasma.h | 66 - .../ChainedPanelsAuroraDemo/PatternPulse.h | 82 - .../ChainedPanelsAuroraDemo/PatternRadar.h | 56 - .../PatternSimplexNoise.h | 79 - .../ChainedPanelsAuroraDemo/PatternSnake.h | 145 - .../ChainedPanelsAuroraDemo/PatternSpark.h | 113 - .../ChainedPanelsAuroraDemo/PatternSpin.h | 100 - .../ChainedPanelsAuroraDemo/PatternSpiral.h | 138 - .../ChainedPanelsAuroraDemo/PatternSpiro.h | 112 - .../ChainedPanelsAuroraDemo/PatternSwirl.h | 79 - .../ChainedPanelsAuroraDemo/PatternTest.h | 20 - .../ChainedPanelsAuroraDemo/PatternWave.h | 120 - .../ChainedPanelsAuroraDemo/Patterns.h | 297 -- .../ChainedPanelsAuroraDemo/Playlist.h | 39 - .../examples/ChainedPanelsAuroraDemo/Vector.h | 169 -- .../ChainedPanelsScreenBuffer.ino | 146 - .../FastLED_Pixel_Buffer.cpp | 116 - .../FastLED_Pixel_Buffer.h | 51 - .../One_Eight_1_8_ScanPanel.ino | 151 -- .../One_Eight_1_8_ScanPanel/README.md | 7 - .../OneQuarterScanMatrixPanel.h | 451 ---- .../One_Quarter_1_4_ScanPanel.ino | 226 -- .../One_Quarter_1_4_ScanPanel/README.md | 78 - .../examples/PIO_TestPatterns/README.md | 18 - .../examples/PIO_TestPatterns/platformio.ini | 90 - .../PIO_TestPatterns/sdkconfig.defaults | 18 - .../PIO_TestPatterns/src/CMakeLists.txt | 6 - .../examples/PIO_TestPatterns/src/main.cpp | 455 ---- .../examples/PIO_TestPatterns/src/main.h | 10 - .../examples/README.md | 14 - .../SmoothDoubleBuffer/SmoothDoubleBuffer.ino | 71 - .../ESP32-HUB75-MatrixPanel-I2S-DMA/image.jpg | Bin 139703 -> 0 bytes .../keywords.txt | 18 - .../library.json | 30 - .../library.properties | 9 - lib/HUB75/library.json | 10 - lib/assets/assets.h | 3 + lib/assets/lazy_daddy_jukebox_29617.c | 851 ++++++ platformio.ini | 4 +- sdkconfig | 2016 ++++++++++---- sdkconfig.gen2 | 2398 ----------------- src/audio.c | 134 + src/audio.h | 4 + src/main.c | 10 + src/remote.c | 4 + src/wifi.c | 4 +- 159 files changed, 2549 insertions(+), 20734 deletions(-) create mode 160000 components/esp-audio-player create mode 160000 components/esp-libhelix-mp3 create mode 160000 lib/HUB75 delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/.github/workflows/pio_build.yml delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/CMakeLists.txt delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-I2S-DMA.cpp delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-I2S-DMA.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-leddrivers.cpp delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-VirtualMatrixPanel-I2S-DMA.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/LICENSE.txt delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/README.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/WiringExample.jpg delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/component.mk delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/BuildOptions.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/fillrate.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/i2s_memcalc.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/i2s_memcalc.xlsm delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/i2scalc.png delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/esp32_i2s_parallel_dma.c delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/esp32_i2s_parallel_dma.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/esp32_i2s_parallel_mcu_def.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/1_SimpleTestShapes/1_SimpleTestShapes.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/2_PatternPlasma/2_PatternPlasma.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/2_PatternPlasma/PatternWave.jpg delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/2_PatternPlasma/README.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/3_FM6126Panel.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/FM6126A.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/README.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/AnimatedGIFPanel.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/README.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/cartoon.gif delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/ezgif.com-pacmn.gif delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/loading.io-64x32px.gif delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/matrix-spin.gif delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/parasite1.gif delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/parasite2.gif delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/shock-gs.gif delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Attractor.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/AuroraDemo.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Boid.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Drawable.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Effects.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Geometry.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternAttract.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternBounce.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternCube.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternElectricMandala.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFire.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFlock.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFlowField.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternIncrementalDrift.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternIncrementalDrift2.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternInfinity.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternInvaders.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternLife.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternMaze.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternMunch.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternNoiseSmearing.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPendulumWave.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPlasma.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPulse.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternRadar.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSimplexNoise.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSnake.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpark.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpin.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpiral.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpiro.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSwirl.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternTest.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternWave.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Patterns.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Playlist.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/README.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Vector.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/BitmapIcons.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/Dhole_weather_icons32px.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/README.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/WiFi1bit.bmp delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/bmp2hex.py delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/screenshot.jpg delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BouncingSquares/BouncingSquares.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/ChainedPanels.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/README.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/VirtualMatrixPanel.odp delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/VirtualMatrixPanel.pdf delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Attractor.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Boid.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/ChainedPanelsAuroraDemo.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Drawable.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Effects.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Geometry.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PaletteFireKoz.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternAttract.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternBounce.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternCube.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternElectricMandala.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFire.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFireKoz.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFlock.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFlowField.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternIncrementalDrift.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternIncrementalDrift2.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternInfinity.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternInvaders.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternLife.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternMaze.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternMunch.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternNoiseSmearing.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPendulumWave.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPlasma.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPulse.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternRadar.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSimplexNoise.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSnake.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpark.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpin.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpiral.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpiro.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSwirl.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternTest.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternWave.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Patterns.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Playlist.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Vector.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/ChainedPanelsScreenBuffer.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/FastLED_Pixel_Buffer.cpp delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/FastLED_Pixel_Buffer.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Eight_1_8_ScanPanel/One_Eight_1_8_ScanPanel.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Eight_1_8_ScanPanel/README.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/OneQuarterScanMatrixPanel.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/One_Quarter_1_4_ScanPanel.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/README.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/README.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/platformio.ini delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/sdkconfig.defaults delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/CMakeLists.txt delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/main.cpp delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/main.h delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/README.md delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/SmoothDoubleBuffer/SmoothDoubleBuffer.ino delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/image.jpg delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/keywords.txt delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/library.json delete mode 100644 lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/library.properties delete mode 100644 lib/HUB75/library.json create mode 100644 lib/assets/lazy_daddy_jukebox_29617.c delete mode 100644 sdkconfig.gen2 create mode 100644 src/audio.c create mode 100644 src/audio.h diff --git a/.gitmodules b/.gitmodules index f166888..bd397b5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,13 @@ [submodule "lib/webp/libwebp"] path = lib/webp/libwebp url = https://github.com/webmproject/libwebp.git +[submodule "components/esp-audio-player"] + path = components/esp-audio-player + url = git@github.com:chmorgan/esp-audio-player.git +[submodule "components/esp-libhelix-mp3"] + path = components/esp-libhelix-mp3 + url = git@github.com:chmorgan/esp-libhelix-mp3.git +[submodule "lib/HUB75"] + path = lib/HUB75 + url = git@github.com:tidbyt/ESP32-HUB75-MatrixPanel-I2S-DMA.git + branch = rohan/esp-idf-5 diff --git a/CMakeLists.txt b/CMakeLists.txt index 2fd4ee4..98145a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,8 @@ cmake_minimum_required(VERSION 3.16.0) include($ENV{IDF_PATH}/tools/cmake/project.cmake) +list( + APPEND + EXTRA_COMPONENT_DIRS + components + lib/HUB75) project(firmware) diff --git a/components/esp-audio-player b/components/esp-audio-player new file mode 160000 index 0000000..916bc82 --- /dev/null +++ b/components/esp-audio-player @@ -0,0 +1 @@ +Subproject commit 916bc82aaa7a342fb1f4b908bc66df89055ce70e diff --git a/components/esp-libhelix-mp3 b/components/esp-libhelix-mp3 new file mode 160000 index 0000000..a6cd3f4 --- /dev/null +++ b/components/esp-libhelix-mp3 @@ -0,0 +1 @@ +Subproject commit a6cd3f4b03c03c72d7ace1ec0f89d280f94bf10e diff --git a/dependencies.lock b/dependencies.lock index 36a9898..c07a8f4 100644 --- a/dependencies.lock +++ b/dependencies.lock @@ -1,9 +1,15 @@ dependencies: + chmorgan/esp-libhelix-mp3: + component_hash: cbb76089dc2c5749f7b470e2e70aedc44c9da519e04eb9a67d4c7ec275229e53 + source: + service_url: https://api.components.espressif.com/ + type: service + version: 1.0.3 idf: component_hash: null source: type: idf - version: 4.4.4 -manifest_hash: 81327a7819f5bc7bf271896e30d778a5c5f8f8f754dfbc8e245723b4a37d3107 + version: 5.3.0 +manifest_hash: 457b0ef96cde12dc161597c3aace929636c8878d5cd57802659397e616b041d1 target: esp32 version: 1.0.0 diff --git a/lib/HUB75 b/lib/HUB75 new file mode 160000 index 0000000..8f284af --- /dev/null +++ b/lib/HUB75 @@ -0,0 +1 @@ +Subproject commit 8f284afe7ba4ff369a4427121338e1673026320e diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/.github/workflows/pio_build.yml b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/.github/workflows/pio_build.yml deleted file mode 100644 index 39901f9..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/.github/workflows/pio_build.yml +++ /dev/null @@ -1,48 +0,0 @@ -# Build examples with Platformio -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions -# https://docs.platformio.org/en/latest/integration/ci/github-actions.html - -name: PlatformIO CI - -on: - push: - branches: [ master, dev ] - pull_request: - branches: [ master, dev ] - -jobs: - build: - - runs-on: ubuntu-latest - strategy: - matrix: - example: - - "examples/PIO_TestPatterns" - - steps: - - uses: actions/checkout@v2 - - name: Cache pip - uses: actions/cache@v2 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} - restore-keys: ${{ runner.os }}-pip- - - name: Cache PlatformIO - uses: actions/cache@v2 - with: - path: ~/.platformio - key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} - - name: Set up Python 3.x - uses: actions/setup-python@v2 - with: - python-version: '3.x' - - name: Install Platformio - run: | - python -m pip install --upgrade pip - pip install --upgrade platformio - pio update - - name: Run PlatformIO - env: - PLATFORMIO_CI_SRC: ${{ matrix.example }} - run: | - pio ci -c ${{ matrix.example }}/platformio.ini \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/CMakeLists.txt b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/CMakeLists.txt deleted file mode 100644 index c216185..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -# HUB75 RGB LED matrix library utilizing ESP32 DMA Engine -# https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA -# MIT License - -cmake_minimum_required(VERSION 3.5) - -idf_component_register(SRCS "esp32_i2s_parallel_dma.c" "ESP32-HUB75-MatrixPanel-I2S-DMA.cpp" "ESP32-HUB75-MatrixPanel-leddrivers.cpp" - INCLUDE_DIRS "." - REQUIRES arduino Adafruit-GFX-Library) - -# In case you are running into issues with "missing" header files from 3rd party libraries -# you can add them to the REQUIRES section above. If you use some of the build options below -# you probably want to remove (NO_GFX) or replace Adafruit-GFX-Library (USE_GFX_ROOT) - -# Example to build with USE_GFX_ROOT or NO_GFX / just uncomment the appropriate line -# target_compile_options(${COMPONENT_TARGET} PUBLIC -DUSE_GFX_ROOT) -# target_compile_options(${COMPONENT_TARGET} PUBLIC -DNO_GFX) - -# You can also use multiple options like this -# target_compile_options(${COMPONENT_TARGET} PUBLIC -DNO_GFX -DNO_FAST_FUNCTIONS) - -# All options can be found here: -# https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/blob/master/doc/BuildOptions.md - -project(ESP32-HUB75-MatrixPanel-I2S-DMA) diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-I2S-DMA.cpp b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-I2S-DMA.cpp deleted file mode 100644 index 60df498..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-I2S-DMA.cpp +++ /dev/null @@ -1,1035 +0,0 @@ -#include -#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h" - - -#if defined(ESP32_SXXX) - #pragma message "Compiling for ESP32-Sx MCUs" -#elif defined(ESP32_CXXX) - #pragma message "Compiling for ESP32-Cx MCUs" -#elif CONFIG_IDF_TARGET_ESP32 || defined(ESP32) - #pragma message "Compiling for original (released 2016) 520kB SRAM ESP32." -#else - #error "Compiling for something unknown!" -#endif - - -// Credits: Louis Beaudoin -// and Sprite_TM: https://www.esp32.com/viewtopic.php?f=17&t=3188 and https://www.esp32.com/viewtopic.php?f=13&t=3256 - -/* - - This is example code to driver a p3(2121)64*32 -style RGB LED display. These types of displays do not have memory and need to be refreshed - continuously. The display has 2 RGB inputs, 4 inputs to select the active line, a pixel clock input, a latch enable input and an output-enable - input. The display can be seen as 2 64x16 displays consisting of the upper half and the lower half of the display. Each half has a separate - RGB pixel input, the rest of the inputs are shared. - - Each display half can only show one line of RGB pixels at a time: to do this, the RGB data for the line is input by setting the RGB input pins - to the desired value for the first pixel, giving the display a clock pulse, setting the RGB input pins to the desired value for the second pixel, - giving a clock pulse, etc. Do this 64 times to clock in an entire row. The pixels will not be displayed yet: until the latch input is made high, - the display will still send out the previously clocked in line. Pulsing the latch input high will replace the displayed data with the data just - clocked in. - - The 4 line select inputs select where the currently active line is displayed: when provided with a binary number (0-15), the latched pixel data - will immediately appear on this line. Note: While clocking in data for a line, the *previous* line is still displayed, and these lines should - be set to the value to reflect the position the *previous* line is supposed to be on. - - Finally, the screen has an OE input, which is used to disable the LEDs when latching new data and changing the state of the line select inputs: - doing so hides any artefacts that appear at this time. The OE line is also used to dim the display by only turning it on for a limited time every - line. - - All in all, an image can be displayed by 'scanning' the display, say, 100 times per second. The slowness of the human eye hides the fact that - only one line is showed at a time, and the display looks like every pixel is driven at the same time. - - Now, the RGB inputs for these types of displays are digital, meaning each red, green and blue subpixel can only be on or off. This leads to a - color palette of 8 pixels, not enough to display nice pictures. To get around this, we use binary code modulation. - - Binary code modulation is somewhat like PWM, but easier to implement in our case. First, we define the time we would refresh the display without - binary code modulation as the 'frame time'. For, say, a four-bit binary code modulation, the frame time is divided into 15 ticks of equal length. - - We also define 4 subframes (0 to 3), defining which LEDs are on and which LEDs are off during that subframe. (Subframes are the same as a - normal frame in non-binary-coded-modulation mode, but are showed faster.) From our (non-monochrome) input image, we take the (8-bit: bit 7 - to bit 0) RGB pixel values. If the pixel values have bit 7 set, we turn the corresponding LED on in subframe 3. If they have bit 6 set, - we turn on the corresponding LED in subframe 2, if bit 5 is set subframe 1, if bit 4 is set in subframe 0. - - Now, in order to (on average within a frame) turn a LED on for the time specified in the pixel value in the input data, we need to weigh the - subframes. We have 15 pixels: if we show subframe 3 for 8 of them, subframe 2 for 4 of them, subframe 1 for 2 of them and subframe 1 for 1 of - them, this 'automatically' happens. (We also distribute the subframes evenly over the ticks, which reduces flicker.) - - In this code, we use the I2S peripheral in parallel mode to achieve this. Essentially, first we allocate memory for all subframes. This memory - contains a sequence of all the signals (2xRGB, line select, latch enable, output enable) that need to be sent to the display for that subframe. - Then we ask the I2S-parallel driver to set up a DMA chain so the subframes are sent out in a sequence that satisfies the requirement that - subframe x has to be sent out for (2^x) ticks. Finally, we fill the subframes with image data. - - We use a front buffer/back buffer technique here to make sure the display is refreshed in one go and drawing artefacts do not reach the display. - In practice, for small displays this is not really necessarily. - -*/ - - -// macro's to calculate sizes of a single buffer (double buffer takes twice as this) -#define rowBitStructBuffSize sizeof(ESP32_I2S_DMA_STORAGE_TYPE) * (PIXELS_PER_ROW + CLKS_DURING_LATCH) * PIXEL_COLOR_DEPTH_BITS -#define frameStructBuffSize ROWS_PER_FRAME * rowBitStructBuffSize - -/* this replicates same function in rowBitStruct, but due to induced inlining it might be MUCH faster when used in tight loops - * while method from struct could be flushed out of instruction cache between loop cycles - * do NOT forget about buff_id param if using this - */ -#define getRowDataPtr(row, _dpth, buff_id) &(dma_buff.rowBits[row]->data[_dpth * dma_buff.rowBits[row]->width + buff_id*(dma_buff.rowBits[row]->width * dma_buff.rowBits[row]->color_depth)]) - -bool MatrixPanel_I2S_DMA::allocateDMAmemory() -{ - - /*** - * Step 1: Look at the overall DMA capable memory for the DMA FRAMEBUFFER data only (not the DMA linked list descriptors yet) - * and do some pre-checks. - */ - - int _num_frame_buffers = (m_cfg.double_buff) ? 2:1; - size_t _frame_buffer_memory_required = frameStructBuffSize * _num_frame_buffers; - size_t _dma_linked_list_memory_required = 0; - size_t _total_dma_capable_memory_reserved = 0; - - // 1. Calculate the amount of DMA capable memory that's actually available - #if SERIAL_DEBUG - Serial.printf_P(PSTR("Panel Width: %d pixels.\r\n"), PIXELS_PER_ROW); - Serial.printf_P(PSTR("Panel Height: %d pixels.\r\n"), m_cfg.mx_height); - - if (m_cfg.double_buff) { - Serial.println(F("DOUBLE FRAME BUFFERS / DOUBLE BUFFERING IS ENABLED. DOUBLE THE RAM REQUIRED!")); - } - - Serial.println(F("DMA memory blocks available before any malloc's: ")); - heap_caps_print_heap_info(MALLOC_CAP_DMA); - Serial.println(F("******************************************************************")); - Serial.printf_P(PSTR("We're going to need %d bytes of SRAM just for the frame buffer(s).\r\n"), _frame_buffer_memory_required); - Serial.printf_P(PSTR("The total amount of DMA capable SRAM memory is %d bytes.\r\n"), heap_caps_get_free_size(MALLOC_CAP_DMA)); - Serial.printf_P(PSTR("Largest DMA capable SRAM memory block is %d bytes.\r\n"), heap_caps_get_largest_free_block(MALLOC_CAP_DMA)); - Serial.println(F("******************************************************************")); - - #endif - - // Can we potentially fit the framebuffer into the DMA capable memory that's available? - if ( heap_caps_get_free_size(MALLOC_CAP_DMA) < _frame_buffer_memory_required ) { - - #if SERIAL_DEBUG - Serial.printf_P(PSTR("######### Insufficient memory for requested resolution. Reduce MATRIX_COLOR_DEPTH and try again.\r\n\tAdditional %d bytes of memory required.\r\n\r\n"), (_frame_buffer_memory_required-heap_caps_get_free_size(MALLOC_CAP_DMA)) ); - #endif - - return false; - } - - // Alright, theoretically we should be OK, so let us do this, so - // lets allocate a chunk of memory for each row (a row could span multiple panels if chaining is in place) - dma_buff.rowBits.reserve(ROWS_PER_FRAME); - - // iterate through number of rows - for (int malloc_num =0; malloc_num < ROWS_PER_FRAME; ++malloc_num) - { - auto ptr = std::make_shared(PIXELS_PER_ROW, PIXEL_COLOR_DEPTH_BITS, m_cfg.double_buff); - - if (ptr->data == nullptr){ - #if SERIAL_DEBUG - Serial.printf_P(PSTR("ERROR: Couldn't malloc rowBitStruct %d! Critical fail.\r\n"), malloc_num); - #endif - return false; - // TODO: should we release all previous rowBitStructs here??? - } - - dma_buff.rowBits.emplace_back(ptr); // save new rowBitStruct into rows vector - ++dma_buff.rows; - #if SERIAL_DEBUG - Serial.printf_P(PSTR("Malloc'ing %d bytes of memory @ address %ud for frame row %d.\r\n"), ptr->size()*_num_frame_buffers, (unsigned int)ptr->getDataPtr(), malloc_num); - #endif - - } - - _total_dma_capable_memory_reserved += _frame_buffer_memory_required; - - - /*** - * Step 2: Calculate the amount of memory required for the DMA engine's linked list descriptors. - * Credit to SmartMatrix for this stuff. - */ - - - // Calculate what colour depth is actually possible based on memory available vs. required DMA linked-list descriptors. - // aka. Calculate the lowest LSBMSB_TRANSITION_BIT value that will fit in memory - int numDMAdescriptorsPerRow = 0; - lsbMsbTransitionBit = 0; - - - while(1) { - numDMAdescriptorsPerRow = 1; - for(int i=lsbMsbTransitionBit + 1; i m_cfg.min_refresh_rate) - break; - - if(lsbMsbTransitionBit < PIXEL_COLOR_DEPTH_BITS - 1) - lsbMsbTransitionBit++; - else - break; - } - - #if SERIAL_DEBUG - Serial.printf_P(PSTR("Raised lsbMsbTransitionBit to %d/%d to meet minimum refresh rate\r\n"), lsbMsbTransitionBit, PIXEL_COLOR_DEPTH_BITS - 1); - #endif - - #endif - - /*** - * Step 2a: lsbMsbTransition bit is now finalised - recalculate the DMA descriptor count required, which is used for - * memory allocation of the DMA linked list memory structure. - */ - numDMAdescriptorsPerRow = 1; - for(int i=lsbMsbTransitionBit + 1; i DMA_MAX ) { - - #if SERIAL_DEBUG - Serial.printf_P(PSTR("rowColorDepthStruct struct is too large, split DMA payload required. Adding %d DMA descriptors\n"), PIXEL_COLOR_DEPTH_BITS-1); - #endif - - numDMAdescriptorsPerRow += PIXEL_COLOR_DEPTH_BITS-1; - // Note: If numDMAdescriptorsPerRow is even just one descriptor too large, DMA linked list will not correctly loop. - } - - - /*** - * Step 3: Allocate memory for DMA linked list, linking up each framebuffer row in sequence for GPIO output. - */ - - _dma_linked_list_memory_required = numDMAdescriptorsPerRow * ROWS_PER_FRAME * _num_frame_buffers * sizeof(lldesc_t); - #if SERIAL_DEBUG - Serial.printf_P(PSTR("Descriptors for lsbMsbTransitionBit of %d/%d with %d frame rows require %d bytes of DMA RAM with %d numDMAdescriptorsPerRow.\r\n"), lsbMsbTransitionBit, PIXEL_COLOR_DEPTH_BITS - 1, ROWS_PER_FRAME, _dma_linked_list_memory_required, numDMAdescriptorsPerRow); - #endif - - _total_dma_capable_memory_reserved += _dma_linked_list_memory_required; - - // Do a final check to see if we have enough space for the additional DMA linked list descriptors that will be required to link it all up! - if(_dma_linked_list_memory_required > heap_caps_get_largest_free_block(MALLOC_CAP_DMA)) { -#if SERIAL_DEBUG - Serial.println(F("ERROR: Not enough SRAM left over for DMA linked-list descriptor memory reservation! Oh so close!\r\n")); -#endif - return false; - } // linked list descriptors memory check - - // malloc the DMA linked list descriptors that i2s_parallel will need - desccount = numDMAdescriptorsPerRow * ROWS_PER_FRAME; - - //lldesc_t * dmadesc_a = (lldesc_t *)heap_caps_malloc(desccount * sizeof(lldesc_t), MALLOC_CAP_DMA); - dmadesc_a = (lldesc_t *)heap_caps_malloc(desccount * sizeof(lldesc_t), MALLOC_CAP_DMA); - assert("Can't allocate descriptor framebuffer a"); - if(!dmadesc_a) { -#if SERIAL_DEBUG - Serial.println(F("ERROR: Could not malloc descriptor framebuffer a.")); -#endif - return false; - } - - if (m_cfg.double_buff) // reserve space for second framebuffer linked list - { - //lldesc_t * dmadesc_b = (lldesc_t *)heap_caps_malloc(desccount * sizeof(lldesc_t), MALLOC_CAP_DMA); - dmadesc_b = (lldesc_t *)heap_caps_malloc(desccount * sizeof(lldesc_t), MALLOC_CAP_DMA); - assert("Could not malloc descriptor framebuffer b."); - if(!dmadesc_b) { -#if SERIAL_DEBUG - Serial.println(F("ERROR: Could not malloc descriptor framebuffer b.")); -#endif - return false; - } - } - -#if SERIAL_DEBUG - Serial.println(F("*** ESP32-HUB75-MatrixPanel-I2S-DMA: Memory Allocations Complete ***")); - Serial.printf_P(PSTR("Total memory that was reserved: %d kB.\r\n"), _total_dma_capable_memory_reserved/1024); - Serial.printf_P(PSTR("... of which was used for the DMA Linked List(s): %d kB.\r\n"), _dma_linked_list_memory_required/1024); - - Serial.printf_P(PSTR("Heap Memory Available: %d bytes total. Largest free block: %d bytes.\r\n"), heap_caps_get_free_size(0), heap_caps_get_largest_free_block(0)); - Serial.printf_P(PSTR("General RAM Available: %d bytes total. Largest free block: %d bytes.\r\n"), heap_caps_get_free_size(MALLOC_CAP_DEFAULT), heap_caps_get_largest_free_block(MALLOC_CAP_DEFAULT)); -#endif - - // Just os we know - initialized = true; - - return true; - -} // end allocateDMAmemory() - - - -void MatrixPanel_I2S_DMA::configureDMA(const HUB75_I2S_CFG& _cfg) -{ - #if SERIAL_DEBUG - Serial.println(F("configureDMA(): Starting configuration of DMA engine.\r\n")); - #endif - - - lldesc_t *previous_dmadesc_a = 0; - lldesc_t *previous_dmadesc_b = 0; - int current_dmadescriptor_offset = 0; - - // HACK: If we need to split the payload in 1/2 so that it doesn't breach DMA_MAX, lets do it by the color_depth. - int num_dma_payload_color_depths = PIXEL_COLOR_DEPTH_BITS; - if ( rowBitStructBuffSize > DMA_MAX ) { - num_dma_payload_color_depths = 1; - } - - // Fill DMA linked lists for both frames (as in, halves of the HUB75 panel) and if double buffering is enabled, link it up for both buffers. - for(int row = 0; row < ROWS_PER_FRAME; row++) { - - #if SERIAL_DEBUG - Serial.printf_P(PSTR( "Row %d DMA payload of %d bytes. DMA_MAX is %d.\n"), row, dma_buff.rowBits[row]->size(), DMA_MAX); - #endif - - - // first set of data is LSB through MSB, single pass (IF TOTAL SIZE < DMA_MAX) - all color bits are displayed once, which takes care of everything below and including LSBMSB_TRANSITION_BIT - // NOTE: size must be less than DMA_MAX - worst case for library: 16-bpp with 256 pixels per row would exceed this, need to break into two - link_dma_desc(&dmadesc_a[current_dmadescriptor_offset], previous_dmadesc_a, dma_buff.rowBits[row]->getDataPtr(), dma_buff.rowBits[row]->size(num_dma_payload_color_depths)); - previous_dmadesc_a = &dmadesc_a[current_dmadescriptor_offset]; - - if (m_cfg.double_buff) { - link_dma_desc(&dmadesc_b[current_dmadescriptor_offset], previous_dmadesc_b, dma_buff.rowBits[row]->getDataPtr(0, 1), dma_buff.rowBits[row]->size(num_dma_payload_color_depths)); - previous_dmadesc_b = &dmadesc_b[current_dmadescriptor_offset]; } - - current_dmadescriptor_offset++; - - // If the number of pixels per row is too great for the size of a DMA payload, so we need to split what we were going to send above. - if ( rowBitStructBuffSize > DMA_MAX ) - { - #if SERIAL_DEBUG - Serial.printf_P(PSTR("Splitting DMA payload for %d color depths into %d byte payloads.\r\n"), PIXEL_COLOR_DEPTH_BITS-1, rowBitStructBuffSize/PIXEL_COLOR_DEPTH_BITS ); - #endif - - for (int cd = 1; cd < PIXEL_COLOR_DEPTH_BITS; cd++) - { - // first set of data is LSB through MSB, single pass - all color bits are displayed once, which takes care of everything below and including LSBMSB_TRANSITION_BIT - // TODO: size must be less than DMA_MAX - worst case for library: 16-bpp with 256 pixels per row would exceed this, need to break into two - link_dma_desc(&dmadesc_a[current_dmadescriptor_offset], previous_dmadesc_a, dma_buff.rowBits[row]->getDataPtr(cd, 0), dma_buff.rowBits[row]->size(num_dma_payload_color_depths) ); - previous_dmadesc_a = &dmadesc_a[current_dmadescriptor_offset]; - - if (m_cfg.double_buff) { - link_dma_desc(&dmadesc_b[current_dmadescriptor_offset], previous_dmadesc_b, dma_buff.rowBits[row]->getDataPtr(cd, 1), dma_buff.rowBits[row]->size(num_dma_payload_color_depths)); - previous_dmadesc_b = &dmadesc_b[current_dmadescriptor_offset]; } - - current_dmadescriptor_offset++; - - } // additional linked list items - } // row depth struct - - - for(int i=lsbMsbTransitionBit + 1; igetDataPtr(i, 0), dma_buff.rowBits[row]->size(PIXEL_COLOR_DEPTH_BITS - i) ); - previous_dmadesc_a = &dmadesc_a[current_dmadescriptor_offset]; - - if (m_cfg.double_buff) { - link_dma_desc(&dmadesc_b[current_dmadescriptor_offset], previous_dmadesc_b, dma_buff.rowBits[row]->getDataPtr(i, 1), dma_buff.rowBits[row]->size(PIXEL_COLOR_DEPTH_BITS - i) ); - previous_dmadesc_b = &dmadesc_b[current_dmadescriptor_offset]; - } - - current_dmadescriptor_offset++; - - } // end color depth ^ 2 linked list - } // end color depth loop - - } // end frame rows - - #if SERIAL_DEBUG - Serial.printf_P(PSTR("configureDMA(): Configured LL structure. %d DMA Linked List descriptors populated.\r\n"), current_dmadescriptor_offset); - - if ( desccount != current_dmadescriptor_offset) - { - Serial.printf_P(PSTR("configureDMA(): ERROR! Expected descriptor count of %d != actual DMA descriptors of %d!\r\n"), desccount, current_dmadescriptor_offset); - } - #endif - - //End markers for DMA LL - dmadesc_a[desccount-1].eof = 1; - dmadesc_a[desccount-1].qe.stqe_next=(lldesc_t*)&dmadesc_a[0]; - - if (m_cfg.double_buff) { - dmadesc_b[desccount-1].eof = 1; - dmadesc_b[desccount-1].qe.stqe_next=(lldesc_t*)&dmadesc_b[0]; - } else { - dmadesc_b = dmadesc_a; // link to same 'a' buffer - } - -#if SERIAL_DEBUG - Serial.println(F("Performing I2S setup:")); -#endif - - i2s_parallel_config_t dma_cfg = { - .gpio_bus={_cfg.gpio.r1, _cfg.gpio.g1, _cfg.gpio.b1, _cfg.gpio.r2, _cfg.gpio.g2, _cfg.gpio.b2, _cfg.gpio.lat, _cfg.gpio.oe, _cfg.gpio.a, _cfg.gpio.b, _cfg.gpio.c, _cfg.gpio.d, _cfg.gpio.e, -1, -1, -1}, - .gpio_clk=_cfg.gpio.clk, - .sample_rate=_cfg.i2sspeed, - .sample_width=ESP32_I2S_DMA_MODE, - .desccount_a=desccount, - .lldesc_a=dmadesc_a, - .desccount_b=desccount, - .lldesc_b=dmadesc_b, - .clkphase=_cfg.clkphase, - .int_ena_out_eof=_cfg.double_buff - }; - - // Setup I2S - i2s_parallel_driver_install(ESP32_I2S_DEVICE, &dma_cfg); - i2s_parallel_send_dma(ESP32_I2S_DEVICE, &dmadesc_a[0]); - - #if SERIAL_DEBUG - Serial.println(F("configureDMA(): DMA setup completed on ESP32_I2S_DEVICE.")); - #endif - -} // end initMatrixDMABuff - - -/* There are 'bits' set in the frameStruct that we simply don't need to set every single time we change a pixel / DMA buffer co-ordinate. - * For example, the bits that determine the address lines, we don't need to set these every time. Once they're in place, and assuming we - * don't accidentally clear them, then we don't need to set them again. - * So to save processing, we strip this logic out to the absolute bare minimum, which is toggling only the R,G,B pixels (bits) per co-ord. - * - * Critical dependency: That 'updateMatrixDMABuffer(uint8_t red, uint8_t green, uint8_t blue)' has been run at least once over the - * entire frameBuffer to ensure all the non R,G,B bitmasks are in place (i.e. like OE, Address Lines etc.) - * - * Note: If you change the brightness with setBrightness() you MUST then clearScreen() and repaint / flush the entire framebuffer. - */ - -/** @brief - Update pixel at specific co-ordinate in the DMA buffer - * this is the main method used to update DMA buffer on pixel-by-pixel level so it must be fast, real fast! - * Let's put it into IRAM to avoid situations when it could be flushed out of instruction cache - * and had to be read from spi-flash over and over again. - * Yes, it is always a tradeoff between memory/speed/size, but compared to DMA-buffer size is not a big deal - */ -void IRAM_ATTR MatrixPanel_I2S_DMA::updateMatrixDMABuffer(int16_t x_coord, int16_t y_coord, uint8_t red, uint8_t green, uint8_t blue) -{ - if ( !initialized ) { - #if SERIAL_DEBUG - Serial.println(F("Cannot updateMatrixDMABuffer as setup failed!")); - #endif - return; - } - - /* 1) Check that the co-ordinates are within range, or it'll break everything big time. - * Valid co-ordinates are from 0 to (MATRIX_XXXX-1) - */ - if ( x_coord < 0 || y_coord < 0 || x_coord >= PIXELS_PER_ROW || y_coord >= m_cfg.mx_height) { - return; - } - - /* LED Brightness Compensation. Because if we do a basic "red & mask" for example, - * we'll NEVER send the dimmest possible colour, due to binary skew. - * i.e. It's almost impossible for color_depth_idx of 0 to be sent out to the MATRIX unless the 'value' of a color is exactly '1' - * https://ledshield.wordpress.com/2012/11/13/led-brightness-to-your-eye-gamma-correction-no/ - */ -#ifndef NO_CIE1931 - red = lumConvTab[red]; - green = lumConvTab[green]; - blue = lumConvTab[blue]; -#endif - - /* When using the drawPixel, we are obviously only changing the value of one x,y position, - * however, the two-scan panels paint TWO lines at the same time - * and this reflects the parallel in-DMA-memory data structure of uint16_t's that are getting - * pumped out at high speed. - * - * So we need to ensure we persist the bits (8 of them) of the uint16_t for the row we aren't changing. - * - * The DMA buffer order has also been reversed (refer to the last code in this function) - * so we have to check for this and check the correct position of the MATRIX_DATA_STORAGE_TYPE - * data. - */ - -#ifndef ESP32_SXXX - // We need to update the correct uint16_t in the rowBitStruct array, that gets sent out in parallel - // 16 bit parallel mode - Save the calculated value to the bitplane memory in reverse order to account for I2S Tx FIFO mode1 ordering - // Irrelevant for ESP32-S2 the way the FIFO ordering works is different - refer to page 679 of S2 technical reference manual - x_coord & 1U ? --x_coord : ++x_coord; -#endif - - - uint16_t _colorbitclear = BITMASK_RGB1_CLEAR, _colorbitoffset = 0; - - if (y_coord >= ROWS_PER_FRAME){ // if we are drawing to the bottom part of the panel - _colorbitoffset = BITS_RGB2_OFFSET; - _colorbitclear = BITMASK_RGB2_CLEAR; - y_coord -= ROWS_PER_FRAME; - } - - // Iterating through colour depth bits, which we assume are 8 bits per RGB subpixel (24bpp) - uint8_t color_depth_idx = PIXEL_COLOR_DEPTH_BITS; - do { - --color_depth_idx; -// uint8_t mask = (1 << (color_depth_idx COLOR_DEPTH_LESS_THAN_8BIT_ADJUST)); // expect 24 bit color (8 bits per RGB subpixel) - #if PIXEL_COLOR_DEPTH_BITS < 8 - uint8_t mask = (1 << (color_depth_idx+MASK_OFFSET)); // expect 24 bit color (8 bits per RGB subpixel) - #else - uint8_t mask = (1 << (color_depth_idx)); // expect 24 bit color (8 bits per RGB subpixel) - #endif - uint16_t RGB_output_bits = 0; - - /* Per the .h file, the order of the output RGB bits is: - * BIT_B2, BIT_G2, BIT_R2, BIT_B1, BIT_G1, BIT_R1 */ - RGB_output_bits |= (bool)(blue & mask); // --B - RGB_output_bits <<= 1; - RGB_output_bits |= (bool)(green & mask); // -BG - RGB_output_bits <<= 1; - RGB_output_bits |= (bool)(red & mask); // BGR - RGB_output_bits <<= _colorbitoffset; // shift color bits to the required position - - - // Get the contents at this address, - // it would represent a vector pointing to the full row of pixels for the specified color depth bit at Y coordinate - ESP32_I2S_DMA_STORAGE_TYPE *p = getRowDataPtr(y_coord, color_depth_idx, back_buffer_id); - - - // We need to update the correct uint16_t word in the rowBitStruct array pointing to a specific pixel at X - coordinate - p[x_coord] &= _colorbitclear; // reset RGB bits - p[x_coord] |= RGB_output_bits; // set new RGB bits - - } while(color_depth_idx); // end of color depth loop (8) -} // updateMatrixDMABuffer (specific co-ords change) - - -/* Update the entire buffer with a single specific colour - quicker */ -void MatrixPanel_I2S_DMA::updateMatrixDMABuffer(uint8_t red, uint8_t green, uint8_t blue) -{ - if ( !initialized ) return; - - /* https://ledshield.wordpress.com/2012/11/13/led-brightness-to-your-eye-gamma-correction-no/ */ -#ifndef NO_CIE1931 - red = lumConvTab[red]; - green = lumConvTab[green]; - blue = lumConvTab[blue]; -#endif - - for(uint8_t color_depth_idx=0; color_depth_idxwidth; - do { - --x_coord; - p[x_coord] &= BITMASK_RGB12_CLEAR; // reset color bits - p[x_coord] |= RGB_output_bits; // set new color bits - } while(x_coord); - - } while(matrix_frame_parallel_row); // end row iteration - } // colour depth loop (8) -} // updateMatrixDMABuffer (full frame paint) - -/** - * @brief - clears and reinitializes color/control data in DMA buffs - * When allocated, DMA buffs might be dirty, so we need to blank it and initialize ABCDE,LAT,OE control bits. - * Those control bits are constants during the entire DMA sweep and never changed when updating just pixel color data - * so we could set it once on DMA buffs initialization and forget. - * This effectively clears buffers to blank BLACK and makes it ready to display output. - * (Brightness control via OE bit manipulation is another case) - */ -void MatrixPanel_I2S_DMA::clearFrameBuffer(bool _buff_id){ - if (!initialized) - return; - - // we start with iterating all rows in dma_buff structure - int row_idx = dma_buff.rowBits.size(); - do { - --row_idx; - - ESP32_I2S_DMA_STORAGE_TYPE* row = dma_buff.rowBits[row_idx]->getDataPtr(0, _buff_id); // set pointer to the HEAD of a buffer holding data for the entire matrix row - - ESP32_I2S_DMA_STORAGE_TYPE abcde = (ESP32_I2S_DMA_STORAGE_TYPE)row_idx; - abcde <<= BITS_ADDR_OFFSET; // shift row y-coord to match ABCDE bits in vector from 8 to 12 - - // get last pixel index in a row of all colordepths - int x_pixel = dma_buff.rowBits[row_idx]->width * dma_buff.rowBits[row_idx]->color_depth; - //Serial.printf(" from pixel %d, ", x_pixel); - - // fill all x_pixels except color_index[0] (LSB) ones, this also clears all color data to 0's black - do { - --x_pixel; - - if ( m_cfg.driver == HUB75_I2S_CFG::SM5266P) { - // modifications here for row shift register type SM5266P - // https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/164 - row[x_pixel] = abcde & (0x18 << BITS_ADDR_OFFSET); // mask out the bottom 3 bits which are the clk di bk inputs - } else { - row[x_pixel] = abcde; - } - - } while(x_pixel!=dma_buff.rowBits[row_idx]->width); - - // color_index[0] (LSB) x_pixels must be "marked" with a previous's row address, 'cause it is used to display - // previous row while we pump in LSB's for a new row - abcde = ((ESP32_I2S_DMA_STORAGE_TYPE)row_idx-1) << BITS_ADDR_OFFSET; - do { - --x_pixel; - - if ( m_cfg.driver == HUB75_I2S_CFG::SM5266P) { - // modifications here for row shift register type SM5266P - // https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/164 - row[x_pixel] = abcde & (0x18 << BITS_ADDR_OFFSET); // mask out the bottom 3 bits which are the clk di bk inputs - } else { - row[x_pixel] = abcde; - } - //row[x_pixel] = abcde; - } while(x_pixel); - - - // modifications here for row shift register type SM5266P - // https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/164 - if ( m_cfg.driver == HUB75_I2S_CFG::SM5266P) { - uint16_t serialCount; - uint16_t latch; - x_pixel = dma_buff.rowBits[row_idx]->width - 16; // come back 8*2 pixels to allow for 8 writes - serialCount = 8; - do{ - serialCount--; - latch = row[x_pixel] | (((((ESP32_I2S_DMA_STORAGE_TYPE)row_idx) % 8) == serialCount) << 1) << BITS_ADDR_OFFSET; // data on 'B' - row[x_pixel++] = latch| (0x05<< BITS_ADDR_OFFSET); // clock high on 'A'and BK high for update - row[x_pixel++] = latch| (0x04<< BITS_ADDR_OFFSET); // clock low on 'A'and BK high for update - } while (serialCount); - } // end SM5266P - - - // let's set LAT/OE control bits for specific pixels in each color_index subrows - // Need to consider the original ESP32's (WROOM) DMA TX FIFO reordering of bytes... - uint8_t coloridx = dma_buff.rowBits[row_idx]->color_depth; - do { - --coloridx; - - // switch pointer to a row for a specific color index - row = dma_buff.rowBits[row_idx]->getDataPtr(coloridx, _buff_id); - - #ifdef ESP32_SXXX - // -1 works better on ESP32-S2 ? Because bytes get sent out in order... - row[dma_buff.rowBits[row_idx]->width - 1] |= BIT_LAT; // -1 pixel to compensate array index starting at 0 - #else - // We need to update the correct uint16_t in the rowBitStruct array, that gets sent out in parallel - // 16 bit parallel mode - Save the calculated value to the bitplane memory in reverse order to account for I2S Tx FIFO mode1 ordering - // Irrelevant for ESP32-S2 the way the FIFO ordering works is different - refer to page 679 of S2 technical reference manual - row[dma_buff.rowBits[row_idx]->width - 2] |= BIT_LAT; // -2 in the DMA array is actually -1 when it's reordered by TX FIFO - #endif - - // need to disable OE before/after latch to hide row transition - // Should be one clock or more before latch, otherwise can get ghosting - uint8_t _blank = m_cfg.latch_blanking; - do { - --_blank; - - #ifdef ESP32_SXXX - row[0 + _blank] |= BIT_OE; - row[dma_buff.rowBits[row_idx]->width - _blank - 1 ] |= BIT_OE; // (LAT pulse is (width-2) -1 pixel to compensate array index starting at 0 - #else - - // Original ESP32 WROOM FIFO Ordering Sucks - uint8_t _blank_row_tx_fifo_tmp = 0 + _blank; - (_blank_row_tx_fifo_tmp & 1U) ? --_blank_row_tx_fifo_tmp : ++_blank_row_tx_fifo_tmp; - row[_blank_row_tx_fifo_tmp] |= BIT_OE; - - _blank_row_tx_fifo_tmp = dma_buff.rowBits[row_idx]->width - _blank - 1; // (LAT pulse is (width-2) -1 pixel to compensate array index starting at 0 - (_blank_row_tx_fifo_tmp & 1U) ? --_blank_row_tx_fifo_tmp : ++_blank_row_tx_fifo_tmp; - row[_blank_row_tx_fifo_tmp] |= BIT_OE; - - #endif - - } while (_blank); - - } while(coloridx); - - } while(row_idx); -} - -/** - * @brief - reset OE bits in DMA buffer in a way to control brightness - * @param brt - brightness level from 0 to row_width - * @param _buff_id - buffer id to control - */ -void MatrixPanel_I2S_DMA::brtCtrlOE(int brt, const bool _buff_id){ - if (!initialized) - return; - - if (brt > PIXELS_PER_ROW - (MAX_LAT_BLANKING + 2)) // can't control values larger than (row_width - latch_blanking) to avoid ongoing issues being raised about brightness and ghosting. - brt = PIXELS_PER_ROW - (MAX_LAT_BLANKING + 2); // +2 for a bit of buffer... - - if (brt < 0) - brt = 0; - - // start with iterating all rows in dma_buff structure - int row_idx = dma_buff.rowBits.size(); - do { - --row_idx; - - // let's set OE control bits for specific pixels in each color_index subrows - uint8_t coloridx = dma_buff.rowBits[row_idx]->color_depth; - do { - --coloridx; - - // switch pointer to a row for a specific color index - ESP32_I2S_DMA_STORAGE_TYPE* row = dma_buff.rowBits[row_idx]->getDataPtr(coloridx, _buff_id); - - int x_coord = dma_buff.rowBits[row_idx]->width; - do { - --x_coord; - - // clear OE bit for all other pixels - row[x_coord] &= BITMASK_OE_CLEAR; - - // Brightness control via OE toggle - disable matrix output at specified x_coord - if((coloridx > lsbMsbTransitionBit || !coloridx) && ((x_coord) >= brt)){ - row[x_coord] |= BIT_OE; // Disable output after this point. - continue; - } - // special case for the bits *after* LSB through (lsbMsbTransitionBit) - OE is output after data is shifted, so need to set OE to fractional brightness - if(coloridx && coloridx <= lsbMsbTransitionBit) { - // divide brightness in half for each bit below lsbMsbTransitionBit - int lsbBrightness = brt >> (lsbMsbTransitionBit - coloridx + 1); - if((x_coord) >= lsbBrightness) { - row[x_coord] |= BIT_OE; // Disable output after this point. - continue; - } - } - - - } while(x_coord); - - // need to disable OE before/after latch to hide row transition - // Should be one clock or more before latch, otherwise can get ghosting - uint8_t _blank = m_cfg.latch_blanking; - do { - --_blank; - - #ifdef ESP32_SXXX - row[0 + _blank] |= BIT_OE; - #else - // Original ESP32 WROOM FIFO Ordering Sucks - uint8_t _blank_row_tx_fifo_tmp = 0 + _blank; - (_blank_row_tx_fifo_tmp & 1U) ? --_blank_row_tx_fifo_tmp : ++_blank_row_tx_fifo_tmp; - row[_blank_row_tx_fifo_tmp] |= BIT_OE; - #endif - - //row[0 + _blank] |= BIT_OE; - // no need, has been done already - //row[dma_buff.rowBits[row_idx]->width - _blank - 3 ] |= BIT_OE; // (LAT pulse is (width-2) -1 pixel to compensate array index starting at 0 - } while (_blank); - - } while(coloridx); - } while(row_idx); -} - - -/* - * overload for compatibility - */ - -bool MatrixPanel_I2S_DMA::begin(int r1, int g1, int b1, int r2, int g2, int b2, int a, int b, int c, int d, int e, int lat, int oe, int clk) { - - // RGB - m_cfg.gpio.r1 = r1; m_cfg.gpio.g1 = g1; m_cfg.gpio.b1 = b1; - m_cfg.gpio.r2 = r2; m_cfg.gpio.g2 = g2; m_cfg.gpio.b2 = b2; - - // Line Select - m_cfg.gpio.a = a; m_cfg.gpio.b = b; m_cfg.gpio.c = c; - m_cfg.gpio.d = d; m_cfg.gpio.e = e; - - // Clock & Control - m_cfg.gpio.lat = lat; m_cfg.gpio.oe = oe; m_cfg.gpio.clk = clk; - - return begin(); -} - - -/** - * @brief - Sets how many clock cycles to blank OE before/after LAT signal change - * @param uint8_t pulses - clocks before/after OE - * default is DEFAULT_LAT_BLANKING - * Max is MAX_LAT_BLANKING - * @returns - new value for m_cfg.latch_blanking - */ -uint8_t MatrixPanel_I2S_DMA::setLatBlanking(uint8_t pulses){ - if (pulses > MAX_LAT_BLANKING) - pulses = MAX_LAT_BLANKING; - - if (!pulses) - pulses = DEFAULT_LAT_BLANKING; - - m_cfg.latch_blanking = pulses; - setPanelBrightness(brightness); // set brightness to reset OE bits to the values matching new LAT blanking setting - return m_cfg.latch_blanking; -} - - -#ifndef NO_FAST_FUNCTIONS -/** - * @brief - update DMA buff drawing horizontal line at specified coordinates - * @param x_ccord - line start coordinate x - * @param y_ccord - line start coordinate y - * @param l - line length - * @param r,g,b, - RGB888 color - */ -void MatrixPanel_I2S_DMA::hlineDMA(int16_t x_coord, int16_t y_coord, int16_t l, uint8_t red, uint8_t green, uint8_t blue){ - if ( !initialized ) - return; - - if ( x_coord < 0 || y_coord < 0 || l < 1 || x_coord >= PIXELS_PER_ROW || y_coord >= m_cfg.mx_height) - return; - - - l = ( (x_coord + l) >= PIXELS_PER_ROW ) ? (PIXELS_PER_ROW - x_coord):l; - - //if (x_coord+l > PIXELS_PER_ROW) -// l = PIXELS_PER_ROW - x_coord + 1; // reset width to end of row - - /* LED Brightness Compensation */ -#ifndef NO_CIE1931 - red = lumConvTab[red]; - green = lumConvTab[green]; - blue = lumConvTab[blue]; -#endif - - uint16_t _colorbitclear = BITMASK_RGB1_CLEAR, _colorbitoffset = 0; - - if (y_coord >= ROWS_PER_FRAME){ // if we are drawing to the bottom part of the panel - _colorbitoffset = BITS_RGB2_OFFSET; - _colorbitclear = BITMASK_RGB2_CLEAR; - y_coord -= ROWS_PER_FRAME; - } - - // Iterating through color depth bits (8 iterations) - uint8_t color_depth_idx = PIXEL_COLOR_DEPTH_BITS; - do { - --color_depth_idx; - - // let's precalculate RGB1 and RGB2 bits than flood it over the entire DMA buffer - uint16_t RGB_output_bits = 0; -// uint8_t mask = (1 << color_depth_idx COLOR_DEPTH_LESS_THAN_8BIT_ADJUST); - #if PIXEL_COLOR_DEPTH_BITS < 8 - uint8_t mask = (1 << (color_depth_idx+MASK_OFFSET)); // expect 24 bit color (8 bits per RGB subpixel) - #else - uint8_t mask = (1 << (color_depth_idx)); // expect 24 bit color (8 bits per RGB subpixel) - #endif - - /* Per the .h file, the order of the output RGB bits is: - * BIT_B2, BIT_G2, BIT_R2, BIT_B1, BIT_G1, BIT_R1 */ - RGB_output_bits |= (bool)(blue & mask); // --B - RGB_output_bits <<= 1; - RGB_output_bits |= (bool)(green & mask); // -BG - RGB_output_bits <<= 1; - RGB_output_bits |= (bool)(red & mask); // BGR - RGB_output_bits <<= _colorbitoffset; // shift color bits to the required position - - // Get the contents at this address, - // it would represent a vector pointing to the full row of pixels for the specified color depth bit at Y coordinate - ESP32_I2S_DMA_STORAGE_TYPE *p = dma_buff.rowBits[y_coord]->getDataPtr(color_depth_idx, back_buffer_id); - // inlined version works slower here, dunno why :( - // ESP32_I2S_DMA_STORAGE_TYPE *p = getRowDataPtr(y_coord, color_depth_idx, back_buffer_id); - - int16_t _l = l; - do { // iterate pixels in a row - int16_t _x = x_coord + --_l; - -#ifdef ESP32_SXXX - // ESP 32 doesn't need byte flipping for TX FIFO. - uint16_t &v = p[_x]; -#else - // Save the calculated value to the bitplane memory in reverse order to account for I2S Tx FIFO mode1 ordering - uint16_t &v = p[_x & 1U ? --_x : ++_x]; -#endif - - v &= _colorbitclear; // reset color bits - v |= RGB_output_bits; // set new color bits - } while(_l); // iterate pixels in a row - } while(color_depth_idx); // end of color depth loop (8) -} // hlineDMA() - - -/** - * @brief - update DMA buff drawing vertical line at specified coordinates - * @param x_ccord - line start coordinate x - * @param y_ccord - line start coordinate y - * @param l - line length - * @param r,g,b, - RGB888 color - */ -void MatrixPanel_I2S_DMA::vlineDMA(int16_t x_coord, int16_t y_coord, int16_t l, uint8_t red, uint8_t green, uint8_t blue){ - if ( !initialized ) - return; - - if ( x_coord < 0 || y_coord < 0 || l < 1 || x_coord >= PIXELS_PER_ROW || y_coord >= m_cfg.mx_height) - return; - - // check for a length that goes beyond the height of the screen! Array out of bounds dma memory changes = screwed output #163 - l = ( (y_coord + l) >= m_cfg.mx_height ) ? (m_cfg.mx_height - y_coord):l; - //if (y_coord + l > m_cfg.mx_height) - /// l = m_cfg.mx_height - y_coord + 1; // reset width to end of col - - /* LED Brightness Compensation */ -#ifndef NO_CIE1931 - red = lumConvTab[red]; - green = lumConvTab[green]; - blue = lumConvTab[blue]; -#endif - -#ifndef ESP32_SXXX - // Save the calculated value to the bitplane memory in reverse order to account for I2S Tx FIFO mode1 ordering - x_coord & 1U ? --x_coord : ++x_coord; -#endif - - uint8_t color_depth_idx = PIXEL_COLOR_DEPTH_BITS; - do { // Iterating through color depth bits (8 iterations) - --color_depth_idx; - - // let's precalculate RGB1 and RGB2 bits than flood it over the entire DMA buffer -// uint8_t mask = (1 << color_depth_idx COLOR_DEPTH_LESS_THAN_8BIT_ADJUST); - #if PIXEL_COLOR_DEPTH_BITS < 8 - uint8_t mask = (1 << (color_depth_idx+MASK_OFFSET)); // expect 24 bit color (8 bits per RGB subpixel) - #else - uint8_t mask = (1 << (color_depth_idx)); // expect 24 bit color (8 bits per RGB subpixel) - #endif - uint16_t RGB_output_bits = 0; - - /* Per the .h file, the order of the output RGB bits is: - * BIT_B2, BIT_G2, BIT_R2, BIT_B1, BIT_G1, BIT_R1 */ - RGB_output_bits |= (bool)(blue & mask); // --B - RGB_output_bits <<= 1; - RGB_output_bits |= (bool)(green & mask); // -BG - RGB_output_bits <<= 1; - RGB_output_bits |= (bool)(red & mask); // BGR - - int16_t _l = 0, _y = y_coord; - uint16_t _colorbitclear = BITMASK_RGB1_CLEAR; - do { // iterate pixels in a column - - if (_y >= ROWS_PER_FRAME){ // if y-coord overlapped bottom-half panel - _y -= ROWS_PER_FRAME; - _colorbitclear = BITMASK_RGB2_CLEAR; - RGB_output_bits <<= BITS_RGB2_OFFSET; - } - - // Get the contents at this address, - // it would represent a vector pointing to the full row of pixels for the specified color depth bit at Y coordinate - ESP32_I2S_DMA_STORAGE_TYPE *p = getRowDataPtr(_y, color_depth_idx, back_buffer_id); - - p[x_coord] &= _colorbitclear; // reset RGB bits - p[x_coord] |= RGB_output_bits; // set new RGB bits - ++_y; - } while(++_l!=l); // iterate pixels in a col - } while(color_depth_idx); // end of color depth loop (8) -} // vlineDMA() - - -/** - * @brief - update DMA buff drawing a rectangular at specified coordinates - * this works much faster than multiple consecutive per-pixel calls to updateMatrixDMABuffer() - * @param int16_t x, int16_t y - coordinates of a top-left corner - * @param int16_t w, int16_t h - width and height of a rectangular, min is 1 px - * @param uint8_t r - RGB888 color - * @param uint8_t g - RGB888 color - * @param uint8_t b - RGB888 color - */ -void MatrixPanel_I2S_DMA::fillRectDMA(int16_t x, int16_t y, int16_t w, int16_t h, uint8_t r, uint8_t g, uint8_t b){ - - // h-lines are >2 times faster than v-lines - // so will use it only for tall rects with h >2w - if (h>2*w){ - // draw using v-lines - do { - --w; - vlineDMA(x+w, y, h, r,g,b); - } while(w); - } else { - // draw using h-lines - do { - --h; - hlineDMA(x, y+h, w, r,g,b); - } while(h); - } -} - -#endif // NO_FAST_FUNCTIONS diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-I2S-DMA.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-I2S-DMA.h deleted file mode 100644 index d9b029a..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-I2S-DMA.h +++ /dev/null @@ -1,820 +0,0 @@ -#ifndef _ESP32_RGB_64_32_MATRIX_PANEL_I2S_DMA -#define _ESP32_RGB_64_32_MATRIX_PANEL_I2S_DMA -/***************************************************************************************/ -/* Core ESP32 hardware / idf includes! */ -#include -#include - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/semphr.h" -#include "freertos/queue.h" - -#include "esp_heap_caps.h" -#include "esp32_i2s_parallel_dma.h" - -#ifdef USE_GFX_ROOT - #include - #include "GFX.h" // Adafruit GFX core class -> https://github.com/mrfaptastic/GFX_Root -#elif !defined NO_GFX - #include "Adafruit_GFX.h" // Adafruit class with all the other stuff -#endif - -/******************************************************************************************* - * COMPILE-TIME OPTIONS - MUST BE PROVIDED as part of PlatformIO project build_flags. * - * Changing the values just here won't work - as defines needs to persist beyond the scope * - * of just this file. * - *******************************************************************************************/ -/* Enable serial debugging of the library, to see how memory is allocated etc. */ -//#define SERIAL_DEBUG 1 - -/* Do NOT build additional methods optimized for fast drawing, - * i.e. Adafruits drawFastHLine, drawFastVLine, etc... */ -//#define NO_FAST_FUNCTIONS - -/* Use GFX_Root (https://github.com/mrfaptastic/GFX_Root) instead of Adafruit_GFX library. - * > Removes Bus_IO & Wire.h library dependencies. - * > Provides 24bpp (CRGB) colour support for Adafruit_GFX functions like drawCircle etc. - * > Requires FastLED.h - */ -//#define USE_GFX_ROOT 1 - -/* Physical / Chained HUB75(s) RGB pixel WIDTH and HEIGHT. - * - * This library has been tested with a 64x32 and 64x64 RGB panels. - * If you want to chain two or more of these horizontally to make a 128x32 panel - * you can do so with the cable and then set the CHAIN_LENGTH to '2'. - * - * Also, if you use a 64x64 panel, then set the MATRIX_HEIGHT to '64' and an E_PIN; it will work! - * - * All of this is memory permitting of course (dependant on your sketch etc.) ... - * - */ -#ifndef MATRIX_WIDTH - #define MATRIX_WIDTH 64 // Single panel of 64 pixel width -#endif - -#ifndef MATRIX_HEIGHT - #define MATRIX_HEIGHT 32 // CHANGE THIS VALUE to 64 IF USING 64px HIGH panel(s) with E PIN -#endif - -#ifndef CHAIN_LENGTH - #define CHAIN_LENGTH 1 // Number of modules chained together, i.e. 4 panels chained result in virtualmatrix 64x4=256 px long -#endif - -/* ESP32 Default Pin definition. You can change this, but best if you keep it as is and provide custom pin mappings - * as part of the begin(...) function. - */ -// Default pin mapping for ESP32-S2 and ESP32-S3 -#ifdef ESP32_SXXX - - #define R1_PIN_DEFAULT 45 - #define G1_PIN_DEFAULT 42 - #define B1_PIN_DEFAULT 41 - #define R2_PIN_DEFAULT 40 - #define G2_PIN_DEFAULT 39 - #define B2_PIN_DEFAULT 38 - #define A_PIN_DEFAULT 37 - #define B_PIN_DEFAULT 36 - #define C_PIN_DEFAULT 35 - #define D_PIN_DEFAULT 34 - #define E_PIN_DEFAULT -1 // required for 1/32 scan panels, like 64x64. Any available pin would do, i.e. IO32 - #define LAT_PIN_DEFAULT 26 - #define OE_PIN_DEFAULT 21 - #define CLK_PIN_DEFAULT 33 - -// Else use default pin mapping for ESP32 Original WROOM module. -#else - - #define R1_PIN_DEFAULT 25 - #define G1_PIN_DEFAULT 26 - #define B1_PIN_DEFAULT 27 - #define R2_PIN_DEFAULT 14 - #define G2_PIN_DEFAULT 12 - #define B2_PIN_DEFAULT 13 - - #define A_PIN_DEFAULT 23 - #define B_PIN_DEFAULT 19 - #define C_PIN_DEFAULT 5 - #define D_PIN_DEFAULT 17 - #define E_PIN_DEFAULT -1 // IMPORTANT: Change to a valid pin if using a 64x64px panel. - - #define LAT_PIN_DEFAULT 4 - #define OE_PIN_DEFAULT 15 - #define CLK_PIN_DEFAULT 16 - -#endif - -// Interesting Fact: We end up using a uint16_t to send data in parallel to the HUB75... but -// given we only map to 14 physical output wires/bits, we waste 2 bits. - -/***************************************************************************************/ -/* Do not change definitions below unless you pretty sure you know what you are doing! */ - -// RGB Panel Constants / Calculated Values -#ifndef MATRIX_ROWS_IN_PARALLEL - #define MATRIX_ROWS_IN_PARALLEL 2 -#endif - -// 8bit per RGB color = 24 bit/per pixel, -// might be reduced to save DMA RAM -#ifndef PIXEL_COLOR_DEPTH_BITS - #define PIXEL_COLOR_DEPTH_BITS 8 -#endif - -#define COLOR_CHANNELS_PER_PIXEL 3 - -// #define NO_CIE1931 - - -/***************************************************************************************/ -/* Definitions below should NOT be ever changed without rewriting library logic */ -#define ESP32_I2S_DMA_MODE I2S_PARALLEL_WIDTH_16 // From esp32_i2s_parallel_v2.h = 16 bits in parallel -#define ESP32_I2S_DMA_STORAGE_TYPE uint16_t // DMA output of one uint16_t at a time. -#define CLKS_DURING_LATCH 0 // Not (yet) used. - -// Panel Upper half RGB (numbering according to order in DMA gpio_bus configuration) -#define BITS_RGB1_OFFSET 0 // Start point of RGB_X1 bits -#define BIT_R1 (1<<0) -#define BIT_G1 (1<<1) -#define BIT_B1 (1<<2) - -// Panel Lower half RGB -#define BITS_RGB2_OFFSET 3 // Start point of RGB_X2 bits -#define BIT_R2 (1<<3) -#define BIT_G2 (1<<4) -#define BIT_B2 (1<<5) - -// Panel Control Signals -#define BIT_LAT (1<<6) -#define BIT_OE (1<<7) - -// Panel GPIO Pin Addresses (A, B, C, D etc..) -#define BITS_ADDR_OFFSET 8 // Start point of address bits -#define BIT_A (1<<8) -#define BIT_B (1<<9) -#define BIT_C (1<<10) -#define BIT_D (1<<11) -#define BIT_E (1<<12) - -// BitMasks are pre-computed based on the above #define's for performance. -#define BITMASK_RGB1_CLEAR (0b1111111111111000) // inverted bitmask for R1G1B1 bit in pixel vector -#define BITMASK_RGB2_CLEAR (0b1111111111000111) // inverted bitmask for R2G2B2 bit in pixel vector -#define BITMASK_RGB12_CLEAR (0b1111111111000000) // inverted bitmask for R1G1B1R2G2B2 bit in pixel vector -#define BITMASK_CTRL_CLEAR (0b1110000000111111) // inverted bitmask for control bits ABCDE,LAT,OE in pixel vector -#define BITMASK_OE_CLEAR (0b1111111101111111) // inverted bitmask for control bit OE in pixel vector - -// How many clock cycles to blank OE before/after LAT signal change, default is 1 clock -#define DEFAULT_LAT_BLANKING 1 -// Max clock cycles to blank OE before/after LAT signal change -#define MAX_LAT_BLANKING 4 - -/***************************************************************************************/ -// Check compile-time only options -#if PIXEL_COLOR_DEPTH_BITS > 8 - #error "Pixel color depth bits cannot be greater than 8." -#elif PIXEL_COLOR_DEPTH_BITS < 2 - #error "Pixel color depth bits cannot be less than 2." -#endif - -/* This library is designed to take an 8 bit / 1 byte value (0-255) for each R G B colour sub-pixel. - * The PIXEL_COLOR_DEPTH_BITS should always be '8' as a result. - * However, if the library is to be used with lower colour depth (i.e. 6 bit colour), then we need to ensure the 8-bit value passed to the colour masking - * is adjusted accordingly to ensure the LSB's are shifted left to MSB, by the difference. Otherwise the colours will be all screwed up. - */ -#if PIXEL_COLOR_DEPTH_BITS != 8 -static constexpr uint8_t const MASK_OFFSET = 8-PIXEL_COLOR_DEPTH_BITS; -#endif - -/***************************************************************************************/ - -/** @brief - Structure holds raw DMA data to drive TWO full rows of pixels spanning through all chained modules - * Note: sizeof(data) must be multiple of 32 bits, as ESP32 DMA linked list buffer address pointer must be word-aligned - */ -struct rowBitStruct { - const size_t width; - const uint8_t color_depth; - const bool double_buff; - ESP32_I2S_DMA_STORAGE_TYPE *data; - - /** @brief - returns size of row of data vectorfor a SINGLE buff - * size (in bytes) of a vector holding full DMA data for a row of pixels with _dpth color bits - * a SINGLE buffer only size is accounted, when using double buffers it actually takes twice as much space - * but returned size is for a half of double-buffer - * - * default - returns full data vector size for a SINGLE buff - * - */ - size_t size(uint8_t _dpth=0 ) { if (!_dpth) _dpth = color_depth; return width * _dpth * sizeof(ESP32_I2S_DMA_STORAGE_TYPE); }; - - /** @brief - returns pointer to the row's data vector beginning at pixel[0] for _dpth color bit - * default - returns pointer to the data vector's head - * NOTE: this call might be very slow in loops. Due to poor instruction caching in esp32 it might be required a reread from flash - * every loop cycle, better use inlined #define instead in such cases - */ - ESP32_I2S_DMA_STORAGE_TYPE* getDataPtr(const uint8_t _dpth=0, const bool buff_id=0) { return &(data[_dpth*width + buff_id*(width*color_depth)]); }; - - // constructor - allocates DMA-capable memory to hold the struct data - rowBitStruct(const size_t _width, const uint8_t _depth, const bool _dbuff) : width(_width), color_depth(_depth), double_buff(_dbuff) { - data = (ESP32_I2S_DMA_STORAGE_TYPE *)heap_caps_malloc( size()+size()*double_buff, MALLOC_CAP_DMA); - } - ~rowBitStruct() { delete data;} -}; - - -/* frameStruct - * Note: A 'frameStruct' contains ALL the data for a full-frame (i.e. BOTH 2x16-row frames are - * are contained in parallel within the one uint16_t that is sent in parallel to the HUB75). - * - * This structure isn't actually allocated in one memory block anymore, as the library now allocates - * memory per row (per rowColorDepthStruct) instead. - */ -struct frameStruct { - uint8_t rows=0; // number of rows held in current frame, not used actually, just to keep the idea of struct - std::vector > rowBits; -}; - -/***************************************************************************************/ -//C/p'ed from https://ledshield.wordpress.com/2012/11/13/led-brightness-to-your-eye-gamma-correction-no/ -// Example calculator: https://gist.github.com/mathiasvr/19ce1d7b6caeab230934080ae1f1380e -// need to make sure this would end up in RAM for fastest access -#ifndef NO_CIE1931 -static const uint8_t DRAM_ATTR lumConvTab[]={ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 30, 30, 31, 31, 32, 33, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 80, 81, 82, 83, 84, 86, 87, 88, 90, 91, 92, 93, 95, 96, 98, 99, 100, 102, 103, 105, 106, 107, 109, 110, 112, 113, 115, 116, 118, 120, 121, 123, 124, 126, 128, 129, 131, 133, 134, 136, 138, 139, 141, 143, 145, 146, 148, 150, 152, 154, 156, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 192, 194, 196, 198, 200, 203, 205, 207, 209, 212, 214, 216, 218, 221, 223, 226, 228, 230, 233, 235, 238, 240, 243, 245, 248, 250, 253, 255, 255}; -#endif - -/** @brief - configuration values for HUB75_I2S driver - * This structure holds configuration vars that are used as - * an initialization values when creating an instance of MatrixPanel_I2S_DMA object. - * All params have it's default values. - */ -struct HUB75_I2S_CFG { - - /** - * Enumeration of hardware-specific chips - * used to drive matrix modules - */ - enum shift_driver {SHIFTREG=0, FM6124, FM6126A, ICN2038S, MBI5124, SM5266P}; - - /** - * I2S clock speed selector - */ - enum clk_speed {HZ_8M=8000000, HZ_10M=10000000, HZ_20M=20000000}; - - // Structure Variables - - // physical width of a single matrix panel module (in pixels, usually it is 64 ;) ) - uint16_t mx_width; - // physical height of a single matrix panel module (in pixels, usually almost always it is either 32 or 64) - uint16_t mx_height; - // number of chained panels regardless of the topology, default 1 - a single matrix module - uint16_t chain_length; - - /** - * GPIO pins mapping - */ - struct i2s_pins{ - int8_t r1, g1, b1, r2, g2, b2, a, b, c, d, e, lat, oe, clk; - } gpio; - - // Matrix driver chip type - default is a plain shift register - shift_driver driver; - // I2S clock speed - clk_speed i2sspeed; - // use DMA double buffer (twice as much RAM required) - bool double_buff; - // How many clock cycles to blank OE before/after LAT signal change, default is 1 clock - uint8_t latch_blanking; - - /** - * I2S clock phase - * 0 - data lines are clocked with negative edge - * Clk /¯\_/¯\_/ - * LAT __/¯¯¯\__ - * EO ¯¯¯¯¯¯\___ - * - * 1 - data lines are clocked with positive edge (default now as of 10 June 2021) - * https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/130 - * Clk \_/¯\_/¯\ - * LAT __/¯¯¯\__ - * EO ¯¯¯¯¯¯\__ - * - */ - bool clkphase; - - // Minimum refresh / scan rate needs to be configured on start due to LSBMSB_TRANSITION_BIT calculation in allocateDMAmemory() - uint8_t min_refresh_rate; - - // struct constructor - HUB75_I2S_CFG ( - uint16_t _w = MATRIX_WIDTH, - uint16_t _h = MATRIX_HEIGHT, - uint16_t _chain = CHAIN_LENGTH, - i2s_pins _pinmap = { - R1_PIN_DEFAULT, G1_PIN_DEFAULT, B1_PIN_DEFAULT, R2_PIN_DEFAULT, G2_PIN_DEFAULT, B2_PIN_DEFAULT, - A_PIN_DEFAULT, B_PIN_DEFAULT, C_PIN_DEFAULT, D_PIN_DEFAULT, E_PIN_DEFAULT, - LAT_PIN_DEFAULT, OE_PIN_DEFAULT, CLK_PIN_DEFAULT }, - shift_driver _drv = SHIFTREG, - bool _dbuff = false, - clk_speed _i2sspeed = HZ_10M, - uint8_t _latblk = 1, // Anything > 1 seems to cause artefacts on ICS panels - bool _clockphase = true, - uint8_t _min_refresh_rate = 85 - ) : mx_width(_w), - mx_height(_h), - chain_length(_chain), - gpio(_pinmap), - driver(_drv), i2sspeed(_i2sspeed), - double_buff(_dbuff), - latch_blanking(_latblk), - clkphase(_clockphase), - min_refresh_rate (_min_refresh_rate) {} -}; // end of structure HUB75_I2S_CFG - - - -/***************************************************************************************/ -#ifdef USE_GFX_ROOT -class MatrixPanel_I2S_DMA : public GFX { -#elif !defined NO_GFX -class MatrixPanel_I2S_DMA : public Adafruit_GFX { -#else -class MatrixPanel_I2S_DMA { -#endif - - // ------- PUBLIC ------- - public: - - /** - * MatrixPanel_I2S_DMA - * - * default predefined values are used for matrix configuration - * - */ - MatrixPanel_I2S_DMA() -#ifdef USE_GFX_ROOT - : GFX(MATRIX_WIDTH, MATRIX_HEIGHT) -#elif !defined NO_GFX - : Adafruit_GFX(MATRIX_WIDTH, MATRIX_HEIGHT) -#endif - {} - - /** - * MatrixPanel_I2S_DMA - * - * @param {HUB75_I2S_CFG} opts : structure with matrix configuration - * - */ - MatrixPanel_I2S_DMA(const HUB75_I2S_CFG& opts) : -#ifdef USE_GFX_ROOT - GFX(opts.mx_width*opts.chain_length, opts.mx_height), -#elif !defined NO_GFX - Adafruit_GFX(opts.mx_width*opts.chain_length, opts.mx_height), -#endif - m_cfg(opts) {} - - /* Propagate the DMA pin configuration, allocate DMA buffs and start data output, initially blank */ - bool begin(){ - - if (initialized) return true; // we don't do this twice or more! - - // Change 'if' to '1' to enable, 0 to not include this Serial output in compiled program - #if SERIAL_DEBUG - Serial.printf_P(PSTR("Using pin %d for the R1_PIN\n"), m_cfg.gpio.r1); - Serial.printf_P(PSTR("Using pin %d for the G1_PIN\n"), m_cfg.gpio.g1); - Serial.printf_P(PSTR("Using pin %d for the B1_PIN\n"), m_cfg.gpio.b1); - Serial.printf_P(PSTR("Using pin %d for the R2_PIN\n"), m_cfg.gpio.r2); - Serial.printf_P(PSTR("Using pin %d for the G2_PIN\n"), m_cfg.gpio.g2); - Serial.printf_P(PSTR("Using pin %d for the B2_PIN\n"), m_cfg.gpio.b2); - Serial.printf_P(PSTR("Using pin %d for the A_PIN\n"), m_cfg.gpio.a); - Serial.printf_P(PSTR("Using pin %d for the B_PIN\n"), m_cfg.gpio.b); - Serial.printf_P(PSTR("Using pin %d for the C_PIN\n"), m_cfg.gpio.c); - Serial.printf_P(PSTR("Using pin %d for the D_PIN\n"), m_cfg.gpio.d); - Serial.printf_P(PSTR("Using pin %d for the E_PIN\n"), m_cfg.gpio.e); - Serial.printf_P(PSTR("Using pin %d for the LAT_PIN\n"), m_cfg.gpio.lat); - Serial.printf_P(PSTR("Using pin %d for the OE_PIN\n"), m_cfg.gpio.oe); - Serial.printf_P(PSTR("Using pin %d for the CLK_PIN\n"), m_cfg.gpio.clk); - #endif - - // initialize some specific panel drivers - if (m_cfg.driver) - shiftDriver(m_cfg); - - - /* As DMA buffers are dynamically allocated, we must allocated in begin() - * Ref: https://github.com/espressif/arduino-esp32/issues/831 - */ - if ( !allocateDMAmemory() ) { return false; } // couldn't even get the basic ram required. - - - // Flush the DMA buffers prior to configuring DMA - Avoid visual artefacts on boot. - resetbuffers(); // Must fill the DMA buffer with the initial output bit sequence or the panel will display garbage - - // Setup the ESP32 DMA Engine. Sprite_TM built this stuff. - configureDMA(m_cfg); //DMA and I2S configuration and setup - - //showDMABuffer(); // show backbuf_id of 0 - - #if SERIAL_DEBUG - if (!initialized) - Serial.println(F("MatrixPanel_I2S_DMA::begin() failed.")); - #endif - - return initialized; - - } - - // Obj destructor - ~MatrixPanel_I2S_DMA(){ - stopDMAoutput(); - - delete dmadesc_a; - - if (m_cfg.double_buff) - delete dmadesc_b; - - } - - - /* - * overload for compatibility - */ - bool begin(int r1, int g1 = G1_PIN_DEFAULT, int b1 = B1_PIN_DEFAULT, int r2 = R2_PIN_DEFAULT, int g2 = G2_PIN_DEFAULT, int b2 = B2_PIN_DEFAULT, int a = A_PIN_DEFAULT, int b = B_PIN_DEFAULT, int c = C_PIN_DEFAULT, int d = D_PIN_DEFAULT, int e = E_PIN_DEFAULT, int lat = LAT_PIN_DEFAULT, int oe = OE_PIN_DEFAULT, int clk = CLK_PIN_DEFAULT); - - - // Adafruit's BASIC DRAW API (565 colour format) - virtual void drawPixel(int16_t x, int16_t y, uint16_t color); // overwrite adafruit implementation - virtual void fillScreen(uint16_t color); // overwrite adafruit implementation - - /** - * A wrapper to fill whatever selected DMA buffer / screen with black - */ - inline void clearScreen(){ updateMatrixDMABuffer(0,0,0); }; - -#ifndef NO_FAST_FUNCTIONS - /** - * @brief - override Adafruit's FastVLine - * this works faster than multiple consecutive pixel by pixel drawPixel() call - */ - virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color){ - uint8_t r, g, b; - color565to888(color, r, g, b); - vlineDMA(x, y, h, r, g, b); - } - // rgb888 overload - virtual inline void drawFastVLine(int16_t x, int16_t y, int16_t h, uint8_t r, uint8_t g, uint8_t b){ vlineDMA(x, y, h, r, g, b); }; - - /** - * @brief - override Adafruit's FastHLine - * this works faster than multiple consecutive pixel by pixel drawPixel() call - */ - virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color){ - uint8_t r, g, b; - color565to888(color, r, g, b); - hlineDMA(x, y, w, r, g, b); - } - // rgb888 overload - virtual inline void drawFastHLine(int16_t x, int16_t y, int16_t w, uint8_t r, uint8_t g, uint8_t b){ hlineDMA(x, y, w, r, g, b); }; - - /** - * @brief - override Adafruit's fillRect - * this works much faster than multiple consecutive per-pixel drawPixel() calls - */ - virtual void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color){ - uint8_t r, g, b; - color565to888(color, r, g, b); - fillRectDMA(x, y, w, h, r, g, b); - } - // rgb888 overload - virtual inline void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint8_t r, uint8_t g, uint8_t b){fillRectDMA(x, y, w, h, r, g, b);} -#endif - - void fillScreenRGB888(uint8_t r, uint8_t g, uint8_t b); - void drawPixelRGB888(int16_t x, int16_t y, uint8_t r, uint8_t g, uint8_t b); - -#ifdef USE_GFX_ROOT - // 24bpp FASTLED CRGB colour struct support - void fillScreen(CRGB color); - void drawPixel(int16_t x, int16_t y, CRGB color); -#endif - - void drawIcon (int *ico, int16_t x, int16_t y, int16_t cols, int16_t rows); - - // Color 444 is a 4 bit scale, so 0 to 15, color 565 takes a 0-255 bit value, so scale up by 255/15 (i.e. 17)! - static uint16_t color444(uint8_t r, uint8_t g, uint8_t b) { return color565(r*17,g*17,b*17); } - - // Converts RGB888 to RGB565 - static uint16_t color565(uint8_t r, uint8_t g, uint8_t b); // This is what is used by Adafruit GFX! - - // Converts RGB333 to RGB565 - static uint16_t color333(uint8_t r, uint8_t g, uint8_t b); // This is what is used by Adafruit GFX! Not sure why they have a capital 'C' for this particular function. - - /** - * @brief - convert RGB565 to RGB888 - * @param uint16_t color - RGB565 input color - * @param uint8_t &r, &g, &b - refs to variables where converted colors would be emplaced - */ - static void color565to888(const uint16_t color, uint8_t &r, uint8_t &g, uint8_t &b); - - - inline void IRAM_ATTR flipDMABuffer() - { - if ( !m_cfg.double_buff) return; - - #if SERIAL_DEBUG - Serial.printf_P(PSTR("Set back buffer to: %d\n"), back_buffer_id); - #endif - - i2s_parallel_set_previous_buffer_not_free(); - // Wait before we allow any writing to the buffer. Stop flicker. - while(i2s_parallel_is_previous_buffer_free() == false) { } - - i2s_parallel_flip_to_buffer(ESP32_I2S_DEVICE, back_buffer_id); - // Flip to other buffer as the backbuffer. - // i.e. Graphic changes happen to this buffer, but aren't displayed until flipDMABuffer() is called again. - back_buffer_id ^= 1; - - i2s_parallel_set_previous_buffer_not_free(); - // Wait before we allow any writing to the buffer. Stop flicker. - while(i2s_parallel_is_previous_buffer_free() == false) { } - - - - - - } - - inline void setPanelBrightness(int b) - { - // Change to set the brightness of the display, range of 1 to matrixWidth (i.e. 1 - 64) - brightness = b; - if (!initialized) - return; - - brtCtrlOE(b); - if (m_cfg.double_buff) - brtCtrlOE(b, 1); - } - - /** - * this is just a wrapper to control brightness - * with an 8-bit value (0-255), very popular in FastLED-based sketches :) - * @param uint8_t b - 8-bit brightness value - */ - void setBrightness8(const uint8_t b) - { - setPanelBrightness(b * PIXELS_PER_ROW / 256); - } - - /** - * Contains the resulting refresh rate (scan rate) that will be achieved - * based on the i2sspeed, colour depth and min_refresh_rate requested. - */ - int calculated_refresh_rate = 0; - - /** - * @brief - Sets how many clock cycles to blank OE before/after LAT signal change - * @param uint8_t pulses - clocks before/after OE - * default is DEFAULT_LAT_BLANKING - * Max is MAX_LAT_BLANKING - * @returns - new value for m_cfg.latch_blanking - */ - uint8_t setLatBlanking(uint8_t pulses); - - /** - * Get a class configuration struct - * - */ - const HUB75_I2S_CFG& getCfg() const {return m_cfg;}; - - - /** - * Stop the ESP32 DMA Engine. Screen will forever be black until next ESP reboot. - */ - void stopDMAoutput() { - resetbuffers(); - i2s_parallel_stop_dma(ESP32_I2S_DEVICE); - } - - - - // ------- PROTECTED ------- - // those might be useful for child classes, like VirtualMatrixPanel - protected: - - /** - * @brief - clears and reinitializes color/control data in DMA buffs - * When allocated, DMA buffs might be dirty, so we need to blank it and initialize ABCDE,LAT,OE control bits. - * Those control bits are constants during the entire DMA sweep and never changed when updating just pixel color data - * so we could set it once on DMA buffs initialization and forget. - * This effectively clears buffers to blank BLACK and makes it ready to display output. - * (Brightness control via OE bit manipulation is another case) - */ - void clearFrameBuffer(bool _buff_id = 0); - - /* Update a specific pixel in the DMA buffer to a colour */ - void updateMatrixDMABuffer(int16_t x, int16_t y, uint8_t red, uint8_t green, uint8_t blue); - - /* Update the entire DMA buffer (aka. The RGB Panel) a certain colour (wipe the screen basically) */ - void updateMatrixDMABuffer(uint8_t red, uint8_t green, uint8_t blue); - - /** - * wipes DMA buffer(s) and reset all color/service bits - */ - inline void resetbuffers(){ - clearFrameBuffer(); - brtCtrlOE(brightness); - if (m_cfg.double_buff){ - clearFrameBuffer(1); - brtCtrlOE(brightness, 1); - } - } - - -#ifndef NO_FAST_FUNCTIONS - /** - * @brief - update DMA buff drawing horizontal line at specified coordinates - * @param x_ccord - line start coordinate x - * @param y_ccord - line start coordinate y - * @param l - line length - * @param r,g,b, - RGB888 color - */ - void hlineDMA(int16_t x_coord, int16_t y_coord, int16_t l, uint8_t red, uint8_t green, uint8_t blue); - - /** - * @brief - update DMA buff drawing horizontal line at specified coordinates - * @param x_ccord - line start coordinate x - * @param y_ccord - line start coordinate y - * @param l - line length - * @param r,g,b, - RGB888 color - */ - void vlineDMA(int16_t x_coord, int16_t y_coord, int16_t l, uint8_t red, uint8_t green, uint8_t blue); - - /** - * @brief - update DMA buff drawing a rectangular at specified coordinates - * uses Fast H/V line draw internally, works faster than multiple consecutive pixel by pixel calls to updateMatrixDMABuffer() - * @param int16_t x, int16_t y - coordinates of a top-left corner - * @param int16_t w, int16_t h - width and height of a rectangular, min is 1 px - * @param uint8_t r - RGB888 color - * @param uint8_t g - RGB888 color - * @param uint8_t b - RGB888 color - */ - void fillRectDMA(int16_t x_coord, int16_t y_coord, int16_t w, int16_t h, uint8_t r, uint8_t g, uint8_t b); -#endif - - // ------- PRIVATE ------- - private: - - // Matrix i2s settings - HUB75_I2S_CFG m_cfg; - - /* ESP32-HUB75-MatrixPanel-I2S-DMA functioning constants - * we can't change those once object instance initialized it's DMA structs - */ - const uint8_t ROWS_PER_FRAME = m_cfg.mx_height / MATRIX_ROWS_IN_PARALLEL; // RPF - rows per frame, either 16 or 32 depending on matrix module - const uint16_t PIXELS_PER_ROW = m_cfg.mx_width * m_cfg.chain_length; // number of pixels in a single row of all chained matrix modules (WIDTH of a combined matrix chain) - - // Other private variables - bool initialized = false; - int back_buffer_id = 0; // If using double buffer, which one is NOT active (ie. being displayed) to write too? - int brightness = 32; // If you get ghosting... reduce brightness level. 60 seems to be the limit before ghosting on a 64 pixel wide physical panel for some panels. - int lsbMsbTransitionBit = 0; // For colour depth calculations - - - // *** DMA FRAMEBUFFER structures - - // ESP 32 DMA Linked List descriptor - int desccount = 0; - lldesc_t * dmadesc_a = {0}; - lldesc_t * dmadesc_b = {0}; - - /* Pixel data is organized from LSB to MSB sequentially by row, from row 0 to row matrixHeight/matrixRowsInParallel - * (two rows of pixels are refreshed in parallel) - * Memory is allocated (malloc'd) by the row, and not in one massive chunk, for flexibility. - * The whole DMA framebuffer is just a vector of pointers to structs with ESP32_I2S_DMA_STORAGE_TYPE arrays - * Since it's dimensions is unknown prior to class initialization, we just declare it here as empty struct and will do all allocations later. - * Refer to rowBitStruct to get the idea of it's internal structure - */ - frameStruct dma_buff; - - - /* Calculate the memory available for DMA use, do some other stuff, and allocate accordingly */ - bool allocateDMAmemory(); - - /* Setup the DMA Link List chain and initiate the ESP32 DMA engine */ - void configureDMA(const HUB75_I2S_CFG& opts); - - /** - * pre-init procedures for specific drivers - * - */ - void shiftDriver(const HUB75_I2S_CFG& opts); - - /** - * @brief - FM6124-family chips initialization routine - */ - void fm6124init(const HUB75_I2S_CFG& _cfg); - - /** - * @brief - reset OE bits in DMA buffer in a way to control brightness - * @param brt - brightness level from 0 to row_width - * @param _buff_id - buffer id to control - */ - void brtCtrlOE(int brt, const bool _buff_id=0); - - -}; // end Class header - -/***************************************************************************************/ -// https://stackoverflow.com/questions/5057021/why-are-c-inline-functions-in-the-header -/* 2. functions declared in the header must be marked inline because otherwise, every translation unit which includes the header will contain a definition of the function, and the linker will complain about multiple definitions (a violation of the One Definition Rule). The inline keyword suppresses this, allowing multiple translation units to contain (identical) definitions. */ - -/** - * @brief - convert RGB565 to RGB888 - * @param uint16_t color - RGB565 input color - * @param uint8_t &r, &g, &b - refs to variables where converted colours would be emplaced - */ -inline void MatrixPanel_I2S_DMA::color565to888(const uint16_t color, uint8_t &r, uint8_t &g, uint8_t &b){ - r = ((((color >> 11) & 0x1F) * 527) + 23) >> 6; - g = ((((color >> 5) & 0x3F) * 259) + 33) >> 6; - b = (((color & 0x1F) * 527) + 23) >> 6; -} - -inline void MatrixPanel_I2S_DMA::drawPixel(int16_t x, int16_t y, uint16_t color) // adafruit virtual void override -{ - uint8_t r,g,b; - color565to888(color,r,g,b); - - updateMatrixDMABuffer( x, y, r, g, b); -} - -inline void MatrixPanel_I2S_DMA::fillScreen(uint16_t color) // adafruit virtual void override -{ - uint8_t r,g,b; - color565to888(color,r,g,b); - - updateMatrixDMABuffer(r, g, b); // RGB only (no pixel coordinate) version of 'updateMatrixDMABuffer' -} - -inline void MatrixPanel_I2S_DMA::drawPixelRGB888(int16_t x, int16_t y, uint8_t r, uint8_t g,uint8_t b) -{ - updateMatrixDMABuffer( x, y, r, g, b); -} - -inline void MatrixPanel_I2S_DMA::fillScreenRGB888(uint8_t r, uint8_t g,uint8_t b) -{ - updateMatrixDMABuffer(r, g, b); // RGB only (no pixel coordinate) version of 'updateMatrixDMABuffer' -} - -#ifdef USE_GFX_ROOT -// Support for CRGB values provided via FastLED -inline void MatrixPanel_I2S_DMA::drawPixel(int16_t x, int16_t y, CRGB color) -{ - updateMatrixDMABuffer( x, y, color.red, color.green, color.blue); -} - -inline void MatrixPanel_I2S_DMA::fillScreen(CRGB color) -{ - updateMatrixDMABuffer(color.red, color.green, color.blue); -} -#endif - - -// Pass 8-bit (each) R,G,B, get back 16-bit packed color -//https://github.com/squix78/ILI9341Buffer/blob/master/ILI9341_SPI.cpp -inline uint16_t MatrixPanel_I2S_DMA::color565(uint8_t r, uint8_t g, uint8_t b) { - return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); -} - -// Promote 3/3/3 RGB to Adafruit_GFX 5/6/5 RRRrrGGGgggBBBbb -inline uint16_t MatrixPanel_I2S_DMA::color333(uint8_t r, uint8_t g, uint8_t b) { - return ((r & 0x7) << 13) | ((r & 0x6) << 10) | ((g & 0x7) << 8) | ((g & 0x7) << 5) | ((b & 0x7) << 2) | ((b & 0x6) >> 1); -} - -inline void MatrixPanel_I2S_DMA::drawIcon (int *ico, int16_t x, int16_t y, int16_t cols, int16_t rows) { -/* drawIcon draws a C style bitmap. -// Example 10x5px bitmap of a yellow sun -// - int half_sun [50] = { - 0x0000, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, - 0x0000, 0xffe0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffe0, 0x0000, - 0x0000, 0x0000, 0x0000, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0x0000, 0x0000, 0x0000, - 0xffe0, 0x0000, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0x0000, 0xffe0, - 0x0000, 0x0000, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0xffe0, 0x0000, 0x0000, - }; - - MatrixPanel_I2S_DMA matrix; - - matrix.drawIcon (half_sun, 0,0,10,5); -*/ - - int i, j; - for (i = 0; i < rows; i++) { - for (j = 0; j < cols; j++) { - drawPixel (x + j, y + i, (uint16_t) ico[i * cols + j]); - } - } -} - - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-leddrivers.cpp b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-leddrivers.cpp deleted file mode 100644 index bb482a2..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-HUB75-MatrixPanel-leddrivers.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - Various LED Driver chips might need some specific code for initialisation/control logic - -*/ - -#include -#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h" - -#define CLK_PULSE digitalWrite(_cfg.gpio.clk, HIGH); digitalWrite(_cfg.gpio.clk, LOW); - -/** - * @brief - pre-init procedures for specific led-drivers - * this method is called before DMA/I2S setup while GPIOs - * aint yet assigned for DMA operation - * - */ -void MatrixPanel_I2S_DMA::shiftDriver(const HUB75_I2S_CFG& _cfg){ - switch (_cfg.driver){ - case HUB75_I2S_CFG::ICN2038S: - case HUB75_I2S_CFG::FM6124: - case HUB75_I2S_CFG::FM6126A: - fm6124init(_cfg); - break; - case HUB75_I2S_CFG::MBI5124: - /* MBI5124 chips must be clocked with positive-edge, since it's LAT signal - * resets on clock's rising edge while high - * https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/files/5952216/5a542453754da.pdf - */ - m_cfg.clkphase=true; - break; - case HUB75_I2S_CFG::SHIFTREG: - default: - break; - } -} - - -void MatrixPanel_I2S_DMA::fm6124init(const HUB75_I2S_CFG& _cfg){ - #if SERIAL_DEBUG - Serial.println( F("MatrixPanel_I2S_DMA - initializing FM6124 driver...")); - #endif - bool REG1[16] = {0,0,0,0,0, 1,1,1,1,1,1, 0,0,0,0,0}; // this sets global matrix brightness power - bool REG2[16] = {0,0,0,0,0, 0,0,0,0,1,0, 0,0,0,0,0}; // a single bit enables the matrix output - - for (uint8_t _pin:{_cfg.gpio.r1, _cfg.gpio.r2, _cfg.gpio.g1, _cfg.gpio.g2, _cfg.gpio.b1, _cfg.gpio.b2, _cfg.gpio.clk, _cfg.gpio.lat, _cfg.gpio.oe}){ - pinMode(_pin, OUTPUT); - digitalWrite(_pin, LOW); - } - - digitalWrite(_cfg.gpio.oe, HIGH); // Disable Display - - // Send Data to control register REG1 - // this sets the matrix brightness actually - for (int l = 0; l < PIXELS_PER_ROW; l++){ - for (uint8_t _pin:{_cfg.gpio.r1, _cfg.gpio.r2, _cfg.gpio.g1, _cfg.gpio.g2, _cfg.gpio.b1, _cfg.gpio.b2}) - digitalWrite(_pin, REG1[l%16]); // we have 16 bits shifters and write the same value all over the matrix array - - if (l > PIXELS_PER_ROW - 12){ // pull the latch 11 clocks before the end of matrix so that REG1 starts counting to save the value - digitalWrite(_cfg.gpio.lat, HIGH); - } - CLK_PULSE - } - - // drop the latch and save data to the REG1 all over the FM6124 chips - digitalWrite(_cfg.gpio.lat, LOW); - - // Send Data to control register REG2 (enable LED output) - for (int l = 0; l < PIXELS_PER_ROW; l++){ - for (uint8_t _pin:{_cfg.gpio.r1, _cfg.gpio.r2, _cfg.gpio.g1, _cfg.gpio.g2, _cfg.gpio.b1, _cfg.gpio.b2}) - digitalWrite(_pin, REG2[l%16]); // we have 16 bits shifters and we write the same value all over the matrix array - - if (l > PIXELS_PER_ROW - 13){ // pull the latch 12 clocks before the end of matrix so that reg2 stars counting to save the value - digitalWrite(_cfg.gpio.lat, HIGH); - } - CLK_PULSE - } - - // drop the latch and save data to the REG1 all over the FM6126 chips - digitalWrite(_cfg.gpio.lat, LOW); - - // blank data regs to keep matrix clear after manipulations - for (uint8_t _pin:{_cfg.gpio.r1, _cfg.gpio.r2, _cfg.gpio.g1, _cfg.gpio.g2, _cfg.gpio.b1, _cfg.gpio.b2}) - digitalWrite(_pin, LOW); - - for (int l = 0; l < PIXELS_PER_ROW; ++l){ - CLK_PULSE - } - - digitalWrite(_cfg.gpio.lat, HIGH); - CLK_PULSE - digitalWrite(_cfg.gpio.lat, LOW); - digitalWrite(_cfg.gpio.oe, LOW); // Enable Display - CLK_PULSE -} \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-VirtualMatrixPanel-I2S-DMA.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-VirtualMatrixPanel-I2S-DMA.h deleted file mode 100644 index b2c36d0..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/ESP32-VirtualMatrixPanel-I2S-DMA.h +++ /dev/null @@ -1,315 +0,0 @@ -#ifndef _ESP32_VIRTUAL_MATRIX_PANEL_I2S_DMA -#define _ESP32_VIRTUAL_MATRIX_PANEL_I2S_DMA - -/******************************************************************* - Class contributed by Brian Lough, and expanded by Faptastic. - - Originally designed to allow CHAINING of panels together to create - a 'bigger' display of panels. i.e. Chaining 4 panels into a 2x2 - grid. - - However, the function of this class has expanded now to also manage - the output for 1/16 scan panels, as the core DMA library is designed - ONLY FOR 1/16 scan matrix panels. - - YouTube: https://www.youtube.com/brianlough - Tindie: https://www.tindie.com/stores/brianlough/ - Twitter: https://twitter.com/witnessmenow - *******************************************************************/ - -#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h" -#ifndef NO_GFX - #include -#endif - -struct VirtualCoords { - - int16_t x; - int16_t y; - int16_t virt_row; // chain of panels row - int16_t virt_col; // chain of panels col - - VirtualCoords() : x(0), y(0) - { } - -}; - -enum PANEL_SCAN_RATE {NORMAL_ONE_SIXTEEN, ONE_EIGHT_32, ONE_EIGHT_16}; - -#ifdef USE_GFX_ROOT -class VirtualMatrixPanel : public GFX -#elif !defined NO_GFX -class VirtualMatrixPanel : public Adafruit_GFX -#else -class VirtualMatrixPanel -#endif -{ - - public: - int16_t virtualResX; - int16_t virtualResY; - - int16_t vmodule_rows; - int16_t vmodule_cols; - - int16_t panelResX; - int16_t panelResY; - - int16_t dmaResX; // The width of the chain in pixels (as the DMA engine sees it) - - MatrixPanel_I2S_DMA *display; - - VirtualMatrixPanel(MatrixPanel_I2S_DMA &disp, int _vmodule_rows, int _vmodule_cols, int _panelResX, int _panelResY, bool serpentine_chain = true, bool top_down_chain = false) -#ifdef USE_GFX_ROOT - : GFX(_vmodule_cols*_panelResX, _vmodule_rows*_panelResY) -#elif !defined NO_GFX - : Adafruit_GFX(_vmodule_cols*_panelResX, _vmodule_rows*_panelResY) -#endif - { - this->display = &disp; - - panelResX = _panelResX; - panelResY = _panelResY; - - vmodule_rows = _vmodule_rows; - vmodule_cols = _vmodule_cols; - - virtualResX = vmodule_cols*_panelResX; - virtualResY = vmodule_rows*_panelResY; - - dmaResX = panelResX * vmodule_rows * vmodule_cols; - - - - /* Virtual Display width() and height() will return a real-world value. For example: - * Virtual Display width: 128 - * Virtual Display height: 64 - * - * So, not values that at 0 to X-1 - */ - - _s_chain_party = serpentine_chain; // serpentine, or 'S' chain? - _chain_top_down= top_down_chain; - - coords.x = coords.y = -1; // By default use an invalid co-ordinates that will be rejected by updateMatrixDMABuffer - - } - - // equivalent methods of the matrix library so it can be just swapped out. - virtual void drawPixel(int16_t x, int16_t y, uint16_t color); - virtual void fillScreen(uint16_t color); // overwrite adafruit implementation - virtual void fillScreenRGB888(uint8_t r, uint8_t g,uint8_t b); - void clearScreen() { display->clearScreen(); } - void drawPixelRGB888(int16_t x, int16_t y, uint8_t r, uint8_t g, uint8_t b); - - uint16_t color444(uint8_t r, uint8_t g, uint8_t b) { return display->color444(r, g, b); } - uint16_t color565(uint8_t r, uint8_t g, uint8_t b) { return display->color565(r, g, b); } - uint16_t color333(uint8_t r, uint8_t g, uint8_t b) { return display->color333(r, g, b); } - - void flipDMABuffer() { display->flipDMABuffer(); } - void drawDisplayTest(); - void setRotate(bool rotate); - - void setPhysicalPanelScanRate(PANEL_SCAN_RATE rate); - - protected: - - virtual VirtualCoords getCoords(int16_t &x, int16_t &y); - VirtualCoords coords; - - bool _s_chain_party = true; // Are we chained? Ain't no party like a... - bool _chain_top_down = false; // is the ESP at the top or bottom of the matrix of devices? - bool _rotate = false; - - PANEL_SCAN_RATE _panelScanRate = NORMAL_ONE_SIXTEEN; - -}; // end Class header - -/** - * Calculate virtual->real co-ordinate mapping to underlying single chain of panels connected to ESP32. - * Updates the private class member variable 'coords', so no need to use the return value. - * Not thread safe, but not a concern for ESP32 sketch anyway... I think. - */ -inline VirtualCoords VirtualMatrixPanel::getCoords(int16_t &x, int16_t &y) { - //Serial.println("Called Base."); - coords.x = coords.y = -1; // By defalt use an invalid co-ordinates that will be rejected by updateMatrixDMABuffer - - // We want to rotate? - if (_rotate){ - int16_t temp_x=x; - x=y; - y=virtualResY-1-temp_x; - } - - if ( x < 0 || x >= virtualResX || y < 0 || y >= virtualResY ) { // Co-ordinates go from 0 to X-1 remember! otherwise they are out of range! - //Serial.printf("VirtualMatrixPanel::getCoords(): Invalid virtual display coordinate. x,y: %d, %d\r\n", x, y); - return coords; - } - - // Stupidity check - if ( (vmodule_rows == 1) && (vmodule_cols == 1)) // single panel... - { - coords.x = x; - coords.y = y; - return coords; - } - - uint8_t row = (y / panelResY) + 1; //a non indexed 0 row number - if( ( _s_chain_party && !_chain_top_down && (row % 2 == 0) ) // serpentine vertically stacked chain starting from bottom row (i.e. ESP closest to ground), upwards - || - ( _s_chain_party && _chain_top_down && (row % 2 != 0) ) // serpentine vertically stacked chain starting from the sky downwards - ) - { - // First portion gets you to the correct offset for the row you need - // Second portion inverts the x on the row - coords.x = ((y / panelResY) * (virtualResX)) + (virtualResX - x) - 1; - - // inverts the y the row - coords.y = panelResY - 1 - (y % panelResY); - } - else - { - // Normal chain pixel co-ordinate - coords.x = x + ((y / panelResY) * (virtualResX)) ; - coords.y = y % panelResY; - } - - // Reverse co-ordinates if panel chain from ESP starts from the TOP RIGHT - if (_chain_top_down) - { - /* - const HUB75_I2S_CFG _cfg = this->display->getCfg(); - coords.x = (_cfg.mx_width * _cfg.chain_length - 1) - coords.x; - coords.y = (_cfg.mx_height-1) - coords.y; - */ - coords.x = (dmaResX - 1) - coords.x; - coords.y = (panelResY-1) - coords.y; - } - - - /* START: Pixel remapping AGAIN to convert 1/16 SCAN output that the - * the underlying hardware library is designed for (because - * there's only 2 x RGB pins... and convert this to 1/8 or something - */ - if ( _panelScanRate == ONE_EIGHT_32) - { - /* Convert Real World 'VirtualMatrixPanel' co-ordinates (i.e. Real World pixel you're looking at - on the panel or chain of panels, per the chaining configuration) to a 1/8 panels - double 'stretched' and 'squished' coordinates which is what needs to be sent from the - DMA buffer. - - Note: Look at the One_Eight_1_8_ScanPanel code and you'll see that the DMA buffer is setup - as if the panel is 2 * W and 0.5 * H ! - */ - - /* - Serial.print("VirtualMatrixPanel Mapping ("); Serial.print(x, DEC); Serial.print(","); Serial.print(y, DEC); Serial.print(") "); - // to - Serial.print("to ("); Serial.print(coords.x, DEC); Serial.print(","); Serial.print(coords.y, DEC); Serial.println(") "); - */ - if ( (y & 8) == 0) { - coords.x += ((coords.x / panelResX)+1)*panelResX; // 1st, 3rd 'block' of 8 rows of pixels, offset by panel width in DMA buffer - } - else { - coords.x += (coords.x / panelResX)*panelResX; // 2nd, 4th 'block' of 8 rows of pixels, offset by panel width in DMA buffer - } - - // http://cpp.sh/4ak5u - // Real number of DMA y rows is half reality - // coords.y = (y / 16)*8 + (y & 0b00000111); - coords.y = (y >> 4)*8 + (y & 0b00000111); - - /* - Serial.print("OneEightScanPanel Mapping ("); Serial.print(x, DEC); Serial.print(","); Serial.print(y, DEC); Serial.print(") "); - // to - Serial.print("to ("); Serial.print(coords.x, DEC); Serial.print(","); Serial.print(coords.y, DEC); Serial.println(") "); - */ - } - - - if ( _panelScanRate == ONE_EIGHT_16) - { - if ((y & 8) == 0) { - coords.x += (panelResX>>2) * (((coords.x & 0xFFF0)>>4)+1); // 1st, 3rd 'block' of 8 rows of pixels, offset by panel width in DMA buffer - } else { - coords.x += (panelResX>>2) * (((coords.x & 0xFFF0)>>4)); // 2nd, 4th 'block' of 8 rows of pixels, offset by panel width in DMA buffer - } - - if (y < 32) - coords.y = (y >> 4) * 8 + (y & 0b00000111); - else{ - coords.y = ((y-32) >> 4) * 8 + (y & 0b00000111); - coords.x += 256; - } - } - - - //Serial.print("Mapping to x: "); Serial.print(coords.x, DEC); Serial.print(", y: "); Serial.println(coords.y, DEC); - return coords; -} - -inline void VirtualMatrixPanel::drawPixel(int16_t x, int16_t y, uint16_t color) { // adafruit virtual void override - getCoords(x, y); - this->display->drawPixel(coords.x, coords.y, color); -} - -inline void VirtualMatrixPanel::fillScreen(uint16_t color) { // adafruit virtual void override - this->display->fillScreen(color); -} - -inline void VirtualMatrixPanel::fillScreenRGB888(uint8_t r, uint8_t g,uint8_t b) { - this->display->fillScreenRGB888(r, g, b); -} - -inline void VirtualMatrixPanel::drawPixelRGB888(int16_t x, int16_t y, uint8_t r, uint8_t g, uint8_t b) { - getCoords(x, y); - this->display->drawPixelRGB888( coords.x, coords.y, r, g, b); -} - -inline void VirtualMatrixPanel::setRotate(bool rotate) { - _rotate=rotate; - -#ifndef NO_GFX - // We don't support rotation by degrees. - if (rotate) { setRotation(1); } else { setRotation(0); } -#endif -} - -inline void VirtualMatrixPanel::setPhysicalPanelScanRate(PANEL_SCAN_RATE rate) { - _panelScanRate=rate; -} - - - -#ifndef NO_GFX -inline void VirtualMatrixPanel::drawDisplayTest() -{ - this->display->setFont(&FreeSansBold12pt7b); - this->display->setTextColor(this->display->color565(255, 255, 0)); - this->display->setTextSize(1); - - for ( int panel = 0; panel < vmodule_cols*vmodule_rows; panel++ ) { - int top_left_x = (panel == 0) ? 0:(panel*panelResX); - this->display->drawRect( top_left_x, 0, panelResX, panelResY, this->display->color565( 0, 255, 0)); - this->display->setCursor(panel*panelResX, panelResY-3); - this->display->print((vmodule_cols*vmodule_rows)-panel); - } - -} -#endif -/* -// need to recreate this one, as it wouldn't work to just map where it starts. -inline void VirtualMatrixPanel::drawIcon (int *ico, int16_t x, int16_t y, int16_t icon_cols, int16_t icon_rows) { - int i, j; - for (i = 0; i < icon_rows; i++) { - for (j = 0; j < icon_cols; j++) { - // This is a call to this libraries version of drawPixel - // which will map each pixel, which is what we want. - //drawPixelRGB565 (x + j, y + i, ico[i * module_cols + j]); - drawPixel (x + j, y + i, ico[i * icon_cols + j]); - } - } -} -*/ - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/LICENSE.txt b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/LICENSE.txt deleted file mode 100644 index 72dc60d..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -The MIT License (MIT) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/README.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/README.md deleted file mode 100644 index 6bd615d..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/README.md +++ /dev/null @@ -1,230 +0,0 @@ -# HUB75 RGB LED matrix library utilizing ESP32 DMA Engine - -__[BUILD](/doc/BuildOptions.md) | [EXAMPLES](/examples/README.md)__ | [![PlatformIO CI](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/actions/workflows/pio_build.yml/badge.svg)](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/actions/workflows/pio_build.yml) - - **Table of Content** - -- [Introduction](#introduction) - * [Features](#features) - * [Supported ESP32](#esp32-supported) - * [Supported Panels](#panels-supported) - * [Panel driver chips known to be working well](#panel-driver-chips-known-to-be-working-well) - * [Panels Not Supported](#panels-not-supported) - * [Update for 16x32 Panels](#update-for-16x32-panels) - * [Cool uses of this library](#cool-uses-of-this-library) -- [Getting Started](#getting-started) - * [1. Library Installation](#1-library-installation) - * [2. Wiring ESP32 with the LED Matrix Panel](#2-wiring-esp32-with-the-led-matrix-panel) - * [3. Run a Test Sketch](#3-run-a-test-sketch) -- [More Information](#more-information) - * [Build-time options](#doc/BuildOptions.md) - * [Memory constraints](#memory-constraints) - * [Can I use with a larger panel (i.e. 64x64px square panel)?](#can-i-use-with-a-larger-panel-ie-64x64px-square-panel) - * [Can I chain panels?](#can-i-chain-panels) - * [Panel Brightness](#panel-brightness) - * [Latch blanking](#latch-blanking) - * [Power, Power and Power!](#power--power-and-power) - * [Inspiration](#inspiration) - - [Thank you!](#thank-you) - -## Introduction -This ESP32 Arduino/IDF library for HUB75 / HUB75E connector type 64x32 RGB LED 1/16 Scan OR 64x64 RGB LED 1/32 Scan LED Matrix Panel, utilities the DMA functionality provided by the ESP32's I2S 'LCD Mode'. - -### Features -- **Low CPU overhead** - once initialized pixel data is pumped to the matrix inputs via DMA engine directly from memory -- **Fast** - updating pixel data involves only bit-wise logic over DMA buffer memory, no pins manipulation or blocking IO -- **Full screen BCM** - library utilizes [binary-code modulation](http://www.batsocks.co.uk/readme/art_bcm_5.htm) to render pixel color depth / brightness over the entire matrix -- **Variable color depth** - up to TrueColor 24 bits output is possible depending on matrix size/refresh rate required -- **CIE 1931** luminance [correction](https://ledshield.wordpress.com/2012/11/13/led-brightness-to-your-eye-gamma-correction-no/) (aka natural LED dimming) -- **Adafruit GFX API** - library could be build with AdafruitGFX, simplified GFX or without GFX API at all - -If you wanna ask "*...OK, OK, than what's the price for those features?*" I'll tell you - "[memory](/doc/i2s_memcalc.md), you pay it all by precious MCU's memory for DMA buffer". - -## ESP32 Supported -Espressif have kept the 'ESP32' name for all their chips for brand recognition, but their new variant MCU's are different to the ESP32 this library was built for. - -This library supports the *original* ESP32. That being the ESP-WROOM-32 module with ESP32‑D0WDQ6 chip from 2017. This MCU has 520kB of SRAM which is much more than all the recent 'reboots' of the ESP32 such as the S2, S3, C3 etc. If you want to use this library, use with an original ESP32 as it has the most SRAM for DMA. - -Support also exists for the ESP32-S2 and ESP32-S3. - -RISC-V ESP32's (like the C3) are not, and will never be supported as they do not have parallel DMA output required for this library. - -## Panels Supported -* 64x32 (width x height) pixel 1/16 Scan LED Matrix 'Indoor' Panel, such as this [typical RGB panel available for purchase](https://www.aliexpress.com/item/256-128mm-64-32-pixels-1-16-Scan-Indoor-3in1-SMD2121-RGB-full-color-P4-led/32810362851.html). -* 64x64 pixel 1/32 Scan LED Matrix 'Indoor' Panel. -* 32x16 pixel 1/4 Scan LED Matrix 'Indoor' Panel using an ingenious workaround as demonstrated in the 32x16_1_4_ScanPanel example. -* 126x64 [SM5266P](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/164) 1/32 Scan Panel - -Ones interested in internals of such matrices could find [this article](https://www.sparkfun.com/news/2650) useful. - -Due to the high-speed optimized nature of this library, only specific panels are supported. Please do not raise issues with respect to panels not supported on the list below. - -## Panel driver chips known to be working well - -* ICND2012 -* [RUC7258](http://www.ruichips.com/en/products.html?cateid=17496) -* FM6126A AKA ICN2038S, [FM6124](https://datasheet4u.com/datasheet-pdf/FINEMADELECTRONICS/FM6124/pdf.php?id=1309677) (Refer to [PatternPlasma](/examples/2_PatternPlasma) example on how to use.) -* SM5266P - -## Panels Not Supported -* 1/8 Scan LED Matrix Panels are not supported. -* RUL5358 / SHIFTREG_ABC_BIN_DE based panels are not supported. -* Any other panel not listed above. - -Please use an [alternative library](https://github.com/2dom/PxMatrix) if you bought one of these. - -## Update for 16x32 Panels -* There is a virtual panel class available to work with 16x32 panels (see: [examples/16x32 Panel](/examples/P6_32x16_1_4_ScanPanel). This Panel includes drawing lines and rectangles, text and scrolling text - -## Cool uses of this library -There are a number of great looking LED graphical display projects which leverage this library, these include: -* [128x64 Morph Clock](https://github.com/bogd/esp32-morphing-clock) -* [FFT Audio Visualisation](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/discussions/149) -* [Clock, GIF Animator and Audio Visualiser](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/discussions/153) -* [Aurora Audio Visualiser](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/discussions/188) -* [Big Visualisation](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/discussions/155) -* [Clockwise](https://jnthas.github.io/clockwise/) - -# Getting Started -## 1. Library Installation - -* Dependency: You will need to install Adafruit_GFX from the "Library > Manage Libraries" menu. -* Download and unzip this repository into your Arduino/libraries folder (or better still, use the Arduino 'add library from .zip' option. -* Library also tested to work fine with PlatformIO, install into your PlatformIO projects' lib/ folder as appropriate. Or just add it into [platformio.ini](/doc/BuildOptions.md) [lib_depth](https://docs.platformio.org/en/latest/projectconf/section_env_library.html#lib-deps) section. - -## 2. Wiring ESP32 with the LED Matrix Panel -By default the pin mapping is as follows (defaults defined in ESP32-HUB75-MatrixPanel-I2S-DMA.h). - -``` -HUB 75 PANEL ESP 32 PIN -+----------+ -| R1 G1 | R1 -> IO25 G1 -> IO26 -| B1 GND | B1 -> IO27 -| R2 G2 | R2 -> IO14 G2 -> IO12 -| B2 E | B2 -> IO13 E -> N/A (required for 1/32 scan panels, like 64x64. Any available pin would do, i.e. IO32 ) -| A B | A -> IO23 B -> IO19 -| C D | C -> IO05 D -> IO17 -| CLK LAT | CLK -> IO16 LAT -> IO 4 -| OE GND | OE -> IO15 GND -> ESP32 GND -+----------+ -``` - -However, if you want to change this, simply provide the wanted pin mapping as part of the class initialization structure. For example, in your sketch have something like the following: - -``` -// Change these to whatever suits -#define R1_PIN 25 -#define G1_PIN 26 -#define B1_PIN 27 -#define R2_PIN 14 -#define G2_PIN 12 -#define B2_PIN 13 -#define A_PIN 23 -#define B_PIN 22 -#define C_PIN 5 -#define D_PIN 17 -#define E_PIN -1 // required for 1/32 scan panels, like 64x64. Any available pin would do, i.e. IO32 -#define LAT_PIN 4 -#define OE_PIN 15 -#define CLK_PIN 16 - -HUB75_I2S_CFG::i2s_pins _pins={R1_PIN, G1_PIN, B1_PIN, R2_PIN, G2_PIN, B2_PIN, A_PIN, B_PIN, C_PIN, D_PIN, E_PIN, LAT_PIN, OE_PIN, CLK_PIN}; -HUB75_I2S_CFG mxconfig( - 64, // Module width - 32, // Module height - 2, // chain length - _pins, // pin mapping -); -dma_display = new MatrixPanel_I2S_DMA(mxconfig); -``` - -Various people have created PCBs for which one can simply connect an ESP32 to a PCB, and then the PCB to the HUB75 connector, such as: - -* Brian Lough's [ESP32 I2S Matrix Shield](http://blough.ie/i2smat/) -* Charles Hallard's [WeMos Matrix Shield](https://github.com/hallard/WeMos-Matrix-Shield-DMA) -* Bogdan Sass's [Morph Clock Shield](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/discussions/110#discussioncomment-861152) - -Please contact or order these products from the respective authors. - -## 3. Run a Test Sketch -Below is a bare minimum sketch to draw a single white dot in the top left. You must call begin() before you call ANY pixel-drawing (fonts, lines, colours etc.) function of the MatrixPanel_I2S_DMA class. - -Once this is working, refer to the [PIO Test Patterns](/examples/PIO_TestPatterns) example. This sketch draws simple colors/lines/gradients over the entire matrix and it could help to troubleshoot various issues with ghosting, flickering, etc... ->Note: Requires the use of [PlatformIO](https://platformio.org/), which you should probably use if you aren't already. -# More Information -## Build-time options -Although Arduino IDE does not [seem](https://github.com/arduino/Arduino/issues/421) to offer any way of specifying compile-time options for external libs there are other IDE's (like [PlatformIO](https://platformio.org/)/[Eclipse](https://www.eclipse.org/ide/)) that could use that. Check [Build Options](doc/BuildOptions.md) document for reference. - -## Memory constraints -If you are going to use large/combined panels make sure to check for [memory constraints](/doc/i2s_memcalc.md). - -NOTE: You *cannot* use PSRAM to expand the amount of memory available to use by this library. ESP32 hardware [only allows DMA transfer from *internal* SRAM](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/55), so you will be limited to the 200KB or so of usable SRAM of the ESP32 regardless of how many megabytes of PSRAM you may have connected. - -## Can I use with a larger panel (i.e. 64x64px square panel)? -If you want to use with a 64x64 pixel panel (typically a HUB75*E* panel) you MUST configure a valid *E_PIN* to your ESP32 and connect it to the E pin of the HUB75 panel! Hence the 'E' in 'HUB75E' - -## Can I chain panels? -Yes! - -[Horizontal](https://user-images.githubusercontent.com/12006953/122657476-cd358d00-d15b-11eb-9c6c-99b61378c56a.mp4) - -For example: If you want to chain two of these horizontally to make a 128x32 panel you can do so by connecting the panels in series using the HUB75 ribbon cable. Than you must provide proper configuration structure to the class constructor letting it know that you use "one long virtual matrix chain". Refer to [Pattern Plasma](/examples/2_PatternPlasma/) example for all the details about configuration setup. - -Finally, if you wanted to chain 4 x (64x32px) panels to make 128x64px display (essentially a 2x2 grid of 64x32 LED Matrix modules), a little more magic will be required. Refer to the [Chained Panels](examples/ChainedPanels/) example. - -Resolutions beyond 128x64 are more likely to result in crashes due to [memory](/doc/i2s_memcalc.md) constraints etc. You are on your own after this point - PLEASE do not raise issues about this, the library can't magically defeat the SRAM memory constraints of the ESP32. - -![ezgif com-video-to-gif](https://user-images.githubusercontent.com/12006953/89837358-b64c0480-db60-11ea-870d-4b6482068a3b.gif) - - ## Panel Brightness - -By default you should not need to change / set the brightness setting as the default value (16) is sufficient for most purposes. Brightness can be changed by calling `setPanelBrightness(int XX)` or `setBrightness8(uint8_t XX)`. - -The value to pass `setPanelBrightness()` must be less than MATRIX_CHAIN_WIDTH in pixels. For example for a single 64x32 LED Matrix Module, a value must be less than 64. For 3 modules 64x32 it must be less than 192. However, if you set the brightness too high, you may experience ghosting. - -Also you may use method `setBrightness8(x)`, where x is a uint8_t value between 0-255. Library will recalculate required brightness level depending on matrix width (mostly useful with FastLED-based sketches). - -Example: -``` -void setup() { -Serial.begin(115200); - dma_display->begin(); // setup the LED matrix - dma_display->setBrightness8(90); //0-255 - dma_display->clearScreen(); -} -``` - -Summary: setPanelBrightness(xx) value can be any number from 0 (display off) to MATRIX_WIDTH-1. So if you are chaining multiple 64x32 panels, then this value may actually be > 64 (or you will have a dim display). Changing the brightness will have a huge impact on power usage. - -![It's better in real life](image.jpg) - - -## Latch blanking -If you are facing issues with image ghosting when pixels has clones with horizontal offset, than you try to change Latch blanking value. Latch blanking controls for how many clock pulses matrix output is disabled via EO signal before/after toggling LAT signal. It hides row bits transitioning and different panels may require longer times for proper operation. Default value is 1 clock before/after LAT row transition. This could be controlled with `MatrixPanel_I2S_DMA::setLatBlanking(uint8_t v)`. v could be between 1 to 4, default is 1, larger values won't give any benefit other than reducing brightness. - -An example: -``` -dma_display->setLatBlanking(2); -``` - -## Power, Power and Power! -Having a good power supply is CRITICAL, and it is highly recommended, for chains of LED Panels to have a 1000-2000uf capacitor soldered to the back of each LED Panel across the [GND and VCC pins](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/39#issuecomment-720780463), otherwise you WILL run into issues with 'flashy' graphics whereby a large amount of LEDs are turned on and off in succession (due to current/power draw peaks and troughs). - - - Refer to this guide written for the [rpi-rgb-led-matrix library](https://github.com/hzeller/rpi-rgb-led-matrix/blob/master/wiring.md#a-word-about-power) for an explanation. -- Refer to this [example](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/39#issuecomment-722691127) issue of what can go wrong with a poor power supply. - - -- Refer to [this comment](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/35#issuecomment-726419862) in regards to certain panels not playing nice with voltages, and a 3.3volt signal that the ESP32 GPIO can only provide. - -## Inspiration -This project was inspired by: -* 'SmartMatrix': https://github.com/pixelmatix/SmartMatrix/tree/teensylc -* Sprite_TM's demo implementation here: https://www.esp32.com/viewtopic.php?f=17&t=3188 - -# Thank you! -* [Brian Lough](https://www.tindie.com/stores/brianlough/) ([youtube link](https://www.youtube.com/c/brianlough)) for providing code contributions, hardware and suggestions -* [Vortigont](https://github.com/vortigont) for his game changing code contributions and performance optimisations -* [Galaxy Man](https://github.com/Galaxy-Man) for donation of 1/16 scan panels to support the implemenation of led matrix panel chaining (virtual display) support -* [Pipimaxi](https://github.com/Pipimaxi) for the donation of a ESP32-S2 to enable support for ESP32 S2/S3's to be implemented -* [Mark Donners](https://github.com/donnersm) ('The Electronic Engineer' on [youtube](https://www.youtube.com/watch?v=bQ7c9Vlhyp0&t=118s)) for the donation of a 1/8 scan panel to build and test working support of these led matrix panels! -* And lots of others, let me know if I've missed you. diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/WiringExample.jpg b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/WiringExample.jpg deleted file mode 100644 index d33bf77cf13ecba589d2d89055fbfa8d5bc62536..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73124 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 }v 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 jpN%
  • Using some other overlay lib for intermediate calculations that makes it's own compensation, like FastLED's [dimming functions](http://fastled.io/docs/3.1/group___dimming.html).
  • running at low color depth's - it **might** (or might not) look better in shadows, darker gradients w/o compensation, try it
  • you run for as bright output as possible, no matter what (make sure you have proper powering)
  • you run for speed/save resources at all costs | - -## Build-time variables - -| Flag | Description | Note | -| :------------ |---------------|-----| -| **PIXEL_COLOR_DEPTH_BITS=8** | Color depth per color per pixel in range 2-8. More bit's - more natural color. But on the other hand every additional bit:
    • eats ~2.5 bits of DMA memory per pixel
    • reduces matrix refresh rate in power of two due to nature of [BCM](http://www.batsocks.co.uk/readme/art_bcm_5.htm)
    | Default is 8 bits per color per pixel, i.e. TrueColor 24 bit RGB. For higher resolutions, from 64x64 and above it is not possible to provide full 24 bits color without significant flickering OR reducing dynamic range in shadows. In that case using 5-6 bits at high res make very small difference to the humans eye actually. Refer to the [I2S memcalc](i2s_memcalc.md) for more details| \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/fillrate.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/fillrate.md deleted file mode 100644 index f667209..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/fillrate.md +++ /dev/null @@ -1,27 +0,0 @@ -## Estimating fillrate - -Here are some results of simple tests on filling DMA buffer with data. -Filling DMA buffer requires lots of memory operations on a bit level rather than doing simple byte/word wide store and copy. And it looks like it's quite a task both for esp32 core and compiler. -I've done this while optimizing loops and bit logic along with testing compiler results. - -So the testbed is: - - Matrix modules: 4 x FM6126A based 64x64 modules chained in 256x64 - -A testpatterns sketch: - - allocating single DMA buffs for 256x64 - - allocating (NUM_LEDS*3) bytes for CRGB buffer - - measuring microseconds for the following calls: - - clearScreen() - full blanking - - fillScreenRGB888() with monochrome/gray colors - - fill screen using drawPixel() - - filling some gradient into CRGB buff - - painting CRGB buff into DMA buff with looped drawPixelRGB888() - - drawing lines - - -||clearScreen()|drawPixelRGB888(), ticks|fillScreen()|fillScreen with a drawPixel()|fillRect() over Matrix|V-line with drawPixel|fast-V-line|H-line with drawPixel|fast-H-line| -|--|--|--|--|--|--|--|--|--|--| -|v1.2.4|1503113 ticks|9244 non-cached, 675 cached|1719 us, 412272 t|47149 us, 11315418 ticks|-|24505 us, 5880209 ticks|-|24200 us|-| -|FastLines|1503113 ticks|1350 non-cached, 405 cached|1677 us, 401198 t|28511 us, 6841440 ticks|10395 us|14462 us, 3469605 ticks|10391 us, 2492743 ticks|14575 us|5180 us, 1242041 ticks| - -to be continued... \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/i2s_memcalc.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/i2s_memcalc.md deleted file mode 100644 index f32a728..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/i2s_memcalc.md +++ /dev/null @@ -1,40 +0,0 @@ -### I2S HUB75 Calculator - -I've made this [spreadsheet](i2s_memcalc.xlsm) to estimate all of the main parameters for ESP32-HUB75-MatrixPanel-I2S-DMA lib driving any combination of matrices/chains so that I do not need to reflash it hundreds of times just to check for the debug info about memory. -Be sure to enable embedded macro's to allow refresh rate calculations. - -![](i2scalc.png) -Just fill-in all of the INPUT fields and get the OUTPUTs. - -So there are two main resources used to drive LED matrix - - Memory - - I2S clock speed (resulting in available bandwidth to pump pixel color data) - -And there are lot's of hogs for those: - - matrix resolution (number of pixels) - - number of modules in chain - - pixel color depth - - [BCM](http://www.batsocks.co.uk/readme/art_bcm_5.htm) LSB to MSB transition - - double buffering - -Equalising ones with the others results in **Refresh rate**, - -or (rough approximation) - - -[//]: # (github markdown does not like LaTex formulas) -[//]: # ($$RefreshRate=\frac{resolution \times chain \times (ColorDepth-LSB2MSB)}{ I ^2S _ {clock} }$$) - -So, how to find optimum balance for all of these? Obviously you can't change *resolution* and *chain length*, it is physical characteristics and there is not much you can do about it except cutting off your chain or pushing it to the memory limits. - -There are 3 parameters you can choose from (actually two:) - - **Color Depth** - predefined at [build-time]((/doc/BuildOptions.md)) option - - - I2S clock speed - run-time tunable with a very limited options - -- **LSB-to-MSB** transition - it can't be controlled in any way, library uses it internally trying to balance all of the above - -Using provided table it is possible to estimate all of the parameters before running the library. Besides calculating memory requirements it could help to find **optimum color depth** for your matrix configuration. For higher resolutions default 8 bits could be too much to sustain minimal refresh rate and avoid annoying flickering. So the library would increase MSB transition to keep the balance, thus reducing dynamic range in shadows and dark colors. As a result it is nearly almost the same as just reducing overall color depth. **But** reducing global color depth would also save lot's of precious RAM! -Now it's all up to you to decide :) - -/Vortigont/ diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/i2s_memcalc.xlsm b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/i2s_memcalc.xlsm deleted file mode 100644 index 9f30ee4c9b1bea8799da2bdd71729f7b3f3ce7d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10758 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 U>DGXNAig}3Uv2>{iq}{F1H@kVz5oCK diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/i2scalc.png b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/doc/i2scalc.png deleted file mode 100644 index f6396c1d8ca4dc5826f04e0b8f91396ef8d37132..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28618 zcmce;XIN8jf#K@ic(cXL`nptR|P~+LBvLlQbn2}^cJuoHS{7SfFK}UdJTvW zl@f{)dWX;h1OiD&@=aW8x%WNio_&7Y=YBs(duAEEykks)@9Jr@9^pO$0)bd{Zff2G zf%b!e&%1{X0aR8$5(q2eA%PijlHZjhi zjSo&AyIH(jJWeO{9jOvHHuyiE073iHyy?4SB6%8v#BUSEQR9t%KK?Yy7P)Sm#=1B~L;LpuqycYI`J5=;Zs&a@(%EG?x`*S2K?X?xOb9k zz*H0I_gSDY;3@+wdk3U5bAl_ut$TNQ!pjM6G7sYduj23t5GZBV+e7#S|2BTb+sj-6 zHrzf-sUH=<2HBtLkzAd1@iKSzp!KWJvCoc~O;Zqh*IwGyuslPgTrLNY_YFMe~%^QiVli-(G zavl&)uwt8kwtUH=apAAli%7h0&I-uPb`h^r zaECRi9^WAUKd)!s8rZD=K%iNq#*gJV%eDQIJJ!?5?-(<7rA}^&+?`xL z69fJADDjimePw@0>aDie*1&rL6po=8MH#N#bU$giKG))8t$-8DyEwD_1lQ8*-sTir z35q^zZ_bg21nr4$t$|+sZ~tf&bcNknoUNNjnEv+N*r5xkO;VUiwWNRUG~F3JP3`Xu z4^k`|u1l_7HurF4*E|Wn8n@JR-MPEQf0}2<9dTfQTwM1MvS1PX%zq2Mxijpyt*(Pq zYwm|9**acgb6}UlS2xAK`@CguA)P^cq8!~~!L0J;>ofuL_VrFloU>P=uLhM=@pP51 z{+6~mk1eX9fWjqYQ_m%*g=ji4yHDVdsh|&$!_IsRv*Pz9RkZEM{9J+HfXBF)aM7z2TeA@jKI)gu^LtagU8AfURI@eVa~Fp5+gNLQgBJl| zRo7sb01LLyuLvhqpmV zUO7bxZ9~r??)2+ld|$;Mh|5~D6W~iQa@|q_pRmx*#qbP#`L?6PT0i{st`4clt7Yz8 zk$xeP->w*Gjsk4bkSwP*5&ja)wVGi+^RzaWljm{q#>kKQ1d@EqmjnXinm2XvP^ZN^W>qAZk;%maO2a zGVgsX76zx^M{E+5RP_4wDPrMjJ4d2@cNsaNSXQPYVxK)|01>5qj zw*tm>!l?R)_fO3TYnUNnF~?=!_-YRPagm;_N7Jp1Z_Pb~o;%zs;ORkSY0_23_04$K zs7X+bUOKCP-6su^=MZn-By$ZURtz}`_YZP(37gkRNGrxM55Mhs#qS4MBTWU^kV)$y zSzKPvMus}il$CZi5$^Kvow?~1nYdXmp%a(y255tn*RO3d6jFW(?x;t(u{_0l%__0& zTBM|jUbYAO)l}T`IEl~Q4UeI`k6*So-SL=hc)tFz9M$P(E|*Y<`xxxBk#q;z7KRhx z0&~~SsKcK4kVM!xU*<%a2G!=0yR6dg;~$^%et$CWoft*eF@Wn6Wtq;}p_WsLdbo)S zfngTvDgB>vJ7ruS55$zj52YFKy;w2tPxb!NuZG%Z=F^MDv?zXA_Tkn4M$tiy$ge2K zk~W0QBnn0~;3p{l_{92^rJZ}#^cMR?oW8$A=+&)e!+{umDCVgdL}yuz7dE8d4>fYSs&LnB?_RGPQoOO5WrD>m1s=ye zx;4HalfND{)$~%A)X{mS*th5WK_FaLm_5tk>aySeOvc|e(Bz>k=FR<)nP6n0zA5L+ea(+n0z08%Xerj(X`OOU>XRB% z2|Uw#8Q;ijqAFv6*?s&pt(5h(zWab`676&fLeIkXseT^ntY7zZ2lt}=?3^xUTlMT% z%$0I#W$`R`?shfph)>K~=Bk*#5GgqyZ+Ut=hQc31ehtH5-nm^=RSQcC?^DzEhtzm2 zwlvhuSrfGnTD2n$s6n`ZuG@QAMhocX%9gUXOA;Kg(+S z_>J7{_y{uEw~+S%pqA|q`~!;JRIcMFrN!bqJ?-GcT^AJF@|4O zq0(Y}x?-(1GF-#1BWkog!7ZsH?_xQ!M{>~KxCa+S*BOrYkJ!nWRLSt2S3KzL)=

    UGXoH-R2F_| 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π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 -#include -#include -#include - -#include -#include -#include - -// For I2S state management. -static i2s_parallel_state_t *i2s_state = NULL; - -// ESP32-S2,S3,C3 only has IS20 -// Original ESP32 has two I2S's, but we'll stick with the lowest common denominator. - -#ifdef ESP32_ORIG -static i2s_dev_t* I2S[I2S_NUM_MAX] = {&I2S0, &I2S1}; -#else -static i2s_dev_t* I2S[I2S_NUM_MAX] = {&I2S0}; -#endif - -callback shiftCompleteCallback; -void setShiftCompleteCallback(callback f) { - shiftCompleteCallback = f; -} - -volatile int previousBufferOutputLoopCount = 0; -volatile bool previousBufferFree = true; - -static void IRAM_ATTR irq_hndlr(void* arg) { // if we use I2S1 (default) - -//i2s_port_t port = *((i2s_port_t*) arg); - -/* Saves a few cycles, no need to cast void ptr to i2s_port_t and then check 120 times second... */ - SET_PERI_REG_BITS(I2S_INT_CLR_REG(ESP32_I2S_DEVICE), I2S_OUT_EOF_INT_CLR_V, 1, I2S_OUT_EOF_INT_CLR_S); - - previousBufferFree = true; - -/* - if(shiftCompleteCallback) { // we've defined a callback function ? - shiftCompleteCallback(); - } -*/ - -} // end irq_hndlr - - -// For peripheral setup and configuration -static inline int get_bus_width(i2s_parallel_cfg_bits_t width) { - switch(width) { - case I2S_PARALLEL_WIDTH_8: - return 8; - case I2S_PARALLEL_WIDTH_16: - return 16; - case I2S_PARALLEL_WIDTH_24: - return 24; - default: - return -ESP_ERR_INVALID_ARG; - } -} - -static void iomux_set_signal(int gpio, int signal) { - if(gpio < 0) { - return; - } - PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio], PIN_FUNC_GPIO); - gpio_set_direction(gpio, GPIO_MODE_DEF_OUTPUT); - gpio_matrix_out(gpio, signal, false, false); - - // More mA the better... - gpio_set_drive_capability((gpio_num_t)gpio, (gpio_drive_cap_t)3); - -} - -static void dma_reset(i2s_dev_t* dev) { - dev->lc_conf.in_rst = 1; - dev->lc_conf.in_rst = 0; - dev->lc_conf.out_rst = 1; - dev->lc_conf.out_rst = 0; - - dev->lc_conf.ahbm_rst = 1; - dev->lc_conf.ahbm_rst = 0; - - -} - -static void fifo_reset(i2s_dev_t* dev) { - dev->conf.rx_fifo_reset = 1; - -#ifdef ESP32_SXXX - while(dev->conf.rx_fifo_reset_st); // esp32-s2 only -#endif - dev->conf.rx_fifo_reset = 0; - - dev->conf.tx_fifo_reset = 1; -#ifdef ESP32_SXXX - while(dev->conf.tx_fifo_reset_st); // esp32-s2 only -#endif - - dev->conf.tx_fifo_reset = 0; -} - -static void dev_reset(i2s_dev_t* dev) { - fifo_reset(dev); - dma_reset(dev); - dev->conf.rx_reset=1; - dev->conf.tx_reset=1; - dev->conf.rx_reset=0; - dev->conf.tx_reset=0; -} - -// DMA Linked List -// Size must be less than DMA_MAX - need to handle breaking long transfer into two descriptors before call -// DMA_MAX by the way is the maximum data packet size you can hold in one chunk -void link_dma_desc(volatile lldesc_t *dmadesc, volatile lldesc_t *prevdmadesc, void *memory, size_t size) -{ - if(size > DMA_MAX) size = DMA_MAX; - - dmadesc->size = size; - dmadesc->length = size; - dmadesc->buf = memory; - dmadesc->eof = 0; - dmadesc->sosf = 0; - dmadesc->owner = 1; - dmadesc->qe.stqe_next = 0; // will need to set this elsewhere - dmadesc->offset = 0; - - // link previous to current - if(prevdmadesc) - prevdmadesc->qe.stqe_next = (lldesc_t*)dmadesc; -} - - - -esp_err_t i2s_parallel_driver_install(i2s_port_t port, i2s_parallel_config_t* conf) { - - //port = I2S_NUM_0; /// override. - - if(port < I2S_NUM_0 || port >= I2S_NUM_MAX) { - return ESP_ERR_INVALID_ARG; - } - if(conf->sample_width < I2S_PARALLEL_WIDTH_8 || conf->sample_width >= I2S_PARALLEL_WIDTH_MAX) { - return ESP_ERR_INVALID_ARG; - } - if(conf->sample_rate > I2S_PARALLEL_CLOCK_HZ || conf->sample_rate < 1) { - return ESP_ERR_INVALID_ARG; - } - uint32_t clk_div_main = I2S_PARALLEL_CLOCK_HZ / conf->sample_rate / i2s_parallel_get_memory_width(port, conf->sample_width); - if(clk_div_main < 2 || clk_div_main > 0xFF) { - return ESP_ERR_INVALID_ARG; - } - - volatile int iomux_signal_base; - volatile int iomux_clock; - int irq_source; - - // Initialize I2S0 peripheral - if (port == I2S_NUM_0) { - periph_module_reset(PERIPH_I2S0_MODULE); - periph_module_enable(PERIPH_I2S0_MODULE); - iomux_clock = I2S0O_WS_OUT_IDX; - irq_source = ETS_I2S0_INTR_SOURCE; - - switch(conf->sample_width) { - case I2S_PARALLEL_WIDTH_8: - case I2S_PARALLEL_WIDTH_16: - iomux_signal_base = I2S0O_DATA_OUT8_IDX; - break; - case I2S_PARALLEL_WIDTH_24: - iomux_signal_base = I2S0O_DATA_OUT0_IDX; - break; - case I2S_PARALLEL_WIDTH_MAX: - return ESP_ERR_INVALID_ARG; - } - } -#ifdef ESP32_ORIG - // Can't compile if I2S1 if it doesn't exist with that hardware's IDF.... - else { -// I2S = &I2S1; - - periph_module_reset(PERIPH_I2S1_MODULE); - periph_module_enable(PERIPH_I2S1_MODULE); - iomux_clock = I2S1O_WS_OUT_IDX; - irq_source = ETS_I2S1_INTR_SOURCE; - - switch(conf->sample_width) { - case I2S_PARALLEL_WIDTH_16: - iomux_signal_base = I2S1O_DATA_OUT8_IDX; - break; - case I2S_PARALLEL_WIDTH_8: - case I2S_PARALLEL_WIDTH_24: - iomux_signal_base = I2S1O_DATA_OUT0_IDX; - break; - case I2S_PARALLEL_WIDTH_MAX: - return ESP_ERR_INVALID_ARG; - } - } -#endif - - // Setup GPIOs - int bus_width = get_bus_width(conf->sample_width); - - // Setup I2S peripheral - i2s_dev_t* dev = I2S[port]; - //dev_reset(dev); - - - // Setup GPIO's - for(int i = 0; i < bus_width; i++) { - iomux_set_signal(conf->gpio_bus[i], iomux_signal_base + i); - } - iomux_set_signal(conf->gpio_clk, iomux_clock); - - // invert clock phase if required - if (conf->clkphase) - GPIO.func_out_sel_cfg[conf->gpio_clk].inv_sel = 1; - - // Setup i2s clock - dev->sample_rate_conf.val = 0; - - // Third stage config, width of data to be written to IO (I think this should always be the actual data width?) - dev->sample_rate_conf.rx_bits_mod = bus_width; - dev->sample_rate_conf.tx_bits_mod = bus_width; - - dev->sample_rate_conf.rx_bck_div_num = 2; - dev->sample_rate_conf.tx_bck_div_num = 2; - - // Clock configuration - dev->clkm_conf.val=0; // Clear the clkm_conf struct - -#ifdef ESP32_SXXX - dev->clkm_conf.clk_sel = 2; // esp32-s2 only - dev->clkm_conf.clk_en = 1; -#endif - -#ifdef ESP32_ORIG - dev->clkm_conf.clka_en=0; // Use the 160mhz system clock (PLL_D2_CLK) when '0' -#endif - - dev->clkm_conf.clkm_div_b=0; // Clock numerator - dev->clkm_conf.clkm_div_a=1; // Clock denominator - - - // Note: clkm_div_num must only be set here AFTER clkm_div_b, clkm_div_a, etc. Or weird things happen! - // On original ESP32, max I2S DMA parallel speed is 20Mhz. - dev->clkm_conf.clkm_div_num = clk_div_main; - - - // I2S conf2 reg - dev->conf2.val = 0; - dev->conf2.lcd_en = 1; - dev->conf2.lcd_tx_wrx2_en=0; - dev->conf2.lcd_tx_sdx2_en=0; - - // I2S conf reg - dev->conf.val = 0; - -#ifdef ESP32_SXXX - dev->conf.tx_dma_equal=1; // esp32-s2 only - dev->conf.pre_req_en=1; // esp32-s2 only - enable I2S to prepare data earlier? wtf? -#endif - - // Now start setting up DMA FIFO - dev->fifo_conf.val = 0; - dev->fifo_conf.rx_data_num = 32; // Thresholds. - dev->fifo_conf.tx_data_num = 32; - dev->fifo_conf.dscr_en = 1; - -#ifdef ESP32_ORIG - - // Enable "One datum will be written twice in LCD mode" - for some reason, - // if we don't do this in 8-bit mode, data is updated on half-clocks not clocks - if(conf->sample_width == I2S_PARALLEL_WIDTH_8) - dev->conf2.lcd_tx_wrx2_en=1; - - // Not really described for non-pcm modes, although datasheet states it should be set correctly even for LCD mode - // First stage config. Configures how data is loaded into fifo - if(conf->sample_width == I2S_PARALLEL_WIDTH_24) { - // Mode 0, single 32-bit channel, linear 32 bit load to fifo - dev->fifo_conf.tx_fifo_mod = 3; - } else { - // Mode 1, single 16-bit channel, load 16 bit sample(*) into fifo and pad to 32 bit with zeros - // *Actually a 32 bit read where two samples are read at once. Length of fifo must thus still be word-aligned - dev->fifo_conf.tx_fifo_mod = 1; - } - - // Dictated by ESP32 datasheet - dev->fifo_conf.rx_fifo_mod_force_en = 1; - dev->fifo_conf.tx_fifo_mod_force_en = 1; - - // Second stage config - dev->conf_chan.val = 0; - - // 16-bit single channel data - dev->conf_chan.tx_chan_mod = 1; - dev->conf_chan.rx_chan_mod = 1; - -#endif - - - // Device Reset - dev_reset(dev); - dev->conf1.val = 0; - dev->conf1.tx_stop_en = 0; - - // Allocate I2S status structure for buffer swapping stuff - i2s_state = (i2s_parallel_state_t*) malloc(sizeof(i2s_parallel_state_t)); - assert(i2s_state != NULL); - i2s_parallel_state_t *state = i2s_state; - - state->desccount_a = conf->desccount_a; - state->desccount_b = conf->desccount_b; - state->dmadesc_a = conf->lldesc_a; - state->dmadesc_b = conf->lldesc_b; - state->i2s_interrupt_port_arg = port; // need to keep this somewhere in static memory for the ISR - - dev->timing.val = 0; - - // We using the double buffering switch logic? - if (conf->int_ena_out_eof) - { - // Get ISR setup - esp_err_t err = esp_intr_alloc(irq_source, - (int)(ESP_INTR_FLAG_IRAM | ESP_INTR_FLAG_LEVEL1), - irq_hndlr, - &state->i2s_interrupt_port_arg, NULL); - - if(err) { - return err; - } - - - // Setup interrupt handler which is focussed only on the (page 322 of Tech. Ref. Manual) - // "I2S_OUT_EOF_INT: Triggered when rxlink has finished sending a packet" - // ... whatever the hell that is supposed to mean... One massive linked list? So all pixels in the chain? - dev->int_ena.out_eof = 1; - } - - return ESP_OK; -} - - esp_err_t i2s_parallel_stop_dma(i2s_port_t port) { - if(port < I2S_NUM_0 || port >= I2S_NUM_MAX) { - return ESP_ERR_INVALID_ARG; - } - - i2s_dev_t* dev = I2S[port]; - - // Stop all ongoing DMA operations - dev->out_link.stop = 1; - dev->out_link.start = 0; - dev->conf.tx_start = 0; - - return ESP_OK; -} - - - esp_err_t i2s_parallel_send_dma(i2s_port_t port, lldesc_t* dma_descriptor) { - if(port < I2S_NUM_0 || port >= I2S_NUM_MAX) { - return ESP_ERR_INVALID_ARG; - } - - i2s_dev_t* dev = I2S[port]; - - - // Configure DMA burst mode - dev->lc_conf.val = I2S_OUT_DATA_BURST_EN | I2S_OUTDSCR_BURST_EN; - - // Set address of DMA descriptor - dev->out_link.addr = (uint32_t) dma_descriptor; - - // Start DMA operation - dev->out_link.stop = 0; - dev->out_link.start = 1; - - dev->conf.tx_start = 1; - - return ESP_OK; -} -/* -i2s_dev_t* i2s_parallel_get_dev(i2s_port_t port) { - if(port < I2S_NUM_0 || port >= I2S_NUM_MAX) { - return NULL; - } - -#ifdef ESP32_ORIG -if (port == I2S_NUM_1) - return &I2S1; -#endif - - return I2S0; // HARCODE THIS TO RETURN &I2S0 -} -*/ -// Double buffering flipping -// Flip to a buffer: 0 for bufa, 1 for bufb -// dmadesc_a and dmadesc_b point to the same memory if double buffering isn't enabled. -void i2s_parallel_flip_to_buffer(i2s_port_t port, int buffer_id) { - - if (i2s_state == NULL) { - return; // :-() - } - - lldesc_t *active_dma_chain; - if (buffer_id == 0) { - active_dma_chain=(lldesc_t*)&i2s_state->dmadesc_a[0]; - } else { - active_dma_chain=(lldesc_t*)&i2s_state->dmadesc_b[0]; - } - - // setup linked list to refresh from new buffer (continuously) when the end of the current list has been reached - i2s_state->dmadesc_a[i2s_state->desccount_a-1].qe.stqe_next = active_dma_chain; - i2s_state->dmadesc_b[i2s_state->desccount_b-1].qe.stqe_next = active_dma_chain; - - // we're still shifting out the buffer, so it shouldn't be written to yet. - //previousBufferFree = false; - i2s_parallel_set_previous_buffer_not_free(); -} - -bool i2s_parallel_is_previous_buffer_free() { - return previousBufferFree; -} - - -void i2s_parallel_set_previous_buffer_not_free() { - previousBufferFree = false; - previousBufferOutputLoopCount = 0; -} diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/esp32_i2s_parallel_dma.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/esp32_i2s_parallel_dma.h deleted file mode 100644 index d7678bc..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/esp32_i2s_parallel_dma.h +++ /dev/null @@ -1,106 +0,0 @@ -#pragma once -/* - * ESP32_I2S_PARALLEL_DMA - */ - -#pragma once - -#if defined(ESP32) || defined(IDF_VER) - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -#include -#include -#include -//#include -//#include -#include -#include - - -// Get MCU Type and Max CLK Hz for MCU -#include - -typedef enum { - I2S_PARALLEL_WIDTH_8, - I2S_PARALLEL_WIDTH_16, - I2S_PARALLEL_WIDTH_24, - I2S_PARALLEL_WIDTH_MAX -} i2s_parallel_cfg_bits_t; - -typedef struct { - int gpio_bus[24]; // The parallel GPIOs to use, set gpio to -1 to disable - int gpio_clk; - int sample_rate; // 'clockspeed' - int sample_width; - int desccount_a; - lldesc_t * lldesc_a; - int desccount_b; // only used with double buffering - lldesc_t * lldesc_b; // only used with double buffering - bool clkphase; // Clock signal phase - bool int_ena_out_eof; // Do we raise an interrupt every time the DMA output loops? Don't do this unless we're doing double buffering! -} i2s_parallel_config_t; - -static inline int i2s_parallel_get_memory_width(i2s_port_t port, i2s_parallel_cfg_bits_t width) { - switch(width) { - case I2S_PARALLEL_WIDTH_8: - -#ifdef ESP32_ORIG - // Only I2S1 on the legacy ESP32 WROOM MCU supports space saving single byte 8 bit parallel access - if(port == I2S_NUM_1) { - return 1; - } else { - return 2; - } -#else - return 1; -#endif - - case I2S_PARALLEL_WIDTH_16: - return 2; - case I2S_PARALLEL_WIDTH_24: - return 4; - default: - return -ESP_ERR_INVALID_ARG; - } -} - -// DMA Linked List Creation -void link_dma_desc(volatile lldesc_t *dmadesc, volatile lldesc_t *prevdmadesc, void *memory, size_t size); - -// I2S DMA Peripheral Setup Functions -esp_err_t i2s_parallel_driver_install(i2s_port_t port, i2s_parallel_config_t* conf); -esp_err_t i2s_parallel_send_dma(i2s_port_t port, lldesc_t* dma_descriptor); -esp_err_t i2s_parallel_stop_dma(i2s_port_t port); -//i2s_dev_t* i2s_parallel_get_dev(i2s_port_t port); - -// For frame buffer flipping / double buffering -typedef struct { - volatile lldesc_t *dmadesc_a, *dmadesc_b; - int desccount_a, desccount_b; - i2s_port_t i2s_interrupt_port_arg; -} i2s_parallel_state_t; - -void i2s_parallel_flip_to_buffer(i2s_port_t port, int bufid); -bool i2s_parallel_is_previous_buffer_free(); -void i2s_parallel_set_previous_buffer_not_free(); - -// Callback function for when whole length of DMA chain has been sent out. -typedef void (*callback)(void); -void setShiftCompleteCallback(callback f); - - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/esp32_i2s_parallel_mcu_def.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/esp32_i2s_parallel_mcu_def.h deleted file mode 100644 index dd276da..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/esp32_i2s_parallel_mcu_def.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -/* Abstract the Espressif IDF ESP32 MCU variant compile-time defines - * into another list for the purposes of this library. - * - * i.e. I couldn't be bothered having to update the library when they - * release the ESP32S4,5,6,7, n+1 etc. if they are all fundamentally - * the same architecture. - */ -#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 - - #define ESP32_SXXX 1 - #define ESP32_I2S_DEVICE I2S_NUM_0 - - #define I2S_PARALLEL_CLOCK_HZ 160000000L - #define DMA_MAX (4096-4) - -#elif CONFIG_IDF_TARGET_ESP32 || defined(ESP32) - - // 2016 model that started it all, and this library. The best. - #define ESP32_ORIG 1 - #define ESP32_I2S_DEVICE I2S_NUM_0 - - #define I2S_PARALLEL_CLOCK_HZ 80000000L - #define DMA_MAX (4096-4) - -#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 - - #error "ESPC-series RISC-V MCU's do not support parallel DMA and not supported by this library!" - #define ESP32_CXXX 1 - -#else - #error "ERROR: No ESP32 or ESP32 Espressif IDF detected at compile time." - -#endif \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/1_SimpleTestShapes/1_SimpleTestShapes.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/1_SimpleTestShapes/1_SimpleTestShapes.ino deleted file mode 100644 index db3b0d1..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/1_SimpleTestShapes/1_SimpleTestShapes.ino +++ /dev/null @@ -1,166 +0,0 @@ - -// Example sketch which shows how to display some patterns -// on a 64x32 LED matrix -// - -#include - - -#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. -#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. -#define PANEL_CHAIN 1 // Total number of panels chained one to another - -//MatrixPanel_I2S_DMA dma_display; -MatrixPanel_I2S_DMA *dma_display = nullptr; - -uint16_t myBLACK = dma_display->color565(0, 0, 0); -uint16_t myWHITE = dma_display->color565(255, 255, 255); -uint16_t myRED = dma_display->color565(255, 0, 0); -uint16_t myGREEN = dma_display->color565(0, 255, 0); -uint16_t myBLUE = dma_display->color565(0, 0, 255); - - - -// Input a value 0 to 255 to get a color value. -// The colours are a transition r - g - b - back to r. -// From: https://gist.github.com/davidegironi/3144efdc6d67e5df55438cc3cba613c8 -uint16_t colorWheel(uint8_t pos) { - if(pos < 85) { - return dma_display->color565(pos * 3, 255 - pos * 3, 0); - } else if(pos < 170) { - pos -= 85; - return dma_display->color565(255 - pos * 3, 0, pos * 3); - } else { - pos -= 170; - return dma_display->color565(0, pos * 3, 255 - pos * 3); - } -} - -void drawText(int colorWheelOffset) -{ - - // draw text with a rotating colour - dma_display->setTextSize(1); // size 1 == 8 pixels high - dma_display->setTextWrap(false); // Don't wrap at end of line - will do ourselves - - dma_display->setCursor(5, 0); // start at top left, with 8 pixel of spacing - uint8_t w = 0; - const char *str = "ESP32 DMA"; - for (w=0; wsetTextColor(colorWheel((w*32)+colorWheelOffset)); - dma_display->print(str[w]); - } - - dma_display->println(); - dma_display->print(" "); - for (w=9; w<18; w++) { - dma_display->setTextColor(colorWheel((w*32)+colorWheelOffset)); - dma_display->print("*"); - } - - dma_display->println(); - - dma_display->setTextColor(dma_display->color444(15,15,15)); - dma_display->println("LED MATRIX!"); - - // print each letter with a fixed rainbow color - dma_display->setTextColor(dma_display->color444(0,8,15)); - dma_display->print('3'); - dma_display->setTextColor(dma_display->color444(15,4,0)); - dma_display->print('2'); - dma_display->setTextColor(dma_display->color444(15,15,0)); - dma_display->print('x'); - dma_display->setTextColor(dma_display->color444(8,15,0)); - dma_display->print('6'); - dma_display->setTextColor(dma_display->color444(8,0,15)); - dma_display->print('4'); - - // Jump a half character - dma_display->setCursor(34, 24); - dma_display->setTextColor(dma_display->color444(0,15,15)); - dma_display->print("*"); - dma_display->setTextColor(dma_display->color444(15,0,0)); - dma_display->print('R'); - dma_display->setTextColor(dma_display->color444(0,15,0)); - dma_display->print('G'); - dma_display->setTextColor(dma_display->color444(0,0,15)); - dma_display->print("B"); - dma_display->setTextColor(dma_display->color444(15,0,8)); - dma_display->println("*"); - -} - - -void setup() { - - // Module configuration - HUB75_I2S_CFG mxconfig( - PANEL_RES_X, // module width - PANEL_RES_Y, // module height - PANEL_CHAIN // Chain length - ); - - mxconfig.gpio.e = 18; - mxconfig.clkphase = false; - mxconfig.driver = HUB75_I2S_CFG::FM6126A; - - // Display Setup - dma_display = new MatrixPanel_I2S_DMA(mxconfig); - dma_display->begin(); - dma_display->setBrightness8(90); //0-255 - dma_display->clearScreen(); - dma_display->fillScreen(myWHITE); - - // fix the screen with green - dma_display->fillRect(0, 0, dma_display->width(), dma_display->height(), dma_display->color444(0, 15, 0)); - delay(500); - - // draw a box in yellow - dma_display->drawRect(0, 0, dma_display->width(), dma_display->height(), dma_display->color444(15, 15, 0)); - delay(500); - - // draw an 'X' in red - dma_display->drawLine(0, 0, dma_display->width()-1, dma_display->height()-1, dma_display->color444(15, 0, 0)); - dma_display->drawLine(dma_display->width()-1, 0, 0, dma_display->height()-1, dma_display->color444(15, 0, 0)); - delay(500); - - // draw a blue circle - dma_display->drawCircle(10, 10, 10, dma_display->color444(0, 0, 15)); - delay(500); - - // fill a violet circle - dma_display->fillCircle(40, 21, 10, dma_display->color444(15, 0, 15)); - delay(500); - - // fill the screen with 'black' - dma_display->fillScreen(dma_display->color444(0, 0, 0)); - - //drawText(0); - -} - -uint8_t wheelval = 0; -void loop() { - - // animate by going through the colour wheel for the first two lines - drawText(wheelval); - wheelval +=1; - - delay(20); -/* - drawText(0); - delay(2000); - dma_display->clearScreen(); - dma_display->fillScreen(myBLACK); - delay(2000); - dma_display->fillScreen(myBLUE); - delay(2000); - dma_display->fillScreen(myRED); - delay(2000); - dma_display->fillScreen(myGREEN); - delay(2000); - dma_display->fillScreen(myWHITE); - dma_display->clearScreen(); - */ - -} diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/2_PatternPlasma/2_PatternPlasma.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/2_PatternPlasma/2_PatternPlasma.ino deleted file mode 100644 index 65f85b9..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/2_PatternPlasma/2_PatternPlasma.ino +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Portions of this code are adapted from Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from LedEffects Plasma by Robert Atkins: https://bitbucket.org/ratkins/ledeffects/src/26ed3c51912af6fac5f1304629c7b4ab7ac8ca4b/Plasma.cpp?at=default - * Copyright (c) 2013 Robert Atkins - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - -// HUB75E pinout -// R1 | G1 -// B1 | GND -// R2 | G2 -// B2 | E -// A | B -// C | D -// CLK| LAT -// OE | GND - -/* Default library pin configuration for the reference - you can redefine only ones you need later on object creation - -#define R1 25 -#define G1 26 -#define BL1 27 -#define R2 14 -#define G2 12 -#define BL2 13 -#define CH_A 23 -#define CH_B 19 -#define CH_C 5 -#define CH_D 17 -#define CH_E -1 // assign to any available pin if using two panels or 64x64 panels with 1/32 scan -#define CLK 16 -#define LAT 4 -#define OE 15 - -*/ - - -#include -#include - -// Configure for your panel(s) as appropriate! -#define PANEL_WIDTH 64 -#define PANEL_HEIGHT 64 // Panel height of 64 will required PIN_E to be defined. -#define PANELS_NUMBER 2 // Number of chained panels, if just a single panel, obviously set to 1 -#define PIN_E 32 - -#define PANE_WIDTH PANEL_WIDTH * PANELS_NUMBER -#define PANE_HEIGHT PANEL_HEIGHT - - -// placeholder for the matrix object -MatrixPanel_I2S_DMA *dma_display = nullptr; - - -uint16_t time_counter = 0, cycles = 0, fps = 0; -unsigned long fps_timer; - -CRGB currentColor; -CRGBPalette16 palettes[] = {HeatColors_p, LavaColors_p, RainbowColors_p, RainbowStripeColors_p, CloudColors_p}; -CRGBPalette16 currentPalette = palettes[0]; - - -CRGB ColorFromCurrentPalette(uint8_t index = 0, uint8_t brightness = 255, TBlendType blendType = LINEARBLEND) { - return ColorFromPalette(currentPalette, index, brightness, blendType); -} - -void setup() { - - Serial.begin(115200); - - Serial.println(F("*****************************************************")); - Serial.println(F("* ESP32-HUB75-MatrixPanel-I2S-DMA DEMO *")); - Serial.println(F("*****************************************************")); - - /* - The configuration for MatrixPanel_I2S_DMA object is held in HUB75_I2S_CFG structure, - pls refer to the lib header file for full details. - All options has it's predefined default values. So we can create a new structure and redefine only the options we need - - // those are the defaults - mxconfig.mx_width = 64; // physical width of a single matrix panel module (in pixels, usually it is always 64 ;) ) - mxconfig.mx_height = 32; // physical height of a single matrix panel module (in pixels, usually almost always it is either 32 or 64) - mxconfig.chain_length = 1; // number of chained panels regardless of the topology, default 1 - a single matrix module - mxconfig.gpio.r1 = R1; // pin mappings - mxconfig.gpio.g1 = G1; - mxconfig.gpio.b1 = B1; // etc - mxconfig.driver = HUB75_I2S_CFG::SHIFT; // shift reg driver, default is plain shift register - mxconfig.double_buff = false; // use double buffer (twice amount of RAM required) - mxconfig.i2sspeed = HUB75_I2S_CFG::HZ_10M;// I2S clock speed, better leave as-is unless you want to experiment - */ - - /* - For example we have two 64x64 panels chained, so we need to customize our setup like this - - */ - HUB75_I2S_CFG mxconfig; - mxconfig.mx_height = PANEL_HEIGHT; // we have 64 pix heigh panels - mxconfig.chain_length = PANELS_NUMBER; // we have 2 panels chained - mxconfig.gpio.e = PIN_E; // we MUST assign pin e to some free pin on a board to drive 64 pix height panels with 1/32 scan - //mxconfig.driver = HUB75_I2S_CFG::FM6126A; // in case that we use panels based on FM6126A chip, we can change that - - /* - //Another way of creating config structure - //Custom pin mapping for all pins - HUB75_I2S_CFG::i2s_pins _pins={R1, G1, BL1, R2, G2, BL2, CH_A, CH_B, CH_C, CH_D, CH_E, LAT, OE, CLK}; - HUB75_I2S_CFG mxconfig( - 64, // width - 64, // height - 4, // chain length - _pins, // pin mapping - HUB75_I2S_CFG::FM6126A // driver chip - ); - - */ - - - // OK, now we can create our matrix object - dma_display = new MatrixPanel_I2S_DMA(mxconfig); - - // let's adjust default brightness to about 75% - dma_display->setBrightness8(192); // range is 0-255, 0 - 0%, 255 - 100% - - // Allocate memory and start DMA display - if( not dma_display->begin() ) - Serial.println("****** !KABOOM! I2S memory allocation failed ***********"); - - // well, hope we are OK, let's draw some colors first :) - Serial.println("Fill screen: RED"); - dma_display->fillScreenRGB888(255, 0, 0); - delay(1000); - - Serial.println("Fill screen: GREEN"); - dma_display->fillScreenRGB888(0, 255, 0); - delay(1000); - - Serial.println("Fill screen: BLUE"); - dma_display->fillScreenRGB888(0, 0, 255); - delay(1000); - - Serial.println("Fill screen: Neutral White"); - dma_display->fillScreenRGB888(64, 64, 64); - delay(1000); - - Serial.println("Fill screen: black"); - dma_display->fillScreenRGB888(0, 0, 0); - delay(1000); - - - // Set current FastLED palette - currentPalette = RainbowColors_p; - Serial.println("Starting plasma effect..."); - fps_timer = millis(); -} - -void loop() { - - for (int x = 0; x < PANE_WIDTH; x++) { - for (int y = 0; y < PANE_HEIGHT; y++) { - int16_t v = 0; - uint8_t wibble = sin8(time_counter); - v += sin16(x * wibble * 3 + time_counter); - v += cos16(y * (128 - wibble) + time_counter); - v += sin16(y * x * cos8(-time_counter) / 8); - - currentColor = ColorFromPalette(currentPalette, (v >> 8) + 127); //, brightness, currentBlendType); - dma_display->drawPixelRGB888(x, y, currentColor.r, currentColor.g, currentColor.b); - } - } - - ++time_counter; - ++cycles; - ++fps; - - if (cycles >= 1024) { - time_counter = 0; - cycles = 0; - currentPalette = palettes[random(0,sizeof(palettes)/sizeof(palettes[0]))]; - } - - // print FPS rate every 5 seconds - // Note: this is NOT a matrix refresh rate, it's the number of data frames being drawn to the DMA buffer per second - if (fps_timer + 5000 < millis()){ - Serial.printf_P(PSTR("Effect fps: %d\n"), fps/5); - fps_timer = millis(); - fps = 0; - } -} // end loop \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/2_PatternPlasma/PatternWave.jpg b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/2_PatternPlasma/PatternWave.jpg deleted file mode 100644 index e6ce3c3bc956113dcd3e8837aa3bad1e5db244a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34981 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 e|GWzgVfs64ftQ|R2lC%Ijv;Pm_ML6LA diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/2_PatternPlasma/README.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/2_PatternPlasma/README.md deleted file mode 100644 index 172a99f..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/2_PatternPlasma/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Wave Pattern - -Demo of the colours, and the little flicker. - -![It's better in real life](PatternWave.jpg) diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/3_FM6126Panel.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/3_FM6126Panel.ino deleted file mode 100644 index 3b706e1..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/3_FM6126Panel.ino +++ /dev/null @@ -1,102 +0,0 @@ -// How to use this library with a FM6126 panel, thanks goes to: -// https://github.com/hzeller/rpi-rgb-led-matrix/issues/746 - -#include -#include -#include - -//////////////////////////////////////////////////////////////////// -// FM6126 support is still experimental - -// Output resolution and panel chain length configuration -#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. -#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. -#define PANEL_CHAIN 1 // Total number of panels chained one to another - - -// placeholder for the matrix object -MatrixPanel_I2S_DMA *dma_display = nullptr; - -/////////////////////////////////////////////////////////////// - -// FastLED variables for pattern output -uint16_t time_counter = 0, cycles = 0, fps = 0; -unsigned long fps_timer; - -CRGB currentColor; -CRGBPalette16 palettes[] = {HeatColors_p, LavaColors_p, RainbowColors_p, RainbowStripeColors_p, CloudColors_p}; -CRGBPalette16 currentPalette = palettes[0]; - - -CRGB ColorFromCurrentPalette(uint8_t index = 0, uint8_t brightness = 255, TBlendType blendType = LINEARBLEND) { - return ColorFromPalette(currentPalette, index, brightness, blendType); -} - -void setup(){ - - /* - The configuration for MatrixPanel_I2S_DMA object is held in HUB75_I2S_CFG structure, - All options has it's predefined default values. So we can create a new structure and redefine only the options we need - - Please refer to the '2_PatternPlasma.ino' example for detailed example of how to use the MatrixPanel_I2S_DMA configuration - if you need to change the pin mappings etc. - */ - - HUB75_I2S_CFG mxconfig( - PANEL_RES_X, // module width - PANEL_RES_Y, // module height - PANEL_CHAIN // Chain length - ); - - mxconfig.driver = HUB75_I2S_CFG::FM6126A; // in case that we use panels based on FM6126A chip, we can set it here before creating MatrixPanel_I2S_DMA object - - // OK, now we can create our matrix object - dma_display = new MatrixPanel_I2S_DMA(mxconfig); - - // If you experience ghosting, you will need to reduce the brightness level, not all RGB Matrix - // Panels are the same - some seem to display ghosting artefacts at lower brightness levels. - // In the setup() function do something like: - - // let's adjust default brightness to about 75% - dma_display->setBrightness8(192); // range is 0-255, 0 - 0%, 255 - 100% - - // Allocate memory and start DMA display - if( not dma_display->begin() ) - Serial.println("****** !KABOOM! Insufficient memory - allocation failed ***********"); - - fps_timer = millis(); - -} - -void loop(){ - for (int x = 0; x < dma_display->width(); x++) { - for (int y = 0; y < dma_display->height(); y++) { - int16_t v = 0; - uint8_t wibble = sin8(time_counter); - v += sin16(x * wibble * 3 + time_counter); - v += cos16(y * (128 - wibble) + time_counter); - v += sin16(y * x * cos8(-time_counter) / 8); - - currentColor = ColorFromPalette(currentPalette, (v >> 8) + 127); //, brightness, currentBlendType); - dma_display->drawPixelRGB888(x, y, currentColor.r, currentColor.g, currentColor.b); - } - } - - ++time_counter; - ++cycles; - ++fps; - - if (cycles >= 1024) { - time_counter = 0; - cycles = 0; - currentPalette = palettes[random(0,sizeof(palettes)/sizeof(palettes[0]))]; - } - - // print FPS rate every 5 seconds - // Note: this is NOT a matrix refresh rate, it's the number of data frames being drawn to the DMA buffer per second - if (fps_timer + 5000 < millis()){ - Serial.printf_P(PSTR("Effect fps: %d\n"), fps/5); - fps_timer = millis(); - fps = 0; - } -} \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/FM6126A.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/FM6126A.md deleted file mode 100644 index 1641c16..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/FM6126A.md +++ /dev/null @@ -1,51 +0,0 @@ -## The mystery of control registers for FM6126A chips - - -The only available Datasheet for this chips is in Chinese and does not shed a light on what those two control regs are. - -An excellent insight could be found here https://github.com/hzeller/rpi-rgb-led-matrix/issues/746#issuecomment-453860510 - - - -So there are two regs in this chip - **REG1** and **REG2**, -one could be written with 12 clock pulses (and usually called reg12, dunno why :)) -the other one could be written with 13 clock pulses (and usually called reg13, dunno why :)) - - -I've done some measurements on power consumption while toggling bits of **REG1** and it looks that it could provide a fine grained brightness control over the entire matrix with no need for bitbanging over RGB or EO pins. -There are 6 bits (6 to 11) giving an increased brightness (compared to all-zeroes) and 4 bits (2-5) giving decreased brightness!!! -Still unclear if FM6112A brightness control is internally PWMed or current limited, might require some poking with oscilloscope. - -So it seems that the most bright (and hungry for power) value is bool REG1[16] = {0,0,0,0,0, 1,1,1,1,1,1, 0,0,0,0,0}; and not {0,1,1,1,1, 1,1,1,1,1,1, 1,1,1,1,1} as it is usually used. -I'm not sure about bit 1 - it is either not used or I was unable to measure it's influence to brightness/power. - -Giving at least 10 bits of hardware brightness control opens pretty nice options for offloading and simplifying matrix output. Should dig into this more deeper. - -Here are some of the measurements I've took for 2 64x64 panels filled with white color - reg value and corresponding current drain in amps. - - -|REG1 |bit value|Current, amps | -|--|--|--| -|REG1| 0111111 00000| >5 amps| -|REG1| 0100010 00000| 3.890 amp| -|REG1| 0100000 00000| 3.885 amp| -|REG1| 0011110 00000| 3.640 amp| -|REG1| 0011100 00000| 3.620 amp| -|REG1| 0011000 00000| 3.240 amp| -|REG1| 0010010 00000| 2.520 amp| -|REG1| 0010001 00000| 2.518 amp| -|REG1| 0010001 10000| 2.493 amp| -|REG1| 0010000 00000| 2.490 amp| -|REG1| 0010000 11110| 2.214 amp| -|REG1| 0001100 00000| 2.120 amp| -|REG1| 0001000 00000| 1.750 amp| -|REG1| 0000100 00000| 1.375 amp| -|REG1| 0000010 00000| 1.000 amp| -|REG1| **0000000 00000**| 0.995 amp| -|REG1| 0000001 11111| 0.700 amp| -|REG1| 0000000 01111| 0.690 amp| -|REG1| 0000000 10000| 0.690 amp| -|REG1| 0000000 11110| 0.686 amp| - - -/Vortigont/ \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/README.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/README.md deleted file mode 100644 index 65019e6..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/3_FM6126Panel/README.md +++ /dev/null @@ -1,3 +0,0 @@ -## FM6126 based LED Matrix Panel Reset ## - -FM6216 panels require a special reset sequence before they can be used, check your panel chipset if you have issues. Refer to this example. diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/AnimatedGIFPanel.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/AnimatedGIFPanel.ino deleted file mode 100644 index 4e79ff1..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/AnimatedGIFPanel.ino +++ /dev/null @@ -1,294 +0,0 @@ -// Example sketch which shows how to display a 64x32 animated GIF image stored in FLASH memory -// on a 64x32 LED matrix -// -// Credits: https://github.com/bitbank2/AnimatedGIF/tree/master/examples/ESP32_LEDMatrix_I2S -// - -/* INSTRUCTIONS - * - * 1. First Run the 'ESP32 Sketch Data Upload Tool' in Arduino from the 'Tools' Menu. - * - If you don't know what this is or see it as an option, then read this: - * https://github.com/me-no-dev/arduino-esp32fs-plugin - * - This tool will upload the contents of the data/ directory in the sketch folder onto - * the ESP32 itself. - * - * 2. You can drop any animated GIF you want in there, but keep it to the resolution of the - * MATRIX you're displaying to. To resize a gif, use this online website: https://ezgif.com/ - * - * 3. Have fun. - */ - -#define FILESYSTEM SPIFFS -#include -#include -#include - -// ---------------------------- - -/* - * Below is an is the 'legacy' way of initialising the MatrixPanel_I2S_DMA class. - * i.e. MATRIX_WIDTH and MATRIX_HEIGHT are modified by compile-time directives. - * By default the library assumes a single 64x32 pixel panel is connected. - * - * Refer to the example '2_PatternPlasma' on the new / correct way to setup this library - * for different resolutions / panel chain lengths within the sketch 'setup()'. - * - */ - -#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. -#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. -#define PANEL_CHAIN 1 // Total number of panels chained one to another - -//MatrixPanel_I2S_DMA dma_display; -MatrixPanel_I2S_DMA *dma_display = nullptr; - -uint16_t myBLACK = dma_display->color565(0, 0, 0); -uint16_t myWHITE = dma_display->color565(255, 255, 255); -uint16_t myRED = dma_display->color565(255, 0, 0); -uint16_t myGREEN = dma_display->color565(0, 255, 0); -uint16_t myBLUE = dma_display->color565(0, 0, 255); - - -AnimatedGIF gif; -File f; -int x_offset, y_offset; - - - -// Draw a line of image directly on the LED Matrix -void GIFDraw(GIFDRAW *pDraw) -{ - uint8_t *s; - uint16_t *d, *usPalette, usTemp[320]; - int x, y, iWidth; - - iWidth = pDraw->iWidth; - if (iWidth > MATRIX_WIDTH) - iWidth = MATRIX_WIDTH; - - usPalette = pDraw->pPalette; - y = pDraw->iY + pDraw->y; // current line - - s = pDraw->pPixels; - if (pDraw->ucDisposalMethod == 2) // restore to background color - { - for (x=0; xucTransparent) - s[x] = pDraw->ucBackground; - } - pDraw->ucHasTransparency = 0; - } - // Apply the new pixels to the main image - if (pDraw->ucHasTransparency) // if transparency used - { - uint8_t *pEnd, c, ucTransparent = pDraw->ucTransparent; - int x, iCount; - pEnd = s + pDraw->iWidth; - x = 0; - iCount = 0; // count non-transparent pixels - while(x < pDraw->iWidth) - { - c = ucTransparent-1; - d = usTemp; - while (c != ucTransparent && s < pEnd) - { - c = *s++; - if (c == ucTransparent) // done, stop - { - s--; // back up to treat it like transparent - } - else // opaque - { - *d++ = usPalette[c]; - iCount++; - } - } // while looking for opaque pixels - if (iCount) // any opaque pixels? - { - for(int xOffset = 0; xOffset < iCount; xOffset++ ){ - dma_display->drawPixel(x + xOffset, y, usTemp[xOffset]); // 565 Color Format - } - x += iCount; - iCount = 0; - } - // no, look for a run of transparent pixels - c = ucTransparent; - while (c == ucTransparent && s < pEnd) - { - c = *s++; - if (c == ucTransparent) - iCount++; - else - s--; - } - if (iCount) - { - x += iCount; // skip these - iCount = 0; - } - } - } - else // does not have transparency - { - s = pDraw->pPixels; - // Translate the 8-bit pixels through the RGB565 palette (already byte reversed) - for (x=0; xiWidth; x++) - { - dma_display->drawPixel(x, y, usPalette[*s++]); // color 565 - } - } -} /* GIFDraw() */ - - -void * GIFOpenFile(const char *fname, int32_t *pSize) -{ - Serial.print("Playing gif: "); - Serial.println(fname); - f = FILESYSTEM.open(fname); - if (f) - { - *pSize = f.size(); - return (void *)&f; - } - return NULL; -} /* GIFOpenFile() */ - -void GIFCloseFile(void *pHandle) -{ - File *f = static_cast(pHandle); - if (f != NULL) - f->close(); -} /* GIFCloseFile() */ - -int32_t GIFReadFile(GIFFILE *pFile, uint8_t *pBuf, int32_t iLen) -{ - int32_t iBytesRead; - iBytesRead = iLen; - File *f = static_cast(pFile->fHandle); - // Note: If you read a file all the way to the last byte, seek() stops working - if ((pFile->iSize - pFile->iPos) < iLen) - iBytesRead = pFile->iSize - pFile->iPos - 1; // <-- ugly work-around - if (iBytesRead <= 0) - return 0; - iBytesRead = (int32_t)f->read(pBuf, iBytesRead); - pFile->iPos = f->position(); - return iBytesRead; -} /* GIFReadFile() */ - -int32_t GIFSeekFile(GIFFILE *pFile, int32_t iPosition) -{ - int i = micros(); - File *f = static_cast(pFile->fHandle); - f->seek(iPosition); - pFile->iPos = (int32_t)f->position(); - i = micros() - i; -// Serial.printf("Seek time = %d us\n", i); - return pFile->iPos; -} /* GIFSeekFile() */ - -unsigned long start_tick = 0; - -void ShowGIF(char *name) -{ - start_tick = millis(); - - if (gif.open(name, GIFOpenFile, GIFCloseFile, GIFReadFile, GIFSeekFile, GIFDraw)) - { - x_offset = (MATRIX_WIDTH - gif.getCanvasWidth())/2; - if (x_offset < 0) x_offset = 0; - y_offset = (MATRIX_HEIGHT - gif.getCanvasHeight())/2; - if (y_offset < 0) y_offset = 0; - Serial.printf("Successfully opened GIF; Canvas size = %d x %d\n", gif.getCanvasWidth(), gif.getCanvasHeight()); - Serial.flush(); - while (gif.playFrame(true, NULL)) - { - if ( (millis() - start_tick) > 8000) { // we'll get bored after about 8 seconds of the same looping gif - break; - } - } - gif.close(); - } - -} /* ShowGIF() */ - - - -/************************* Arduino Sketch Setup and Loop() *******************************/ -void setup() { - -// - - HUB75_I2S_CFG mxconfig( - PANEL_RES_X, // module width - PANEL_RES_Y, // module height - PANEL_CHAIN // Chain length - ); - - mxconfig.gpio.e = 18; - mxconfig.clkphase = false; - mxconfig.driver = HUB75_I2S_CFG::FM6126A; - - // Display Setup - dma_display = new MatrixPanel_I2S_DMA(mxconfig); - dma_display->begin(); - dma_display->setBrightness8(90); //0-255 - dma_display->clearScreen(); - dma_display->fillScreen(myWHITE); - -// - - - Serial.begin(115200); - Serial.println("Starting AnimatedGIFs Sketch"); - - // Start filesystem - Serial.println(" * Loading SPIFFS"); - if(!SPIFFS.begin()){ - Serial.println("SPIFFS Mount Failed"); - } - - dma_display->begin(); - - /* all other pixel drawing functions can only be called after .begin() */ - dma_display->fillScreen(dma_display->color565(0, 0, 0)); - gif.begin(LITTLE_ENDIAN_PIXELS); - -} - -String gifDir = "/gifs"; // play all GIFs in this directory on the SD card -char filePath[256] = { 0 }; -File root, gifFile; - -void loop() -{ - while (1) // run forever - { - - root = FILESYSTEM.open(gifDir); - if (root) - { - gifFile = root.openNextFile(); - while (gifFile) - { - if (!gifFile.isDirectory()) // play it - { - - // C-strings... urghh... - memset(filePath, 0x0, sizeof(filePath)); - strcpy(filePath, gifFile.path()); - - // Show it. - ShowGIF(filePath); - - } - gifFile.close(); - gifFile = root.openNextFile(); - } - root.close(); - } // root - - delay(1000); // pause before restarting - - } // while -} \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/README.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/README.md deleted file mode 100644 index 63ff899..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/README.md +++ /dev/null @@ -1,13 +0,0 @@ -## Animated GIF Decoding Example - -### Prerequisites -1. The excellent 'AnimatedGIF' library by Larry Bank needs to be installed: https://github.com/bitbank2/AnimatedGIF - -This is available via the Arduino Library manager, or can be placed in the 'libs' directory with PlatformIO. - -2. The files in the 'data' folder are written to the ESP32's SPIFFS file system. - - -## Credits - -https://github.com/bitbank2/AnimatedGIF diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/cartoon.gif b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/cartoon.gif deleted file mode 100644 index 32a0e2534e45bc5e468f9dc6d74eb9e40325d570..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29727 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 diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/ezgif.com-pacmn.gif b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/ezgif.com-pacmn.gif deleted file mode 100644 index 0a219a4621a542c454a4f96ec69c21ec4b6760be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44831 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 diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/matrix-spin.gif b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/matrix-spin.gif deleted file mode 100644 index 7925d68b9bb54b0e79d904227699b2d6d5054023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174779 zcmaI7XIxWF*EgDkRB94hD25~iX`zY;2$DePBB6)@K|}9FK&46&LKBowq)G3hC?Kd< z10qF~qKK%7h$x__s34#~4%c(u`+3iY`#Sr}-ZOiZnLX>bX0894ZDnI=VCY2#-~ej? zKY8)}{HywrH_#?$$Q z=F%|Bkid+VhQdo3^?g^SzOUz|yN$G*>S&BV+gWNGeZ{yzMza1P2*RwTyIsNp`-MTN|R`IHe@%3jySoGTy_x6}+5mcpJf_<{OI<*ayn({qE z3W8VP+?ihcmfe}g>ub3`+_$#2GBH1FEV*TI;Uv&iTUY}f`p0rdGGA#knE(s={~RQlox9YYIOTY z(-Xtf6Vu&x!73{OvIx0E?WJ0;iWU+wFt=&WmK z>EuleXSd`fl(8HWLYxxZk4C%K_jNiY_`I8+KUbf7weNoK^ziijbSNjf>|Wi`XrF`v z*6?&+%W(I@i3z`u5V)$84=3qNeOYZEZ{qtrZ=$bvdK!trOn;v)>uh1Rl=~F0oT4Mn z*OjqbaudseOY!lD z4)KU~svUk5T^2b#|6+9F;mE}B%>4J^iHY&=)3w7LP6q-{v_@Y>q%@6*Z5GcM;tZeJ-LUYk}`Rps;fc)rjf3m0c| z3e7@SQ(FKC004Hn==L-m)hotp=Wc8o8|mc};unMS_6rCKHz9n#^MHU0@--nG*=w(D zA8GCv7-StE<>wrK$i*i<#K+K=V0r*&9BULC78&LjT2vzXhg?_$9TnRghwm>M*`I^+9xU~GA1Y@9QThzFYkzxF(!nak^a9^2#fq* zvEk90|1%v;pNKH6Sg%Me9Zl_jrt}{|d;9-?(y*}qrH+nq^83Hz{jY+fUE(7Bw4D5+ zBTh#7`0bD@{-Y|=$UMr=D<&e!B_bm9KVOj+7!eZ@9T*Xb)78<`#i`hP`2>ak)1&%7 zEcW(BHsR4RUg17|HdGVBju6eDAYUV@p{}`(r6twOLRVWy$AUu9(KoQv-AA?DyH9uL zzVAQ0)CixGVSeE;|Kauhzq}Uz%KMKsghlRXrusz%o$~XwjEV@u{m-n8g8qFhX8$Vh z|M2?$`&i8Xl~-$LFk1ht?f+-3|I@W&K>s}cujTGE{@3>X!gmZlYR9sH{OzsHzkfE? z*M6_A{QCK0`TMu8OJ6=OF3f-WIQL=p{mi@Rw^MIkznXkG@nZb>v$4^U;ipfA9uE%m z_dV);*wf8>aR1)jJGZ-T-MrD+alO5*_1e{zE0>!uH8nQW*VWckS5;P&mt8C^DK09! zP>`RO%gs4|E<5XNW=48iDkp`_VkVzSN=%54i#>hnWK49_iO7iXu+Wg;puhlsKVKhj zFUIj>o*qZt-RMVL54$)!Ino>s*&npCwXwFcw4j=sQOKqTOpNy%85-=<->bJrS4Ue* zQ-h?grmCX6TZyPhz~dCKyX56$WiZlGk`m%*6jDr7L|8}=0f#{$U;)sMf52~mAz%O> zK-zH?fPZ#T0GtnSgUhRo0_q%Cn69WtGj8fGO&+@pkie1@REurk)IeKr3Jhy{YJ9zI z&Qeb9IMQPf1j;lfixa`LPR_hXqPrgsM$nx zsL=vP*^GM=Pg7tu7H(=8odvZbFj1+K63yd{BF(NX-Xdl<-&9gFagWX_HLQ+=+xJdi_$lH4fkj0G-<(zrr1aK_9y;prwT1`^I@y|L_y+iV< zZQAbeDCC`3aYXy3>ImGN75hWbx5;3^WMJ(s;LG7<#s#6O!NSeK?mWSlpQj%se3l?u z-{vRsKYxwu{XVsrw_!x0Our{eE#q+wHFyXR|I@h-Rz*?N!H zZ6GBGZvcZ$q4fp`lr~mm3D(@KU?l^Zd;>mx)Wv0{F;7jytCDKcaSm0fg@6ODxQYl1 z*^Sv^Ems7tn6hn2xDY1~XF#-YJ}7rPV~QDAC?kC;fN{q1(+S|IzWE53_Q3$n3OCgc z{u}t~9KwF)G8HOArBO+DPgoK!21^ATyO;o%sjGAaVZ1e$RMo80+}#@=3VRvzfz?2w zOODdC>Z%80`C|3a1M1fPFPz;hnnmhc;t>nS&g$6&s(BzThdmm$je7>{` zf#7lnn*d<3fL1aT+1rEV-3_z+R9uMo`Bw9B+EP&-bf850&OVXdWR95COcb=(d&#ds z?r(_F03jl+DImUS=-bGWH?1_N@vYqZCzzvBOD)^7f%SfS)b7Ys#x3bKmZ{V(0eo5n zZ&0BcT8zuj`QI8={B6xVS-6T=r{+tEnz;FiTEBAuAGm?`JCtbzzeS-lju7`n`AzE0 zQ^#lB7H!(_(-<7nVW0~f462&CGKhimj)2MYyCxr7EM-o`($v*!pG|&ii`BHh}M9@i<7R-7fi^-)QKkZ*6vsCwC41wL(eB zaJz*tff~GU|D2oi*B(OYtEUt1ZSNx5Jz4DLXpIh&R$2F!dqIJ@fYyG{lrMAL_xiK- z^F9r^_iT`{gQHWrR(N2H!y(qmbNyr97ZvvKn2#&t00#^sY2$6UTtq>=sVLqh6) zj4qw=ztiQGt}?{pp|m5#vtB&0kbQ2h(5uuwcW)R_nIPuaeLKBy82FU%{TFlPn0JYZ zOb;y)eI$=_`2NGxrSuxS`G5I9e?&;z1s1+>sGC}tP~`40UEAUNb;LmFN*$QEkNM00fFomS+@n+!%pgq|_J8x<*zv^+Nej-}Wt0!fwP)m}` zw7kx_d{OdLbFY*3f+@+A59zek9e5C)+=KRrasgOL*?PKl#*4_bqYfMn-m+Q&6lR$4 zGykgnK7J*c3*X-8efH2)7-NjvN|);C6fi%0zRBR1g75i*d`gNxd!}OK?E!@7<@x-@ z0jR=cGvmYYW|s#9K^su`&h-mK$UJBFNG<3F{7#~S#m`}cxB{5^s&3YB4gZ& zt3rWV^w#t1XHyz!BDoTDM*v&7B-1AnGoG2tDgNzKd#JVY- z!yH?Gm3p_kvp=XN$w@Xu7Tr5z+FY&rR{0L^)TF6Z;*oB~vlDKk=lwqUy)(5U+;Yrg z@s!H3jtDjoBo|l3#K~~0`fKCwuKAQgG*ox7ubk_0OjMlv>7ZFT2l^Zom$Bi%Lehu; zIQ3vP84PXZ(^)||XI+EN8Q0iw^Oikr&>@L64etXwTw8gTR8FgaoZzMa1zv(9q&$wZ%`0~7PRkZZpF^5qo*IRa&w@SGb|uCky%i(!kc7bUZxF-D zBFR=5u?}pp>Hr4g|A^`0XuzIBa3S56q#LjQV699m^k+2XE8Q6^Nba&XWf5Hsx4P6< z8hjW0N{v1gC%FNmaF?8DQHO5~jdh(x&7mpq>+nfSiWISK$QYI2LHPnX8tJgle&47# zk@?}5X8cO^l%*Lu^TeYWGutNYEPBP0A{asZ_&Q_jp%YlkmrDUxt^n~NS28zX1A8L) zB6FsDlGU1d4I>C_^lI8%xwz*uZG_S{ZJ8;PoM#`1P5}G}DK&|TL zlTyTkV_6R1M6i`p{4xmKHfeC}c^@9OUK}_6IgIjXmz^U8RJWDW{@(Mm7 z)FgW5&Vx`t2s?7hi=j~Zjp>zVb%0Z@SxXQrOi0M)B+)=SV=SpsyVTOK3W_+`o`R4vR0lVVMXR^djc9eZZ&CyA~M`Sr*24aSrYhz z9OFyHmudoTGRw~riLtxZ<98oW2%q!FL@{A%Y~kly_J*3AQOko6%VN~$AYj()2z<6M zIdmqLNMRm5HF;lgMTH*6IDb{pN#SbA3IEE3*%)LhKxJ;`+!2nV+^(5N(t6f86^k~Q z++QsYldZ^?HCRx{N$u1-B4V$p!k$=)K<%KEIp- zfFlfToz$MhsDH3lOXy*;!T;jQOk$C^nMV&&;BG1$ZAQ*z0e)z~I_F7u1`MvipbntC zGIMsBpCbKms3Nlod{tWHV~z+%a@#QSB<(|AfdT)50i&kTK^#_15sw@tQc@6-?NEI+R>jl|dmzd7@N-NG^Ih`G?XMf=cS&B>4(gj@zZMyvQLGv((_2Pj{gW^` z>0RqRA1T*lWInoy&E#we0CjiJ7FH0h zCJld*4~}{ll=j5B9N(1G1UoUbI0iGD=-Rz2XX5QV9ub76g1GV%FC9<9k_N^S6#Roe zrt#_01Ex-g(%qx^!c3r*pf7haZK%ZG)7tR9^s|fnTS0!&U)|;_5{3tl01={`80tZX zy;kxiJ#HJHuvZ`x^(W=o3-ZBouC@(@KNeA0Fh1!A7)2uiyG>CAuCg`M=1+k!dGeg< ziv1J(0MCPGKR#2k!u194D42t&9#MJY6Evt$FZx|e>oeG7k!sSSN}cI;TSdxAedR^d z(hAk*riPo&0JwFoEgN^%v&0w6>9{S+NHi*{_8$7GBkL_Wdgs_dJ{nH6LG?K;s%7j{6=DTMVW55y}S_O~W+`DWpOfJsu?qz9n`-PBim! zo!qCNnaU?WcVo@!w^M|lz;bt~TzhkGnd7HMnW=t(JEQVWVdGF(+gr1cb73udK77EQ zF;Sek9(4BHxhExd!tyK}>qlU7B>RQPk8!6j2W1g5A?o5!l6`2o0$QKjw9G&%NZ?!M z+p{fik&2dGK@{~H*dWe5Cht8wD2w;aTTzdUt&~SSd%~Z5p)}}Rd;ZTfPOx1l9%iyS z0`ghAvFjDgu$42$C)eO-?Uv8q>6h9A+xSqxkN%#fbM7}7#ER!l-Y8K_dS>d->-1Ut zYbBZ`;Om?{td^>gwV0ls70T)m zR@+GAe~-f;@MSV>CMy{(-p;57u<_z>{APk9!K()*Mhc#4LJ3L9=^yZ>WLV(L*jTV& z>#f%Jd*$HwHuuolI8V>YQleG{elZW7M;xx`6e6$gBHwCXrMH|J$?GFVBL1b^RX zEPh;YD@#tn5p06kEiA_lSDHc@8Ddr}@zjl`;$lp%)#@?Yuj*cS6wb+d28O3K`5xOSW0^J-ZY4yXAuh}QbCQz!;QI|hAn=Id#<9jw{>pm z?v=%)2+QDHEX=EwD$1X0rIy4S!odB_o>eKc0RupfFkgihX$Do<&y2^r zzj`0wT==QFC{9-DW86oe5=u97`#BuNXNDF~`My;ouuSjl`!Yv1w7Bf~nK=2Vc}q7+ ztkm9TPzn1(zL91Y1=*t@DG|4oPMx7kEh%ewi4Uf`l{$%7F0x`AfoT^uj|^V#P9fYhWQLO*&y(#*UoZ zn5fvV0gPSBm!57R@*?IkkL>ES04B6%rNB^UT)PLn;5V)!L^3@*{(O@Y0>g36x7{L6 z7_UE2U%ZFzmyIL0&uSk{m4Zmf_0#ryi|3cKL*L zvAvLN7cJ&nAqg&8Wl;n#N|#I$7U(&?3S@!DkAAC@q8Ys|BgRU($$!YuH5cIG0<*Im z-!{N^pY;?vgLv=2IEzDx6&$kH-C6OH1r{*8mwD}{WRiPd3ec1^`;(if9XaVavO9Jl})t&{<7_}~~xp8A|jD*aNgqSfg*Ll7( z`IUOiE~g7fzxu~22fJr1<(bUqoso{%(P~T3APTBY&W9u5|J`vN-xMd0rcl^?w3=_X zSvN@hC3ov@U8{Ew45Ja;k@4|(roe8qvo6-iYKj zFFog&1(I3YLQZXU>B$)FDv9-+>W75`@*dY!odYa#>9N7SHIX9LukY}Ry3Eg8hOQCY~TcvyMh>nk5e+-nvHT|pcmfb=3n z)4qw6as&5uGsKn7?scW53L;cL;a9Y1ILoVinP!#N(4M?pvHJtaIS2oUgaa@s6C)|2 zbtYK#Fam?li z9$HI<*6p3S%b$K;M@AQP(j>S8W}*Chz(aE!foV7&=YpeUV||g`rtvNk9~I700;(;H zep~PI$*A{thor9}{F6tMqNrwQRjL_DV5Q_W>xl>*pQb2`xKt}Sv5^xb_|ZxAynsrV zZyxAM35}Fp5;zu}U|mYX@7DGXH_p#-N5vWU#YrE+7D#zS>Ps_Sh~CzbLi(YRdGEOLoLnq?PNK1fSO3 zXKEi_(0xY22Ju6o3DW2PP{%Lfb$$Qsb%$z1SZlY0toRkA!JFL@thVQUSCHIc*Mh8u z=QV|+RdRl(Tzn6zR*_ND*=3^xqj8r|W1bfhuP9$9Bozzj1iSn;wZnjaj$35Ny`mSM zg0!`zD7oyrh`_f5MYCJ^M^GUDBNB?bcEUt#YMYFcTCcFIoKyoxwXP`_p+VW>v;(?Q z{V^oRZsj%!HI%N3h};nO`s_w6&I{#Aw_v**EIk2Tzv%nXLcNMkN)@^~F0_DZFP$9* zZPn6?-2du2SqGJk&LG}aaDmxdKR6bSk`zZ4Es{dR=iq%=^oyT+O;c5t z5{8_IP0@JfaJ7Ast&{aDvZSVi2Ee+;30`D-q5d4$CMpH!4jz^&QJQgJp>5u{6U^BT zO;!YAhUCi&vwfHsug)b((%cestC)2RQ5k(_xUQwNWIeL(^t~^(W^{A>xsFTrkKa2- z_cqE~_tqF72g>rImfOy)4*~1i#%gYGE;i9MH;lqK%T)AuK%?TRi-Y-%_RaiOePOerZ`iAR^rECoHKW2<(GnwAck&94z1yKi zk}1rdN+vI!5<0uj@ybx6HJMFps;Y3P{JH+L_62v5jUr&^<#+*3hG52hgQj)JW9gV* zyI!UOH2_RYMnTgeMQoAkvac_x1B<|89J@ zu*?Q+IrAfKExb=yQ3*KK+OzVpRsbfbXB^4+&hI6>iyZqpRuSzMWKrz;R0d6_G-TfB z=OnvK9!bz`ksg3ElXS^YQ3ja?8T<-#PfcEE>xWCXNxwH0mz^99`Z2hclhif$tb)-m z+40`=jC|9}<4F>G?8&pJhH&>FUoPVUwhY2z>3OSk%eH z`gNIXajBI-6a=5b5&&uJz~zvw+_F;GZJ1)#-@P4`#4Evp*4XTLzQ1DJ+Bw;*Vi1!j zhLW?60XGrHFO^lnZ@iSR&GQ&<&PhXp8UvEPMwOf#cUML=hH|tYnxa~L{f~GaHh5=I zv#6RM_yqq7c82e9^OdI5VFtND6lc~ejHg!R-bcZ2c_{344XQbJ%;cq&f{1;wN7Rc` zuE+{@EpJqswL ztJPP^ERMZWaX$VtsAMRnl7x4*g}M<@;5HWk#auA^V10pcW5)9MW6!QK;y({L-N7ahRAeLBqjvFb3pFK2EU>Q1g8;G~d|toAzCIha=q}uizEkPj@ex@E$rOAMh<9+THtAAQI>2 zdAy=3gxg>TUyS-Lf>?g*l(a<|MG;91=GXuUMd=n2zlQ3$?k@ceAiBQG#+b<*NotJB zU@>uICFTpi=0pgEo{zNbOq&CGeQ_U7o%GjF!+j-AJTDtV{$gw2bsY%zI@{A5Zb8e1OD$F@JnU%0U3!lr}5~lhqWYoHIDUcC89cZ^_xBT(ys^f zw&CruUpXs}x;doM7Fzd}S9Gp57lW+6!4l5m8%82oq$%e{wREYv#`TKiG(l7k6sq$$Ko$<|d;HYJa+;-Kf& z@>yJ89AIaw)^pFqZ<`k~r6}pu_}4ZDGt7P&YH2d)o64N25Ti;C8l3bp9ouiQ@Q$%- zVm&95bq_YnsNXu=9k^}(>Vqi}7d?s=WX6paxfQx5!5wLdws za$$HG6rvYW@}UHWEvP-02PO>GDE%I@I&)wfRuxCVx^Ro3UH}#aNm?$#C9e;BN_DoB zo~J--f+sEbU48E5$-?|)F{lHl8z`q0D#!vJaNSpUGO$ok0iQ?rovh*TN=jo6-1zMf z&_sN}*^6R3QoI_o{y#5l)3Cg6K%QEGfnV+K{AIIPd;5PHkDbjunZXfP<(MOAb!PxTJ zz^(kD!J6~8F7-k?DZMtowtdK8J{8bLffCK!o0QUn-3ROA2rC5>i1v&2#mA^xPsiK^ zUs66p_jiLm%yunOD(0MmpWe1eL{WEOyc`&`1WW;wRep-~>3ye!pWiIMlz#lok1PG% z@Z{OdAa({niT3RHm)#AyqM>)b3sv;M%F|5p^zkDOeBZ|7ZGqXsmA*$iz?FRYYAc8y zKSh{oDb>LnNe>!m7+^2ID8elzeU?QaH#Cq#Quv3uy{MTpTo`2V&q(`d^%+`IOp(&( z9}c(~=GW_>EfC|vJk}()SvBG`6aH{px_spPed?#(UJTYJyY;P}l$`k6y&x2MhFM&a zWbqF|LJS~JaJG9~o`br&%%#8`v$FKs zb0epUA1p0gOZMfZ9~*kR`FXE(esLc+TYEqbc34PclZg8_|0J>QT}1|hw&Uo<%as7I zs6?5Ob}Pq%C9QxV;gPJ&fE`NAd@*bfy2Pb~=XJ=XHIsy#IaC^GP{HdCJLP5E z?@h0x)4w;~q=Bt7@Yxd9C1Gi!``nlth_&LAp-FiK9;aHm1Df+= zb&&~#XMJ8_1{?Fy+EalN;5={FUxH zY!XhD%Z3wzE|!3v`j^Fv$#z(g)>h|OI03L4Ay@oQ5EB17m#!Fo>m#AsryudU5N8K3 zSU^KNRFNS;+qt_du&;|1!cA=W=n4vJ+<DO>5t=)Du{>^NtT0(iu-XY}0wGUCI8X3Y8jwu} zMXS?lTcPonxyc8$ff-t}h9?}(8^)DmH-7i_nc@!WAi+@b%r8@m6$v2m+`Y|qia5Nz zIma)rB;;YPg{4_;=5Fvyva>@N62UBlsg#54Th*$PtYg0@ABy+h)ipp&%|6d(R7IGB z9Ha>? z+ner}X#u{CZhw$U6cwnxog?tOfeX)uf>7F1rq&F2h+DcF^I~z~<8j#J!HA@Bn_g83 zhS76~`U!EDOn?Luh;G$l^NTO|a>j46;OTBA9=ievtxQN@Urw=M1$mMTel7!+5#_!S zk^lh5UktdD{`A9#6>E=fEamm-^2on2z*{0(5g7}acpb)p^eYgX_Opt`?a#%}N-Qcw z%EHUCE&9w4!IR%A`cWiWg&xCw$#2>`9b9y{uA3=9QK5f9vLKs(m6zXTrNEEF>FXmY z=E4KuRvN%7=NwDGu3+F6N>M5sc2FK;@C@9Se{j3rc(A5^s1PcqxdLz`2*IaC8Esx> z#KIg?yF|UX_IdJdbw0#R)^`LO!N;kr_Y?4D*{6LqISbvN6lzAdSM|;o*wE__uEiYv zJD*dQq7$Jcy0)Y_146vLRU-doT=hvC7~%a^S!@TU z7sfk;FA)1C;{R}^&XjgmBqy}azse8j{k;RaE$|Uri=B~_{mVD5bPjA!4 zgVA-7kKOdwD-Q$(lGyLykG(i$cmc+84mK^e$TOfygj4EVz4g2d|5(QgAK2%0>m9ah zu6>66`S3y+2c?1;I$6nWDtB(_+&gW9c^rVp|Mj{F!*l3?);R)k1boQa`}9hjR_qK@ z02I5-32sihu`8Px1*?n3dXM)PCRI)Jvzs**q?n)U^=S~0;qnL?OyPMmHAD-Jm5h1$ z&L$~OtX2nIIgBggh;j_*>?sPyO*}X+q|iJehfA zA>6N=rVv?|ZVDRSPZ`{n4*HU^_{4fcS{Qe^}Zc+5(eiOr1p z{R78U_;lh6S>Gsq>Oxe5>=6>ieiek057mC;qKx>N8Gj5$)_93Fq>mX*R~(Z%3~s};VoOiV6d$uxB4uNXY#V@Y#) zby8P7_7y~J0DRHpW__WYd07_ss##>7K{8_l4rZvAPo{w3p(H(wg>o*9`oPgon|ZaQg4B34?A-dtZqHBgdVyAf*(`t+{L~Bb z9d2X|5a#2u7XPBbHtJzKoDb5;G;0tfRV!=0AI+3Ora2yoIB{C>{KZFIuz>iX^>^>; z%jb2UV{+qb*!A1_>n_f!cdn+sp`@1|{ox&h^}Hi2(Hvcoa~1^^9oQNXAC6<9h?O3f zJdzdUbsNmfHJddWUwUa=`9C+aCDr*Ud!Xc!p4pbo?`P zPv0e-i~NQ2j)Ve*qx1fsf(x4?1!WJ=^B1m{uNZH&N_u$^J^5c$9<^kYwD zeSvlRNYWk|YwINiI8IWRtc^6&QPmb1dp`h1vBY0lW%U`_RNdC&3a{sCK^M%V)AlmW zWSK#BvF`I+RK+r!4Aj3|8-1wJY!nvYHhga~ zR=%By?CrJ8+ikY}X5Ar>5@?-I*i!!XuELa7y{)LjU;zt}?Se6x%kRqBS~x+T>P#v- zobRHRx?3~j){R4VEbOT}NYOkVmpR(iZ8_mo0l0@t4wJ+oI?A(^x3JQKi=owcFF zC-xl2=5gp{*tYD|5ltSj?|nM-OoMxh{N5wTgfxTVs(2~c0y|B}VSq>aMyEa#W`|4Z z7V1cva8FNIsqRmLB+b@gMLs!tS?$fcQFjKKWLb_aUwu^RkD+q%L3UK_VrScmhIc{o zPC@7-Q6oAxF^(SB=F)5}7~;`pd@3hpz_5IMBlwY*JcN`iHpq*gROyXv-&= zG$dvY0L5-PzX3>Yjs*nIQPQWIMO-l%Hjhs5=kQi-TPd#?LO5qyiMGaa4iH*!BqZee zfy{Z+{Abd$rrEtljl}D+)N)U5M$bino$*el8AkG=wO$bEuS@rcg8NYn1dA5RDzDQ6bd6fIRC4YQzf$BWYbtx6prT8^pO{=!4bTa}#Z%cJh zMERjSU8|kKqqJ zR24B%q)f!6WPcSak?3fuMCi6rSW5ABOfFGRx-+ zYX>w5lB1&UeE*Q$)*yd)`OMXGVQ=GnvNOid zgF%VifYJgrwxlnGHtVF&#w?Ql85snS$-s^hj_gkcgvDts^PtkBmsWOtO?UJehXvIa z!-@U?hCBeF>jP-ZyusAqRSGbH{VB>&5ydlBEA0$cZkWRj?w@c`j{ zRtk1IZW%`g2tlA#yHtLR^a4qAscm)EBaV$Y%wEm+*$;(|BEGdS9oY?_Kn%nQ;~Ng- zUL_MHC*NG)>z;gTN!cywx}cq(fqpM7p3+7U>6t$hpE*-#Bx|m9M!8J&Co&wg?G;-* z(FlN3s;Yh6>%(t`C*L~pw|2KD-3>Rlu7OJiGq%XN)~~e|>Fb@z=GS;E6kuKl$7Hdbm9v7-L}-z7`k1lu*2OK;^Y*+)8_Yx_a|V+&anf=zN5?`$K8h&ZhvIGI|+m2y)%9NYHcdD zCGO{-X>q6jai#!fh6!`v#+LXd^-3R)5YL-TPbFyRO;L1gtr@Yz?dsQ2#Lu}vD9>WW z0nESBFqxJAW8(Fx-P3FDlVQ*HDSAs1U8}h4*seMOn8tt%qIj>&Cs%phKCdLFMU>BZ zH|#p&6fCZNGNZ*0I<4HsjT=R4$peA@wI^lfe6N2r@QIL;{aKCAlPB8LpF@|>iv|&S zQXqDNB!!*~E;)LMU)5|CMi{irz{@)E`!mvt+>NHq%-kV1BpJB-Zty|S9e{VJ=&g^< zzdQ{t65Ecshtz*P2Wu#06Mv2XgxJd?Q0KdyqaeVs-wmgP2D?V<<3g?G&6+h_fFa+v zuiLrXAsuZ{y^Ojd@F-%nr>s>)+19kb#+Z0h3WZTs~nBR`Qc|BHPur5IjSvYZt zq-BcNbTe03aQ%-MoZ31zOTnnmiR25aaw%SdFRUs%s8$W%u(vMB6A*{g=XmI#F+_Kt zkjoYu_xShUPA@OC=hX()1b#D87erz`neo*GN>E{)13)Apjz>JbV+YfbO3%`Ri^W5y zf{G0vdiXyPG6cw%i`K1zCW5Q`yx6VBio%;gHNjyAiR7NR5LR>N4R@J&Kzd&eilM|Och#AQ2zzQC4`OJ%rjd#@WG8h7amTs5>$9)onRBUNrp@`oE*uurTg=7*AlMX700;xVxbIcX zf-%xqo(BDi+{Iz&iwl^1KTQE>hL5~rD_|s}K4aytm7IY#M7O0y12ez_gMN#p;A~E| zy*8H>^S=MBK*&oFKk!Dyy1PU8kVZOk5FP2wmFCV^B2!*Xl|H&+w5UuuS?V=Bqk=xS zYKz}S^6v zO6@Qs{#&Gm&&9Oj*g&}8PC0U&{oYiHue~Y0Y{q0JV~ydAY8*RLfPOGTk5%tGm`oQX zd2H-JHp#n-?|NYB9ydC~ufWejG8vQ<8657Q$`5bzEX+RH;vKtp4xIHr`}auw#TVhp z?c1n=h2sQk?)JyQJ%kZ^6SwH*EoZO!{A4X*utls3ISnWD2-01;H~091R^FeF2vt`C zMM&L+z8>_kB6%MlfiC#)*cIPoyB$po3^Ofh8@&oYIM> zdnd2A*Yj#d4pSuYZ^eNkzRC8>#xuWX`(6!=nBV!`^EmgT9yXcxwS81`a!`3X;fdc( zPX+#Fu5-w`Oiu-#)8TqNVrH-ZQOz#xBP>oZ0@Q5*!XSr|3=L1og#26`qbF@{q`x~Q zM44oS-A1%e*@_s>@GSVkt*}G+hg;tUSfwdfgb4*(y-)i2wCIId1^4ttTvpO=uq|H5>>hP2(zu_1;cg>-3EA%)w06J0y9`r92h<_LQm9Z&wGaKu=Zzmn6y zCwcKqQNFxMKc8GTxlFl<0hO>Z8}xu}j^#d?qKp@5lP$+0$zZt*y%jMqAO7;Qsbay4 z8v2i|^rae^*U-u&{q~rK0Is#(BT@VkPfSj~bj=|FDSAgGwPg|bKCfk4r~ATi)T{bi zE%%VSb#chHho(5aI^+%GXZxhWHc>z6myOVB%UxX8Hs;KlQHD(fo}gEUG%*3=Ef}`-X)j`vanfJ}owV$U14MvXcab3;7+* zN^QJcp^i6Sp>A(2KCRT0?z)z^MuC6Mp?se#e<8rJQ3o;XINg&ve11t(m>_9hKdfIi z59awWq9{HDAyhbYfFV1bM|xpyM(q@O>>v~c5BGIse~ZiUyZ zT<$^rR#RU!0)z1S=dq%_pU38ppu7jsu{XI&0Ay&9;xp5pcBHijSU@HN(sFFMc9|KH z@P5qEOH^FXL>K@PLF|HR2C&>TSgzN9k)a0*TQUrAit3Ax6L_}pW_}g-0Lt1MEY->c zmYHcIGp0ZGbZ|swBJr5mZc+XTLA3Ud#8UTz3GS=Jb*_#lGO|?m$g^I^`geuU0hYkZ z94n1M1`3Uq;$rtvC@PPUc`7f#Q@b1G4VQy%>B8SN(=TSpS4Sa{Wjm*;Sz#B#9r+vf zWx^0jzy*T95F~#qdS>T%{(k;3IC6O; z1qLJ$$bZuj{ zG$3~KcdBZ#b&to@61KN&dOJgE=v>^E9r4F;?Dd3aQk%abM(kNwZOpn4G7v0au_wlE zs4(Qp19aD)o%*K3h+sVW`c~t7{+sKWl55#l8gqK3?T%q|B?h?Uk$r3Myanf)isYo> zZAIdxE9ytGw{^V7yRK9TN)id%)YdB%R}?M5M(w@k736FWh>={=hX0G4!|#aH@?W3G zdMhr>`FJHyAAm8T{dySm2tZH+m*ap6oLle177 zrH2bIG{i+=De*}CIU%@p2i2_$MJ>(@RkA#mj?~Qbb6ba$d{mAD(}_pfb?MnuEUAPZ zs}%gg|7f!xq8g9hQeKFNC^UEtKyM9tTk=&52oa618h!kNf);BJh1;+__cqxQGl|-z zYdMrU1RrhZRs>bc1(w9GVdJVxrQL%4I;EEKS`c?;GHxlkQoz_yWEz#G!c{uD19Uxi zi>S7=NoltIIn#*t%-9`1cjL27O*%*09KM5|jpyCmd*qGV^wl&4r8l~1h4-^ihO>d% zX-8Q94_)W}$n^XE@tw>zVsqRaW|(6Xk|^52Fga|FQ4VvaQb^^HY;!)8&AD9fO|uDc`Elsc~gK?o%+2Q7xi; zXTUSAWr=iqmk#@R!5u3^NJQ#`+Ki0svuGr50mwBZVhKs&Ss{ff_OI=3&67t_+IoB_ zdXuC6R&mzP)6e0`x}+X=;Wy)x80vHPWQtv2dxu2+&)ZhJ12=o|(dW{Y)w90^md(z* z+st7Woi*kU6kaME>pSS8pn6RGhYh99GU$Ew8Y$n^dz0aK<3Kd-TfZqX1*stHP@u(Lr<>;20r&s1@2l8`gu{qLIMqf z>1psg(6$HnJs&=`Z3vR$Rd9KIibyr`x>2cIL%=ddD*qG0ES}9G3F);5zbavz=^=pHduxSfOQ^X2~&>|4QquVO+gN zZ6*;df5TwXEcUWBx;Yb5Dc576@Hta0{Q#^tstzO$`$k=R;hcK@%T0aNoFK)kQ@Qu$ zI}!=dxUBez%dkldD!3)buH%y0ofH%ADc#J2E>511VvR1_C=WpUO>Ub<;gL`l?SH+s zfFC$hgMl(e9IRW7;xAx}UGu;q zbF-D!cQYK4L|5l0^0aaYq7rcJ6IfL!4546#>O;e>WF)Fxi@y5&N6r{Yoe}oo(C1MS zJ?`Mp#Gc*(z{$y5ytLc;67=oFh4qx#jNc3&ZZA`SU26T0}Rz5^@b=8=6S zQl!-5#q36Md*?GD54#jKgQ^z75eF5Ala>Zpo$7{%I{M~S=3ZnQC_cY^_6KSB0Xpr6 zSqC&VQJu9Xs=E)}^YV81aEWJ2{j0<(C}!W&iR+%(`$;oZ4{q0SHTG)w0S6rsk!1(t z{-Wi^-{}5l-oy7T^e(%;+z-W+S!BIwD?_2#Hdh=5aK;`Cb6M@fak1!J1#1ZfDm`Jo zRPG&}hm^W3D#40QW@1&>2YlmJRv0Q4jr+#EeqrV(lgkVC<%TtWxL4=~c%;5OC8^e6 zb3|b_e-i)Ak4B7pvARBybT35%eYOVK5qQjupDKIlIDhYd`4-z>CUXH-_L$>~i#X3T zqc+-`=p<(-9hP#xH(p^$J1fqGvEJ+M&K=us51lDBiU-eTtFI_jzBHY+= zai~djYbwr{yk(XP!qfzl9n>+mG{T^=W|~Q-qaJu1EB<&Fqj+Ew5Dpno*`r}1?aK1+ zW4)X9sV3*nQUSC$ktMJel{(g?e+za7&tTO0kNLc>!N+O89-B>3 z*Z9ZMo7_6xN8dDGV!<1&TExQD_ad6ILm%vKr~lK;QqPwyKHz)@ zIm{ftnyN0VsyP++L;>jUF(;Zx>DN}#&n11R+}S@&lhz;VB~aDi0}P9j)b5R z$z}zy9Fc(Jm-))Awh%PArpL*;mFK47St0iztzgFgdXY~C%XKGHUA1C0$=v91J85$B zw2?JluOc$8LSgv*3DVPdg@g>mttHTz82b zFgmv~dN346Oe9Kqgk^*k?>^ftfwr3{$c-?2cjwoSeSeTZ09mg!8yitxz-4INCJ z{grZQty?fjM1?!f>4kNNXj5W@oo8xw_4CC(4f4}PN?$sWsk>|=5w=L#tzdh6zPr}F zMC*TX6kq!-7e75SR~Nt7ciU#5JS~yV5*V<%xCk6Uo3&I`O#wrE0ulZ#MCnj%7wVq- zM)ZQB-8;Tr-Uws#=fkV(W2ceJZtFoPozLY2{;F9#*TcJvq6@hXo{!Wm&tbX*wy2Svr+yxMd3#-~pB z>31vdMt=R5%MpJVC96H~jGT=fS{2);Hcxlk02~YnmsqR?Sz{0#xCpcN)9>sZdqk>&0Ke3ud&eewjwFnQu{PWr>wT~{;2@gAS- z17g396#{J(n#BHv2o)IIYQLZ*!uwxk&;`yPn|q>~+_%DOD0hOJ{Zuwk(Tv&N-q6^r z2uA*U55qDZ=6>Zpk)Ahg?*?SX58LL!!_Wvt^R@ZbA9a}vrEyXBrcQO3Xh9j=Ns2=vG6^QYCM zwJ(pvjL!1kocg1wmU*c)bZqQ;pQ*6*cvLMy8V)pg)Z6GjwQ7T$G6M`6he|Rt8(XYT z#hfbEpnSf2)b6GGoiFOQvKFf++O0p{i3;oaI_vxT{D=z96qI}Plq!od=C_Nzobc-# zqKs_f8GKn)F>1}Gdvz(^^utM9SNw;kH&0G-p@@px6yEaHF_J;AR{GPA-{#xg!xYzg zt8epnntvO9u`%x8yEifN?dBoI1z$1qc$qd{gD&X70ri~aKVDyp`(8<~&^4fN@Fn62 zSD_5Th)jlJ2SEc;U6A*)Y{J*18#ay(S<2k;vY#-dq3!T4CsT80Z0>b!>)45O<|+91ZS0fnx8rP zaK5@q1JsyxFdhsqtY9l|e?c4<=MmKcc$v!Vc>eE7%J|+}CAEEolbxUmG6ZZUF?ZzY z?;XBp&*ZspR?CV0uV@c2(_d@DC`*JaE4{p3Ux`l!%opA-|34W;gwy&!6b@G&fTg=G ziYid0HMcXQ>z%!L1&E~0?>#rJzA`W0-r87hoGME~=zQBy*LLp%18cA#I=_KHS1{A1 zkD~pnXlRVT6{2w`FAI(F9ju%7Hk2D?s`U!@HRA}-D|Ei4+1o#h=|IH$AGre z^F#6{jbX z?1FP~{Uk{oIA~R)OYyQ|lB)*|3Dj`KNkFNld`%OI?e{KfWe}7LDTPw`d4zvP@ww zCpPA{Qb;p?K1bB+YL(83${EWgifrYNBoUVWaGi%W z+y)&JW$EhSXtUAJ>~f2~x1Nc8g`-&roInKz=tX?A)U&?t!uQ-VCS2SUIWy$(JK;}N z!X|Pt2O97LhDo49HkeVp$}tleTVH3UO3nv~*h}3+NLtA(6*oFOM)rU$q=(-o~48$0jL3$ zAIhz;3FOcr{9_1wU&&R#Kt6;o`6F^D32k;rhkAe@LoG)KRZN43+W#F5&P`v-X%>Hz zUY1C6ApBH$-sGW0i&5*M+}?ckcc2Wj86dDspp4=o#WFntJrnJjyPcv?Mx1kiN0IyS z8&eqqQmdnaK2>hJnhX~^FYB!$>10-QPI}=$yHCQ_+o9sj@1|E}_ExT~%T4SNh_g=UF zF}1fkJwK;{FQCZ6Vfd}!nRZBg!WA#>70f=FxQ}LcvIe-UGhM~^Gl1w7l32(F3}!dE zu?ji#QI79B`(sM87zWu#Z;Ba51mSO`nJHRe;k^Jn{~P1Q;A*SBs>E^3v_bAdhyOCrT-%9g@J1SVYo zftj+w55FHrASY%ugPuN4xs>2Llo4C@M|m4$Es5@9!A;V6V3r8j+A>`Pl2(3mRe$H` z-(H=yWb`I+mq}tV%Q;ZnBALFEjfr@>($Wjw9Vo)lUC6p$Oc(ylra$)_*tjHKnJ=q( z%ODaE>tDHa7p&HW!buEz!C_96<;h(M{Goz+>o!B}pzM^dFPvAz-@+H}7vj!bIo&{g^%c2k{_MAS9CNbXyle##qY7$JwRDYr za7FR|A4oBuW-)DUJVJ$;j*}FfhgP*L$dB7f`NW7K_+I?umZ@67={2AqDsQIBnL!$r>>rDC5y4g+4RQ21KwWMBvw}NS z6h?gkDLq$4eo%8qIy!EmrVNi}u2NyXhVqxsBu0jmoTY@jDOvS>7|kd6I%t#x3?plV zFasi&N2Pm)d{9B)+IXtTlSL|?w^It!9A(#KD}}K-nJnm0{Uw@+!EoA$yTNODCAZG- zptpxFY@{=}I22XJ@`S1-wczmnujs5d`UQg*#Q4_O6W>aEi*m(PRr;|zo!Dqd zqaQi1|IiJ#8|?%V-O~cJd%>&_{%^ej-t+%X?(r}B&aPAKW#SV+Z_*gLYKl`J2&V#S zdBXl~6PcSWK>IZ57hP+9c2RV?Rdh=uox@Q3{K(1MsJ{abA>>dkom$jOb!B2T*`#2v~ZxrG=pOF~MG zpyUtk?3Wu7cY1l+Rft<+MF4^Ql4LC=oDcGh?ge4R!*vG5wzgO6BU5AKyjsc1!b&J` zuWTvVjs;A%la`#u{&Hl+Pki1Np#-bYG6wuEg$WCxO@UnCP=cN>pjRc_#O#&)u3PptE&d`QM$mT2kA-9a8q^pdUEXm; zU?>O-wQ&C@3bQU2AjDZ92{H%<_<{2rc)FT0eMnm}B#eJCybHe@T{@z=%cpiP}SCh}X?7Oh4 zh)d_CL(xX&f+B?_&BGnKFWj*P=CfXWRXrAEvZH68h_Rth`T^>$W_7)fOo>bX>#(vw zzAVrh5VnR^7B+efBs&x1VUL+iN@ZuFh}h2!B4U^=0w-vr$-`uHsAe%aX>HNBK=(rv z>@w0Nrwk>&y1Aj=KuswHqJNG;r@FH|D3WsLLmL_^v*TByi4?V=PMW(4^{=RyyB*ym z{KDVBDyyQsuw1*FzdKEDtwh_io8IoN}=c2P$NVx2XQBQJY>DhqC0%e)9z@@w+c1}b)g}I-StBJ-@MMHf1f^^_htD4UWY=LB9r;c z#`+9;PJOCqr}e(8PC4LIG)(7wS&U!zL3!o3qHJ;G{SVGHm|Q!rz^$Y_?;Uck zkX`9Q2icjeQ|;9CTeAq#i$yM;k~>x>VjG<1Sau4*8F>W2em#dKL1T}S9O~R>B9HmW zxW>Gk3jU88JFzlpdGOW700dhT%m!a}<2mtn46Wv0G1nEvSkE*fD~Q?CQf~?rj8+Ip zi1`vv6ul7pi3ByCo;ZHf;!b&Hx2(18@$-hmIQ6mU*?tF$4WMf#snp20Q-bF4mkB@D z6E#T6UJN?yD}tk@t8${(n8zEMQj6nnz78A7;KdAnmH<4QK!{C!0}!#za8%xxlYX_K z3TmCIlrQpR&KCdcUGhj4Kp2)npiFTTdC92D-W44|HKmUGHy-7sW=vE1uPs}&eI+3_ zExRpI(_-zUc%$e~5J`%VSxD9>RAyPOss`nW9+kc6&Lek3+PR!CND;N!Z>DL9F+ag3 zOn}`ds1ucAy|84Y$z1OC_7{pB!gx#4NF2#~PXp+nu5N(!iU-L+FYr!B>}vafA2AG^ zB6+?aQ!|olOKu-Ni)@L;1bKL!9)*JBevfA=17c25LuZmrEQ7X_IHPutTarbxNk7iM z!I<+yvYbzEaz%yjW*b+BUFZ0xqcP4+R4=Mj)-!HQOY*4mT$uc*&w8F5ZEUmuYEY;pXe7o!Q(=~4fm8UxgeGn zzf=Ui^RO+f=sKjGPMPGQ`#vQc{0tJmf0CX0=<4?}m;K^05!4h4?ns}jX~nok5`6vR z5^6n1V;+@oF5c5_F|o$UZ(BcQl_fS#AsRHoT-+`;0gVHa+bj&x7iJ; zmIz|vxz_i+m51!MU#Li{M0G+Q{yKN;3J(;ul=FJD)=SJ5A^&5TxNV`gSN`?~DFZel zzHtX+^1Z)Gbd1eMzho_t0ya*o1J+;gOwc! zYVG5#=R5ahV96luxjV$#GhM2v39EKUYfJrq^r==6qsw8!=K23uc9szX&&*?2V%9|| z15^$Y2zzO%ozqUrAnZsN7KR|Oo)qO@FYNuHi$GIXzOajKZ2{=cD>c+ZUMHGHq6W3+ zXGv)aJHo`f@*6AbF*`Ta!N}k$8sHd~;_6oY#{2<+sszTUcU*<|ZpLGdOH$GqP{U!< zw*?>Svw!b@<+8#^AptNjp5B-vNQ=d9t6#;odgPQFg%UA_sx;eZU?wQA2or4WxFeQ^ z8X@>olMUjJO<-qx-q@(eU^CZNgI)q9$0pS88q<;z*r;j!H+f`6vmX#`@!uW%$L4+8 zmOok<5yj|w;ORjxv$JXJQWB7epnS;!b0usTCyzvw_XuwOk{cI&*u#Z?_=X{3!xy;# z;mdn5F}-^}{(qNx2T#7sILF7o**ab5ghJU&XtjzrIKiANSM$z8Q{I-UD!2E3@T<{T z5l!Sqr}K}ZHj~FK-vSqy!}E0p9AjR|26F?u)NKIsJD7+LPa7rG;U|Zc9QECq zu1)~01&nZsSsGxX>2mWBrb9ea zP$P6S(8yduMnBN49;)n6)My>kk^J>|zRcnGS`efW2(IwTz!I!_y(sjWm>x(wCl~fx zvMy)sFT;<#daN`qmKlYOBD+m;a_w69o#KGZ)O#hF_BJvMy6{_)nCCC5)hyxmu*7Po z8vGIurD3;p z8fvlQd2=^b8>v8PVK+giBmI-V;ozgNgw>TCZ7+)2bCQ@rBL-p~NB&|v+y0XCLLs-Y z7xrcBp-pls1%Y+vM$|^Obm{6;L+M3d6)9dtU1t^5 zQCU$k#0?zFqT^pLyo?P7pLq@1bNUtNRuoku76g$cqb#vf`D>;Mz0lP{N||flW;vvA4G>J`(#SK0?4M0V%6xfcH4G|Z6la`+r|{@~_B7ey#%nND z%5&}0U4s~PW8If|-}4xf#GRopp{~`c)YL+wEB^)xcGjK7iR}ODI!WR{v|g`t-HCX0 zMWI{>dok4qvttoD-hWRudq2sY{h9D@K&}0v{9dX3^z{gbta$NYg6X7Y#{eH`n_H8A zn|TptF-Q5JRT+|kw3CPX>`|kX@9|aX2@gG2{?W)vT5bBgYPSV85!L-OdTMDpP6iFg zpec2f$~x6wZ!8TTb>%*mbK4zI%75ki$Uel~jv6KoFkg!U#WSH}rc@}k`)ZPD7tbHg`W!Kr%GObHP zuGQJ{&F*;+1{KtfA!;8UiLNqSy&SUJC)pz@RtV$!?%gg1Bg|S_DfyqbZoh|M%wboF zUv=DMqQ6_j@T}WJI?{>x(Q8*Q3|J5hh}Y`6k5skJbNF6qVL;Pi>k$o+utb3F zJQ|fC=NcS~Me{o)R5x9^uI#m9fr$6(deiNB+m=X;CucI5XIi#47-5eV?|V2XJ|^VF z9DAPM4pKo56a4S=6keg;^z=A#(}=RF3V|Vo(VdJdSKFWAl>X(!Oz%S5sl`Uz9Xj2m zPedeN*h}nxL(ko6m&Zcd*z8b9duyk@3#Oa=PA4(f{@aV zJUaI`Cj(LfjGHR)bet`jM~KFuxJVl6ZUf7E0X|0jKd9$-*0`P_M~Rl!He@2 z$8MHgD!W>vdGqh3<}XPGY4L%GALRp)d9V^7C}5tw52SNfVZDBh$jFw|>?33TS%e?h{st{{1A z7!;vV4WBPx^Ams{pB6~bqYi;%n1Q|rvQH2S8ea>$@D9V4{|kZ#wxo#-TtN~X_&T&) z-=RW>h$?yYEe@zyl&>wA75DN~FD6P+j_`yk4KPG5{aWb z`qvQ(0=4(pLgU=5u!98A*_tzy?DQrQQTDXG7(EZy)diX2Jp<`C9kXUBSC-0$vaO4@ z1G?tRuifK_-#F8){nMj{D}|A%iI{p*oy$WdPfn@Onga|!+sE;K96g-t}ys>p;grQBskW_>pgz+l?Ys2kG;^ zOXkUl4-OdQUN!!cd6S(#^m>17t%A$*I|(AUxK2RLKUI;oB9Q&p1ny zP(p(tYIOcuj;poIZAR75|$Do$%H{ME}z+szoF6n z#_5o4a3S&f42JGp*Q{YnD81`h>ky9uU>%grzVuo$(Ib}0O4QV-BPTjjZB;sSYswPS zGg3#T0HzS=%v9=Dc0OH!$ZCdU#7Z|_(>eAb`mW#MS~3#liZzlj1wk;hmdZILqg>&5 zfc#1kOl*A_>~-R$&Lfqi4rL;W2z#-U`A}l>%YYO%G!|WV_oRH5>h(2n6`pXixD+pq zfC#7Yv6ods``EKBWHAI>rmk4R;A*%0EBFV>eZLbLXStI*)5EYV-Xe))qc!0RlgK)3t)ETVsCdj8fv*{$4qB425dMoMW2HlVSNlIgnSi7H% zr}7I38d&at#1$y!_MNX){(Zyxw0Gv;~TzW;)#*{2UC^^X&agF&&6a<&|$z>6nptW8EN!;_b*(+kACH4b#aw_7c5 zm`#enu^`{X(Q3>;r4t}A&x`8(hT>JJ@a^;IkR2o>_8;At9)istTMft}8C zpwqJ=`^sK~L)yt(v$DjIg-CnugDm(lRqVq5l4-5ZH!`Qn+mqtNrDPhk3Mo>e7}Vw; zt*Nps;5S+=ux}7=!KLdNR7|F@^TfKg0y?Cwyf81@cF2y2=t?(_l~Q=QXj@lS7XRC8 zRN8oeWGTwu7VC;mR;9+nCn@LoN$wV!kpF~*TURDT zD5(9*8KNAHIq=ZGtL;k}jRz6c6uNjRshEq~c``!+%PXfya;5P+e$eA)2=4uVZ<&s% z73Yvf;&FA961Y6p9OCJ(a?cd09N4rmY2AHH-B-!GF#PEF{TX?>*yOEvR>(O?qqj}4PeM{iqUuV(d2r-Fec3@@72}6|=9$d64(e`HQ5|_@mgFD< z!xQ16Uy$e*v_#h$FWRjq8lyJc#Uc;9D8A0+IFhqZAqFsA%K^cWY>J-9b{;+HUG2Wo zGsdguJ{*1imE(8(;Fg~Uji}cOOViw1rXA6(8BAd^bT^Ojtq%+Yw1Pn&;YA_8(K>99{@3#Bi5LEi{&8!Huv zymp)kQ`oK+fOv3WqNd-$gOz@Gd&;(f@I&o-Bm#uv=PT;|Wnd2!URx0QYNma%ydUlz z$vn~T%5mi>IVcSh?!jyC*=>G#b?HVd0YrQ2FjzfoUAfM9i9t%)J%Z!j9(l`ry4V2% zu=XWaMZv(2_5#IKrzMz($wh^h$!=-~NQ^wKpY{O{BSbcApGFb6HTKd-t{z7m&aHXH zD!Tc>mhKyCT2=}EOu4&Cx|!s)il^q7sC%gmH{0}CXR)qBZ6;*p|^)MN6z$e`;@j|`h$NR?wrY=2Hb+ECS#fDtx>;+5SL#POEQO}6 zCCkYwlK4{mrhhO5Xz)*CX@Q^~NE2>_5?qay9-^;7$>Q*mB-(U1JdjkfpVAJ?@!QL| znh*((4vb+1s5h`)l2|bzc2@P8=UA$tb^l9}m*Jr#19paKB%dIqDg{;A5lF})F8sX< z6OAE*Pn!2(ej8jnq#qmu3<`7{keB}#sqQ_4YnT(BWbjp)&1FUo2#ndL(_&gG%19!A z7I5@*p`S{aVBxe0KrlG~k1{~R6!MB5!)M=B^FFs@RBXtL733W2i{%G#`5UJvdlOZ5 z;KXI)B_Ft6dho7_JiP6gv(y!D!^ zq15uRpogpU&>ulbh5u~>v<5Bh?s5_E$o3oT3M59%5GW+ISsDd!#jNP z70iz!ZLm@iS=hebn`(0A{$~=8ER-_<+KUjl9k1mJg_~~zJ}GM$j5&`tTVw1p-Tsnc z&lr=z@&Gih1|*C}gHmn2oh!XCrC-FOCC;x+QrsTSWZ*Nc47#O+|0)}V#tO}*I4og| zifS}_cjUEOecffi)fs7J6duz>+Kgzilwc5G?UWSRW22| zguK7F5kMg9c_~3wiVWY4rBRQv%3)DH$osX%tnJ>HCN7HOAUJuUy&Nu{frjrkE{amK<^IV#sdM1O zAVlo(D~)JFb>3u|NeIeTk|(}+vPe{)_Xrw)rO7=~WY<~Go2}qCr{SExeZ(#-d0{Ux zV-aCYZFS9Q@4Yk>IHl4nImcIpMw~>$t_Dv&5H&a&ac>$zXK-D^+(_iQeSma(4o>FW z!xYKfENA}_K7!t(I|t2oLAFd24o#2FVw;0)!FU6ZrIZQ(+fb^*wLKN!ubY891a=6tD}V(9 zz+4=gOtbSUprF(DiO>XG(WOd)RC_n7E(mOKfQ|*vfS%)$cfj8X9{n!7nK+$k0A(xj zXruUL*JM?;=aAn-10j=M7X_Ho2&=|6N#YennsAZ_Bu=^!1_M?fP%3Mz0&(p>@4KKI+5} zjSVa&5N0SDctt0g2j1|ZO`-696jV|1EHuX-=}jNYdYif`vQESTa^io^?UoK%GE775}qUK0~8pOc6t!r4T2z8(;%at59p(306o^#@EJ`Z6=rW(tHeIJboO)5 zj|5^mL}D}VE){Y8#^5u_U5#x2*84CH*mI{0-|h7`V9lvo?!$v|%i!Ih5j*VQ+=?Ai z_!ffN4T{EM6v+nc@LjdBr6-%#z|M3OzuVnw)^+2OQpu@M!Roq~H zQ=&aDJs%g4U+^*gp!O=MYI12c|*sK!cB_z$;mQ;P_cNTW2;~|=vO?l_2}}O&-s~)-z=PQ z8LCDNJWFpaXlO_JXFX|-OG$^txA>0bRrmFM2c~QfZ9wg5h3R}m_V@5mwT}Nrh0Z&& znq2(pp=X4MOq!DQA#K}adFiO)VX*b#+79vvuLy0jX&JfqnjcJV(qOOZrL))=Fzjat zO-6NAC8Gih$h8zc`8sIivTmd1d+V;a9?Sn7v|j}@ZZ1h9Kz5@+a2T08EQ_&KKJ-FG z;6(Ir7+0+XThlq=<0(*a^5U`M z`Pa;4w}t8J``7Dl!-e=7vEUmbIRdAtcjUoOk`Ul9{Cj?oiMIs4UD?(B{7nw|pw$nl zQKsZjl_H?e3T59MxuiJv`wq%zz%?77t}Zbl>tq$0P-WycIX0 z3oN)i(xENn5~nnXQmU$Dg8`!tz1BX3Pb;hXvC=8+Y*ge@;HZt_jG- zc%TU_do$y9n67^>o`KqE8&^T_-`a>*S4h!?fyli9;TaD`b3qc?1p39q6C3K5SzGBu zYl!3cAj!9IW<;_MTD9)E(@NmAXs-6@Tw@N_JNkH&O{<5CUY zr|M#=6G4mn2Z z;Tn=`sE_uoJ{d-I1H0L3-o)4%bAF$O4@bKJe;J;7ua|l6$8TyGR&`O^dN&s2sCUQ` z-F_0QznJC{5>#Kob~#GRw?r?bwZA^6_9wS;w@f={A2tXen^+&&?!>Fk|4v@J9Qr;j z-zsrk=N$>pVt*x_QTztBlsHkLk9?26SOUq2Fd@e3LY`|>dG}OlP3Huho0}Hb5sm=Z zXYT7;^1oaGSwFAXdmXpGrX!lbFok>?NtWk-C|C)^oz~ZK? zC^ zA|n>Mm?sJ+m%%G2=#MOpVgN-!ow7;B0)7!pNV{>Z*f_gK33d z2L6)Cuv9_-N%6S=w8Ow;moR8ZddU+F+-H+*x}=h0-{t0S%Kq?DLLFX=H^OpnBr5sm z@m$#Ba59A6IV%2v*5 zpV=dq?G;d#h#o-$!%ns~MrdF5gYSCy_)DER=#Z%WDeG(5>~ihAG%ybx#WP5DAgao) zRivukAvow`(G1txIqlw2DAAd#TKedRxLLRofq02cN6c4-HAaq-h)X%=j*+3_>-LNP z>-}hloalO9c-4klqRQA@Rppsx6)7tb;7?>c>BwrR{I5>)gzcX0mkleV!wnWEO>A}!YwGV{&S2W?T=gi4 zWvJ5m%Gr9pV9$X-L`hTV%X+&aYvuU>uQ&V)@0_~@c>%(8ZipvYhsiUEmJZf{d2DN7 z;BWb+i0d*wy!6am5I<*^&i|lq88i`~;urU=XaI7Baor~8u!}c@M_7P>4nrp2? zMK;_JF`c@Kju!}tQrQ4J6v3V%g?AGL82IFxs0)yc3@$!sty4|2nXT*1ZOC7h)NuMn zp<;oT@e0z>-yu9EEti(KrQZLb z&zm^R)w2k6_T*jqhSZ2d{N{pAcy&o)&?{GkOLEs0+9C2zGQ0HRUOL|_Vo+9?j~nV@ z0|{~LD1NbsB`f6A$K z1A3Q=dW}bn-TH?jG-5CJ!M=+jkU_l1fx?}^lfE;*fc2jnmUzO|3ow3qVu?REu#*86 zO$Lj`5afFLvt6Yq78xt;hCC0lU^~eC7pu|yoSJf~loOd=@>zz*^n~oDUbc8V8QnUG zj?r8fU82=MTCt#Z>RJB354I6c_s9?d)H-iNb}(>Vm4i3cV9S}%Jume;wCeIGT&u}U z`PicnL*7FT@t-P0IxJ|La``(}f}uw&7A5%A^^IOqOC%#%ZMQl(tBcw4wxtsIT!H*( zD2N?cS=oHJ7ChR_1X?~=qWjUdo`GrWLo)BsOF2sUuVQ2yUy5b+?4-~H9JHwj(l%Yu z$azsMk=4KH+|Zf#u8$cWQSr?P4JPLb(!~VBvwa9ol@0-FXkTLhP}-g3nD#pw4{zx? zt2^K_qdzE+?_V+M8CLdl;~9{hSjD9z{oJ^WmDv!%GV;G271kk-M&x{B`LuZsn!EV< zmpDsr&`VUR6V`BMJi$~~#IkonF{6D&` z{h#Unf4_I$7`BO$FS>y)x)|H0djX8Srif~Rk9@~V&l zZx)y}U%??q&jxY>HV%Yf#gf=#r}s{6ymQw1R))e6A)3~(cUN`}h-TI*r&ZqIW?CNj z(wJWYdA6kv?Zh~*&WIjAVCZmRjPXsl#nQR`^kof9-IeZZ33cPi=Um65B^=m4s9 zjm4jdLs{O5zi8TCw06gJXw8GKinl5hkkuhK8NTGW#ZD$$zQd&O7G?K-yRK_lMo(7j z>`ZTQXnk4N_`M@ThA9zKR=QBqqG}K+B?4H{H_FxDQo$#GQ9REK*yoNxc?eMoU;>=8 z#hb0gc)cz(Icp>1!8{We$4^g+cuA_>RKmxTTou+L@E$Tpqn+`9+~kyc&GeNNZTVyw z2i0Wi9201j9SxWqd-i?4-H}6LOUN>dtFmzFVTy7Uc3{g>5 zb3Th_yo54K+f8C0_9*WsI!8F zQbi#V9@f5JvSqtK&OU8|TmrtUXL5VQ8BQeB<^_lb*)Bm_#I`F8H}iBKo(i29v-#3z z9#3kY>#AFNeMl;2H&+_3mJ$!e=5rrJRt;q7A9`Xe<8f^9CRxProNsFGZI?DP%pdjI zdnEJb&j%I`JG*|S3DCEX_knB56_+oapLo>T_}W2Ac3hVI_TEQxFk7G8U>t2DUCr<^Q=Kc+U~|`OPsjGIcTjge2HKC~ zJtl129M?Y|Qbb*q^0l2Q@aW&|JxQ>H$vRW~fZoKhA%}#QdZgm?w+z^%V8_zT#2=VHs9=Nrf>gVz2pM-< z1wEVrZ2w-q`xxFpq=D~R$(aPVWg81e^umW^nW{OPvnlF1?*FDh@hosMSOC5v!E1On z#1XFz^eGDP4@R!e=I$c#SnYGd8aYS{TSn03-4Jr54vn)bFk%l2;zxX!D7LRx_0@54 zK6Ff*L&Nr;2!_g@xO(`fQnkWbIRWikJ5!kt>(y4G;pJG)@GDax`bn*R;AIPwYDHoy z-z(c=e+X$cC_zcxf?+6fLx%P`cUqFOrI`H~cy!iQZI2BSaLsH!x#(nYlco1l7A zwhw$KXDX*(_T)axafwG~jg*45duXyyKtu`MQDurW_X9Y(%Y==s*v#jy&7$NhPA)pL5NH1e55pcNl5 z`i&~yW&^^~UCODQV}$XeymVTSb;M0uZ8&=$VUS6M3gv*GlFS`#{z+u7|BUvk25Lr3 z%}dB%Ib8g^_%=h(IXNe!s-^FsJ>3F9Nv6}^WOXO<+pRAuaLs3f=m?FsID2$noo{P9=5pX~? z7t)9GQ>_CqOV)Q_U;4t1FXYx-?0ytKyhPMzBQVc)UMtKO0$*VClYgLk?}950t;i4z zRvPliWmT~^A6$-M?bcdRy?}gB=!-1qe$ZwB^&->DOkB;}RFzfQWb7E1mC*#>p_8}> zSxu2qYqP*9w`oHr678ic>tS%Ay|W5Mv9D)B9 z=~(ahvPyIO8bH8Buuw$aAqaEwnY+cKg2YlX-aM-Ngix^De(f1Z1Y)2hezLRm_(3T? zdWJYMpbU?0XT>kiq%@~Yd@ml&t=k2-yTQ%454ziPae@gI8H zrjo~xLjUtzQ@{e^(WkbVc8l*SRdY3vDrRTN)6-U5rybd`OQ3-8ES<1xUnJ_lY^7`I$gJ1!=`cv zW~p=mmYlx)J<57eU|g}!HcM^jirj4YJJ>|gnTbPw#=*CK-Yfl=OnAbYThS;R$SSuM z?9fmkdpvU5c~gvNGX0~m%ClR)``C*TA=_V5j>+wz+TY_d)k-6s){#=D+f~V#yA|1q z;#&7Yr}|@d#AWeF(ibcF!Z7~JS3c+CkOys@c6z)Cl`H!xW=q&II^c+HEKfA7bn^%qu&VVu1ylxvnG(LU4x-2RLqaTYn-w%TzOApi zKtcIena!zlN8h={@z&EM?-`fc6<@f-=s@meIny9Yp#BX_l*P3}k?sNSc%EB=m7cSl z{mW|1zTNfW+{!60VOX2HMT(n1y8(jQ%LRMdNGv$`oY&T;ox{u@d>!^r)9-Mb6_4F^ zT3Dvx61;Sh1;Cl3OWhN%t0KDXU%wn|<8`DeU%P*k z*n5Rxu?mIbcmSL#h|cDn>>drisc>rMXGo>g_L-X}cuEDh-0LRQsM}JS|1I1FG{A{Y zW-A?awdH$y4&0mx0mvMzzP+D#v~sd~bMmbg8%x2gt%W#xHK9Y;XEO7Wp6PP<<>Qb0 zec(J(@B+ozuy#`*lvUa&{62|YLKnxipx_GJ-(Q4DaT+uWA$I}5z+c|Z{?bienjtFb zYpWHOg8w7bS@Ay{hyp2r4K>Ov<$p*Vh0|Y`t)I&xv$^MGvLt+yJnnL69Y-t_ zOj#_%=IJ{(0DP-zFFqi(_}hNpF=O$<0V|J!o2{TxLV2<=eD61m4*t)4@05eG?phUh z(h>3%mIBlsDb2n`!D*MJ-P9$c3ECv6PYipo<);|9fu>XRRt`yl5$M4Hxkj0;%>=im zh(a)h1zgyd8M8Q%x>(6J&;1wSgy3izAUzduT@aKjLC0ei>xDsEFg6i1&OPS;V`*mg`Ru=w!yO>Op~CZD`F;CyS?h0y{g~W#Rx^v z>R1cg>==iAjvN2cT+#x zm`%$}BEBl3m)|K#Y-ETF5#v8Y)sd2X1JAZ#Kq$EYTE3j0(K@5jAYH0(`AG2?{6rdN zP+rC&_Byv`_LT#t%JV{OvE64Q|c7|XLC!g=6px@)A-Mq!uGVYEV7{Ou1W<&bafdUw{bKRyb@u03x}~hl1Mj|CRTWDv=yEb9alnx*JFC>F>OPN<6@U+9mG$G`6rG+^C>@7zw6)Wv0` z6?@;^c{{#n)G-p0Npv-j-^RF3(P>7VMxDT_VwJb z_gEOz1>0X6B$S7Wixff0H$bWZu;iT!;UrH;*jAP09V~dfV_c4XWDB0DbMflx(Y)9; zeM`~JO*a4~Ezg*s;|I?kIG3O#I9P3U()*$Rq3q$>8l6hsjE3f&VA~W0B#ZWizLy5j z58|~;{SNLYZ1lAJd9eHFK~0XDs@9W@@YLX3>|S;98Atfc@)5I03jCRAUdk*~e3cOQjCS~NW zi=nXUqv^jH8h7D)y>1ByOwl}gD`O>->m@Vk+5MYd3UvsR%?HhvmkHS;FmKKv{Hl<&vjkw8k9y&+Jm^bYfi5jQ2wmz@Eys&rp z{zrQXAZjYLWyEUph}-hX6SQ_Qolc)!w~a25F1;Ina3H;1*nX{LcXH6S8+=kA9nc!D z?Q6`ch|8Hc7b9EcMMwPo`qyT_KV0X`2SEVu5k#RiEcz!-pnl0iT7>6&x-X6!pxdIB z)l2;@Wx}sVDe)d3N!k9&fmGmeYAso8Kp#5K4+w}p~{Ie@sad!pMzkd1CHwa zVRpM;zIS&~N%HxdDQM6qmTE)*ii87x#uCyJTECOF(h7zQo%uFuRZ zNEmj6Ud>C0p9>H&Ujg7ns{gpPiVR*$zeXz+@#mjPhUsC%3WUwJXFq{GC0}#&}8M|y;-xk&z66h^i7tB+XhI(zN z9$yCm$FA8O;t=q@2PE{I_R()_{wIMsLr)sy%fD19@5DG=6YizeZ{Gu$ts2_+{FwBP`94+>d-}3Rk;VtYB%r&Kv)9{f5L<7k~q89-RKh5)IT!Eypto~JMCRef{juqPgbj@6R+hy&YOd@Mng2~`T6DEg-;E4n+|_(ZDyEM8H4cWV{3;>2FaG63|j6V4yz4@sC-&;GB|wTo^h*e<5UTNKK~0nn7nJ4 znkT#W?G`!G$T~Al2zGMlkN)j$s@%9xr45fS#nYU;vUgSQLp|FRCOBFD_e{yx0mzxi zC!Qy?{7dSeHe3P6J0Lf93QUN#@g&>ru&69wveGZF*p$Zmw#V;8gdEfs4F1Z1;uesT zVVA;wX8Nn2kaRs-Z+vSov zR4dnhy<4GWRt%~>%S(Yniy$DSCqr0n((|FyC)F3}eQ?2k{WOw~7b@i}XV~??v9ukP zi6B3&NY!X_=R-{Qf)1jbAM|Ao6pxJ{#>TF>`1;GlPO8LCuvPPTPk{)wc4c~yT`;V{ zz)~8TxXcBtwhq(a!qNdd{Noo40?OugNY|D|O9W5QfenF0f2Ed-a*6^zg8zc51O$T7 z>0sdS2^h^ZAoi{5U$K1gO^CFgs>vsNY}Uio5^~PM2n?gmA~{3kqgFD+SnI=6UA@o}H;kpNJNV2n?6(4xP7F#wn@|%LFfHv{ zjo*(Bx#qlec<89?+b_2Filh1($>J0ho<=o@sqth?IV~qzXGP5A9)@4X{fQycU#nkv z^UC*3qwwT2pKYVMmroX@MgeF5YtXhgTChXOKj3ZNF$DDW=gQ7s1z%pfW&sNy;~&|& zo_&Ae-MZ47ohoC$z$Vt?KVCt>X*E!B_hD!6J(xakyEUzfd9V7bwMSiVL*yRJ-gGLD zhIks$g~yHij!?<`S^yJVGPit`l#BI@t|o|nQmp#Y2;@M&eg#~h6dDm}zl@c__)^)i z&*SaE9Q^a23$ur=9-N6hTcMVP&If(RPY|Y`_v?diblcKxe9H}pT11%-(6*da@oBzX zH+I7kvAm0g2nH_hyzaHo71E4e3S|H4o3h0=09!Gn2nD`~zcsYbtXI#dBsqh`)X!c| z5rLsM9~ucw=s z^V-Z>Cr}d3JIb5_u+ad)_|I?*+!bTHX-&`-?*h=Ce04Ne;RhfSMSJl^VtbPK%)CA`Qk@ddZ?_*GQwAWUYXl;(=~N9qsH z$f&4K*l-ffFlC()@PRMOP!-$$;KIbeC~dfMvL`M*u6nhs^f)7>dcG=G%aHXUulYX3 zV1JB=N*OJ$;V4%sfCijtQ_Lp>DvF^;biW!&;NLzlXlt?867WBXw!d;)Ff7!JJ$6u`PtQwTKfK{`HiGZ!jf9vq>i+VP%7J^yq$z{9G_VnD?liNvtc=E%Hh{{EmNAnk zR!GAf8}R>FgWO-Z_M)5YZL0oYql#B*DTVX$;~zNP4t84@ZyR;B)RkSe-KlJ~IGp?P zCL8_rcXlY4k8F`wCQ=TN+7EeOir%Q1`dH(naD$-SayrAWGUk(R+#kKl-lr-e4g_X) zePCk(CVaGf$*S8ETtH)|jhCA`MNAH8+?rg4!BpIV>wp05JaYWP+BDBqX69^;`{VZ^ zug+6qa^1*P$5(~5yx|4?$**_~Qv~MrEMFMo`qC%uy3)Mzc>(R9sLSHSEJcSpW+akDxibt3@7nrZxFV2{e?V z^}CVBS>Ue*&eFLKf{zN!A(gM`r>Q?F3%(MVV_Ny`Q89N@>`~%&MY^FuuSF^ncKGIh z_q7Djd9a%WNo~|gcJ;Bgia^1I(T1#xF};s!ES2nCSE-kxH!}tV;~YDkm;SFtkDKm| zIulKKLb?Z$*ff%}BZvjeTT5NO)iWx3%(JDExT0D>qOE zJv!sUy)|&>ecZ^EuQl&ZpWJgnl+--Y35AP6kV2pn7S$o#K!f9MNkRT?+m)+4$Fgrh&i0X?Q(_1?S|mwy%~NiJ^n` z$)sPGghA@{_HfTO{I(Ibpe3rCR)%Q&L1Cn&(iod%Za*vRmgW}Z2vdVF%pcg#4wWJ(lfKC`ju{f<9=+o)z;&iX^{&Tyx*OzSKj3O3bKFBM)v z1td85S@(z+v)-nap0TbkZHk@BB6m;roZJuT2ul4Y{fdgx?mHu9!}tYJQbyU~VK^&LY|v9? z;Kq5a<8xeMwFgP}v3t>}t{VqZkAEFf^CI6e9v0FQZX;zvIr~ee-QtQ+rDVeG%G|@% zTSi3+*O$h5Czfn`W`c2V%7yf7m~(8<@;+*FYDXc(KPhL8o)T8cHucHSu&Z3Tfg!-g2dtRFK={0o)q-i%ryE3FVH$ee_0Nz3w zjXP-!I_&u!WtF4@_*%V#$YDhmYd0i`)$r9h=EIpbTJvb znd6~5M0<9eFOx|Pudk9O&a1r+kEFw>`5YnG9ZysTc5`{G3o5)B#)tZ84-W${v_eq7pfWVD zk|+n)G|LlVn>IfwW-?L~O{l&D)Y{V3AFLP#t9?X72XuT$+68~4LP57;6pjI4%I-WY zM5!YG3hsqk-oF|o1ZxZJew8mV`I&WC;{Mlms?VLTY^YpBLnA}!kTDGry;pMX>W8YN zo2|5rMHzoy?a=2D={6F7*53W%$Go@@0P;vAch7YwnR2xJypS zAPs}b;;n!Iuo>Sw%;n(z=RW+CnV5M}%3Z>J>WD+U{B-+_jnj6<8xfs- zwF-FCpEXyG9Tua+&uEQMFNIt)yI2k7(A<>aU}3)YotTVAqi>S$0p{o+wbzHIpM`lM7!kAm7+A`X#v`E>rcvUyC9;ZH_z@=p{k6#E|Zr(#3{T2ZB{|h=(LHC zf|j64gRkuzo+k?u5o{nrIDt{%NqL$Y6;XY^A?)g2Q3;Tg%-5m7jD1dqrc27Dc{+hD zP4|4*3N$NmV2pg|?D7vWJzKJO{KnW@5`gjK2SJ_sltKnoI`(cSq>EtS$rF@+(AqT6 z4bd(-S!xnoJG4(&T82zm5!)Uo;|JaBwhiZMwF7B@_<~D4`mB_(E+K`}_JWuUKq=B9 zdtecTW3nB6a(6`tG8Q?I!djK^c`H2+pWyfqW#R9uWad>ukwbzS^;3^c5w?PX1-nQzpHkJEH1$v(Ure6=gi9+$Me{a@>N>>|Xed z`k3RUyt(@m`|5Ac?NC_LSKDO-hnqM?2sMGYFYn@J3EeHt+DRy2YKUFD{-b5iAZDu* zAc0dV*noS&yH~>qUQ-&9D;X4YuRbai{a4nIeYLRHW%XeV;~tlN^+?kdk<(-harxop zU?#3;6NNdak$h^Y9GWCYvJEHvkMbkPrlv&Q)YEufoHghI8>8w-wMaiY8{wt{(L4A4 zVZcUfrepY@Df6`Skw z*5RxbG{aA^d+Y6(h-z89UL#T{s^Q=Ed>{L5@kbg29dCi!S&{A(x7y3Le&qLa<r}~FMJa<)Si{(|76=*+tn4Xe5LUk~Ie@Dbh=0rQEWgOgq5;?5vfr8FsF6tk# zExat^XBA_Z@hbn0FMS(joOAG>aDj_xy^*U1QsB=3zV?4AuA>O>-o-UBuO|Gi-ON)+ zmUv%$zxn&8A^p)rkQeF;D3{KNh0PCL`M!9jZS(2cb1_-1>wEvwTOMkatUq3~i9qAz z8~L$u#08I7Eg9?NV}dojv|XHWEjVU8{wg=oACc>2dCL?=k7yThCIyHC)i&%!Tjf5w z?+|g~G-~lQPx2Nn>aAnT^yh5H?AB6*o?g^E#9y5F`&v4)e{zbBaJ5LW8*mxTb+9@S zR1qRvcUID}>UgB%ZYf`0w={V(feoVd6kk{dkesG3$J{L88z%GbLKG-K4dbJ~R&5&AF` zURvJ!+hOo*jY2*C%1Hemrse3x7jf;owO;4u48;sirHZ{K?0j;^>>>#h7POTCvy}Xh`x3e#0>K$; z0g%@_Ey3=)tDTEQ32NSVuurh?rl2z=7n^M0M|GzG!vlIQ&4o_b-@mE7(WNxF6;`2L zopcVtCb{jqdh?jUyQ`^MzTHx@KuBTA-IqOj24~=pw3m0mg`{zn5qc3j_rC|6y8H)~xMrrIo+I&QL>+d8t8$yyr{dJw5F~T z8ODmIP2+B_$s@z_AWRoR9*WJKS>`zGGg+{7?kZ+~=qe$-iViw4pdm83WZC>Sr@6>4 z>~n$WW%GSP&SFRUKRYD%lASh<_F|iY4x03~NlOmqpx09&;h*m7&a5itwbYRI+i?8n zPuUVxXRMl!0>VOfv^>wyrjZSRovtnnH?<%sIGt)gV~Brb+N;Z&l|bzXPHsrhusUDc zmQdTrfwBPMDX-gTETFPr4<|p{0}zTjSmINOu8%ud-tuJ9|3Ba!=hs?lHCD~cCRl6U z?X#+6Ucb~BbY%Yk;_x%&O}Em(Y@5S%QMsWnzp(mXYWwxsYP!9}C*S>CQVOoEE{iuk z0iEo#bF1UFaMU)XQYE|M#nnH&;hs=2$+)U(9PR9?YMeKNeK44v#5-7MB4QvrK;gZv zylywW*;A);+qq~Dw=ilvQ8+^ogpS4s)-?)01SvfE#|y=Rm~DjY-+yksrU}9eJ&sQd zGaM|Z@11x{*S&2kP`I=8*&>^BrS9bJu;Kof)Xrq_jH~h{#~qswdu{z$&z|_?%(vXC zSQlG(TP~!sbQ|FcOQ1EK?w1d&jr6n-1c!g@JbSybxJr3QprDvz8c~)hy|j~cn_UmP zV?Fo!$3HKA#``{+T^c)TcCHB4NKgo!y>j4#_kxZxUsuRl9~$-kYoKDBF+NN2py3f4 z#YFrh^-L2Nk6RU8&_44xV{*8DBe4?{cSXc zeJ&uhGp^c-SONBcVB&_8$Kc|dE+4&fx+V`P=0yD#Q#}-d`NU|`shqI1#OzFw6d{+j zgFuUK|F4n&f|PD+;8Tr%)}i90{FB{CS;RjcmvT0n`lwaLUqUOoB_7~lskc06lD4;A zCR&4m3E}i(h{7bL$rz6tWPiVW&5Gu#ssoj{FhPf%uFN3I4Sh^z*h)&U#&Q#j(|4^c z%koSJKUfzeUC-732`P+Dw{x$yDD=g_G;nSFcB&G{s1=6pjIY*vCv1GXft z`{7$;0WmFm=MI6JL(fvZR*IHDXALxhfPxNIYJc!o3O1D6P8AJU?xO0YpL-K#m41`I zLk69dq>we0k5Ww^{+rQgnrmkGC~JSmaQ{8yH4cYM~Nf>sSfF=t_&3UL}>r0T?3M)PxiLhv( zDVONK)xKu%#++=>zaN)}TL4n*#?XbNea zEvp%C3K=$Byi2?k8&tBe(lNB_Rm_jDURp#mV1KLk2Nm}{m%Z!3uk>svY}nlAyvwLV zKj@H|5z1CAFL^naw*?SrQDcq zb*&I`pW4}o<4;;=Q$;j&p)w6F+7Tvl&)(mP)!|-D+(u2|*q3vG6>OzL_kzW_})BK0CGg><<%(1LA)8CfTs0J%B zZ5l4Q2=7=4@3vzG8HQwvEk~BZ65lT>dJ#WTNr9@H!!~NTfOlaQ8%bm}Xf&QbjsI(` zaCI@sd1EAj1mYf!#fON}kcJVpkBc4B;VO*EcM-}@+{jSLUT&iPX=Q*u$+R?xo%Png z*DKo{1f&9VxrSO(U)^a$+gS29lbHVar7#t3j+OFuW-rxjI<~0ArFq#6^ZT{KCFdow zZr|meX7Lc#c_HJ^icXLe&+$__!p`c_N7rnMiq4o^SQs^LCmOy+2c2zhSK3Z)&5O4_ znTGRJmmV>N&}q+s&DX;URXHf9Xz1CLKH9DoV>hhnapN{Q2V_+AWApYP)T-l&+5yO5WTC?a;;%wI)`7Md^fya8jR6Kfl5h77N&)LA?RD5 zqLS1#r85 z$e3|Yn^pAm>Pk_Ie$Gg|o$1Jz*DEE$QrDTFzM}0~>>Y1*XZgTVhZ z+kX8Zq(b=mqmNMxHh`Fv^=&Pirj>p_)x9R>#ZE_gDHy7@CNabtn{1sbtfb4%Oj4%U zfC6urrCZTz*l}KXdkmFK_*s^u5Vt8l!-4ua4<}@|bvs)UG>tJP0yJ+H4_oU&D}7W7 zouP>rCC?<&T}N$F_Y>eO#x0sD&KZv+G!6(|0munffF*1k|y}j$>&hAtS zt*fR)&A=Inly0C&4gBPl2ZP-EYl~pNT?+XXA@b|(DM*3M9d`@&5xrv$uBmEL0kaS} zqh%v!Z5)jUf%j#B+}nI(Im96gJAP_s7T`O?f9Ywo7|h*dqPfnwkyj;6UYB>P>E^7a z1>}Nq2|>;n!gleyB!3D{X0VdPc$>|)ccyz9EmQxiX0E)W?<%6X^=wjKOR92|WoY2* zJc2NQ&#+#V2`Z7-9~Q>3wIg1wW@zQODKOz@ z1c%R;UKE>yd^mp;=n{vW{ha|B)gdLP9(`gPQV_eJCl1`JB1{5RkX|wGAE$UZeWeg2c{TF2joo7M1o&(au((s4l zRZ>g0&j?BLn}ZO=`|>-8u)4(geJx45JOCGA9P2x>dpCCc1O$)kg2VBYKaUYnu=ZYm zB&+(%*#@y3TB3{K$*WrPi!%)M{S3H18Td0YbkfQ5hD+D4mU!)UNY5j=1%1QT?t+xl zk7Cj)Wf2PI`%eh%Zu1$v)ykFPk?<9G#%E-tGEGosyJ&f(G_8Gf&|b?XIWxqUc|a2AZu=JwNkLEPIQzX(nIO*V8G9&;<)Y_k&=n=o z%?c5FJ}{bf8L}f!h#=0yvkI#_FO)IG-u<@eH`_HR<2VI=itbM*jGvhS;_%~W;`^*m zk6sjfbJs{vDPPOlg^sYnUEp?8nMd0Y!+0xeFkpXWRL`@(R!kzGQ{qZf2dwxxrDjG= zQEBQWi5vRA8PoNgW^8)=Nbl(5ZzCjO3AjM$$QG?b>9Y9$$e)NJku4qTY@fNO`h z&3X(`%m&pIVR*#jxfvZ)w6LjBpAAUi(;z`wsZUAN;&yHbMBf+SKz z5LM^EfYnm4ZZXQy$w}RTPDKflUl>Nrb6WJ^&oTtdv@(Zg< zA1T+xSpHoGM%yzW^>&PSVQc(_pAl~@(>-65Sg1HeCg(`ji0)8!)Lu{XpkEaVVsuE< zH3-{CoopcrH>)`o(d%osEMuG$EV)4Fc2%9bMymDhg64t6L;jDk0*BNbdlnR#czAD9 z6#ZaIzNrYpcHnK3lBE^>lTwTLoWYB1Qx^b(Cx37rmK*(}-Z(J^@s>}C3ceMLQR8a} z1S4ZTk<0Oyp><-6sLzO!>-(9M?;9tD9r zb2=h)-KCf=?Z@IBjbz_bv|>tH4XD}R=Gj1-FDXs4wzY#v$_g$>%81)^n}x^jpHguV z;pC*!FJZc0sgXn^e980rRfyfX4TdD9^ri|8{xCEGP?7x8dgNLd9ub(Ag^cF4L#=-64^Y#YP>RZgz6C}phy3UG)ytwbz0|DD%fr+vqH5S3AvOcA zrDxV?30a8b(UAYKK;dW3JlYKk;ztwcdV+ zN3e!>EtugjiU3Ky5N%lu{;w?m8z78!J@t5kY2m(8PG(6^x$Ui3SVhXuCGqh#e8djh@ZNYG9dE7!{l>%Jlt1jFN>AM(1qU?aCru<9MX6(a$3P}Vxj7b|EJoX-S5IXQYS?~ zN2DeecUBXgFJ8sZw%^SDT+=~y;X?l%{rW8)*X!f|7dwM_Y^SIYB{q-a55-F(UhND5n;hQ z|N6dzJHxM(4lDSB@ksBO=)iT!}>TzJ`IX?ik+;|w5qD>;C9HzdE42Jg4zd}tSO za#BwHK!dX75}6!9D1zy{BIaNF*`j1Pfh5o*q0!N#%d}4ZuWgVfCZnJ+52t|?n;fk1 zLP7`l7>vBOSMfjxCk72pi3GGf-|B>cyc)XAwm^4TnE8)-rqWi4Mw0W%v8jATO0ViZ zNh|ZFH;RIvIOHX>vNJGwB`9;D5P>D(<2OnbmNvv-&dxYH6+7Y%N^*SEs^W#?!xQ8c z`g*ViE-)X0H)-IiQbr)hq5_c0%gog!wuLZy>efGt8mLO-6@fO42M>SJ|Dc1(`B4-8Yk zfr67f3FPCJEEv!#Fenes-oI3+)EM4EqLY>JUIVBcjiak|h>BBNi8v8cEK1DK1x_7*(^tyT=x%5y!Rql?_T8?KotZ z{8o?6)8AqQ`SJXowYhkj;r@Mw3vryZI)qF;uv2-q{`jD{%PHx4NGu;n0Y1~6ga|<# zGW3X$OTik+LoG-*v|ZePdFt7n<_~8M+iqrfb;?Yf&1*Sx!A=VySLw)0N7+o0OLt_4 z8l!nY(dU>lr-ZSCyybGJ)fQauxe*&pKoEM2>%4X*sRsuDn#EWxGR>OkJl_Y@MBkzg z{plORY*#>4D0bKW*TpmrvZ1bZ`L?ikdgH^pVWUr-%S;o?tuli&9PYPJHfl=qI(!7% zR$oBLUgxl*>-!BGyFB}AmDVfK{EFNmn5h^5Obz5Y0kLZm4S94*w(T zGl?Ac8{4XT)1$L1g#8B!O-T=$<_8LYt&RMsY5ixG79S=Qcg>>r@dc;zQ@*>##n1x( z^klr@X|he4o4Fv=<2CQM`Gr&gy(EdJWStI8OjjDn)6;P;*mbZxc=74uGE?`1ev{Jt z0w~$^3|sShLnJ#IMLW#g6;D=Xo?hCrM4$au04mD&Lh-K7*BKU4XU~o(7h1MRR}WIz z7!m--PL`(_Nbw?Rq?iSK7Kx_jTBH!S*4T5IOD+i3ENU$8&UVUMcu$tNOS#7K-2DT3 zRG|%*peEX1Zm)Hxm7u5;Q(0i6cucgW2d=cefjxq7s z26Z1l>i}n%tUQSSw)F+5*p9E6J=AL_ClyrVjB&~-mf#6HUKxeKuI(INVv zC?H#ksygumb4y{-75be@^U)@bSmlmRC5WUOrZ#$mITAyqq1Mdwq7#DGaGX`Zl^t+A zt$|jkR23Gi7$IuYsF3As(N`;w-?AUA>)LYCx*NLuf`Xe80Ym)9gKJT~Apm!=T96Ha zBfH82D=%!$svM2@Qr0u~6umw`1>>g)y4B+|U#OtDFAXK?`4wX5RJtvObbT5T0T<93 z@EBn(*m_KMFa7&?+yPKu7MOVsgBs6jsA@{K{uZI?Xc7boHPzo~=$5qBf!E{Hj%o64 zSYYlz?~dJo_8fi0mgerQ*kG?HsHX5PT8P0+iK)dsGO*FkLHVHn4%fiNj*Aj5YZA}mB%}o~8Ss6E zgqj1=S>EF_irC(At>~2uIY&)AOdt2L@@IyU@|0pPt4r|@U&LG+ID2~*yI!lp(oyP7 zq-c&w#we8tMTUscz`SkY0^3q)Hhl+|0UB;HsA#0s#9j+rUr(m+Z%R^rdA_2hMI#N~ zfeS=Ks5IwZOK_ARIbG%!IE+AVu*H42{<`uHkb>q;kPL(VK5VJgrEpUuCo#MpHeep|lF;1;FQ<;=()nSn-)eqbJliw#K%Yj`keXTL# zX&n;D&~J+U6pL<5^R(dG+&^5VfHfAFBeYjb8X9<}yB^s7F0~P}3H?CWD-BuN>hxi5 z+9)%R?g@>o7WmO+yDOiR(Pg^CUDa5KFx3CWHFMBS%AzTwiFDeVldQTX-KxTiqn64C5 zzjrwb4Ea=BTyxg9Q`3gIfsL1seh;zi))YC(l=SF+nHj*={L{aSdo7#bUv`Sczd082 z3*PxcO8#Y;5*v{kkg`LJ!Y`Ma$7<^Y+rIY@Ih*7f8bAay4!vRom?sV1g*LhrS)DuH z*G-koOv6Wfik^kJ?yB?lfRPzjcz@h9CX@q|x|Lm8FxRVrHVKLLfK!3vfvoT|blR6S zrT=jpsLD*Gr{)MrG#!6E+F>`QCY7l?A|&zUkd=3~-HGt!?&EYc&K`5CVcytt z;!V^*zJdCainrZa?fO5u&io(B{(b+~EXHii7`rTE-x;D*Y8E47%h*a%jio{= zNhRqvGswu`; zy&?l9*S0{jazBbXLzjkWiM=u(eldAYP{0QKIUT-Y=?eammpD>tR0wcNkd5 z)@%sbS%Z>v$YHq3w9BwlE}8HB{bpIk@Id6A2Rnk+V%f4bJ1!bMtZxC7K`1 zzbq)AO3FrS1st#13Yh)-;Ns~CyZo)(xyhSQi1Gzl#+;3w?InR0OJhQmaaYimIcpFMs1s@mj+Zzm+U59%!Y_1As z3Y33+9C9XBA014y^2{=IcCD57pSYCKB8T2#+%lL3+@?PmHuUK&?1Nli9Ew$r6sR-Q zxEkxR%HgYZHp*9e((UxLQt0Ui$Eh7hlhUn6opqWNy+4qlQ>6nbSsz2$`W(ivgr?F* z@br_ps;aFSvUTAgtb!^1*7#A@N-9R-SM$Hy6_?aG@EBsNoex?EfP_I6ThTy8Px>9B z8U~@~`jv@wrwqs6LpFJ8DTSCUvBR&@FiJ7PQ5AhO9c*+^6=ZZmp?c2A}|%G!n=!`E3M z6+J|$kC&j^>c z*u*PxK8!vl_ubGtm6XkSvS*yRt6@25y6=}Xi@7Jv@Auia1pfZXOYU`2)Q6y5h!(L@ z_Q=yO^dcmfV<_y%$1Z|2!NT5W@5cB1k)w2x6{p!I?t0Mo>#?H51~U-@*0}?op7BA> z3V)MlFOHqg=)K;df47AnA`T7%62Q?uW8{)~w{Oiw&N9RC%(;GFg3Z=)luBrHc+KE( z;>r?=+A$mHt3X5uJwLG31yT5L59lAy?HyAW{Tvoe-}X+grtY(VNqbaT+f;QYM#6pI z8aZw^JwI?tREf|#JWsWET^*21#YtKB(;%z-r@xbR@L`J1uWBT?&}b@f!l39ke!B9? z6(b4ZS`?&eSOKQ!4f!6ZCg0n^*IKSt&+74ewOb8k70eb3%4s8H=RcW54JPkEAB4+L zxO9Ox;2z*8vQ{ce&^Q@@$YIaJoi$vk6@+8(lX*2%__>ZY2-<>+JZ;193nRuMc&`BB zvM6=xdPqD&UNv)PW2xA(h{JAzTC!igU09`KI)3Q-5>j)UYSASjep-(63wQ953(lu- z3c5HVRB-*pfiHQn(mi1)#*$;s-)&&O>?;XTWH2hYYM#8KnH_-kfxLug^8|gG46h*rssWYs3#L7D3 zW>5*84w#aNz!mfKqw=g*YOxCtk);*fBdK{Zt&bu?^MPI+flae4^aei{lt0@>v=kO} zTz+WJl>pP4L{2fU2_aKUahd8v+JAM(SJ$Zil&&RD`99R=wEp(022qmr{g%yMq;+NF>vFA->HZ7FV&e- z8(*aD_8A;Al7LP7>fQWg_abst8tP=Rs3$vUR(2qxzB$Y5^zZ*AK-k<=DEX>V5moH> zdPRgicF$3$W?d+qF#e1w9boOV^y9efK^3!rjk1c-Qb&UM{*Bt+oH|T>oP@e2FZTJF z;?SG7w7%sV9!AOT5R`ld*NhCU;rfXJD{FTpX)luPidFaB2f^0h)ai}6cl_F>q<^1O z>X}EOwyxfH)!EHrdzAk*tN7rOpp+X@cyZ=EMnvIYww`qS_hP0nI3VbXs(U43r_0+M z%fqjtL^VBIdB1+&F|Gr)B%X%M#q@QPRpfS{lPd` zvMM!n!h0t%#YaWA!mPMcq$In&bP^4ADCtenK0_-&h{9K1 zDu*u&b;HlAy|z(_oNK0b>Y@2O#XDvgjCEA&yYBT`_BS9cNMM5;a zxYtlEU^daQhNOy8=it>)nwfZ?vb<|^L*U(IRant!Son~oUtlE2IH~)hWvNXPWS_F( zcyPa{L(uV5n<}>}82zWbm4WRw4?+O-m!vkNUNq@^nZ6`rCDj~O5durlk?$+1$;FQ? zYP~>G=tw0^2ox^#<56w?ZdtYAs#-?bx}t*io^r5pEm>n+U}f8unGag)rxGUEhHiww z1(x>aiqrjPOJ7>0=+Sjn&y;5N1i&@qc&*3^%fXY%S6gn{D3{&}eBNGud(yeR-ixB? zTtb(Mx1AqEQo1}XmvIOusq^lo#fG(2q7q50p4@6R)co_R1MEs=@I-dW|9Q5XU5&)U ze3U-86SSWf`q%Z4#dQD`y5ckBgY&!a;u zt-4_kSYMLQccVjDww}p&fb)YK@$>IXXgKfE_U8$2BDUw<5dIvr1*ML4U%&N({mI7D zU)i!yWIpkou^**krD7Xm$8+g*VRS{nx8}?XTEY^ z#-K}g1Juw{Azj8EMbC<oayH3tFLj&ywy4kv70T7gXsQ4+;<3GNJvzNe9?OF zR5KI~fm*a-ET=iX1u5tHz8u-o3%AT*w&q!Uu#4fS8R7gv3#w_vtqcYGB`JbgI zdkN0K)3{xjw+{;2M{42AVcKqN;z`-Eac3H?w7gSF9&ddp^QH6-29&&GnsYZ859^_HEs#j;yTpp5 zFv+nsRsZFU!!I&4HB?bMk47Q40o{_ky8IL1lCs;&&jwM;7O6^s*Y)s^uesk( zS)}4&7Buy;9sCp|mp%5iMB~zWs#X#auP#Rs2`K>lItb_Jp~q~}8`-V~tXo1hU)g7; za4#dB7-vqPtITR3sSk{BvmqI|TXln!Ia*lB)C}rIBO9UtB>>evgwp}fPxswRt=cvX zC!`@g!V1Gt+l~@f^84a0&0TlDuV5`ofr`kzJcQ6pM%BF%ExTEtFC^;P-dm|1k~Wul zBULQ^{&HK&fGModi>ZbT)9&7!!4VeYKmy_*7wrR$-?lKjd!^RWjg>2Lkx!ssmY#RF z1Ku?FtEGpIp~8Nt@cfGbnWZt5mvkN!YoN-sv1@rEmF5`3m;ZSsA(F2qA@c8OrYaXyfqRFU^&feM+{R83nZ2Iw78}hTi2A?9?=Lp7KP; z?`Qn}_T3a9LXv{Wdo97>v2TJmYRinVv?{x7GwF#KrCr0j^V9b?T}Y0hH@~)7-Rqru zsZ)QuQ0>_@lgk(H2L;;bk#_I>Ux_SOzNz___s^V5k?Crh{j$KpDzh_s(w~p(cxGtH zC%K)Df*|maH3j+eBe6-~_?aw@&$<^=#1vs^ktpm_Mb{1QLagN5W9t20hp*YIb!IA9 z#caGPu+lkYyd@vEhM6smRH@P1+==?ocjUm<(Iw5qf~o-2mGU*4fpNx>rs!i~n`=aIOtHJF-&CxQ=O#{$F$#9YNaq#q z{8((3DN|ADMy+LRs%ZbXA0RKh6k5<4MW_}R>|H80x`Fabk&q_HP(sC|la2!ZH|;l%o00#0VhESL^f8+x5Q4xAIdg)Ef`1ZCE;h$s?iI}PRikPX|agPg%u}Qg%@kUFyhSY zJlRO_VP5M6iNz!cd6MxggdZp~zuC-xuhBU$K>%d^+F`gF(n?ZUKw-M5`W1myFQl=7 zb_ymtJ+F`-xgyk*Fh&RAuTxb=X}8=E)&()%X;TFG!^M_Alk|m_Rx{-22s@NsCLWZD z@0J#VR@?HqwkGb@&wed;>*Y2q*vtutN-PErLM7y;2kfdQ()(H}6qatuv&cGw{ND|0n6nuwD3)JHtU0vjuk6r55op-;q zDZFr?N;t8G0Z!~B_30FYt;h&`7>g&WOfO-7m=3CK;?z|g4OG6$cz$SJ_w}#-U2jv4 zHkl$dN9`W5!PYM~VY$*{2!h6gyb)6JDF|NA!=}-Tug=^^zGV@_laZaE_32c1{7Kcn zftfOM~)gG>bWs|iYKSjPAttiXb4IlhzCBhHh4B(D5eI0r$@-d zb|jR?NfN35ewpboojYe{zVkC$+UbIb9`;wNQglABhc!b^3Zq|Cfg zB_K`X@-`@qk#O31gz9^8SSw^ltv8HGoF-@Uo(R9`MLXf6mA{Pdjw;4LQAub-M-Q1Q zXmt$F@Ez4#PF*pFz$tQ6xMDs)n1fs|mM8$SS!|CyE*$i>q5MwqAOJ3OWgqoS%3~#SvByItzn4^` z*Wku$rZ4^%x>0EIxWfR5@)mC0^z;vu(mnFjqi&<5Vz!haC%NB_&^2!8`_!*@V;)m@ zF9S%C{vf57t_7&t6rh>OHyv|@&;@!-;6!3T=c02UV_(pQ2xXx>X8RfOBYUu2IRe0NhvBdM&eG8 zchV~E$86UF?W~QknJ)5Cp~4g+D>-LbQqN6rzcZqyv?STp)uT>rw{|jKN{7AV1e^Ja z`ny9|`jq=4_WwkEW+DA90p~eH?F7b51J2oY){5kx)m=!|1=|>;bkgvK4gL~Tnhg&R zG45o>zKKqD1Wzno<%ilJqNJIESgc00oz=Nre*NTU%!YU$hx4?2g47moQgQML&)%e9 zZj9ik@}L8KZf8TAs-)6Cay@B~qy?UV#OD3pgp$xkk2AY}kG;~6_2coN!T}S}9k-;S zKBTC`UBm!gKydpGQBqs9s{3N=^E^xQVyrH>l|b}`nX_EX^)s_Hn)KT?J9&b@H4c-u zRCpp#h~y{aI7z#nyct(=Gg-Grk%&@{Mw)Vn#esu;I0vsNX=`DX}1t}cd!y=ZjtPcWIAne$3%p+ z1y(fMu=cyz7&-vampfc+8(zOKj8?rvpdrg&Oy(mn7fT)lV@mE9sl{D zf=TU&7Oe&V<>IYAB;tQ;kgr4g4%!m0tS;kJudagTGU0-^y+ta45P}*>hlK#6ZJpel_go3)*2DLkaZk6Jd_`+twX8mlw+?lon@XaPz z>6s|jb&xH!;U4#dY<2fQ&x6d?v}nP78)XNpGb_CjHp0UmAjAy>DRJrvO^1s{Lz)0+ z7?D!E+upr{d!!W6ih<=TE|b;X7@j$!K;4nutaJNk<3wdrAsz+`UWX!1TcL9Rw)5>v zH!%K2`Xjk71*vot=gdJv)o>`}GTw3v2Sur7OkyPD_!gHltc-Me(Q z#El|9cYIZQRDY9uQCjV$4)Y7@*lSG73yvCca$7le)NzRNy7Go$4 zd$m559d!bB{f&i@rdy(kfIMsoxDh7Z8h8G4WSAt2_FW2g0&F;LTe2Oeph00=K!$WIAqjM#Ol_J4)Un2^Pdi7FClYe|n3D zpx4>~4?tJB>)Zv-&{5eFDKL(?~7k=9@EQZG08Jm!EL#Bsm9Y{yUN6sm!hH1jF zeCoa}b*O}Y9!!KMMAFRa&tCpJMLwX~IpFv$zdq@tvPbV-^u#b%X2N@~=5O5bLc@Q^ zpggjb@8C|e!<`;Eu^sjBai%jjpbD;gPj3N&^e|Ih^BR<@mWL21T%O8bE0s&P6wYk5 z!+2~F144QnT7!;PJTti)=1bjeS6haNt8{~`cQOoFfK>m7{lZ{7szzak5-9LVQuX!* zyH^O8Dv8YfeW))3WxPIsxSi4-Nwk8D6-{)v+(H(7a=rqM0}fk{4Ma=*_T{a~6^F|V;o=hIR{=~BMB=FHq z`Q%Kc^IBewyr4?^bRxb63;$;4Pn&Om|bJ9&O zeT1Rtv&*-!cc}WV5SU1}9>{hEOza(JI|9JzQoObI@y*)l+Gb1)H0#7^pU&EneP+pK zpy0uj-qJ-5^nIyLv&m|k+mjts=Tc?Vqi~{6O7DTV3N5qqa3{UUe$N5ZT>&oTOutCv zK^E&(DR^z$9C?!#@R_O9ll>Mx&Hdr_+NjEsYT#vGRE0k^s?)SgJ|JSXcU~%iN)f|aUUJW0KaoZWXcdaZ@u1>Puoss)V|KVomu%k>dlebu`{z?~bEz;7n zzm>Bg-2fHQXYTCPdR_d7AN{q}+~Gujj;S5?*Xuw1`-jihw~?`1_uJz0*rwfNn}L}q z=modn&ZO-!zD3CeQj)z|RTk$t(bbAXKN{9!ene-O*EVz1+eBvD@sYiK^(t*0d|2!th=t1oe`QBy-1imfW znF%>zAk4o5LD0b?yIjZg!e!geVry8b;u21Esyr=@*i&hmV5{H{l;!1)%G*|ypXCnW zpm>QkvdDrjg)5ZmQ$xHDT7mfTl5g6CN!z3nV$l89muKOx@EF?z?AV&QMj5~)$)s73SjIM79??*#D z`VH8k5)@V#S6&C8ilmn-ool%&80ntN=suY~T6;4(tx=|%A7F$~tYp6jJA#>oGvU*m zEQ~P`tU{&`c0Ks{Mf(U!lPI)t{%A$tGbh_(nEJ<{;*-FY6zwy`Wt{IC#siWW6ZrE}NK)d-GsY>CWPl z9x+D$BQt*DISK{%s(+LUe*AyhY=;8R_-U*)3 z-lD3=R_tvibyT%o1IaGN2<_Z|bd6nhISse7uEqo5M=%zR?#NS9x!?ozOzs%g}L> zIX9Hw{Z74dvpznauCY<9!xpjF4!w3&U1N*%*jxI7$5nReXG;>h=lR_;UaKc0F=LkQ zYF|Qa4dSXirXg^JKM)}2{NE8%LpV}hE>2LX7`WgPFMaQIH^p+pWo}p~^Z?B7$^lAi* z^q~&Uv2S)vftPH53pLwF_5EA`&2A~w{P-KU7cADm(Gdt2y_`@j|4@;O{5Ax8gga=K zdfpz65EDrRBYQIOI)Ti1bU$jrq*D80KIGklTCBzavOI}hwWVs$(C{g}{N(F45g`5^ zH!H_F`3;#R-@W0DKV*Y{h4BD5Sc{P)#1e(Nm!j|axlAcK}B zsCM`XO07c^p5%t3*{=Q!lmdJmxX4^1o2T!p+C@TH<{G!W7$f zy>f;mXA%KnS*MNB9ffw%dQ66-{_!Tiv|BqIJL4mZ85N`}vv8AmU~7HFdJ&%F4cU?) zGI>OrTmM#Td0kbP&S65N_h_+gfG#JO#(3}xSJZhEsNcc_tZ3?&D(i-?nxmzu-g}KT z4Lpm^h{+Y#a>p9t&sH!p)V^)Vw%)8hlB>Au(MSK0(j#4zwkfHK(b&k`ee{H46x%3z zAOa!x`{1Nm09bWN-))l4@4c*Daa&{Q4pgLxxNTp=*X->0<75Z4bmhbshRTk*`imsh zd4=JFH5y%ctM`tp(9RR&?0!9C@{R~|NBFhhTav|Y2p`!eW``cgqs6G)UHZ0i!!y-n z^Vg3(8-Mc-HhhvgGM%@pPw>G(BhTx6=f#O{m)?{0tAed{RQ$OUA{C5w#S7ZyJjDp1 zpLv?=-GV+T%<#1{gckTD z=oaZ%B^VOw)Q$xHJ-YMgKT=ird?-|x#Wqxt3lj++bNs}`q#@_&dj9X0D5$=2Q#*Z8 zfv-k-aZgC=p$~hr6oO6siBy>wVqH9J?660}QU?r0w9GPdlUA>jp-?pKRg)C+V86S3lQCOYj{3IJ8BoxvZGj1yHP;ziAP+@*|Zv}!pGElwc_A50^5eZsm4 z)XxZ~ttEvmCQ(Wt+0U$lFVXagCWoH8)>t^RSgMUD$UXOM419xZTf$j+1am8>{_0r_*wp6e}wg2e~zIOV)G{f++_U zyrLSwM&48eV}`7u%Z50xKsQ%3vEhT-w>9TI^3l)l&;%zw^j+d%mPm|?Tc@k3fJh`4*7^OiH0m~LK@rA%;!0OGO7kH>@ zhw{px=#wElG<*FonV_yo%gBp12}uxU0ly)mmF2X#EWe zhvx8=?$0+-!uusr+mxiz&f972W?w8lEe4k*u|0mP25?9nLt3(&Si=PPjMOO$)kAyI zU0$47($7(SjdI=?8w9|I8bt*CW22Rqa)ZR+L3;MN2Ur>5Ic&#YtdYotZ}I0WKmK&< z9za_Bs_6GEaQ(G|eRE4)BA%~dDCE(+P|&;am zWRj3$Oy6m>AIK5$u&A1OcA`J9oQMGUKr94T(6fV&d@k;V?(b}Ndz{aK1E@)0i~huShC~1&VAc2)_|-(lytDJ(D<-fGS@3< zNX_Y_P+8l}Vt|+wDH*V%^RKas?#q&Wbkn7KiT81l$pJ$?2A`{6IUIiLQ>hEG^M!UC zEHNmb6pfKB3_0SfU~;4>X@{YC0C?gOT1a1g$9|O;X<`>|*41#XnDOt9=fadH0faLB z0;v&{r9CeIG}(WtQkjeyY3zVEpm8Ch-A?1>QE#TG?6AvhwA8VQ zDJ}D$oI&!iVr-rvLjIS%ZpqZ8ZD+~*x&7pV+CppWM9WetV2mVDU?ssc)fkIo6VsO) z=xVo3WWDm+bj*|fZ?0@lKvX9UXBl7qn0+JzJWwLYA{wpzfP_Y+KO8DI2Z0S`g?XQP zf33DxYg^-Mwvl>gt+cMtY>-cWWX9_g=?d~0y!`&*G#54Km1bgq z%)eRnh<76^>gXUv-$bxIL9f!F-{5{}VP!m~`cd#_!^9TiSF$_>;82S-?Pv&u-x74k z?whuW;enpU3XtT-^sHYDPV&OEgk=iT~(QXfuzxpW4 z6pSq==yT-U8mN%3nX>M}HT$gEs!>yZ^ARKAGQG&+D)1BIG!=BWIh@2!m`%KIh*G^0 zA$Y0muw%XKuEW`o&>*4Lv;+LmHuwXoJ@ErDV6${)4Z2$wfM^IAYJWc*bE+|&`d7s3 zMphpQZ#{r~YycqScqtBF-|FQHva7CEw}8~Tk?z&2i_TXw>^5D+cg1L^QVk!nYd*Fs zhk;W^Jm;Sc^0BHrwFgWi|33Z6r7J&tWj~heC9{1FB#H#FVAJqv&TIirzUMz6Mm`0u zv83`fN(Cp%SSXy5CwZR5%ZOZhwKHB8QmiV*fV1#igprSDwt>u zAMN-Q+ZV)F5BASB$swB>9U;b5N2M;RS*&@p;g2mQuosaJAQM0S$y$q5UY(BL_r))% zsV_=&yj;@HEtrF3=N!QP#^Juqs9eFr7eae#_wIAi&YbWiHuoU^U4+8W4en~kgLfm8 zIcA9(tt!}%-o3xQv+(}v2<;^tbz&v;%Al1B5oK!&=Sn0Y;i!T6MrWCqnLN@B5&4H~ z2xS&`Z7t_l)lT3Dih>vBuy+{Wj6M40{0-|jvt+3A^Wpdq6xW_;N@SPskXaIm_vAwl zq{WdJXA;MKbEu4bVJvxJIQI&Pj(h*R`;#G=#gi>+O}fBO49T`d7r+@Y=f{ncA;n*Eg-Q=$ld6E$gZ7 zw|?Q$=X7aK+U#@7&#xG6#zIXgHAu?XO@wVUHBN!E@_Z2|$$%T|+dux#unRtZZ5*4} z9R0J`y#{ra^R?#$TgGR)+T=gKvuYfr;rT&lxq01izMZE+M_EI31yv1cS-BY{av_<$ z-8SD7CpBRXEuWLA*>ZmF87`Lc&_9<2gZ}^Xd!GkU6cYbg6dbozbRqa=n*zxV4_o^2 z%J?7v_^sdYbJcYu9$sHL@ijUjO7DPR&qEh$JD-lN6L36RetV1%xu6mJnQ$K{zixPB zhl4-;IN;%)d9#km2`N##)`8^TsERE1RLGSomQD>27bdW7-NA;PE7rKJ7r7y8xTcV2SaS^n7;gnOlt zC0p0<&jVjQQxO)U5r@qyOwt+K-<@c*U0pbFN)lf?H8MX5U;`QIniyRdM-?qyTxa|U z`9No8NyW5;U+3%b)2G)j_Yaji8mVmxF&__2)&hI4{5h70t}%FMyPWNEtV-_1r(4+2 zI%(Vf7{^;vTrZ8jb2hoH@0O_R|} zg-L+iTz#)-T6CMDwo)(wZHRs}(Tc`ipG`!YGd!5oeh1%I#zdtHcj7Ygw!b5Ln&l^$ zYVg)xg2?4sjJ~n*Xlu5p?jM|?QMxP$>eulFlVNKfs$RaT*2T1p;x4qYcQlhN<~-W~ zJ{d@`B>@@~`ypQ`I)uqJiuiN%Skz|GfR3oH75aQJ=)N+P1@dkEW4B_SBlZNt>2Qn9 zj8-Zle}Rhae6W_6LbAjUkntl;;BC*SS3%JsiW`m!DR_O<9Ue{he4Ui`UBP5!NRVQB{aZ+E(6Z@ff+1ifl# z#8V=$qYC-Jv$~mgwYBY0(r_R3qEhH9YT~g_j!bUp!34t>^z(4IvZaaUGmWcN0O~!7 zhi+-|+GsGS%o*;3)MQrn?&`gSBRl$LG)6 z>bY-r#E5Oe+2zZ5FDh-1%IdiG8`(Z%??8xpvjK!L1rO;}dxj6`MknLJon=WWP9txA z$VNr!(%o{5k>5;@v8PUZKU7Qjq3n(_X-nHw`OfnlmHx+1E2tLysf%5@s$=%m@NhKi zl=yb~68B@hZ+_Fa9%4QZHu$E72SBG2A9k1OnuV*Nk9PRUY{ygS;`AU^!(yXw-RW1z z5#y^BI^T`{P`RrTyXS?(j`q+Jv>5oF?-}HX$5HlRE%=zE_P1M7&?iwj0}ye3{2eX1 z-L$ap&Zjm+VO|o~mArh?!jODf`&H<%^OI1fdLy!hZdNmQ%#Q+a0`3;Th(0zTM^a6-yY zIq1SGi-wCY&90N8iL28)VPQ^ZS%U60skU8qam#Th{W{1pJZkDLR+Q*r?zZiumZ5Jm zY3(CcYBGa+V%X=QIR?`6U|XLCh>zv4W-&qK_%2m~JTwe~xjoN8Qf8&tK!@%DRq#Py z#ue+0Ev$kwW63#G2&ed52>u zLm3hJSwyBA!!MlpkI>_jq)f2Qq9N-RMh-CiMYM#VNoQyOcB}ke|Jv!KSR7_0=vG&q zfnX2Q8T`QQjgAlUtbF2mP$9 z;ZJNYg?u}4z7KpMt)B`${=A6=YELuu$KlbUOycpKzdrYqvHYv@1JjdI-P$5L`JTy% zpYLEPW0CZqAux6al`vz!7xW5Y9?Zde=AU0n87<@zvsUZN_m*!(iJZF@h$zpbLj0y{ z&^HfS{#;F^3!-En>PW-DAFDciwd{#okHnVqdX z3e|Q75R5Aj6ytxIm`IOTabvX#q(B|T{qyf@PawS+nKb8HXdl31b9gmzOwP9}B}?J( zmmIBwK*YLQSGvc8Yy)Ahpv>hYJJ;fZ>EFwrhaIEv(rvYI%XdmMg!R!qE9cTjY}K8h z#7l*hW0iWPj(^K&ov5Vt>%EJ;8PjB_|5Z~AyRwTMV{TBn)cIwBe9)67mHs(%F4pB% z#Ko*#9-qttNTt`F>zv7<+=qvu^&e+cABi81n}p_nzH{8hHk}@_@u&TLhTgT;=@)4w z1}?QH)@NIE_a}F^4VFIXs9I?qD1LN%!mByJOv*4+!{o{+rOZHhh{qyl}>MpceL=IeO<5|j7aznhMO^j*2kJt_xY($K8K(nhx3!idIJvrM;)N%9Y)P)Ap znu;CQFv>0#E4RuEm)l%PWSClfoZV%3jD^)F)0bXKppnxM1Yhcdn@(OZs8_g$qQQ zTVOrgmdFl($^pV8pT6S$9G7;T;*NZg2uH`+S*=7iA4h&C$KyCi(D_qj2{1Q}Q0@?t zP=@bYD?a8XW!LxCROQ3@rz?{{la#4MZl8#3ZGC(qs8ICcptWi32-AP{MxYp}G|t_c zaAvFj?H8+BH(p+=)#rfFQF}cTK@oVa5=dI<2?yWg8TOtXUSz)rTWYIB3w#YxunyA< zQQ_KM>sXT=4)zaorwTho_FeM0XV}yessT=s|8#DHFN-2%Gu;e8>E!ft=r}^LR~78D+k2)ByNZYTHKvo2t)Z3NBLn2>5QaJ<>)N{4^?R#zRyX`rX+1u5UU zyGJeY+$%BUo{Spp8H=By6T!{x%PZJJcr+J^j>ip`so1T2Y*ROoCf-Y1~V%T#w`5OXnenstMaJp%eVC< zy!$ZeJp&-+_Us*l%TwZlC@l2TOAwMV(=YXOO4#tSxmAewdA10eqQ4#$Y7A{+cTYeh zN?8xJvwnbYv&x3Sbu1jQsA9n4WQhCMiF!KVu1&N%lxs^K>0nC9&uG{uqw+4hd~ z&wwO=&{^vcRiMOLE_zd$t!xUzSoYyyly?1EDuqtuIGNoM5zhUW&w%5KXEA^Bt;CyZ z2)>KVt$Mk~vKB)=MxnR=7OzEH;%QoSoYqD3PI5_|E(f@yUeJOsXjrsA8?_MR$Hvfmw9w zBG`rp4T=Bms=A}BxQ=5ieUnrGHIb79A<}k$j;jgr5mO>IEA;v0ELmL#?Wnk*5nzw28Ppnrd7qL+$btB zeUHFOSIFr-;`0-iGr*T}41CIc;g>LATh5=f#f1;}oogIW*(sccX!pVi&3U#e4XEdS z*`^XY+x=nx&T)K=`0kMHY(RVgIQ_f>z-OUQi-+x~NN%27d4M5j184C4{5?rIpbeQ& ztGT96cW`C<%$EYVOdQO$pWT?b`r_fGg>7YjWA$}59BvO2ZdtmgPh~Uree86Cq@S52 z6InoG+sjZp)3=Q^dKqeBE3+zNQ`Sadt-wjd{~&x&B^ZN?VO}l)uxb5Yt>un#h4VwlzU;bbdcXP14O@G= z%eT~lTOF@=qlojd-Y24ioC}7hE(Gj9sICrq z*P(htX6&GPmQQD8nemaPh)oz#^6I7UO+F0aw(+LRA0wZ_us8Mx>Y9L6xYwBbD!yrpCGoj^MYE4V*?VsB$7KfIWymbgDG8R4N*;4d)) zsFZUZrN|z?ULHj2iO!O9gVGNrfyg4~(;rY}>Yj8l-#+?#+Y*#rmH*ItEzgc6+zz}B zAAs-m&d0_L>vr2ZDFug|(8(AC7mK})f1I#IjQa&=g>*#bnag$Dboai6b|->&L_Gx_ z_FIYr0Wn56MB=EZk4|1FdmODFN-9q%kwdZ#CD-fI(IkPZmDq_&mOVSyO*+BUX#l@p zLOy@YwPLUQv^GL{BIIM1FjPpqTb0MQu#Ge?Ja{zBBq;2tlb9JEOr+BrZ6nhj)b?Pk z&DL?568Rgc5VYIhGSLafAL@-#E(2q@)ftw;@np%ubc_5+33_6J3_HEO-j_Mtl8y&) zfKARuki>MyN)_PmT^kLp3YztHGX4j3R>S1?oDSgWg}1s_0iKP>qgkgDWvsjSzz$f; z68%o;S>ONyZF%>eXk&+kN=WzRC+Dw4I#`CLlG#SAH9x5$l2RGk=vX- zav~R~AY?JiRIBs>Yq=evz>GnJsqR7Ks6oHJA$lS{wUiuPauVmMdakX;;<&-ME2K^x z;g<6@*U>iVnzh(P-Wu+ZTN?~NI`bybza?^t6nSyv5IlT1)@Vx|=YQp2N#P92iMw}b<;$V9n4s>Mad1Y>u2vG zl?}spXd`%LxQRM#7^Po%$9n45&-%E`HKOMV5m^7#kvZ}cm;!5Tl)ua*Ld>L5TPG{A zq08ALH8O3%J9%5g9clA8vPi^iwr~O*bfCI@wjPJ!`%Gz(ASZXY-nhanRbHXQ zMN(#Y%T^e~$5`q@$vtTJ8q8c067T940)bh8$i6{Q0tIKdIpQnZye>?20!(n%7i@`8 zj*JMsE=gM_xB=8{4#f6T0GustJ7GJc|J+$Zo;#F>JrxP&XS#A z7zKyglVa$9Z$Jfiovjp-B5g`4)-KQ9F;3Pp4@h7C>d_OKv1Ogxk)Cxgc;@yo?B8FX zpGCGn%lGzQ5EIKsyxfXK*VCl-Sy*8&r7&q^tf>(a!At=jcF~gnC_f$ANO@ z@1ibKH=5+&lI^s?{ptTy zI(P?tJpd@`*pn|2GOO)CKTB}1@=#H!OUb^79zvVk@3zBrr-k7G**S&}>kshM+()tv zrOiny4it)q_sKPD*O!d6bH8zEwJse-o;@+coHX!(x8@{w_mKh1l4<)U#(gY|woChl zXP}s?lx|ZGEsZrBP;aYoO90~-f*Nm3yoY1@Y}m7)dRtx5VJ%mU+|l3fNEgnR%jlgF zyPpIW5U3>@s_zTq$W%?xZf<|92x&EHri1UDjlW5J(BT3pJDpP(`6%rIjT~u)xx~+x zrtKZ;rJ+T5_jVlxqSdSU2>Jj>8tHEZ`1iz2*Obo z=OG0$o`UpFa{mS8E-B@~aC5}?sXN!!k$B*TRQ98BNKHh@a!zNCiV=$5W0NVzf}E@~;Z?uIzT1#pkebeUnf}E}l#0#=Um-I_ z+@=8H&MSn75k*i!7mK#MEMBNi$2%cu(C~V4FjNu*0&d~05czFV=2bUzSe*p!I>K4OLOwg9kk!O`_^4icJUleFo4 zwu3<-0Egu619v(O=z3b2M(tAIL)4~jqwPH&ZK(nu$3j z?!!K}eqR~BN^y__1&tRGTG&HbcCb+w95at1@sr|kmd1^%(g)Wx`N#AU9-Kph?>VzB z6s2m+N|mjN8o-xDwc8ePpNrM7|zbIeA`#c=WbUgwn?76DC6*yf{R?x z)&N_EMRHaRUU~9?1LwCtjQDAwx*5GwsM>cnVLJ}mqp9lKT;ino|LA)6c&7jV|Npsz znQd(5G>2xG^J$h!McbTmN)B`EU`~Z3>F^?z&G}T#nW&sYDuh(Zoac~)N@t|QE2@!7 zHJ;z+>+}2f_x|5sE*I|4$L)5z-fk6_?SnyDtxso%VJ}_!y z75NWV@Src#?pj*gk?S#d)4Hp~D@|NYgA)M1d`_KkVi-M2D4WZ7HVmA8^x4bwqEvh zxijiov3pI|_Jl4(uA05%^wBfe43@mokwk?r^cQ02b*jexXPjZvK_}Wlp8Ypwi&E_#0t7R zG@T1h`F|!&u)02d z*11UsDy5Oy@v~wo&5>eL_^02A2HZQjyAC*%mEW4YJ-}+OjZK()#?hi~x9ir0MtcC{ zkrykb$bWXVJ7$7q$l@)*Gbd7tUa&I@jDsdp^l~#~ zApe9RyIhl@lfzE0jN-xE%Jz;D`bWd+mc>;aWEL`vt4`(E(ClF8>q88y6 zrI}O?HIKX1QLkd0n2Xgg4y!OV5GO(Mx!Tt3vXLoTCT9A_0cVNLY^HXiGT$~4>eUuq zKxC;o5Ory(i5_}7?sYG9x>kuc(rDw2E|-em{HyNyKxC(fCNP;ENK}44s{y4);UYi| zNJCZ0HwyGhbk}ZKOO_oMyiWXBd@wwMmaikNFPuo%yfrVY7=PAcdoBBfZTCRh;uGL2%)spuf;6z=#ocn z5AkLbS1u@al^t_+45U`r-8VC*C?eE#W4|z*^N~$qPIIVIV(ahXyySD7gMeI6A;0YDjZZU0MI$&(ygOv#PDl;XQ z16gCAju$kh$^AB1tmk_3M$aCtUE$Xy2}LCbtiB*k<6wYF;D`mFpgC&YJo)U z6zCbD6W@evOw;^+;l0#0XjkL%y@)=}u63OVD*$`nrqm}iT2q&|j5 zHI0^fH1AQ~-UKweI1gUt2aE2kf+PYOVgFy2EAEq73FM;i&wOsLtIW<*nwI!F{SnA% zp7Do^prLRc@Ja#~yOwCXQn{1i1id1LN&R@*W=tq0OJ0qdVnUjMy>9-dKL1w|?i^w?e^)QJ4^CojD>y3L%Zps{2>^-9RfqqjL#65~Wc zj!5^O-2BHE2z&RanBLwVvIr;2jw7U)TUwBsXn6eUPO9UCWcz4q8U!i?+rA;b8o2M)l7nnnw9)?IHbh$w zh9OE{sQ(me)9VQ z_JcdVSdFLQkSqD)Xv?{Kz0lxT!TP-sjbNbpRT3GQlWq%{9SC0m{Co-QxW~238%7!A z9qtUr;bryanGK24s~5D8@RDL10nuSRjX_u`pW61JUXuVzxqF=|TRhLW{2R}5;g)@& z4yj!zcSqLa5eRfL8TA{FCdpSUdVYdC@SVI3%JHMwA=-aKM^CP^_Uv-@7fjbmT7P1} zD#Wj?9V^)>>q+Dlw|{}+7jBVe#d246va?XHR&r zkIj+2LY2#LOQ0=?@bTCaW&&C`#MTA> zTJo*GM%P&z+2(ktHKEM^?mV?>syRRxCidTMV2|^Rj{710C*yfdy42XGUCpVfZdYlp zt8jp;;D5_|q|o4R^MY?tKteNoW<;qux&V|tX}BQS;6&8*aA9tPWj;_et@N+8?$40x z!+?{vU*Fa~zi7VUFLODd&ao_W*S77?i-uD{oE%D2*!?===KhLR-L(}J`CVyGil6!` zn(c|$qyQSYeGSn6UbCaj=;zIaYLAOl&mCW}Um}N;g0fW<0n;C!9-lk;m^LDyNk_Kh z4ixM7B{Ro#KGz@5_5ON4%{#PEHu%+HpTiI=T`;8ikXE;{^P=rPX1y)|4u?oGpEzB_ z3A~Lq=fZZ*SN1!aSsc6U^!1V?GbXR1%~3z6{Fg?kfzd5o#y?NmH0@oVP|jhb{scKA zwwVdIOl2nboKB8dl!$PjmJET0F?07s>8{1h$0@o(%LPa!jtX-2NJ`vXA+5*3@si>`RPy6;5BhBH`M*A-0i|$8$=Diszw5 z4`{(v-V{9}Ai~3B^>y=Ntet%-M8i^sjj`$TY5oM~67$`P=qmF`AyLl|oT|))L;twC z8Hhe>csqzDn4pBvr*)B`8?zgeKT+u+xgjjasBLK<#S|*Ws2pXSId6^8uNCz;o4lRx zaYpVGR{=$piDxDl z4)&`f33{7VkoCkpqq<+Rp^-ZA>28MVm5;MJj;?bzLRJsB3n#ZH(^6fn>|}Xx(@s&u zQ}TS|jSdW_sgHP%VleAyRyr~=U~oTUWgsUk#v=~=MCg&(*rdUH>i-dZ)g~FAmz9mU zy`IEuhpd?%Kuhlivk|wYF<0`>r(?+2F(0#+j}aNov9$K8P1mAUpQH0tH)8!u*Apc_ zqz>Im#_0977&P!TjrFUFHD^iE2LiLThUXKdO>toy!-a#_l1Ilt_J#XZ!o7RCoGvpZ z3|uEL9j$PM8x|SHCzTLyzeI(!f4W2#{$Lci7$vktOnt8OxfT8XNc`rJB=qh%Xs|?+ zkn5I0|M>$Snms33Kh}Sa4Cv&k+8-n~T%RWau-GsmVMS^Pa61lFC?$pstoMZg?$d&ovvX^*@NB%jUw!=Xv7spR_a`VkdnD3U0 zln2(@^(ry~jl&vjxRk12$x$qBc6vUayj-5UgXYf3%dd7?E|+u=NAowl3VhllVej5x zn-8bJ40l(i`I0DMTRo+y=s-tn+D1GN-G?@a&4ne$@RKJi5$gktfXlY|J6CPVKbbDn z^(15{JA>voG#2PFnHzh0Kln4<8D}wEnrZ_)hX+DT+#;_md+$71kw2PeRGxD#BuLJy zMQC|?PA*=Uq_I2$JM!7>!UvV=E#1HIXSW^0W7d)=l%tsm@>2)o9O|8PY1ToRlNIyw zNTq$c8c2(oh+mQWRun~#c8FQkd`dU4-VFGJE}Sxm<7pZDbup&htzGvCKJS%ukil@2 z+CyH?qLi>!zzKkJeFjc(bHkzM)Sa#NXbpuA)u?c?o!y3rqoKRECz_og(e|umMod-8 zP!QaA+PkI99^W!MTEAJ*_*|4uqgBFqq8{IKzWne&tci6aZ9_b?RQ zd8U`XdpN;Rh=+S z>$CiDxsUwd;rtxUO`p|wdtSEXX^JrYhUZ}>m$z0ex!gh)?J&vHS^msW1|tez`%hLo zyXH9+wES66;*#3ep=hjDYKuG0(hI|!QO`W5EJvLl@i{RQx~W$7yTpvrH3--^Q*3lc ze$KIM-Rk^lm%Pw`2kXz_f=n+*W2ML^DjS$2jEWw+>&1<2tjq&AmJ{fCG-xwm47PO8 zO8ypqOX&A_YIGw*Ats>D*UQAOL;(oJ&3j4d>B;*}7;1-CtJrL+qhQV2DgW%(D3$kM zQnl?8HRAQ{Jgy`N3)qc0_8XZ$PzEyzQ)9C2AKk~6u1b1 z9;Qvddaxu)Qsa)xcjp(cZij0Fr+Jqmyls${`XrocIt zY_llhM!$0LU+d>M@w-`L_58lf$DLTIRJY@R}Ku1$Vc>4Bu0Q#LD zBse3(cVC7*2GgZi@C|B5c{&4SX=;c#(pSEZaDQcHv=s9IT1F=oH*O7|W~i zz512kJeik0K&;t$D@PrcAB}JvuepTu`0B^aB2mztaH+G(bYuo(>(TkSguy?1Y);Z z>D<}a2LpB#c?`I&M&ku3LaYv#G zlS|S0Q<~~NAd#+v^}KyZ8-AV-A(hre+Ru~7sOVjs`*KCMJ8Mi9>Ie6nohyWg)k-?g zakaNm$~(SWOORL|NpEtC&Tx^&&d_?1n1$Do?PIKnGA{1-z{d-Fb&*St>ABL?BvmcO z-wa^eI-=&xs*Sbl(M*`pjD)lKEI^r^*fF|-H(QhR-c>1ibo2TA!?wUYMdUuH|MePm zJX9SC!`8}hfW?ZvHf9_ynHmJ|6ieDYx;+9bZlYRhm3C4;`fNrWl_JDm3;M2X=9h|x zC(MNEE)0>ad=*Ojt2fNKl3=V+<9K-N)JsL?i;0*|?kHc)yA2;PChJv-_ofiq+x(s< z=(uoT@62Z{z-A~XOgTylW_^1zKt_To@sekx|Mg9EBkqK%csOKhV_9%5O!bOz4 z@XKPAL#M--#^DsV25KPo{<)p)YZ2s;x)y8?jom|>g}`EIA;9S{*i&fm!=u&@Qx@f# z8yLY(LYX<7qyGq&Pf9@CMb^nu7Pa9;a0lDF@*x1yPuH*{m~zr^2A z)HiYy<94{`^v4Hc0rsS$*{u!IH>uGB|GeRuXM0b&Xk{5|$P*xNA^E+BZw}$=EHx*) zM(QlMcl-&XCK=M2N}GbR^m)j+i!`#-yM3|b6n3wkWo}TGX`q4|bF2EBd5xn#&aGZB zZ5QWOLfdrjdUTY`-LM9|A+a88ma)q6Kj%`cE#%VEs zE@w-IFf*gHtT!OPCK6hIX0*0s7w&aM^wRMV=Tx{!6vRaBObrzIprwn!cC3ekvG6epMWOSI=J+Ta>!ZqREWwvG!Y8!bJmf%JY>AAumr>LiP` zxQHR^=#PwwYFuS#4wQuzNTdmhFo_Jr1@v*`1I$k$2+x!;MH&T0t*%*fsg0P2t=pAAJIb5+BfuRnrwX*r(RO zPl;^F%!)LqT0@=J5rS0P*%f@^@c|3DdCHw>{hBytJf+uJ-Fs+w$D#(lSUgD1$a9Q4 zN=y%VM;0RQSa^)#VVLn=b=1r)Ph#4+<9)$3LFS2CQk6-!j=fsvl3Lb`&+`lX)vlsh z=~hhZW8`6`s-eV4)4X*WHJWMq=qLW2YSn09(y>&pAS zU{%Hv-l}6cXt9rD`NezlfL%F!KNbsDV zQHGEAlFy4q(5*)yq@x#!%t1TQk`Mmv18Nj$(2;;Z57D^VT8X5Up0wW}@%>yOU{CRA z#V5MGWKg=Fc?w%SzQHd_QkZauvQ5=P>_h%PDCk^S=^KB)R|7bp{p8p#0^e8Acf5l; zW>W5RTn>;@Y);oh&#QZi)9gW32KVAr_G+%qi#csBOc{5*p2P*_KOE4nj1`7eTo-IH zXu@7$8~hKW0&K01SwBB!wQdjJ)SZc zQqesPv(VXm(dlq-_hq}0aAJ~rwa40IO!w10p~E3dFC_G#4a1RIM^)&aDa(VGgR<{8 z+Mf&6{srfFeGUjd3{vpa?VeI2j(HL1a!&+O42?^-zifa26&Q=R_gwOyZ(fN!#I1{9 zGA#I7 ze9~NSL0P(bISV(_Rx}&E@ZXeMmw243_>p_t@$8>wqK$Dudg2DH8_fPu29i)tNxE#A z0?GL19DB3|smk$)s-m(ZRd@!fHPzfNa@H>`UVWrN|9I=@%+c}aDs1NE$(O!8i8O*Sz}vCG!ab*rvxJ+xnHA?KjICn{~2VNk}L zW=w~0m?a=7lnVp7h-Ae^F-`P21^?RubRkr%GGrOXIt zVa|uyK`yNkLQe#bonBN-L69i%$&fI1Y+lk~0`krCpdBYgKY9ANj3232-Ed|DkN!dSw=FN*ZEkjtDg3%eh^kk?7Gq^1-lH01n_*CfyVNna{cZe2&K0z9`xa+t##% zf8w8u$qgA)>_~h=R|r8OOBD1wU0v_-$sUG zhm-iZbWZW&C`oLd3pWjoC9xQAtwg>$6uVg;5SeLMz^cp*;r-e9#- zfrr58SRD%5id|lCS(rj*&Sp56FjLFqULh{j-ZAj!Cz^a`(tg+_vQ>`32d0uVC5N(b z&>lyEvpT(yum#s)VIG)-~9@y$C%HD|A0(MhyFtQapH#Mra3}Nwn zR;7RK@=P))ZV6a1FSK9X@2Y*r_5 z09)QbLBgc={rltw{5x<_QScnL>P1Mf2vrAE8;W=Z$L`w#o0^rk9R13|XGC9w>v>)M zXr+8acCWY(Z7*^_(Pr`!ncCX+@lSY0K*FJiwO9?oi+KgReMZxj`+wc_VT|p93DSF_ zezn=7#KHJDH2VLawmWtX-M8?z%e#$)R9OlyVi6IFxK+jA^!_ZM8mDS6`GiL5>q*&e zc0JXR{{R41e_YGo>{=F067S@}WlAlU2_bF^R}8!uWfgM;lJXf61d1M)h6B`34yHC~ z{XC-80D$Z|Bs20wOXw!Ih7ddN)b=n`s7hbSM*cPbDwXLLg`|ACr_`}HVgW212;yE^ z-s-N!4Lnd+-Qn)&B7q}KLi8WAaM@HD)wbq&@3&5hY^U3~%s{Ab&#RN-p=|+Qy;mS`rCi zSh{+9hGAso>r6gnM1h=8_M9TZ;pFNg!^&9rT$rP1qrDRlHc@$O>|uxIxy=zr$F};K z2!|!APVY>lIFK_kQ&Bu3kA-4FrPWx#or&I4vkE)u8|3&7KV022yj9G3J|i&JyBW$MP+7QAcBr#FXaQvFoUxyKr8jI&Lm9re1&5pxL4N;m zc-0gn5?x;LcjVnu%gKk?88NMmZr-N|pxBZpkJYX=%d97HCf~M+3m_b1czOb0XuMLk zMypu78^v=CZuuikjecD4a5lbIUxT$R&u=j$wMLpW(rCsg86yp@;(Gmyx9v}~WfNs^ z-}t>)!cHSW-w6Gh0P8H)0#FYz(Kqjn8nhjK;I1|cLrtBUak(;&&6fe`tjA&aU8$T7AhZWH(JCOMm) zgVFVhhQBj*sLl(psJ(yiQVLAK?5eUJpXD+7CL5s3M1zfv)SUUcIR^LTT$W;Eq}76i ztYyUtQF(WK`!Q1MUp&@ab;Ww@q~UnuF$j!-s+v}enTYtHVC`A%AjSFVbLHwGo&M$t z0XFyQVFDe#S8Ztmu6J(PqcG`)**7Ju2#FZ`Dj7R7tY_nds1A2GY$$Ca_K)2KlPs~D zvaAkIh9-$U*<#T|mClT~H$Wh&sEJWm$gbw1R0sCq36NCJaN) zPL!;5%QxKHjrE~@Q;!W~O8)wFK|9tpc9$II(aAx3+^fbQ`BD;fnJ?+I$Rk8)cu=T0 zX}oOidETmIs$zdDHTU|y3WTr9Ga)@G-#AufPtbeh5`;m|svjS4}9o_#W4HWZ$Iy2U% z>uw|aa^>^4U!Ql;!2uuuWH+t6FDUT2c~R$Rk7LDk ziq#HYL*~(L?`%{ITO0=(&w?frhU zlW3o|5BtYsX0I6UkgYFhTph#FN8&>^fcs=t4fZSP7!O>F)%r z+1iguDk}M#*YQC3R2$qYv6aJxyXE*efg4XOBXMllge2)F#C!bg$WhnYpZVXBnSN7E z5GojWHdH6RVw4hoJvyqSmy~H(&Y#&QzscdhabqaDM6WgK^#$q#KtOz6xW{lhwQ!kr zwye5X)1VFN2;@TLNI^W1^iQ{5-Mj{xdJIPZ5OqeMFbH(U@*|VPSYo=qfiNi5SbyKo ztaSC$qTN*AIW|uB_nN13mg#0n_f{}FeKNW$Otu$~n}=n>`0RS z==&oH&ZSK?I^O%0hf30Q*r`bAYNEYH#?vrwT!Y&C47;@o>z>rMqsTd#5NeVMC<90oL0L_$vggGZW< z#(ygzyJS5y2GnK+3?Zk<7I`r}UgykkoyUR<2pJQ1e_^<$DDv^fW=R=pe7@ZzZu<5X{^Khb8o6p?3B6e`I9o&$1`hZXf1(_IKV=yc}~qO2)e=885ipB6r$5u9+ccNt}i~yGyBN-jz^j4cD5m$z+2{%a6Qq=Rhg&Y zg1P6Zzt@ z4mXdF?lUeWy&IjYnVDa>dG*`?W}#M}yYd?Sal^L((zLS$GVX6_9pI$3@$j=dVvb;; z)OYARW7zi9F#~@G*PhYhck|4yFHwu#qmor)F>i9_=2;V+x3Zh)15M{c5!L+V3kIu` z1y-i7-d=+6PSt=3+&?;n61YQyReN49rrx#VTPq&Am!iWq!<2>1Bp!22G1$*(y%)$i zri%4jUi4;4#&Y+892k}mYZ^5ad4NO`BqYOG#$n|Ok`$twe+ADy^1_)nTCayeTj4zk z`j^Ax4xjsD@;ivx0=c*8a6Pyz+8%J!s2aC3UWcwl^ic;ak&C|X)2Tr;JLBxUkLZqW zI_+*oNERZr|BOps>6klz12U)An+GlD11}^3ey`V`ZPipUJA>Xxd5}BZT%5zi^UJtY zusm(spJx1>aYUv0oiz05Vw8+;qNu&r{EY_DUCKE~6@)0_bsNG>`D7zmJ3Gc7D#2n1 z_^?-KR$DNUf7OL;;FTdqoUg!x+-mx!47pwBImq_>WDSVj=slWs;7HbUjiizta>R|P z|Jfg(99(18gYh}Ty<}vddDJX5@Cs7r6c;YFB3ZE<{85(zhL&Mk4?1|S!A#*&+Xo<3MGnCJkfRyjL212Fu zsZ;=>6g?lKDeuSKcHuX^bU^dE?+cb%N^@(T@l=<70`vL6L$kRX z!Btz69o<<>sM;yz92*t#)Hs>9oc>xxpx<)WYg*~_aD;65Q}*LQGsNPO%bl4ymX0Xx ze-%Dy*rt1FJWFSGlEjncJl-|tsgpUYMX*Ex`X15@pxC@*9H!VrtiV*+Vtp;CiQ|)EiB>ND^NgF{pxy?54~bR+2Fz5RDFia7%`O?=YDbpC zQ8@kmy8+JNS0zIL^j)K41x34*%c4VkDGs|YC)cuT?s5$6ab9D&^i2Q@c%4oL86}=aBV!#rDw?G4ss4-pu!ItIZ$f8ss_b_=oo{7 zbYeIB;|Z9Pb}vD0OlqPy2!orfW4fIA@$h3|!lTza<-%%^7DJ57RCbnrXkE~VX{i_z zY)Zp|ypyXsDhC0mxFRj}vO`a)9@cg%pw}t38D_Kyt#M|C4PL_x=yU{!nY~d$BQ{T$ z^Q6_Pdz>yX*5#`Gl+5|^diT11Lkzihq2SSDtec}m6nhQhhD6^JAIy>z zLOCQ9iBl!j#2MI{Nry&7F1WIBuWm|`EJXMLnbvF^eB1pd+mZGs22ajl(EOGM1x?Gl z`W0`A;lRbdzq`5MY4L7lqB#fJ3%GUq=!gu3^W%)Onmf6XAHp|ATF5Eh0>IN%0Lpo< z(Je`{e4-<_BH4O`G0fL=#J~Vydn7NaBJ{lLwf8OrtjbYFQG;DC)^2*B?_G37-M*p6?}<|4q#(T9^;3)CaFx>=I#Aw% zq6~hr;W2JkWzenWa01N0`L!nK_88-t-4i7{#WXzL!$nL5DJ`q2p-j?SUS$xtpqpRU zW%_1Z<#merACy#ObPpb7*}Ozd|W&JprnjJ#X;ngm0C>dpsO-y@IbrrVYq6emYg_42CkW;#AR z-_bWeZ;{cwo9Ll?W_3_~oyLFY*_1M=E>Kcrl2e$L8)9lEq1*_SUp%p0uez4JYIDt(LO?f}93`fTkjUJY&!9X5Su{etl(;&-GVQbhlwJnfRNgin2=~!ukEB1Bwf1l@SF>oHP2Y@ULcVu(9U$60 zP+hvEEj+K=lfp`hgWs{PfxcqAsv;zY6|{SD63DcWQ4ZiiVH+&Y5EAJ%W0$(pWj$Gi zz8wLBP6gY3Ub|i!e9>INjIYsiV|QGvnck_{#Ov&qTsld^z#1h%M(SBuQrx&IK*;fP z1Gng0xnQ%u@aWMG)gE18e_n_Wbq~N42z1($8MvYGS<^nZpTSM#nHWk4ms0Lr1Hjl# zpVc0Y@q?jbC!bY9;s($w75+A6C~y}V&82;5l&4o^v0gRc#6)31+_YJQPo;(1?Zg3C zao~@XpT##5+Q-*1zvyb=%9CeKjxwghJupz{FV~r(Hr4aY6wGfK(s|Mx!!l@lZ=DFc zt1P-q&2{q_qHTmlzhzWg9Nb{`ApJeoaFdipxz6DlFP6l!y}f`Wu5LmlS=Pz7Lb0W| zXXG$y{0CVNVauOql%HPNZBw0n@-?ICe%K5{{rK-kjOc=8DBUy)9RT8@oBg3i7vJHc zi{jun5|FtpMSZFKbDlxgxuYt@-pr%`v?%*edk`n3eEf67!M#QNv1l#RF+I6n3IFLi zoM|V=lSc-b*4B`j(BzK7_VrZ2`CqM_3^Yh!@Z~sQdbt7=({OvbEoSXN_^M}4MOy}dF(k5|Uso)Jt94fJ0gt$tFHhnJilKW;3m37_yTZ1Il zRbn>(3WDNHtp@OCcmU%0AF!O9b@cO8;4P@wF=(uD_2J&NrX{y5~18vjnt+3yjTzJIv7 zrS7$OQ>J877u^n>#I>gJrU`wFJXg*gX?OphouUKW0+X>4pRKe14y zUQG~mywnJmt!1X@gDT6~=jtmJKoSnP^5MbR*)QQ{i{+3@(irvcp~$K|aL89hUk$4! z;-c*+$%z=Kyh*Vwy1&R_oJKZr24b~JWVV0mPMFEs1Iv0N<~L*Q#ld>lxekuD+I7FTKe9;PEz!D=AoBksWb0qEP9)w%hss}mxBL}`-FFdLC+;jbL z+P?Lqq6fGdyp?C9lMy9_x;@2JxJouc2YdlsF zH{J_`)ZM(#;>uz|^(?jGlq({&$0vl93*9))7TiSVqphZ+P0}UKLS+ zVQY9N<91)xb0Y+@kPeBKjzQki3OIn?I!oxu)jnTDKbul21qjTP%VIvr`-Z@hlTOLg z!)iVUWTT`tQOmZP@MI-2Eq2u}1fcFNfFnuvi_={`|E(MM^WG!}}if#fTuIF7WyNI+M}>ypXo-dmde z@baecKU?ajsgE!EuBo~u_i-_&?B_wR(1q_e6B>OV>x5#wYI;DVC6B{oDKRdzp}0$r zK0JH0#j5CyX-)p}BgtpGmS4qzv7Rgm+w5^@#V+jVetoC`WCM_Ju7|6O==+uDxsN;N zNWswvTt{7i>7URT=79-+yyl5X%sU;Ot<$x*{0OJ9D8fs&wN{QEYK#mD*0*f3grfGaH#+cK(Wea;VHD2L^MCt zD?1&u0MH>)tO-FvtEr>X-rSW%LLNy2;NJfWFU362{1siG@lLR%V5s8;N=2L`uV1~` z(&r;Xfe>&g-vkL>rW#QNICV_7kF=qiF&or_TT1|8bE93~)}c(@$%uO?X zqNz$tHkMp zLa?Vu(Z3qr-DRq3^%*N;(+KoR{4G2b8o)~7v8z6K(0cq;uU|M`dYZfFGpq-7WSR8| zd;+K(ZW|)abNijAY0Wp7L0QjUm3~H3w7l322{nH;k0(TT`{Y1AxRHm}iPN~tE9<*& zr`s4Q^uSG*ZhmdGA***AtGbwv>c&%;2I^q~Ztm^Xh!LL_$`inpT)oJwzyD(o4ZeDa zv9(^+>*U{;M}n0{TYkbh7EI+AaUKSdIhm+*BmJ)v8*WtZ?C1%96z0DW&`bQtEA$gV zOWCEyCj3m*6^w^8CB=lDlO+>0<1K&OZ=D&|x~dj+a3W6wZCreBFLPeK7VQ@b+CRII zVAaTZ7XMtbO_vtwm9^)lvobz_Q=>(VlI;w;U`U$dd!MdRY!fD7uX)jw=Z<73P5E|F zdYj zhuFYRvxb#~KJ_koqUF2>0w^t$e;n%|43GTBUT#`>X=ftSp(ihYHBEP=ToO7K#E$BD z#xl2A7F{0yODj}=*H$a{^TdQ5neVj?H^TO;BNX}N?{yypIZ{8nX7;KbFjJ1RHx+9U z0*-2L`a3RZ1vQ^1tPbk_6ct#ZgJNKwH8j)d{JiFzf1dVT0cbx#{C}8B>Z+v1$&$1k zE}W89vE+77rQN*1!^JyP>J07OVDXg`7lrA7#lG3h1XLm<%=MCo{Yn_)F(nDXCA_pPvm$=S>SPE1`YFNmc9OItRx;k}T4RqD8T-I!a_(Jo~5uD4ne+ z{H}b$q|SmZ)W+0vCgh2Bb0@(yXR8mCrP~Xxcw%N;Io& z>YzrNcyHV#JktZ9%0Kw5@O^lJ94W)e;ynRB;Y9Trx?(~1;ZO=IQNnU5QijWADgs;g zbAA|J^8=*d|D$zQlE3O>%Spvy4d$i#vRKy>s_aXG2zov#=uCOL)wJmDde|wd*{V`G z)qteiGbG@>yW*^26da)%ll{86bZ}joBsv1iNTPfDP` zJZ=I>-j>E^@w}b#i@j`88c=}pi^}k)Wy+GetryMTi=RE!e&q}Q=RKy6a>U=bX{`Zc zX+1TmL`H_JN-9ivAIQ}=)!O{$O8dJ@TXz|FeMY=U7;H-Xt2DBwao?%M_K0X+flg7Q z?>^9>W>~(#l6n~O#Nf^>D+9vM(l~%y;0QL&0wC+O|z*I zLi?ek1ua9S&`fA1UCyfs8k_0laJ`h%q5g-0NG}f{khLWlCrj4qrLNzh_DVj?nRzG! z%0rCVv-ut_D$c4SgG*d*DKf5}%5^@4>OjJFg2$VkwLxwQ22n?_d9kbFjzamKym8-5 z%9~NBb_g;K2C$i5=!qNK*>$7%;~zpRHiD#~hNP>uFfxhc>D=6c6gr=T=) zz-)oDaiCZZCAkm>q1Yr2x44;1H53GnSd03uy4{a1ZjE~H0WDyNC%Hz=Z+bE}x~nbi z!gZbgb%_gd{IGm!v0G%b3iQnU-P7f!Y;Q!@(9)u{{kr>} zE6I4(nbCOkTFZ5#s7(UwtW2cwms108u=kqdm0pHd^<}v(ze#_5sB!VPH-Ws_-*y@1 zVOBl&jL{NS&K0;9xHi6V-*W26+bipTFR&}JjE;P2Q@YS;Ckw5}LSF$d7)JBCdV<~l z3)ttvS09OzoN}9G!+o9dLgugQ(#n5msK|NyEq+ti6-Q!T56VwJzSFU==SNR_?CwNj1ve!CGmv8)t;*EdZwnp@Onm^ltvsK}`XWu{Q%I^LwY^ z`cbZ~_CoN_?-hSTbd7FPqj~47Q~PTjO8iOE3OCTU+AEa$z2}&Co5c#n+rEtR zO!xo)-`Uu(Er*eqnZp=nR21!C&WeyEX(Xpkk_sJcb3VkJkJX$HsT@nCn)4irMCmN# zQt1k*RLj1v>+|#X{ZBkz&)5BMyO+x_k=@2cBR!DCK5HA=7-UBtDKKxZ(-U}L?!Qj~ zuJ^K2;llfZ&Xd#kePx|q?aaxKW%t{!Ys(fo@-dh0et;eSmFh-1?z1{mjmjdVtX4hB zlpi_t2h)^br-u{ph%lP@i{yPTJru3V_TI1B$J`5u|3w*$<1?Z3?E742eiU2>=kyA> z^Ive`@jHhp8hG02f91pV(0N9Tk5z}?pNvIDcbTZSk6i$GAONUEbA8Mp^08w1-GmZy z)>4*r2mDGBmF;AeAc`S3K{8V6T@U|$9C!DFV*5ytlat6C&3;rJc;p?`Jyl)u1jS9cK5MW{$;TS0cpF=tBi4MaE3Bd;1-j- zO_479^a&~K494EGf7vFlTd+1kZHgvlqI*fFSwy0akpPb*z3$%Qrq>PHzx~}8T7>eR zJ7dL{e1S!*|9|dDhqAVn+soxkX>3eh2+Y*0#_Qv_`*0rFUzunfgL{8f1V^Z#r}{Wb ziZw#4pw zsEVQCQwU9!E}lKWB+_;j1n8KB^y5VR^@(T2M3h1bl`)FkTjN;$yY@qOB7z=%3B&H@ z@>NY?NOz1j6o!m(y%ekRUzf11z}R!yrJsH*)GBqpt@V00Q7S4=f~B%4Haz$GmhV}U zbU+j6!}oFbYC0wzjE-hfyJ!8Z^~{kX>r?W913|8kziz-bQJLQ1wXKI7HejT%JyJ~E z?LF}*>BZ{jy`Q@O^+rc#i7!^WeCPxGy4p5pv60F(>y?- z#GYblsE6}u2H-5h84Q5&m~vkzg4|i+KQg)JMTJ1sEigTFxgds;Bf_$#8e;Y-kO<{G zqt;NIn`%1A{^s~HX6e-APIt0dnt z$kG&YI^`Cq$v?LEBHoE4h@QbfuV-+(TwN@=Bd!XP)?WJPV+)OI`yQ8s2U-|&#)}$U z4bx3QAYq32Rp!f8*bQ zVh?Bc-R$Zg!|ojF+;~$@LniWsonAFiZGQ~-%{1g#0uQ47x0QR++ok}Fx`i|JYu_8t zx)&_1nsI?vK2AU*{m0p-QpbJ^^3F@C@)ytLe(LHr*G*!!cek%iHKP8p`7($%xa9&9TP_`4d{%Na z<5=m@nQ&C@bi)8(sR$@X^~W z5LE&gD1rFgQs^v9ADr*|LkV&vd7_~iCH?*jJtjHSoRgR2zMsCVEd4HY2G4m z*9eXYmG*`-hp`2E~%`-{JtODwYWwSPp67AKs_Ip@O~nmbEVsj&m0 z|2k;-gzt7%;M&P8l?1wP*?>;?R=742qDlIloVu=ErgAxzu!3NXeOL-Q9Y(hNDM&uH zUMWKf>;hh4xE{=>J%S=G`#VTXUm@mR#WPLVK*{Nog-Xo5g6B=*+q7K-Y^`M^zxMwuWfPBv zaG;y;esF^w7R}&_X6#^&^oxTjdawaAkYP=+dcQ~s9cUXdy*7}`cjKuMl{6SpBK=f@G1JH?yBCoDXw&@xka6BoU;Tp5DsEgihR=4=Lw6 zM^%Z5sC_iQWZN@pos2{Uj0dwD#Fv=!W3Jcbq?wf*^#BZJ3E(Qo1H?HvG-Y-4f@YDD zpYF)z@1ryT>@75Y0NCl|Cz75)x>7`-2(^(5pyCMVpAZ;!u{)g%h~n`;wE;-bmV_?% z&{OS%dl1slb|08&W@Prh&|;e0z6W!4hy1J)SF#`oU>`a=y>GK$%@MWyB4dRf1|rGzqDV-!{U7?^BPYnrcy zq{~VNSTK$mD6F)_%Uf6qS{+JDmY%m1VM%$(MWD)UTrPBE#o|+%^^3E6%1ztExu6Km zAm>um)laD4mbGp*Tnoy^ss~TKhPegr5 z+xuZ=_?QNSBQza4-V3QgC3}9-Bc0q}p==8i&wUo*dU@YRuMILW8khaZ z)8JO&gNOvP{-EV7ov(x4>Cm6+fXQ%c!AIBa4%Z`>te(MghRO?oToWEC6iw7`A-Sjj zO|sHQX>tT#>G)3fbfDuQNYn#a&T{YXFkMzO#Yu^03Hibm+wm&*Jk-U#yQLSj5U09_ z7E!vFENVeNuOGV!U1MT~%j3x0k(bA3`@ia@yg1C zsd>7qc*h^KAwpU7=to_pCa=`2BP`I_*qYqhMi$Et5T}mJ4x2v^w>h3}6F<;wsXOR! z%%jy>8`KUmlk{vq*RT)?b(8msgf+(LXPvlZy_x>~P_5qjwg+`_U(Em2*}n1l)>}Zj zB3XR_{}j2$c;eCM#l=(40vF>g6{C!Uh==z7`1F0-?MYMw_gW#%=VZEfCt z>4J5qo=ll_dhVBO3e%&;+oYoq>VivN9o+}oeYg_eP}YxQH=~RarhiLgeQv6(Ecz=f z!GfcfQ?al>7=}tvOcn1yPlueLXap+$Ew71_WU8K?mG$lYmP*G@hxt|o-V)9;=ITci zU$D6UMswsm+xTE<1l$cT9I$>o0M$*%h1G}Jp@XrR5iEw1M4ZBKtia_=J81&;Gy?{p zqN16ES(+nJW&Bd9D*-~CW;pQiZ?!xRR2b;H%N+1V)jB~ng4Izf9K?8@{q*zC~x{BznzEzXl9c9Hm zdZ)WEK@_C<15;?TICEM7RCYgf@By4b!ZZn7f2Sdb26huk`|nFWkiP-ikvq)xGl0U55TSF_fevf)tt=K@r>oM6-xN>y@gk`__lGMDhgmeisSa+R*EzSp`? zR2Sr{%ClY!l(p?ul{}Mu64&%C?;HTN)uZyVTfTWM_XZjias)Pc76oxrw#2tTX^Ips zCTT3b@JfUsoI=3z$9fzOoa|{?3512%z)3R|$u^FeCl4IC`Zseab%*4=qBI47E0+l7 ze3YOVKu+_EuS*hrRFd}UxJ?I_=feL74P230x5Q#5!0j9*e;kO<_(;+Yctf?(o(6nN zRDJj!ZAgN?8$sf^6j%j8LK#+nzPqJhwy@i$-3;R2v!hh~s> z(G?}AW@s-nLEZ?NwuiU(Izn|lETB)0YwS^j&%m@1pkjSWlRd^_x}|pa*6r6e!DH3X zfe&0OcSLXoSevZUDALfiuTM2?V(_7Y>JRU(?<}!1cQnC3pH>MJ$|fkZ>5D39qhO@tED4#~#vaYv|T3et}?OjV?&lvd>cW3?#> z`HuTz2;9O@19Wz7vYCd(K46|)b7=(1;pL~$RSe<(TN!jZY z9YK*U!Eyu2EA&c_t&|m8Pavx?~=%{wNpztlsNlR3qTa*8_^oWHf5unenTIHV7WXOz+PkN^|O2 znp&cUgr}!^{?uYKq}M&IW0p2H1a>O{D1i-2tS^VFy-~bF2Y=uBIye~!NI%FF=WrAB zLLjh1V%?a^LTTHEE6IEtNxRn$>jt(mGCYO{9rte3K@{ExP)B zx_$9fsqfDR1NV+-&mQ-LzGG=jD*_l+NPmZq$?wx!AA;R@h*gg(t6LdpLyVfs5`k8x zou1f1guK2dlu<@j);L`{`*DByZpXfdG1{}p5^X!Up#c0L#w{tpoKPpF{_NI*m>t!j zCYp!8M~6^Bb|^JFlSn3irhW|KP!^EEg7@HuFlu#c0|wF5es5$06Yb+jn3>#8Q6Ec} zYgEnHvXx;O>ke|C$TNa0D>`{W&htfFxg$unRb+GKJ~l{}RIcqrAt?%~V7jYI;_N8X zbgevf)%q=BBLG**rQ)O*BYZxkMZ%R&9=7>Ohota`y zVPp8wVEH)xVa2;C>83s+T$)u6*1$avc)pV_{K~Rfgr8ddM8IIV;NghG3kvQGtshj7 zdSFvHo>s1@hD`|tnC2Hcyy1-Jw-cjQeBJO|!ji+4oJUNK;uEEWPr+op4eRmPk|B3O zY;m$pZ)-^%N%>P-z32ddM~s`UrG5M5m|nCq03ucTfLNm3Lujj zx{K~q3-XZ!Kpb|$yuXjv$5Rqu0>@d_gj`?Z|C;#u*0C)@G)V_zR4DkRELf_iR7D`} zV-%X~kq;UScQn3h zTGL&?*r*+Rl;IPlE$hg~$)_mS6*PFMfA3FxlY&39Zf~bM#i@s%Nz0>6vc6dd+fzRgLvMf zx|HnSKW}~seR2y}!~RYl{K zt3LVc!y=YyU7r1A;}_q1bI&{stw=sABdLTU1IY|83LXC6$rc2nj7lZnm?@9vT86jA z&IS4*$({r8K@+<}0(K+VO{gvHQ<1~;5-O(a z6mWpM=vYd~IL<$SAj(tgXptw^me;&F(@5z!aP~$A(a~EoVv?9~(m$pef||o6vOWF7 zg5pqBQ5YXNw9uVbt6aRn=yuhw(Ta2U@fxFhK;Q=f0F1cMGLw@6nTaqpCWUwW2g@m* zHP(B|$OhOdZAMBx2;p|LhQaG$;R8d+&W>)bQNQfUBcfZ7?;K!fI+ONJ+{c8pve%)& zfp-t#f}wNG+GOgcBcEle^C}jSWPlGws!mZU3h2S8KSMPhpRX-@teL>f4j^-lNmn$u zX=JS}zeAyqC4yj*R%nhMXd^9xVcc1TTCNXhX7kIj1{|D=`n!*dxZ=Q1?+RlxBDe@i z9fX@z(%a;iU3(F9G(E|$WN%`QmJd!+iJ z6a&dq?c}1LDsThWwSv}~`CB>J_b8thk%fW3wM|I9|Gv0hTv!31KX)XHb1ko$_oqpN)`dU)Pvg$N z5gREYgB$FX+18 zf5bz+o?f1Ec(`*iP^p2+sCld3y`*enE^om>?q9RQQH3giUTJ>ZQtp%2G+d!76AoZb zb}ZRpJU``X%hzs&d|HiAaz6?;tPvw|0OIJ~hJbaBn5=8k>?mI9ZNB&+jRDY?^4A8C z1W|V!`gjtD9SE)bX$PO@VK(RXHm`^rJ|P2Tj~xwIr+%~AWy1tTye2>#-CN_R-5D{! zqTDLLR#FNBpS@POH1`h(olWp{iQ*>VyO5s%0lkhguI23nslIQPt+P6Q*j*oKpSN34 z=tZ*4R85InSk{WRR)P5y4-&B_W5p@CuNL({Hd8ryG0}V^mcaGjwo-C~aG2o!E7z-G z>C{c7pfZz0bWrCsFdYPxiOU}&fz>{2Qw`HO<`M8d(I5EqatU3R;V7fQJT%-3f~__s zN2#P@V+Hfg7%tjo8k_Z|Dl_TU3mF?FCxFwcu}No2Kqqy3o$wUFCe)A~+j6i89X>F` z5=;>TWtiId~^^i*&7rp4n6%Ke00wF$E{-{mPOp3p9r`l|l*BQZ|W&;Wv@I z;GV|+bbQl-a>ep7<@TQ}PJ*TXs}-z6spBlX<3V+lIx&{hTB&h>OrFw*ngn}RslO&v zmwR9H!(Ne;@sw5%DpM2a@O=$1~(wF;rS(GcFN_04`v`m+s}e!Pe=i% zWWGZ=4~{|zQgrJeRR=m}kAQ`$Ma(V0|k?(Xx0bylPsVF#mB zdw-kjBq%6cRdPn7odj3hlvg{{l`EI&-i>XHU=cSG0XG`mF(_P+O;^Pz8BnXkklR7h zT~N@vVkn$ozK)f~tgx7fm;4DeijOpZn z45OH^Cw`5g6@#Wc-IY}N?FK$qVxU!p!$@AoxHI$?Fj%HS=WMW3x)cI*tXys8a3t41i*d=%SBb5Avr#*_g|GIWmJqw4+35 zl)12|Tux1yu+p#bbxut@<8QNnw({#=Sx_-!;)9PIn{fHSKKsHd*8T@$30v*hplrxG zQ`*Emc7@}mXZD~8lCAe`w{y2X4<98U+_O#))wpC#>gHlD*d5A{Mvv+4l{(|qGGcDO;AYKnV;<|fT3u6~ThdoC1GHaUJ-{3a&g^3}|~4pQL#OEQKmfBO=>%mNpp%C5-l>VJ9j>3->hh*$Z?juilCVv1&25gav+`#)d z$?|L+hmAc`R)snH;T3vnl^JJ7$+Pz$BbzFryQT4>W`Cm;UdB4l9h`dF?S3yEEdeyL z)xJQrCxel9t^Scq^Rs%QDSmK=U#ipEi)&3UJ6cQcFlsNud>9w%i4KE8Ub}zY75(MU zxN*V1Pqke1zYw!Nh_DkVdX(YqUQEx}op+bduC*Upnhb7n82wvQlI&Ldpw_nP=-EyR zL`e#P7hqxR5CNLd&DCu0vJ;jUF-ue<9bGH z{9D8YnLGvOWq6p^EFGdPYw_c~RxA)%$!xNfy?FiDCr^eZzAMFs!f`QXi%fptk@k(* zm!x7S;X4(yFgYr)dxfiYcZAqdyOpH^S6kW|=MjL51Y{Tl!`P_KG zXkf+uj~zjdl#&U0o5)iYO#cU|Gmoz(*e~#4P$XJx*d${kDYr!n{f+TU$+BY}m|rd` z7&0@KocK+d5~0Ym41#0qOmK%U1GAY>oKvd!U=Hi?OEUt7;P*eRN+%_9w|4SY ze;HhkyC9&88%H9V5Xx)2Ykk$d-VmytC+ip_qIEGpbSO8@Kzdj#bbR8BltVZ|F*{Qp z#VJL4q&NoJ^E960G`S>DH$PQC=);i~JPCXM>qZG0z+{h_6#vNIA6vt8vAdR2K-}3s|0am$E+X@n~PgTmEtr zp};O0p(;nLj+uBrc|9Y-ewhL;E>XcpaL6H(h&7ZXVv1l@ax{#$e1lMd8Y36(yiM-9#65nvFF6Y>G?HrrCXZs z5{`Ho?NwF@GDu&MU5PWcs}*6vjuwk|!@>YOtz%@s>|juoGnU5anxv0i zr&L)Huv7PzXe^jC@34j|s!Gf?ibZo62sctHGiR*0gQ2_q%5=IZ>MegfX(Ov;Km7gQ zS>P4iiFt!EEh~Cvg2~kPkG7kNc!U(7F-$}u5G=WZ31YBf>KrTQOBgj(+6j@F({iTw zG{kZBCj(uI3dg;p^Xve+aQg%e zL=#iGLN4KHwOmlV zAm0=ms|(1NtBVSV%6hOZ+}S`m-$nDD#9Rbo&ts7(H5rlWprhe{)RC*?IRdd`w+-uG zMdH9BIedf{Lar0@vC_pOod@M;V^o}<6_h4xCf@NdN!h!3dSq)l=UY~v)D@r*L6pz*wh+HS@wAP(FgAr-F8|YF&SNa*KO{!xs|J9YW}|Km6IWDchIw~&d9QcG?jjf z2-Lf2Xq@#*bo##E%O5J+PD}Uie>WmX#)WusV{3H?&J+%quWjq}4s{ixUz9UQcIT#Z zTz}!kU5ITMw@0(3FtQ`_kuZn@8|mA_|A#pt`#7#<dk;-c+B7x4#QikZ`>)5@0FjKxBPLM6#SY=oAfO zlGirjuf@VbW2xN#)k~6I-eyMvxN(A&j%|dL1U?#?_J7iIy$>G--$r%zj?ZcchZ6$; zyc64#5F`eHyL;o(0$UQs;Q4aOpo;tFKYlrwqSyR`Vl6^-rz260W&AvY-HmcrA;r#z zjq)cE4fsVvD?3nL9Nrp9wQALcsbJW}+jyRc%-gkk{Nd#j2uoa&f(9~ZLc|BVO3(k! zOIL;NxwU?v$#*jE3esq2Y_v9KkS?Q8K*5UkF_ru`ABPCKWMyhQNRAf8Ycq-bIGwcz zOZ%4<7pK}W&?2$(a3V_HkI7Q+Iy|Q@J{XNL61Ia8)CkRu701R!6LzBJ02^!zb#l0#=y0#UI!9^^A4DT@b^ZA#_!tqR~7eU@ke@Z-L z`jEYpRn;rIlB#`=GY_H_?flW54Q;Z(mMJJ$?RJxf0-Cp@uT{3Q8cC|0t{Dp>4%2(l zNRUxU)YhFJhXUc0A@dQms(TBx(Ho@{JyKPahXZ3YFpw_f3t z^U!}|dcNa>ZP;8x`;OOH_(h8bh_Z$IaGOBVQ%Q(T834TJBH9oe6j}kCD|TdXu|WBk zdcs9JP8ASdeKDO?CdWlX#BElF2y_*z!YD@K$qbN6jFt@0oY{;bnKpGWBnX;5}q6Y9l>|dr&(j$8~Vtwk?D`e>J z`N(6(N1EqW)GzFNZOfu|Bey3AhT!dM$5w-5Ue2Iya*Wr{d{Br$oG4Z3IPhy1{Fi9E$M(AQqxKAicCUSE zJ&U#q&Kq6tTy5NNVYP<2U*R8AyX7p}=-PhjpDzK%4?BKIzLMIYcmv_Q!# zr~t3ve3!TRh-7j`<4JSxo)m~cHD7`_I#HS+>8x(g%7>;npHqEw_b#>`jgwj@AV`ze zZhuYunliebukW9eob%Tf$C;b@JC{#K&Im%WKt&Z1-3tZ=%np!X+9ITbbK8lG$jXs- zCCSz>3KJtm!gSEhHNs+8FHiua*puzX_97dvD}( zcpH?rZXtJl`OnJ}o6BOwjPoy>6#~UF>XLbPWN9*)C_OXpYB-Ai>{9QUOyg zc1l*e|C^#M8k84#Enl0oJNVJ^bfh2$KccTPZLaZv3&Ztj(v%1(05#^y1}B*HPmYT% zg(irvnuOe%;U2(ODBf_d_&%4PY=d0Y!tdWivv#k^$9slCs9e{OaDXz#B|?kE9+7Dz zJ>yirx%x639Gv>UPOqwf0RHzNk_grQD?8^r3V{M4y|uHS4pz{mh6}P)F3&D)tg;WQ z`!FWj0A8=LP89%;S$%1sVM)C~JVXn&fcC^5XS(97qDDZf0X%~34F!!UUBV0qSBujf zHxGnC_uUG787{n*e+5jrx)#p|$AiFBDLGA+d7WR{4Vjp>$|iQGd2Q+BG6LD-&}JAz zfc#Hlh=G_<6Te@*j#Bjq8`DAJWOE_bNFVulBl{Gy`DX6Q@rO`t`1P zsCtpwR!8@hT(*0)KmJ1wO7?N{_bhYYjwadvXamkhonAn9X8f?;TNe*s1Wx4H8(ana6C9UjZ04S0PZw9@XJ1W;HDu6jjDu?7NsiN1mv|R?EBsGbpK!1C- z)mu73@@*D^iAoaDH9M96fhd0X#g{4RBVBO`=*@d1UjytW$toJl^1y0HsS*Gwi=G)W zFkEA4)b4QF7FP9GdrCVdHdd%#(<*EA9_6MHkf9>)MHYj0>~w|znpZdGe9K(jVDuzQ zU;i4VeRDvfuwc)#5C!YlH>g`pkvzlpI=Mmmb8mr*Zd&;`0O~1X)#z2b27z)SI8*%y}Z$9rX3MhI%^E1<@716U+B&QBV^?fSUlbAnKhWX)sa{lPXg07I7W9N+C|@USaU47L0Q2oxZsTyxSYd^H z$)is#mpfi&-2y0Nt#eR~3+UquBcCr8dxRYPi?c!~=Z~FY0aM|zH?91oUyJN|f7k(dIU&MwRX<%`7z{ojh`9|ec1bQ0Dq z@DE;4DpaJjL~=A{gSy^Q;AOLE@V+7jdZ9~M8r^R$4deq0j-rbY4G)EnA@tN`%u(Gx zGTMPT$<~cuE__K(g;IL;pwGU-uTpyw=5Mu zNlW4+Xs-$iU*f`vP8CXbod?U|uAcj@~}iKiWcwl+#P+;y2jC zDlVB?mM!iIQTcT`Df_W4*A0*rjBv!Pj0ii50aDbU?T#_^dHcCQP&_(^iNRa)2`f#> zaaGG&*UwjLL$K+;572VQ=Bo5U;(@7^tkBLfLMUx1VT{edn7!yRlM4F1*AEr*I0>4W z9I=qez`Y!rBiYms0=VRS0e9+;#?qbybo4YIg0InB$Mnf^pAuom4lB!djUE1Erg#-E zGTD`rOz!VhF4IuduCV0Z-W17-`9ws_%xNT8$!yydGsM_s#;t9$(EAX(>t=>!sqe&0 z3PS#WfFZvl`E6WBu;KJBvMb3T%V;ku6Ys;AdDm?t)%f)L=T`*zfT9Hzh$!^r#(4sl z7Q=j!tBO1!is{0C>@64)+SheHO&1bo&=?F{k<{@F#b}YK~)`a zY3r(;=O3c#?cuE7n<)-pJZ*b~`wz;9J_6z8yCoy!i6@B`F>y`Apj65D9d>8z9;?N6 zDooHOr}+hOCCAm$yErHJ;;;nkL5|1Q7jcJe$}VJsCtB2Fag*(MPwuQLCKD|^ww(c- z^{cCMazV~2pq9whm1?vL@gs=EP4Ww4>hwlR>kMaksBsFWSM{D4M6*(YvRK6h)WgSvb^(g_6L6>-&dJp`9`R6_|+t8F0CE%Nu#phd9ASu>V_wsd7e*3`j_sH?E!wS|qj> z2j_2_2LHDpV$xak_gnn!+pi%E!v-PF(c}}n+vQ~Yf6MKap&U7KV<_vNeb^hr&mSr2 z5CHN#=+W+y{B4K>haQH#UxZgh^#1pdUU4&4)>!T}X|NEcQA*BFA9!41B?wH|9$0qr ziQ0C()v@h>(WG>$1}K>L26gR*X3(10V;Y;JSX;DeXiMsguv0+n8e@CA7#h6sOUHXD zRnw}@lmqQ}vk!mB)p(F?ZU+t5^z(&)6~ z1Zx2=EBELWu1YAk$MGJLI;~X~YG))3;-~$)Df0l1y#b7kNLa>>fp;&#bU}KuPOFMB zfxwcRtSUW7KyXDYU6vU3ZMX@{_-YLH&>K_wdf^eF%8l<$kX=}yh^VsBd*W?-U8L#Vin_l$S-hVGM=vX~mX@_{h~rh~&cf^^JvoXmp4}pKb;w=GG%tQXGutVY z+59i_QUYi0Rwk$SK+wv`40ljJVQp|Bb^N0KK6lL@TG8IU9s zV8U(fG1G87wG`?RP-eHFC(lW*n2jSkRxCv$K^ffuw8ND=JHmRjwSq z!XEM{m)oqbdZ)qURr9kO8ahgqPI)@*YXh+V)iYG=psju!MQ>uO2-eP~0UeGczjk#d zu?L735}3cgnPP52WgIuJ)w<*-d81b;;-$HFd1T|Q1|BdTJR#2Vq@izw91glSW*rIn zne_;Tlyef`F`ut8_L58t6RSdC@xGN_)qurj4?R$6-;T2oiE?$_g@6k1qc6AE{3L5C zCXFd{OI=q6XM2JZz`HkGis+kTP~Zqh1};w@6YpKwG1Dn%V8(B(!q4%7ru!c1N;Np5 zX-1pOE$O_vy8+cLu@1Nizymh0(QTLf!xYAho2EZ*b6rbyV!qza{#!M71BUkKI;s&m zt6xN3=jyubdg#8CkRZaw2FgoQrhmOl|0ac%NlQO(fW1xoKCN^mZL-EOd&?WznR4)u zHJ=Ua8>t0xxKZ^sT@cjK7kNw=Z>~I<5CpCPg91u7eYLfaAg&^$~DLhw_;TpGCaO6yH z2K-7Wng0dnfe%8wdHMwKclBK|IZ0h-E|RBT>?|-zeHvz|j77-Ug>o`feEonYUwen8 z<}SFp!K8_@mvm_m$wMlY6Ho!c&e%(P`B7pp76ya zcFqj4s|_*ZOi)HIy{Ds)Yml)2b_JU%tpuK7{f|{BH}n16XXuShIcbLEY_)WPvez|Z zLn|`^wfvvvsB0Tf`%ekr zk*`nCs+vTGR8kl)q-G|te1$fHSjI0f;4AArlX|6uvrM%*q+dE&>mLuWsl1rK&qtHv za0800y=J~^+cz|E)c?6;6njtL(59}L@{Ji-B@7tq4A1#-=8KW*`yZC037vq2K$QentekCCG z{eE7tm#}e{&3PM^oAfIgeyjbpAQcAf%d z0nbmMeTV@byGDjW8sBES#o=lCNvquX4CRe)7oPe97Ji!HmH-H<41U!=T2S6yb;;A}PrM}W8-^6IkRi$|bXzBTtbVl{iL+F; zTQgtcUc+ic7;>AYf!}g_nT2Jwg{SGBdP@_GInHadK#jD9dR#!d@B3VJd@IAjG15!w7bUlMhh>?cuxShNBQ9 zq<|AKJ*|}#r_e74C@U;j*~ts@yr`cy_~}^3H8{l*>fm%EJPcp`z5Dw9#tgNmfku;; zeECH5g%vh7p$NcL`A2#)N1*NJGsn!QuY$f#E2l`48G*fL0R02GQdfHWt4B8RSYY*s z?n}7^QYLro8MmV7kIiy7xB5n>e1n*O@{wM~W{J5=c}p_K|meD#LWcPx=!mOZlaEL;1Wek#Tk& z?Hyb`BeFuDM5^MReHSy`g?hG}j152ew@StqLTK$hMLO@nqzvsb(9B?+1cs;sBBsT9 zI^h9jsXQc&A)xq#96-d|w7VNitLBHop+VDKI6t|>=U9g(A5UN3_1P}EU4#gX+-O0q zi1=O&kP%}RTe$wxh0Rl}#ywJZro-ly98@NzGok==^-Vt6w&oEgUW%1_%{0Y(`nbfqsGgY61#e{D!g3GMNj)Zitr0{M?E#sfU&#L7*L)8I# zqJ7fG?BRnq&POqhgvk=FfSw#n62(gsHkyRG5V(x)g_+)Kca$f7;z5I%(Mg zfv68Hi_~3;J6^v$V7{H}8cOnt=%u&6UI|FCI!Hi~?@}XtcXqN1(kN%O37a|;lK-qu zM7dq!LOrCm2X;5{p`8?;rg~v{P~KZvqHPuVM-6-A>c_T`jy|GJzLR|2@$(X zZQ|^GOixPVoUsYwfuiY!H{G*Qy-k*3_HT#{R1gD}&c+-cmvylD`^)ptQro1k{`jyL zGz0bb>BCC8HBF}jXZP!p%g;*=j5IFI5zDhK>-Y1HFZ(;D&ppsNeOQygG`0_x^8$uj z>qN4$DS2(9)(ZOf_6t|XzBlds(8WNDg=Al5yUhKa0Ktxdv^B7SvAJiS_K18|sQL9U z$o`L&e#6oo(W>eX6x5mt34BLttN7$RG8UNgshLW?=e2Ay-n9{}Y}tLlz)TUiewq<$ zcd!4APmUqLb|K5{DY0Dhxl`)DsZHq?>$aB?*51GHN=CyanEe?dC&J+x-D_%@=?%7` z4Lh=vZKiv(6OcMORecWLlcA^Gb?|TJf3zVNS(tk%b`(brw=>8Xdm7kFy0PY1h9_d~ z5p;HG+)D8CThWTIdfB6QR<~By9mu%DHol0q*Bt+n7AKtCBn?3NAy|sdOROUW)2ZS+ z5PgMhQ~L@;E!VVX;a5Xz_%Lmxqcv;`mNDw7LIpVj0j{`|5Uu$aGF#NUxr&ht_PfyYlvhH2AqWyIY{>!vCeG?hji# zEA%$rXs*QcY2t_;`ZNv%7p|9txYe)o&( z9iNQENr{r-rJMO~@iJ-CUc&5Na#?MlF3w_xtI33_%MJA~rVaMoJuY$S``$0V2Mx31 z3OTY$1}@_!*d+*L7gSBDyuog)!l=wN>67Ga!&kn~x%CT56HB9-d#~Tf$pPwaX2!lI zj=MgDgZ6=4sK5;c_0Sb9;mBxQfXRV$8OP4v)D4hPI7tP$?dWcIgd?C0jB&sB!@Wz6 z%Z9*z@ewxL-s}kb%i_wQP0hH$jN5yVtZK-*&Pa#ufr{4Hb8c1 zNLppjms%7%L+?)DkX}1l+&^60|F0!CEb6Z<3+^tD(e_FVhn)e?I={?Hq6Sf0|#e z{Eb{}d5Z2_bXel^x~JE3pTkeT#r^x~x{RsKr2oG;&u{tje_ZNpEc^Ak=cPUU@0!Aq z{;j1`+ePUrQsm0`S4(;NgGG{Gui=p}?N;Owe+{#7{ePkF=H|E3WxNQA=TfJD&mGch z3FHhMPD3IgWpu01H(iYJgToLRx1=U7pC+l>W1ZedRYONEH%mo0OE$r>N z0&Uh6-AEa?ok60RDKvFp{5tkPuOl}X_?HF{tG)Et1&~Ra(SAGRY*9+?4p?xil-iqc6pwoLx^M41 zZsr!dM}5aUFEwJM$CI#|=Qj8L|CUQ%i`8|L#xczunv;aFo1Pxma|#mn>DmadgF%tL z!2YSm$%^D~?{8Y$B?DU4sT-_*q+>It5<_UWxoq{PF7JlkPx#dg9{7KBoqHhD{~zx^ zyP9q6;x?CNnEP#{qG%T*mvT#msF8}2(B&&B+ss{=Yog0s$|Z!9OR5<$Qb{-6kxHc+ zNfLHGo%8Sc{p;^}eO~Y9>-l^yi9x#O7Ip>1tNwqlkIq12dy~O2nmG7TyVEy*@>Xa1^VUD@#Uh#UQsAYry5jIYH zO4@qmDHtc?nsC8l1ny?4*Ikc-bauH@1E^qzi^gi4c)?GHWt@WAqz?a6!$SjGQV^P| zsQER!2kvN~mznb#ddcNUXRK_TpVpdWB)O@Dr~k_7d6ZP;wbY-V=1Zj%;= zkh42?VNLBb6wyh|f;SF)&NGBwU=)|~z#bcHkeWa+i||8XPV=45pt4~WJ?-)@t^83L6U#C{H> zl7Mynl9@OLHQ!Vc5E2m+i2IHp2$zpbSRd(FC_KK=Qw+j}6i6hwtg)v%^87kAcKT2* zyWti;m~cYmxz%h}>9Wg$aFPFk!H-dY<0TL0P%st@Sr2{C-_PAuflazV{~YL;X2fMwccv+)YdCM#LtU|ADb>7Yxsz!Z2gp0Z4qGnjoA- zks4cD0*~qF`NGX9_$ePTeQ^R19L{ZPbWdsy-s(xYDRf_f!3f%X0YpK2qPagKHCjG{F|Pw+covswLIo;p59l>hX6mO?uCikV zKt--=Pz1^DCVbz?^Jk{c-uE&VW8OtfcNwKUSjaJIHPLWxxPS$sI5#I_)vV=%vH3^A z7d&Y1I%j${qT0d7+OGmc@FA@o|4t!ZHJ9I|1B)tF=Dj1VOeENjUO-8hAQEBjWvRT| zGx{`ZKh(L;V&d=NzuvbFL_Sx){VF<)Ch1-5&K#_>pBkqp2-r{Pm$Sq4BDBALoj%Lf zxOMfgZa#8wuyurW_Hf@)cYWMWaD16`2w9mHZcFBerR22W*^%KDC+z&x;%}hLTPcOQ z#1B(v&RNp^^Dx%6j6I+n!yWlr@!O{ch>gAl?&t_-rB0&vEp2*;DgyH64x=IZ7=L9YyUnzi(CPoSx*y zCxDq?Mfx7w@qQeHN@FX@4L)^DEWO96hyrwHRy7Y54Dl%jOp5Y6j@1MGFZ|UR0M0A; zSD&^`uP2hTx98fahY%r1U)vYYU`>QF&pM~JQ<)pw;ZOltMz%HEOU`rugo0Hw5Hary z9z991+@-qBD%rm(Z?_A){(;WB>aGj!A|>sd7nx3mHVGc5S0~P@y1Y0 zWSd4P=O)RKJHlvC6Cae&b>rd&zMy9_Sl1GFgdyZZU~t5~RUXgp_*c5U zX?rB%d7PnQrNQ9eeL%2DC(T1-#RC-dNlR5?fJ$^Z2X#Vx&$-~8w3emi!#iW@ciSp> ze&5$CbxpOw$7&h+-C2f=753uB9$2L4s3Lsf6Pop)9lCsr%MpL>*$fMFcN+SllHsUe zXXjQp@C;$u8r{@^KkHBSI5yLh2%S~*QfIs=Z`l5MXFUV|GE824Poo+FliQL=lX_^l-2UN$i}jU=Hq@C7B0iVU3Uv1N4zVA3@DtYBHgFCg7G#OPifQe zxuzH=KAs@mcF#mm`08!)*p)0aXuhfoE$r|Xu`0e zpf)F<{6tVq>5~aBueE=0C!chU*OyEdaNrOHicGQb(Ee(CwMG|!zr`tm zNn2LEq?c#R<>asZ^Oq{DEZ~(AaaZX)hgyms*ES<%&_=dDqgY|t}_k;dR zUxvFy{`$A6?^iS`=uT`Aw4l6g9|*B={ZNu=7U~LCCtP3LH?W4P&zra0(oTpf zfOWne-VLjZ(6{obBW->_xA>8XHoJV-#RI!0BB}+!#97Wsb&}4#(f76J&#L!2IPRvm zeXhy{^zecsmhmFbAWVe$D~GbfHo^_PuV9}tLT~^1IP+k~H`P!(ibLN^mnQet(%|U7 zAIot$AZ)vB)wg)YUD3Ey`%KjF>F&SUT{zK_%8zSaR+7vCN$HA&Ur#-C{}3J|aBY1E zJ%G6PIIq6l_h7!*R)OPUG9k72*=@KF znojt!|c$u za0b)~1Pp))g8TB~yXt$oek89{eTA9hpqz!`#IkA0j+grX7@L{f&WYi(G|P)8T*EPT zXFp>h1?=qmyOxs0x+mvx79V*#bdK{maIQttpZBPmAYJTEQCiY$C{7SDPQGkRV&V01 zyzIAxWd;;ioOyaqpNVj#l{tbXS_X~fl%s?!h=qus8Z$~>PIpsKK6OwzK+k|boAZ=y z4Nc|sL==tMpqJkZwY4V5$UiwDC2_*2DMP(w8!jpJGQSQEfm~l5g4)T@nwni_sIAlj2o=53wSuMymn2@NkplI{b3~Wr8C>)gz+;zjd z^BhljKrDv(y^v;SE({^h_3(R4d;2@~x$rcQj@%*1CoZCAkKJj1Mk@aZdE+OmQ3OzJTvy?Vo&;c1TaD*q#e*TO)42h##qBn|0tDsH>GycH~ z4?ougr0RUk0NiuPU=P*an?s_mJO0Am|7Nlp6^7nn(KHF1O*V{qudJ%}d@sn)bPIO8 zn;_P8R#0xM#k=hv_t%J%uRIFjUe&IMmWDC(VFF|Ii=EYf^}Ei(*DGv&iO`Gwm85BL zA-Y2Zol?MQ?U6qPu{}-O!J6WZyI)vlTQ0la3g)Owj=1z%ULLu~6&peeX|w{bBZWnp zM=^^8DFoM&w}Em!0=yh+G?w>+lN4m@e*=X`7;n;s3z0T8o;x8QlHt%6lW}$}4Fk)?ce~eZ@7cj)#J8{z(GL`g)w_6>nJbIvMeG z5d6Eha=c6;p`VDU!c<;Z$WiYN=s^RZu5f^Yn~^ZgFI&8>N64|kL6P|F?EUTP4u{G* zk3^Se7_}BByrr)`Xpxmq&0%@K%x(tH4!FrDz6EXI{JbA%BN+IZB5xb|p7*VP=HXD# zPGR%F8zajblJ%CI@CY(n%(Xl+Go?cO);zw^>Slz@`(SVQVm?A$NA7e(;%Of<+xjjp zwTqxe!*?SB2ZhN7xpt!|-W!6sZ|^7VeGoWMqP^Z!VUHcHrZr|dZvw15Xju5NvBtK2 zFFQn-Kt(?sSon77Sgwa^yV1+XYf9Vp6Ob?+9_T*Z-f|B`vglNAi=O8Hxpb4=s9q1N zn3@@QdF8gi9K>$)TXoJp(QGG7#R*`AI~nH4dac1f)4L2dLkt8YNjfB7vL3Lm<^Zr+ zG1oU+qVMUGIlSn4rwzrxB~9L=tAA`v8XPxE5V0xCV`%u+QCzl`HY`6CP%ZqZcoEgp zmP=h4_|yH(wt@#Vr}LojM*fXjOQ zSX_cHcvj(Ku|AKCvqwfRxyAId8?3h}PE-(*;(Dy-n79)|@4Y4IJsao3cVA%k65}2* z{fiDL3c>ajBU<0cnWH{9(UWcrX_AY|7OQ2Ciq;ky z0htW(HmOwXH|VFKUW|&|62|mh-@F>oUUkWpY@!9#_vvYCq2lu*&icB=6zO!K{i>Pw zS6z316s0wK`h|PY&qRGL|09$`ci8p67S+f)Lg6TpmmC4D^rcK{;>Zt4?s>)FLtl|k zJg+5`KILuYc`=C-wNI;kJC?88I(R%aQK}E#@~`g@U@u?Zcua5fBF$SOSkhkjk;hB2 zUN)t~j-EAV<)M}c4v^s*MAdS9_8)H?Y_qX;r5~c`$th%WboDSk0@zeaqA>zzaNQ-V z?1=cK4Zz*ENmS?x`_X}+i%C_fRsjtC=?&YCLC@=eXQ-5@J=a3oIG%@Y`119`tKFY> zfw2H2R`h7fnpcqo`DC+r5R`q>cb#9md$J-GhPCtYS~dHBANmJY@3ByWxnW#!CuYX` z>ALHYqM_q^OnC5+FlYI^Mp@#wfYGBr-X3B&dw@~0Evp+o?=;mYX^FZ$B-$z((#&3c zK|fQ(fT2$=<%{|7;O5>)H&gs8A3W!XhegxGqqio4!op1TRuC;l%`Iroh}&f&&LYFY zMF7Uy|2O<-yiy7U4fod{pg-D;-|i=$tpqkCWs9@m3^t8rS@0q(+o*KWISkYX;&>L} zWi#)ftCS4Im=Hm`7XQ9z)Oni$*z*?;@gjx8sdzOBHj2AB%c`iUIRlg1=98ImCn6MM zT2U-vkca-v^PzZ7qW~bq4?QNJ{n3zf!ME`>0GT5@qmaj^bop!ojzWOmMhW`j$&&PQ zwKweKG_+a6BvVqNNy0;*c(2JC1)I2+`H{}Y)~Ysbj>4P5p(Yho>GF+X;~BNL2j123 z{J{?cOxTF|fAiFNI>^fQ@-eQ~K6dVQ3#9VUFR(wIk*hXg)E`-P*Qa(zO}1%6 zyuQ>bA)e^g7R_I$YU@dJ{IOFxUc|lGvt04eXx_`=n{_SmZsy4v>42D?_peM$?iSTh zN;|X8#@F+SWPq;oDs5$-wD9M{SV!};OQ!PTFb@wKV<)|~$>nQo1lAwlwZ`Gq-f^ET z`4QzqHbVU@OKbCbyY|k!uZ&9ala%|o*2R453^$>QyYVBB<4kOg*0sPWVz+$i`%aR5 z-7Mi9O$LJ9R3+Xdceg*z@V&db555Z9_C0dsq})Y=KqMvKA4J;;4}PdTvwjSzC7Yr7 zA{&YQ-O!%sg(;iAAbtKq$+O2k7j^HE6fxn8XAtT`JO1b^IgSC)*e308*qj59K~7?@ zp49P3hnzh7}0$u?D4p06b(nd1L;eF|)!1~DvDE-dqFl&*mK{jYiZkIde-lH!E zG7L8|(F)qo z;>=ah=Q5oZ4Zu(;JB!}}meytB<-R?~nB%ylm@)D)qsHsoB}b1u0hvO`3h^IRQ40WYHjP{` z8H$r#(;LLctiHgZKm}a1Uiu7_DTpz zx+5N7oD~Ho8BhqbtuZ}g9-}xz>1QD0OzL#dziizKoUoU&96R)U*QQ`0;F>AcK^qJp zcr?EsVIP9Hq`xu+CW8-$rE?*!n``#5C?KrvnJM-~;rf{2ZOV-o&BOL^F|6^#sz7y& zVP%1b-fq^;Fi1sXJLxGFfOgE1Vf$=M3t;%&q2Ed_)Hk zKw4Ud*e?-4s9sB-oU=3b*9)?%COg2|8zc9OU&tC*VMxg`vkOBJIGXh?MVP>zE zs$$}z_9BkekW^39MTMuouVHJ_CBxklKu%9Rm~xF_s@G`0umWh84WF8LQ`LKJxsRmn z&mo^kpQ+)2}V`OuWuw0t+SaI!!|sQ0_Q2x9h5N+M8*^!6=!DtC1%*WWwt(J{rN>8-FEt=*NEQ7?@O{t~ku}0N z2ARs{F#f~S;H4(2#90;e^*6{aj%Hhx82U@8Nb1@^t-1%%nrzlIhZPassk)?*7baME zxk50$5v)%LDb^_6pHwEpZAG^24L@$pjv3gM6t9vRV`@8;X=c99Z-8UP_8YL&DBg`W z<3;UNIi9RUqaK4Djtxev()5`~m4jt_=MF7zhT99KR|XI|TFScuf?hZGXIcFthLse| z<(Yzovx@(%MUV2%ts@hdp_&$r_vo4+&HS94Gy1l2ELY4#CG&g&uplJztWEN5d9`6V zvN;T#zoPL>veMB{++0B@r4~THrdBE3Q8ubQelgmoM|CW8bTGoA!@i%Is=ojdYa*cH z`khEWh$2}JgnNB210VOw>0i2<1)w#*xqNM7&(%9t(>bsKb}Q)U_abK8_`d1CuYuL^ z`lv*)^5uqZ&*HC*x!+i$!0k`U>M6X^MA}GJ+ELG9o1qihumZv%Od|hF?W?`e8L6^;@lyqQ1N~4ZBLRoQ+#y)1-p)h zK2H+9hV!1*)E>V4@POO`a`T>g&-b;qBf&mdu$eHKWQIPw$fMkxB4QL{v@{dDpJQ-S z#G1uX$YaULgdT*&$IxZ+aja~e%yRFK1bF*olPBDI0u17kC=`p)h2vrd_68_RF7wtC z9jBtcKh{CIQq;ED52?Y#To|5PXW%a)`pOs-pHTGArDVLITD;JbcEcDhQOk}kfS*<8 zg$$1Cs^IU^9Yb#u5{K}qZ3V-`_#5I|TzCSFO_sl`sMClKqk%eLq6ss@5w4HV6TEcK-nIhx=!tYUh{K|zwBBa}%rr-_S*vKc>1&DYW^!)ah z363)UAN+W7vJFFjc^Xtf_u#19ZPl}&-ypHEC=b;`2ab8VoE*=vf1O-0`@!~5JLcG) zyv*ZPN2K#pp^#0-S%{fNPaTix0{&q`tntvmHlph(He7v_Mgg$WD?<5D&Pk*Sgh};X zCu51B%QQD8d@oRIifzm+42Hni9AM*ky1~xWY>kM=yQ!pX3PsNhZV~FGUHkS0Tn1G) z0YJHJjIK`GU;ttV+Bsqf2r@c6kOQBvRiSRp9M(H<7=lUXy5=K|)i>hzh(}VC6!UE* z@c%(c%y?SO%qD@ynjK3jA9ewmt0X>_+f&hMIR_kr-G?jovdY=~<#Qh4QoNq)<)G_+ zzka+^3aJP>yRc?o0cf9^wcvvGDPocwjaG|SL@4=&3^V5Uay8BNK#CpTPY*s7tQWuy zOTagdPw0Wo(RP$eU+XOVY(kis;-7bk3T894!mYakxE>P6`@BZ~E~xjJ zbE#WusvZggsFY3If=Qg7GmrdQWcu}83g))oCELrNi<=;3`-m(EV?WQS10(~pMOVYF|^X}8N>}YR{LS6MQ^GhOf zK^)(|6&5rW@f55(MO+Yf5Cey63VoOe!felH3^{Rrj39TD`v7zX_ga@qEvdpB&;VjQ zP4n$KL`HW&@2Ks+A#6-#bF;6=!6i5m40Y84a{ESYWCPfxN02-6>R}_KWQzHV4EKA~ zaN;Y!NT73fW=R5L=HWFIrLpw(%eAr+7%3(TYpV?C9JoOuo%?n{{$wWSXi1{T>gLN6 zQnYzc=iS|u3yfDp+l7-B4C(KV+IlF-@o%hjM?_hFcPZFKMV%^wPFtc*W>i=xiF>%_ zWQA`{126V%pXtl86Iz|R>0ow1Fw^SGxQ~8!)W5(;@c;H0S8D-TR|d1kMc ztGE(()h&5a?bZ!ckFiTT+2c%Ha7+s!aWjM_^R#!^q@vAT2b zP4*S&R9MKEd?I&)F5WTg$k5MqxMhs5-CrnJp#57Ser$FYu;UiZwg1pP9#iz}^VTH}_56*$e&1qHZfX!_KzXhpo#1+lD` zzWf<16P1>^FNdZt^L`xlOy^SMuAKDe4jc}7$eFUhaAu;ypdRNq%CJYy#Fw~4k@g6E z2Oa~d#=^+8A}WfR{w9%yJ3exsJR@XWtR57gz--avj6lP247DL3c>c7ws;oXr(L4Pv z_MRK+_ph$Bn~z{nL|N507ZH>X+FVIZEHl3*9L8QB6nD$$@S!c|4FbfM4N=adMnlYy zhns4K*fIQ@mVKFO%Or3k7RFtIxs@x!$#~#R@gZdHnnErfSKI8~DgH0Z~AP(*^IM$@C zgg?9n??Y8_&_}ry`#Us&z1v$o_&-6c0|D%}I1BYlcf}m`O_$UJNx1AUdjG=-U~Qvq z@3XgZ($mc6Tr6I2D-=7e5PadezQTV5JPNS%4Do3ODebMJs1Setn#YUY&@$OZ%l zupKAUoaYmF!NepTdJ(r?oTf{~EbanAx0RoHjzL#XW}2riPUG-$RXr(+*HZ3jR#P2U zp-x;@$-w-pPPM!k>4SmsMlQXI_FEWAp|lHuu7jGYd&cS3uYYg1Xj<%kcyJxJk%_3c z6K-8yX%_=AUq9gfNpL4Z4|A-(4V3}RGh^8BTP|{+F5}eOqg^MUoS5;3`Q2Si6&Hrg z-OS5=j1ylMzb4~c?&8WZ;pNkyt+jJ<47ln!X(lGbH!b8e+~M830#LXjw>D^X9M7gT zvC7@_zL%{#mAPO~HNPQcWtt}HCj(GpXyP|IIiA)Clb)O8HaxeQekCy`kC|4hNdDq1 ze@2h5I9c`KrnMPX_T@(g6j;=@RmLtpyxv-#o!y38Da^DvGK{&}naiH3GkO~tiUr6y zVd$%Djq|c@PioW*UD3MB6RYvM+5MXF$6)lyqj8_6gp4(fhaYiPp0FFiPJSM=)Wxq* zBz~ZMwKzZcw#H@T@Z);h3b{<;@p2F;4@46u{NGqu$_Mvlf15C^?l-d+wh4`hz1G7o!djANdjVPDM>7VUXDPT<2G7zqVOe3eN2K{rpDOa%s0t z!8Fq>ixbm>xFEmAfLo7V_&XD7u$c|3vrmRV>y%@%p3dK8NoH>(tyufhI4pmwB}rrf zTp2mscZCddoW?=l{ruweQ(3&wb6vUM1aQUl8W;R1W>m{N)|-@AVLWfW9-V2RhK&2oC%cXnaotlZJceFouUxq#_9;AK%4O8cN`nD zl4yK_>(uDM^<`C#iX(Z!)CSYrX7Zl1hcAT+Levs6y5=`<8Qk5gQW2ARTe>ia z5ahhfhEY(NRIhCE->*;aYVtFdr(%CmUZo({_(7x{)9U6=u4rQAG+Lc&^qVt|E+H#9 zoiH4pavLw=#!tVm&(n>$-uI`UesSY(hMC5qGg#Xb^E=0=q_I3DXw4J9=jP@9q%FAp zF>Az$fy|a%sAooApXToGpYy_KLyb<;>USICZY1}l-l=7^O=M8#99Pi_E{^^;F_#ES5W z6UJ&JA@7{P=FdaS>#;~NikD4c6154wY(lEeP$p6dU+jU^Xk_gIRbjvPM(_GTNWpc6 z5fDmXi>YvGq9h+mjxysac0**{X-dh+fCZh^@J8w9l69y)<-* zwqEj}D~Z$Sn|QnM3lCOv`DG6htYO9>6DS^{3arP%Lux+5qrymTAAjEJGDWCnt6Y72 zie7DYW$LEXth5j|Cn>S84qCn7T^Tma!nE1%+5P==MQ6_n+b?^r!*5M#T^Yp;x&D2q z|C0ab2R)2${@qn+pPnsv<6>mqRe$`I)}nN9;=BH})T5YF=+v+L%1Z^qly>`*RU*V| z$ob}b=&hZ;2rSJ9!*5NLeWP~fb$=}`onQD-%#>%((?g{ZYc*g-<<1A3S!4$tlOiYzgpcsYS$xL9+MZoWy)9HHQw2a z2aUm;UGEjn%Qtrcp7xY!*Xsx0*ni(pop&B-P5CMLg^hrGB)^tlOQWbwLUKFq?>)bz zJ7!%{kBVn?76Tz&A>((D7=QW5vLg>e$gqg}N47Gqy?G{N@)uj6wh8lT=FnI{TN8E% z;t69bHZ=VdNnbL+TP|iAFc7Dhi;pRgc%54Zh1xNrhH)eg*gkm5;K#|MR zYxll3Mj}%u5pxE(2oQi863|;C;FQ2)WPb>#|l{qS5IrliUC(P zs3J6_8_et?qo(^^wMLJ9>Spw;juUvdG^Zd*yACZs(s4qShp96F_8!H4!sjs@pQKNv zFfVOplouqmefT6RwAj63EakPSgib_lVzT(Ve{BXg*&#a0t|rJr{MdEkn3FmKly32W zmFCu9dZNt~BHKrZy=&j^r77Bsp+z8VN4@YN*53cs7C|Wh1Uow878uBe$3M#4u;&s_ z`-QXaYNBfxOJ!|F@khHFc0Z!+$!6T2KF;cKUe>Y!I!o#@40cyL{x3nnB?EfI6yR+` zon5-gj%4H{h4?5Ld_*FzC7(3ea(pf)t#5AwX{nSE$GW&aTluy0DDx>jgtp;q73 zYK6<7lsmBt+)z=9NRs*}vC@j5iWRP&?#TeIE)GI}9elN#{P02zG)ina4HT@cF9Iceb~UIl;uOHL>R8dS&=p zv9xm4Rh3bv$49zGEO)*D8pD1)EV}wwBdXu;2m@d3aRvpiF5?#;AVF-&e}3awV>d1@Ai1#+elU;x#dy5cSVk#Tb262>aZ$)3Tv>REa8IY}!Cx{j8h`+xJbHX>=)3 z#!Ob$s)3jZ2cefJ<&0)7#Xtx^GBz+cAL!Qj-t8v}Y2%rN4zeOCdG(EQo|XLYEk=q>Hs>nHwWfX?wRY^>vv<8~bKT&~p1OXcmo6x-CFVD_xe#`>Q$}c~ zaWbuHBDx|w%i^_uROPneGj6uNcAO}q%JYvrOw%{8z0xVF`4{SVFIBKzbAS7_S0_qh zUj-k$zpDNkT86`*JALjUf*R$L$d_vCB&E$UxadoWfS)(6zCL7~t#t6v0M_hapsJtp znA-M@nCIzoOvCf+B#YUj-t4CHW{Wacf%*XPwu5Eqng`dPH?R3FM#^J+QmaZvY!weS z%74PYIT>&|r>`3y+)cQt{g_cm2mK!tor=wZHyec9`e)Lgdm!Vlcvl_UmhB&lm1>@Z zwL;O=wpz*Zsj@Wk#fjWL&g=ZwKc1zhDSw}P6$n2V)Rh(3?*VL}Y&ZMZn&uQxWA*my zj_EezbqfC6HF=Rw>5IG8Tn+RDZVqt^UB#u0;uv^J#;bYmoWL9Z71%hhU~u$36EgBm z*Ju!?c&t0?8(bf^gYp(F|8&C|HK|ACr2}`C^|)KNa5N00-SF{k^c63?iS~ot80_4w zdOZN@9S`!fP~sHDN03x4?j0eI7ZPPm%?9Pw^-Z*YHS*W;DA1$M{9xL64tLfYA*;4s zS(F`w7aAN4W2Yy@mu*a%cm6dH-iMC4=YgVh(Xj*rm*v=X=j_;IH<{qYF{N;*=My8` zF9CYc8<(frqf3e~c}oE_h4bDNFtXsf{GKkK{E(Dj>ak^Ea3=}SgboEj{{A6CVI{f; zsWl320sE7@BScFRztc=|GvIgiloctt>6_#Choan!y6aqMbhErQpx=T1ag7Tz;PK8M zz6|8$$}m8EUd7kxIOOdPN>2*n07n|Y*QyurOag0gjV*iayV|)365tsWw)1U|v>8=ToXWj;JNWb-rkPz zkQn{_1y)hqT)m|wsfCzEy0FajnNoCZ zi}CZvmpWz#UiZj$y@5VFv$H%&;B{m8!@Ufft*wa=*{>fLEdy^)ei@&BxcTuNkzh-h zt3t10JvvB!oPbD0lUAjg*3IrKst%L~xzk7YdDpQmSN5&`mZb)4EeYBwpN}4VuB0Sq zUsABxS5pPt_C_6&jqik`ex+b^X(ENnz-%|;6)LGHeJMG$&9-Et7ih+}Xl&&9ulXLz0T?#FZ3Qiyw^Ld%91M?4k77@fZka`_XIyqs2fP&RW41vkd zV9{NA>11mLSdB9TDEhLybdx?S4V4tsyWn{zHN$CrI%q8I9-Pn6A3!w#dg)`k`k&g8y&G{cXIWk~44Y@aTIDXVdW-t|G_Tnv)SawD%s^+8ahiD6Rm zad;dTSy3I=O|Ob9b2pU_xqmtDet8B8-)hC-LNycRM5$GlrJk7H`o;L10(s+$AU!$P z=L0WkGG1&_`5Kt8thnJ?1u7Z*Ds>H1S{L#8xE2$Mp2+0E>O)0W8ocq31Tmf#u>y16 zls!1*f_*}%rHMl?srl@guJdkwU^q)^&lTSp4Wo!#pReU+H;kh{F}jt$YVgcepR+tV z>r@>SEsqTIt#6eGq6QI9Z=?>2pDicP&_};~5_el9XAQQ#2ZIK5yVKjV}I;Dquh<-htB601eu*LrERZ_QKz1= zdu-nNY=*wW!mo>NJ3Lv_`QOnMXsZvPKlnz?UV{V7m-{qs%U)T-H6YgOFP9&AD;L;$ zsXuUKW%cd)x{vwF^Ny3%;|`=wY}>ZgoWb*lpr?B1?u+>@eM!#)+XgJIoPtbVyJ^{= zfSi)#$2j0~VG1kWmHwSJ*4^3mNs<;iI8p?2a)(!xVj+{sDh-QslhI<&>%G-}JoVu` zGaa~h@H*hMXG_u2D2l>}fBEu|?pj!F<*-<()8xXyPq~=CpS(dUHi zq=b1#+@+I6ykL9TRzf}*nn#fJdJQRWYN5DzZp_S( zmUGMH5JiizX&r#)-O{^nH4%Wyy*_exTuP7TNu9}9J%cfD{l!O|ol}=Oy>=KyC5Vdk zRDnkGFJmUWcz=p3quXgnrt9(Kk+CY!Ft2wXLI_~M=MDNy8tV6K7)gP^KXQ$wQhavA zDRcOv67P8#E(w2{Jl6<3ypDuyt7TA3KKA5;AuNo~j(dAnuNgw6;h~gpfba(gTMErh zkmhu|(V(o6#tivnc1(1^m7!Y%n1h`_N&bt^j%!TjyH%2xMFaD>6wrcuMh_J$_BMNz zdQ%)SoR?+`ckD{m?c77Atzsy%#t)!m68+z_jVxBVH^!}M?b90I!3!`9p7pLf4B|P) z$xKdSWKj~f>|sN|yO?)ifmxp+h{PW}-{Du>zh^GT@Z6&V=l#QV;UptBhQ9iz%3W}* ztl+K*$5&GG5TjFb#awSwwAJ7I5`n=W9p9X6rM7!Nwjlk`a>nVn*AZ>xW5Y>o2&q1> zM?a1?$OZoY5`z zB{$kgVN0Jv$Q^DWZoj-i>(}LdHW8q&mgQTHoS&TWesU#Ai1dfP@?;N4D0>2e+iL2KJ;sXqQW5I}h-+2q*b;{k|*R(T(prz7gx zp+QR43Q}#J!I^8oe?9a$`G+=QE{C}31tCR2uK_;HG1tm2M{kPL z1iK}{J@l&Kt3X>Wg{wfyb_=bRSmINwwN(jB&~C(h55WoLan5Fh1 zs6pzB$&LLC>y2Y7)G1qNirQDcjrraVnxezskD%ruca?liryIx)4gKi2BBomlNBzv# zyc~Xi_QkRaI_30m+_k=(@)X8H)nUuuH@BN(nwq32d83<^*3iK0S%);?UD8Cs;~RHk zVD&L?`_=+~23R?hJScU-&vQ^Iy9pM=&Mv$1${%*i>Us6mL93L_qPt8@DIU3nUjE0dhxfNI{Lo4}~M{;+G8(;u0^Rv*mi zBhyf(l?FBIjdA_=vXdF*bB_Pby}oy1sR`@9$e?iU;8QH@YVM?wf!TNT89e6D($s&i zoL5N5TOr%BMbLH{;>e7!d9Mp|qe00dI+m&DYQbUOxl$_Q-&m`lqo-l8ma7LBwq6bV zq`Mfj;7 z02_57g$a-9TZLtCG&V4hwxBNHJcvrlPER2(Ll~=<-{WG!E67N^OZ$pYjf>)Un03;0 zM@Oc=;l^UTZYs-pP^Rmdo}vvQZJ4Ty#dVblp9Ql~%9#VHs^y$7mr;;aX=cx!E-g=sEAOW;_ z6}4|HytQ9AwV-LSGNWi0)CZ@6hr|7ls}YHt0?(nV%$yq6?p~UTr6>0c!1Zc(K_3@n z;02UslVXI)N}Jq8Be2ig(lbAFG+!PMUH8J?sbz8OOh;k`b1dHHSZzMsU}2Pw6#;QC z;t1tI0$>KzZ1n!X!NNv40CFb)fB{ed03`<$)1h13NtafY@9?c6&?Hw1+Pti8n-F<%D+Mf$Rx_qOM=>&NWAe<*tRI7c-Yc+F zl+9Y&z?maETi2i4b9bQl2w*}~m!E&yz2S*tVc6an(dbUW;|-|@x=knX8o--hPVPyP z@U{Zv(M&y_jtqR+Rf3nF(sM`eMZQ}4>A|`xT*E!K9=K5e!Ly2aP*K#D4DvPV({7+j zNmNdeL*~z!KX4LZ_?Wknfn<5q@F?9~bCq6ba;{7@t?CxY%w9q6H^@oL#owd5SkQnh zs~a;9AqvGaT(b@^Wk7FzUGARz@<6#_5?|F2t!UscW5bcuxg6-XB?B(tzWh@{cbb)D zz~ur$>Y7a?hN3{e^f(iF^t0`I#O2Qc|NOgo6;O=QC^1t)EH$wfbKY0OoP8r@`+Af zyv9^!OlDNUpc8((J+y|NT(N1LM2&%qs_m4Kl##`_IfUkzwLJ7Xu64_Oe7hymAmG?b z7_esO>#0&U(ZfV8GOufwF8;KFRw)A0kxHNb;*kBUEG$yzQw9SL?0Auxtz;5`HAlz~ z#YjH;eUY4=GYX8oJ7o1p*7I2Z=MKfK%fA^g)IMG_CU;|VoTSTjToP&D_d4{h%C>V8 z1i7%$6EuK+np6^gNoPB>=&Vq*4Bw0{L#W%=ufF?hEy%)&I~gY~R1jo|Y<5MnPOFC+ z$g}NUmdm!eH2xhLTf@i zP&xVcrP8(7O)$cG`$%#EOKho_uz0PHoS=HJa~c)1{?^M2`(lFl*fu$?{n*rW4tf5) zyg%|d{*U*|2gw(vpR}%*OiMhjlL9G|1(>NN1023i_m6DNZ6_3TC*E@>r0N5pK#SI( z&Zn6k9nM6&{j7VFq{+h)&Yzj!;VrOi3ahQ_6}XRHWcgFzjZNtv#&v0NcO&KD_R#N3 z2Ka0g8#(x2NlRIM>Tmv#k~v83%Vt1Qy1_56M!KHX_-5CZcabw7w0bm)iwa=D!(vHH ze+E7yK>YHs0uN0^YNG5}7AzBI;?z~=`E~boy($!lZWtCS9<*d}*?LA9gt+XpPcEcv zP_WQTw8##drxe_woBTL=T%f?G9p$0VeZ8(Iv{H+X^fbXFk zI_4IxGnQh$m=>sSGN|C{cR;fM#DU{iplqgjVH4r{m7rw{r7!gM$dj+{8HiM~a`zl@ zv3zXQM}yAb64J#NW)Ewjo+z@u3iP2mwEnDIM$zwDhVBEFqclPpj2$k4pByItg;>!& zE)1f2Y8L0KKYCa>olBm3k#@o;63TDWU528|m=`{(R-r<#xcztgm!a+d@EFKL&_1U$ zO}rISe2Kq)Pz-&99VqA)MYY-_h}Es*#zIZ4JwJ-hQ`D_qx2Qb6;dH!LK+xMJ_qjfN z#9;dkjE3vd{-<9wd7fuXRwaID%xm0sVU{5%7)z<%27z|Y7|iM#(&4LZcOl>Jv@bAr za~f|V8X07DB>q|W?`x4!p#1QX0caDua`Qi&exl*NF1{5~e{u7W%abm$n_|>bYjz;F z9>S@fN56lxnq0lrHdL~!)M6*F963CzcQ_<4{>OuolqZkt$gqyXnn2n2I~q_VsX>)9 z;+{wI*%D@Ct78*p?0Vq%(3f|-qRQd^0VKEZ6|N*YWk=R{&6{o47^~!}t2huUlMG+n z4i404?*cQW%{F<(=&{qjP7MW5)E;itY8lTot$ZyU*c9}d|Hkr0nJg!{oK4c(Ap~nt zaLAE4?^J6OAj23drfgE`7U?Upt}&q7aZc$_6>l6^l44$KCmc8xly3AgqGWI;M?iNq zNvCM32cCgkzyAEL1$IScpYih^zcVRL42jgM-ciH@U+*ASzqvAR^z@Mf`k{hP2qF_H zf3i9tr0vBVD>q~j)=%H_WEBkmmQ4Y5hS}H;bS+0wR`8BI(0X6D__NEXG?5YshcTKN zsW)Xa?i_MFzAD!h4OVjLEW%E6G8wiI!veSQ*O2-l`H^IcEdJ$D>ZJl=MkT4Oij4FW z;vsNoyv+Nmh;PP#Us~@Qu6mihf56Lz-#&@>hg&havB|c-L3t4*3ygsgfDmQQCTcTdJx2x!ey zL20@T<_n*DBrTK9>ZVIJC;HolgVuD~tC-wM!J~%%W$O!)3^?~@>f~@P5`_qXt@PQ= z6ci_5PdmO(YIE!8XVbv&J5JCWw@eE!J$$43=AQSM>%YK}Te|B_zi6FU^|E~L0eJL38dM$}jY%tgJ`J?f3z}`pbobmz)G$ON zbft^zG@PX#=w?2)DEV|Z1RA+&s3haX;TsWwY}hs%e~e;T_sZFF)0pA&;K1}lv?Edd z%^#6YP~cYdH3hJpC0HavmRn3B=FfUB1SEC+=`K&)zc+CLLM-b|TlgC9Bv@W#J&dnIbeFT` z-g;o19~Eoto^{>RGO{s-J#8r6Xd04MoBxn{$@s$|n&K=2(>G8I1PPt=Oy+g4eJrFU z-3exnO_@ye4KQjFL=a$ECn256D2C>&&49QYDv0rZu=&UQKWO7U9YMG4Gi{c1Szjbh z^i1#V3{knALf^-YxltQoDBx7xBYkRQ4weY z#V6D41~C8Yp=u0iT9{p&^Dvv3a%Rnlv1+NFHgCNFc!*=1ESw4Mq-s;xfQ z9g1&VcZC&f-^!TN$pZ3NLX^hE!gU1Y=(d$D1DAZ;q}$>Eu}2{pMA-cPO%5w~*Dl}A zmYTCf8^T$wv2@VE1^2byKYbJ+@R3WFPpb0h486S5 z0N*JN!yQJc6^VPy`Cf_!r5$!}sQPW4S55C#mp@VjmHGw@i#dkwi3koa zj|CYxAq~rY*<-(o5wuQgQir=}rOtZ&sE#;G0ab+#_S0-bic&L_XY2-OR`0m3MjH5? z`n%)<_XL?7lyz!5@%I|Sm(|(W5`UJd%>jTKQ_Kb)1r_h zh0Liq$Xg2_l@Nyo3IsNN?)ucTZx*CY507CFx zo3~w`@>|Z0e#G^TMN;lqI1JqQ&}MzB<(o51ghL#3SUEElm}cyKvpm6Q6IY^q0r6~c z=&97|sHtd2d`1>riTYrgiIR*pAR?B2MTF4W`cCgM`0d1T5brdovaZlzI z;#AeWAByHdmn`$j{L46-Pa0|5Ow0XOy7aNr2BU|`@&SU6C$^pdw!_2xXN+;Ls)d8nAxa`*BgBM6l z{l*uvx)V9aycsEgGcgS+pYg_;Lk9@}_HwBy7UfeYS{0&LUej_a8CBHcS$9UqIyiFJ zaFZGzP#>J%xj*Xa-GXID<2~}Tmwk-)>p-B_gP&onyuk`04wk-i8MW?h)CJr9!ClsC zg@^k%0*ahgwa2t)fyVRPQbTiC%Esqqb-n;1Kx>&H{rSB{OK;oD53LRD>QGMWa3bA=yCmarECP+u%c-}FOXK?CH2G!qs0(I#M%i?oF z19HR8EB66T{Xah+U<)ndLIWQ)xyuvpE< zxmc7Dzh}b_1rj*`o^A}Z1&v&;uLmLQAQGKrSG2C-PUm@Q3)gZ^W(V=iBg26m(5in( z_rpBR%zE!P+RE#JZ@BkCTMZkqRCa`3Lms!p^xkukp7FO*Ejg3#D{t5jgYC{V7OtF{ zOE`r|(iZB-QU)Woe?8XHUz5vn|3>@wSonCqeA*&)0QVI zYg{YQpQSNFkH4r{m490S{C%Lf>Ft`5{4QFsKuD64pqJe+Ou^|}A&!Bs;1y|#4RCkZ1;PuY_PRU}O`|;un z!|q{v(&;1_B8cM<=76X_aI#<`;HkTZ6@W_cfsqJLIYC;N)qb#hk+v3K43YWU zb(w-7^~Ii>dy17Z(pp)Ku_2P)VQ18OGiD>>%v*akqni4&ii2Ep6+kY}r@vJ-Fm|SO ziU9W8bn6DoDWrANa5;R`R9en0Ceo6X*6o4MiFKK?*AYEWrOjMCjqC&Vs|vul`*hy- z@9LJ9m+MgY1?s($5Y610eq_yp4&%EfX~#mgjO0XEr+)yV zO;oN(o30n)tk$13nWTCy%gXhr{*Qa<{`;WA?0!Cd6hxp%=|%R*FdI$I@U+f)k8_~+ zcYXQi599M}JX>CHUpZw$8kAdF*z30V>gaI&{OtvG3esb5G0OuxtLTGDNUnDcudAXJ zO)1o$t)S=R?faWcs<}+A&7(lGa$%(Xw9)%Azn+S^hA6TWCZ5i`?vd(Uqh23XV+xV{ zSMM*Aot3KyzUyYO)1UIIVSJm}1S>cF^)x@vUG}3VUf(*}0_jULZu2xx3eqd%5zA}$ zy-PMR64{AlKqh_H(8_H=FYw0p;O`<}-RT#3Iv&qatb)9THQ{E{U*}0k9HUC{K#hL2uPsq-QIlQRrXuQ0K5wC_R#S5LX6VKql|0Y#d`y0R zxGh?o4I{5z=v3gA?BNqDl1a`nXVX;yv?#zOLRL;=^)o$X*}+E7cDm0QW!~0@V>(H+)^}$Q8Ybb~pJ!E16q5Lfv zb$AB5u~G)aIB>q(?N7A%H9(D(4M{~YZ?(N*%o!G?ftSSsKo_-ymeP9?B5p!q=qmU$QK2CnRAI+1C3IUI@wqa-TdXl|-o%%DCi^Z6U~rC}6sRcY9M z|J^CibmRI^XbPX!YW-?h)v>kz23gnqTfrZ%HwJ>bD+pn)CX)!!aIBgt^X89DCWa!1 z(4wzBJOIB(@=VFQEeVbiwUO>mcPwm)IR1=$ptnkPza2CtV?yqqgiD>p*_u+4^!Qx+ zfuXrYr`1~nb54CBlG@3`!oRP9yNF3wlUgz4@i#58av`P2LrPq%T$9=B@T+Z&6GOPt zwJ4qA{M%29oXV{&J?6X;2(fL2!mq16{`YR|l-MJ%H!JPtT#E5Np@^&gXMdpdr7uf z(ksep4>ZfOF)$^fkg!AV0dUPhIUcGsIhaRBL^D#S+%hxiGn@^$pzJ!{q|+iBWhXwa zd=`SOj4_>m{kF#xNcu)mf&Cu-#uqh<115haXQAeTV&z;bDP%bp3m)4~y?qxI>Opm; z5+P*2!o(et)0bv>Tv=9yQsc({c=tx-;SiOtalf(b9SBgKKe|TadDX6aM!tVz?JyoK z&TiW+bGdcin#X1PXzqOuHJ5{CJ2(!Abc-wbucw?=F=~#7GCZ%YNc!|{T<6@hFp>9k zcBB6# zYM$@S12(sE1`ZAun)!lqT5&Rq|2Js8&-l2MgK!?+a{cDaA{~#?gPx1uvx~?sK1F4( z{qkS6H&(NGi`})5u2pKc+b9~N%XFc^v1_@o&ddOs?CSTW#u}1q?7>-=M=D~f3#I7z z+k2QED_`k=D>DDq$iKJ1=CFN_eqBw}AgFU7pKBZ0R))cV2+*n7Fk9r%XHS>oe#z$S z!q?XxsY8~hV=!}*K^2N;`M#VNStt3`9&V@-{lkk*7gxo(`HQRP{nMf&&M?H9Cix}NinLF)N^ zvE(dE`4GS7Q9_wt(1+ys`wInY6A+g}f&!lX4F*o|(S~U*SFM(ZfL4^A>*+-Apr;P_ zq7xG-8ik@V=c)^0yLgD@I>~c4olSrxqB<3110w`5%(yCSZ?rAFJe6dapqFo4U8twP zT?iNsI8VA`SrJ8`3{RC928|0hxJXoxSY`z9gqDFehn*-#SqjTM7|CPD<~L6yK_-CX zNjxZ$`ltk7n78hVTOyHx&#+nOq$%0x0*F?ktQ<*-vMeN=i<71gtgqlMR=dbVtGm#{!faTstB1=5wP*MH}Az$Bc;xE5Gf&g*Ycrip~_!6qKog5)2*S z!xUybA1SWU%AGf?LWJ{V-1LT<1W^a?nS*jy{Vs_B2m$*D$uy_SbUYuSZyYI$Xjoo$DskuWve&3Zakh=O0RAzE*QY(6j3TVW^qpMgVq|CN`-axbcW zqu74#&+-0%(s&@#7WRfnk z-L=Hjp}#3*GrbUH-C2_LTRCLMcy_ndQ=PEGdYkW$2g-igotxy_aA0jpOLi4V!4G2-c6sLxdIm*9L-o43r^9w1MYVN6i}y0_0ROu1>LC6>tc?5temmTf zVm;Y^*e(t2xO(OcYlv!_4_?Wul=TLxgW>#pzlUDR0f}*V@kIK_P;%+V2cO@J}&WiMXJ1lReu3~RXnwZl-R^nL5r4y-pWX)$QcRStYq0orOVLSGC=Z7 zJ;dC|9FVgWIK4!~q76_aX$Yl^(>e&IA1#ewx?2-IP9>?wJf7$ZEv3*qGq?6?ZX|Hd`%tU@=RA;NsRaP>ys|e#F=9K>rD0bq^IIq`9HY?PO4XZG2Ry2QKz>Bh=jB3B8ayf6PK4qwZyZKLcM{7@pQ8~eSZ~c94(cN`& zq(Po6d?*VNvi$JDgC@m;@|q8p{W5`&XS)?DI#AYpI+B=*w)7^h5nLxXRF_jl>OK*n zkJ5Hi7iiCJWkD4IY`)-$&9ArXtrbuw#FQHA!Inpm)h2Q<-6$*o z+;A#{M$03`U+?sO8k)5GZw#?EyKj;8gi4Pqcwgo! zwvMnY&K&Ou>$*W~-0pFs@z#lld;sAxC4i}UN3gpLbHXQo*LfV$cm!@$;4gH$?a9i5 zH{UY7(OP>P0I{rT^Av>~x|+o$JeLLYerWH|2_U_VBPaXp9UPSCc@xf}y0?oWl^Z&q zLKOF1)%~AW`z}jn`Xjs~LjRz3p3b<9Srd%y!7G0L1A)Y*=k7gpJR!Bzr+Hb69es+pZ z)*R}*9UO&H4RJ-~>)0JQlVUDHZ7T!xR^f+#b!mPkIWk{B3Dp>40)SSt2@y@|T;*W@ z{>1cx8$*?&moEGgq_zHgHb{BNb!~`xr2*Pn0JTFAL1_9_&n39UEX%Idea5G8$D^(7 zQ(&J%(_nFpet3FGD-M;fF%^jLg$k(^8K}NHjmoSAMQr3o4pQi>9E^B})sIfXw&9E* zk3UQ|*Y(#ttbjFpo}da0Ud&;iJ0sq%m-4AQx;tXGNqeD2btT`~E;(=EOb9i19SUKa zP?T%0s1V%)+8>{deqp8eCh@xKO3coZSOGR5^7aT6{^b_t6A^LEhL(p&R@UwS66c|LEea0f*ZJ+!NL5w#F-H?Di9b zaEhZ8bdgsj3LXO0J21KGoLB7^rCKXx%-Q!3!}9jsul>mbS`R$iv5a#bCfX&Vi(Ir^ z`&B5cQY1y(^eC89MqzwRnlK04J&f1=Uf5ZqwZ34KbrRhaK4y8?#`f`+Lh~T|a(+mn zUj)Rqyf{kQbz%%df;Z-Adx1Cey$ooI&8zk|@uQab?5*M&-N8e9)9s8E3pNXYBn<*G zw9fl*wY^J>!CfnN7hIJu)wVxw!!sIU6pRN#B;E<7Cz@@sG=-FTSH;?<^@J zFp>(68z_lXb@P+c`+$(T^LtO~*_F$BhIyh~4ZMDL${VBo_12IAAcx|i|6ZCIz~$x6 z3{%D?z)in!*+a$Q&P+Oi?`%yV{fm{=J)Xz6RI~t=^~x#bTtTL>JjLZerr*bOMk&@C z%9xsBVItZ%UQA5-vtjvN4E8gnfBiEq?mX3XRbQae5x1BPQ(}wlO8JQyht!Fx%|g|k zl$Heemd^_r=eC@XZW2;e|HY$>D!6)XMg?}andwjewjQchvc}XFV5xz#G$o=w2M&Kb zlTHkgKjEDeVK;J~aQmaHe50Y();hQu{zlc^2`ys)*>!JOlev3I%-xRCn4eh}3><;t=!A1zorO?t}=NNn5o) z_c<1(0a27&b0;1t@C#vbvF0NgMvADq={}TXy=6bWJ(F|2JBTj;CA;Q|2C-3_0lCC1 z4wSL2Ji+Mm(;JQ)_Lu!rRA9ygTx8Cmzy!doiF<3?=9$1gnATe;IZ-F6kn5kkS9$Ya zy1w+;Z0W+~G1DlMhUHEL9JENwY9|SWZ*Lcd3a4VV#MzP9Ib1?Nz2ec`f`rt-ASI@M zZia=yA=3}0rUsUQ4)Xjr8>;)B@2hL>HYz_bdrcg>iDOH{x|u@G+ZNrJO6xz1QmPP% z8qWPs-xxfaMU>9zr4i0VeLGtkGneB;$X^-U^u5>A!hs512i;8WN%SMyV&g0y=q`WI z2_r6FPvgk!&DCCMNy!R;Kvc4KUeUaAG7KP!e?nodaWvLSG7AfUm0WodcF6qU+HfE% zLPiBw4O5%}VRiOb|BIWVF>{A(|7gC{zIDBPm%yN5EEzmTp?)Z$K={^jgfu{if^;K9 ziDePmMV+3Tegx1@;{g0fAdNAuvNQtOLdSUv$=R8PpGyg1Rr`F!dDK;TzviW-#FKyR zF-Z|}mYkd2UyDNH-aVV7%^0MeN_Rg3`F<7#dN;g^5hOz>6J=d>1^YY9czwZs?RJ!7 ztf$LA*fpGM&?n~O$qcsNvo1a9LZav8KFo1Zu+Go1)NNEjmeaDVF86k7Y+2(Wr8He| zAKe*&8OaH#3pNh0Yoy@?3LyPW25X5#LtZ$~=dEpP6FDs0P0Bnw+@+HivwfQ-3JSNf zy9h6?@48p1%pTl%f0f^D8y8e8UAEU-JuZKV36WN<_aYDfQpl!EK^2a`4DEk)n>wJh zt4S%PrbuM;y`^tDtpEn@oiPqOe?1kmW@Db}!hVj{gSgSH?}{a|)AX|Rw>y#zWV|wJk!bI2H?I6WJ(^9p;j>PLo}6JP>*xC5^*|9u z^;P*G$t5KONaPssSC3YuKcDc}!@uEDYjw}d!1em}^I(;1-u18~w^uE@T+@#NU3m5y zZqY=QtF6IFO$dHPlgS5VYJ1XhLi%kzc22r&_%iBhw4b3RxSvXJ<>C3#%c9gyT2->bn=klQ*jGrdcdK$AntP5XzhDX2%~CC9q$6)rBC`rUvmcmpo(SQZzh78 zOw1A`>oX~DOrT??W>O&xp%^nP6IPjT_>Lp}eJP)uxMU8H5=BmOlthTLY*Z29C9f0L zgoDG8b9Va?$WR0L8a3P zbYZ!>!I*PMS)P<0!OYc~o=uRIihU<(PF$7(?Y{*cOSEd{6g5ipGYad|7nM)Lm&dz+ z@@TzuW1F5uU4+7OoHG);RP?E)`s3X`S~39Zq^%K2{Y12Y!Nm+>P|v5{6fWH|Go?JO zKOKt-GCWmrxhR1^j{pxvRfGV@%jt>KK5Jt341*|%p|a-e9^qtVyMFs z+2=FPk?kXLvU26AHBt61_G0E0*F$tW!hdUPjr!7DWa<1C_ClW1@R>&0gw=}PSFsY9 z3sTAzzz|3-WTudXJV!Db5}WxK*JGt(uytSjyAT9Kc?Httlc3i*5hH|XyED8D^}3~! zo9#*{fKh|timgEU(A$%(zdsj~k$7>xGFEFEVo%h+ee7C_)yIT3lE$~u5q+qp_VGA< z{f^dzV9YWy9Fx;UgP<_nbx_|}QnwkJmEf2%73f?Vn}tc!U0N_%RUuAs;n;A>B%FfI z3UaIAiaMvs{u|qR2{BqheW;ij?7T=t6BO`4Tz0&nJ}je%vrP52iGXb))-=33R6aUjlB&H1Q1(4#1OrUsq-kR+j@*ay7wGYo5+{W()w0UT zi#(Kg?WI+YXeH?waB`_aeP@iScP);0X4syvLPQm&M`*l$w*M~zwFQm9L_o|7S;h!qS_}HfR@gTdfy0Ema;9`M~iP|I5AkgB3&%AE9AU*b%#%0#3GXUg6(A zy;)ueWxSEan?7h>#y8j@d8+)7{=-0;;&(hpziQ8s7t1w2z4$lqNEM^H(Fh?Gykuzk zJ!IU$(M5Yxfn?7GY(mKeIS>B6gmTeR zrkd3$(GxImanHUY z%N1&kSJd5r-@1Gq@Nrcy6^?G=_?4od=KxyU9!AauSOYQF(pnTwz?Y$Usj?j*RFG1L z1Ju@NXo038C$Gl;ef(pH13xDtPm(vJWRMfm^!kFTSbUj{H1lzH87ybn1F1>p)6*i8 zmX(nNZCFM|!kx}XG&+~aI;ALYjXf8IE#MOe?z`ucX|)is2ciQy*#&1FtQvO?69u3LjO{kk(oP}M)A789|zYc+7aLiKR?p+7!9q}z5U$C?#Erni_4 z5@FgkW6dEkd~5KJ=!f3$14qM%vqNvXmc3(4t?b08M52hc+S``>3K!*JrFk86>~+kD zDA-^5LC0{iV4EHsKDR}tSg&czh8_K}UoyH07!;lT+9f~MdB2X~qAX+hFwD#Kl4P|x zEq>1OSf6#LOjXE(rK+L0w~}7-GryGs<@K-;-XjVPr)Af(^PcVaUri<7XRstx9@!(t zzq_!lsto1#Bo5D+>L)^8N*ix^mI>f=kjRLQau`vops%$>;vKWpfWuv2QpiUqRZ1d% zDSE`-WrBoNTu1jeZ=R$vF#AyKYa<`r53Y6NF<+^U%I!A_c~Utgn@sWK64P;&>xVm2 z_9k7{bA8IEz(G~SVxiZ_V9uy>srzp;zzFhNnzt`4=~Pw7L>BDYEnn|Do}7|#%8SMH zP$T)Sr4oFe_k|p97inP%TEJm!n2{PC{#Dnj$4G2tE=XHWnvPU@0gk#f`5Le%-i=vv zEAwr(jz>OgBW+zxyz~69XG<=*!DaF?Man7XCqhFMZ44ppGc9QlF(1Ih+4*eAUNwZ|iHk}aBU=fkCr%b7`^x40oRL)e`EC?dKD=hccz z03W40U<{t~5|U%R#Y3U%yvpC5igjo2&-@j`Bl?tb9580Pzb<;DU???}vV;&4kVd=* z_1McZ1G{K}Q-Fx3&1t0*%UxQg59T~x97z26cyfk%_s-@-q#9G44L=&h{&cM*Y$XZd zo5Vn%h!XqHNIYb|3{CZF8K+9ErS~Xx8*L%^hg4l7s4w|BaJWP}!n|8m=iWLFytE{0 z=HNM~_PRoT_4@#oee#$c6F)D05ya?kIiVkI_FKBM^PY;Eh1(a((S zQX+o}_x|FSFL&^jf3h{+gw>KPLFE$9b1C;e`eh9bIF8dtSHc>Le;;fAMti@bW1S^@ zYQo~Eih0_HzLxDo6e-cau2RM*IQ-BJQ0QEe^0;L(A5rTv-hY5$Mx9dXgO>TiM zihX@`P~m42U+~OBzo_yG)mjlYq>*X7)QE{TKYr(3N+z^sYafL+aYS(%F`YSl4W!cf z*BYmOLUB)UxXx1OxsgTMV`Vf z3?VNVvjNbFN$(`bIH#YHiH&QSMHwRPaB}x=$C+X)j&ag*JU*etv=}z66BRSp+)Ea> ze|yjygAeK>Uw-iK-<~ugj|LKkx!JvkrMizU~@1ne(al02MS@<08`wfwWFw~<#8Ouq-7_$G>zgnRsMt<1HQ+mW1^hVLy^oHP5VA+-0 zJ+?dULP0QR1kws=zv(dbuvTmC*o=3A1{w>q{nNWLcIg4K;TtD3?!6Ae+yWsPOfkx= zcrh>yghci2a1)dc5N4Wx{k2!dTZG)#j<`#U+Y$Ost61BRT&6XYxsR@l>nX1|ED|;vzFWp$<|!m_ftcbOR*P zoL#Lt{{A5Vt4&AuXK6a;G~n;}^;0l?m(1hTK18`Y0E|`}%gQM^GR3xZ(K^XlDC3aX zp&Bh_^;h)f>PhoU{Ek+Q(s}#N)iDM&vH*kQ8J8V)bA1_f&3hS)=b_!MvFPaNr)?j4 zxq3IY%j_MkHFo6H-bXiO;hVJxMbisQ%4AlPrQ;->$2H+VCJx0r|-dd@BlMxXR4B^>6&E?Sf>Ko>1zR+)%2QHdd_B- z-D58=HrFtFKu_$aD%p5$cp^r}HL2>{4|gQWK)lImuJRb{9xCdt3Z%vwjO>FF5F5 zP?tVy?l#*KmW16=zxOM+(eYaAlYeK@CN3%<)>3=$jW;5$IZ5@Q)0%z-6?tS8E_{yh zsYQ)?y9N9hULy@_+qq+_%=Hqtm*ne?Ze_ng%;qHuiK|HwfC|FZFJ@r$hodzzE|;V? zs8#Swj~jLtY7Hu5iNM5DG?P0#uMqb#TzE%ma8&o2G}=?7^14U+>qy_SUybAImP`g- zika|Kl7>gf7B4N>#@vN4_JXxXuR$DSk|YO}?SvvmKY|+{?SK!o2va^wIZbn4!gqWf z!jhnG8#$I_NzcyQErs5US;SRTN*qXD5d8z#De+q@lHq3F^@6E=af^Qm%ikt)R$p$- zr!A+LGkN|6R!h6W%n|6cl*P)ffI1{K~dLh;^3Rugbvtgf@cyNF-wKOB>70 zXz{=SsAc(gp@_6N-@8LPHgv85n--Av{=lca?b?G=?R}5l1^Ub$4zudmBqHrn?dKbkb zF_)AAQ<&@vN-;{+0$f%K8pj#BpkGZ?csJ%~caV#S-Z^%UKC>C4=drint_RgOV`+vT z#t{1LwSEv$Xgc?w=!EqVp^bnk)}eSvDKX`8pXY}0xvmyIY`OsJ2UN<$YTdl- zob62uI(btq?82=Lnon>WZY)q!lx#hNFco>8IAnqLD+D{Q(pBe=U%sl3xm!JtkF3Ue zwvavYDX@UCJ0Hhd8=QR`RH51@+1f2%(6*M`(J zy8_P;y^4Jnq!|W+E*|-T2+ z+8l5}Ahj2U^w3nAQ|PZ|ii^k+&mi4%%`(;M6evgi2`3K-n7>rThkXDREJrvL>wCc{dT6Hfy{ux;ZHZP9IM=pSFcVVf0CYO_0gQ1oM!R z&7a4iIxxkA3)nx|siWqLng&-A{dV7~KlnxF_RE7u>TiAua2v+ePiCS)3?l7VaVctQ zf&mL6|Kp32oTrPV#N4B|+IDAA9=yOYExHNzc2~%h@&hc7(sQl_52<^zs`0Bql4R@w zUv>fDok>&^cy;kSnNT z1PerU1hf*P%$j(&^P@3w@Qybfrq?<=Ai$DWreJmXWv4n0k>Z?Hrn^LM=-57Y>c|bP zkN7kW4OM>ebEb^KqZ2ecTqXD0pI*W?7>xU4IF;L>etXMC8qA6n^c>UyoQCb>zypAn zw-(;Px^eX^xF2T^)t=qzFB|(OIZ^OZ1e~geg`qQc9T{EoaK<7;+`+SapAJs2}*{48A2gBw`I&MmQ`D%qLWn3`5!JuW4XMgZ~Lok zN^LxG&T^_0hB6t2t0V^!_K^0miBCB%GStd|=M?9~{hVBwJTj<<=L_sH4@Sz9nhqMc ztcTYOrbm=hGDcFm*gDX;6HT!UV7C_B}qp$VENm%eK-GV&V9 zBi3j)^UPE-9FF#<$gpd9kMa!R-kGm?2R78kH@o5t!d~p@k|NQ|{WnPlwyozfMpcXx zWzpElC-rAEKL4A`Te+9?dlPFntDGLQa_LkjRm5MtztLvza8g^lI$g|}tM=zc&D+`j z)@Tc@&EgdsE_;;GZDlmPT+>e3b@sIy?(i2+Cd(?LH=dPFA=pLYiFm2&TVYlK zS>n`BJbC`Hnpb%qIh)YqugKz_zDs$=FqNhcmkT3t zkoUs=Y1xLSA$L(wDJ8`bD&KID=+jjPyrH79;<2F2_12acx|^1zeJ=SNXVS?af$ekQ za6ZN`jgp$qV^BMwy%?cMhwOMpcK_uOy=w#trmK(^k(pQ4jn@c`*e;V8x2WuvPZhZv zlyVj`!mNv`bPW>cf+lJ0VoMOw@m~(+-xwCJ+zh%syWpdnk~9LvDoEKtj@UzKoC0Qq z4!VEh>Xc3ujmGB9Ey~FuncPfdyQ=iK2UM zKDa;Xbqy*06QMJBgj6(BlQFUgt9fPE+q3?z-^A0lSIs*%mX z_h=k)QG$jgysx7P(eNg=*aWG?$QTq{Fiil!+j{Fc?bo;c)S~3ki=W+>(G_R+tkLh9 z7cL(>V{X~UZW1*}cudQFb=4$c2h{=nimLi4>iF4rAN_HCnupMqw^2T9p@vrEU<5*K z>iFl_^&YI|$GoY8)+eOn?l+$pTnb4Tl`5J0%CKR9Yfj2ljgF0m-f+j=*>$@v($nGS z-KzYkm)keo+oN#dM(@2u>Fj*{>&cZy08~}&p;4Q}NzGWBGQo$?t(+4*5>rX`o2}nI z&lhHg?Hj?lU>1~RwOJN$EQI9$*yE?)BvO#q&Pf21^gqO&eqUd_e&}CUrQ1+RX$Jza zSyFMB!3=L=BAUJV3op84N^qOYIS; zHQYIl?2x{=(^M_4yjSPy(zk1?%|1YZUK4;5nCPV@mZ zYl1IGe>SCJvw(z{u`b%mFJ+|@5eQO~|845^&SNHl@;iONA@60xo1=56V|sG3Zb2w} ziGGsypuO^ZDjxRcW)sONgw0U(!DJh3Pm|G{M4?GUe;x>p>LzDZiwql@NN1Lr6B|DQIIdX7o?7v^E-0T)A*P3Z(7Y4fs|E21V2sFs zRo75E;#XEu%y1cMvo!}wsD^EITO*yqx79=5Mzj@zq7Y=qsQbcGoqP4#{}$ao&MvY+ zMfdgMGJ`i0sLV{y1IAwT1oVs96s8{X_{j@FKO-^-Ayed4ftI6T5TMW}(C**!z=2to zu0~9t#ibPCc%t)!ERyyIyweP~B`MaKi7&3wYBsm%$)p^~Zrxx{I3etmwDpQ1>Ms zW!BTWteOu4x7cMg34BSsweID$);G)DZkPvKDhT?nk*?$~a%7ATv%3=zwsO$3k(;2Q zbdMDDIjTE@N3L%O@3%ZMNZ-(_E+M1xL`hP}K9ZN?Rn?L}3RG)$~2$+Hg_m1sZ(5TAivUi>{`4203Q6JJSW6@C0J)_Twk_Eo^QJ{ZRS$T8Jo( z<4`CyGC?@>mj@Y4`7@RKz-V4>$@pZ<6^gG!?Er+~W-+yt0` z7W67GtDH%YC0vLQ;)|_=Gm+>*2&A!LeA&aDZE+q;X&h^?XL(3X+uyAQ~m9H#!3i!zFKvmQ^b8I;d}+KAZWb*|rWTf1+nTXRg1 ziQ@zAw+EeZU&G!^gqeb`R=*!}Sh(e8*75lPvAVTSvfk{Lnyxr0JI{Y|;Wnt?-f#TI z^H4+A;O_9|0jUq?goEj!x0axh{A6Kob~5!?e_qL4#4WkoYuW}BA?akmXfKD;if3y& z*xlLPslZ5Dpo$;)1m8~*8Koa@>sES*fyp}1?K(Md3bOyv{zGSt+T`)|xK6RWd_A8j z*;xh3)1~9T-c!hRjqpBFmbk`#D>v_*8+$z3fk4%bxhjFwCT!uRS`>7v9c~y|$sh|v zaa;B^wl9vfi}Jy?e`6io+6Y3WOMCLV%0+ff^a+#mrUHetk*nD-X-E^IdC%8%X5WlV z;y$;3>oNYPL&-*nT*I6)w|M3ja$^a1#s01UAc=70EnM{fqwC!NnehMjzq8qfZO-Rm zm^sZMhfW)82e_*?7L{WS0qshuQ#-YGO7Y?c6Wco0Wp?W?(oy!t5&Q z|9aCAoXJoeMW5stZ(N(b!H%5;OxY?;h{+=VyWIgrGrfKwhs@3<#Uc3gDE!}+;3~1w z13S){DL_^C;`#X2TOAxKdQ<#?ehGTZIm$>7){mZ}n&I$CddNYPzlL8P@N9OoEa{6F ztuukM8aCbST$XMi4Q|n4vzR3(jCRU){FTJ z%rJ|ka$1Wrj~3e5C8(4lgoEHm3%~h4b96Ojni}UiFY*bpSW65}{rkryC)iE~fvm(j z>W53Q^AjcBJJfG*t<)1P;$qrxk*5xWiHGkEN?UjVj-QzH&M5Z=*6ZnVao+pw+Jh>N z`9`uWXc{rd8`_!Bd0VyrG%wXlrI*oMCb`6K>{kwiR$&vW@O%j)1NVy(+c_gLn*Cqx zm~8I49a{%xEDgVo(MAeX-Q;5%(zOjUOl@I5DXc}q48xQ4YKwn`Yhp+3O0+Y5aCW%X z+d!WK>ybLI3Ih=4pmv4Z$@nPe3gV{srP!2a==+d`W716x=~1tUT|V)nypJuOhANRN zPu|UiAB_8Matz-`luOQ?O2*2!WD$UZ0!#5=s2x8~5}F2VsBu1CvoJPWJJIBUR4@?l zxcH%!D+1;tU}1{^@}ek$CbIn?Ser}eE1&j(MM^wR8Sj^5toyJ5)G+6(-K2?O%)!H_ z{Nn(aA4ccOExXj0fz!^d-)tmtlS@{Op3w;Rh!|g6c1j9%C5%PA+0r-6b_*N)mYU2F z;9Tu`iQ9r>LkEtM`YI`(KntH5=~oeymF*kDJ_{C?*u86a5S;zZER13Ef zEv-|=sLCFMxD2w#=4F|~G-uTC4BUvKvf85P8JI)~6$J94_92TYqVo8559WmG}jS(emf?_ohqz`2GM~gHrRqjnbt|J?iLGrse zPWR9}r$)ZAgT<`~);PWV-nwWPIHt%>v+K)|%V{1_WZ~Fjfj;ag)?%HiHxt0^9hV8l z;HYTBCR>j2-udnz+D~5Nq4u)%EREwf#&8G_*qQ@=Bqs(qDhOjot*h3nJF)uOI1HdS z0zM6Xq7xkR^v&RP#WSu%LPdPOwqV;>*DTe~@-3x#2 zk-m^MsoFXr2(sXt_(2xJm9f;gM5D{InwDx?S*}P_WT(d|QX54G$I^5>%>az5#dIE0 z4=vg#%%AhTaJ+UwdW}dOS5JJ~I@Kn|2AHS>t(7RIzyrRvE*bye`7n9$!H$MGD7vYS zY^ygm7xTpw*E9!}i)~v_jh57YjL^H)_sEBALx@Es0O@JAgcd`LyIYSw2qJBu40_9p zIy}Z3;a`=OncDM-qt?pVi8$@G4xq$U?lw%uMEEIx0Z~){NcY2^ulii$>uu~@(CiHR z)pr0kveu`P;vby;CGqRF=6P-)L{x+|M+P$(98^Eybp4GNngdHbqDopEQpYAi7VQoG zrzw_(COsZERT65ZT0svsxrojz0^OChA8f8Y*zSi2#ToIwen3-NJdP8L>KkF$$JsJd zlyw$jd4H4WQolB(bxfR9*uA&&%b|5ajux`At}djm>vYKRNI*V4sYdb}iI1#pf-}SE zN&cDyTqw&GF`Cm_*e^Suyk7FrP6(;;Hw?n@bCZ|nja8-Mgp+AzI9~t$0Ze+J$AmF7 zEdc=Uya=hL`${y@%nL)?FfgzWtff>lfkEf+z|FF z<19)g5Omg7aV-V+Ltv%C(7LMDHTzQFAN5JY0532Vfw1DUjWZDZRZg&2Hcp~L)~8w* zp)fw)pM#tcXcXt65$G+sFumA!hsik&TUBR$u!`;$nt9cVT`fFRCWKi87{%Yb`Ri9Y zQ*raLo#bJUw}*+7t9O9Uo*3ktXNAn&`eE?$>-=RV0z=YE!c}M3+cV5=SLSv{f9^l* zJ%&P8VV@=NvzJUp-uzu?E~V_V3!vN%bx^dPIU(O%{mkR>d%72tlGkjSXy+ZSt(x~z zI5#MlS7c_~@8|ZV3>*jZN+R68dQG*75>$1GQ)MpH^3fI71ZAO42r6~tN2PP~XH#Fd z%UkfVIYb@|k|W@IG6tc^sWIA3ocNmwT`a-F86@sH5vV(5VjMlqIIo*t!DS)1X-ZGU zhyZ}GQc*ZcE@nf}8;a5^OViW{q*)W%nlwN18EeYD@r7Tqr-|A#IO!Jzg?S&OX~Y0R z5O8J%lO5Lw1{3+WRs#It5^)oqB55iOeHxN` z&->&X_c8#-WfoZ@>RuAu%5{O^eS`*)KO(k8QUc*4Y#eoBq*lsi=MhLo>qn@C9PSXT zOB)@lg!0=LkhlC5_p-(-HLZ=}13%ir;zjRgh!`W&H**Ek77^gAsM7o_okI$5LWTC& zFRsjM?DJe6xhXfPJH;Ik+ikE;ptat~V8;8gwIfgiL)#mg z)H6)MRP2Eq7&!tsi@U5}C3y~v8|gy@Fu<}@7LqG+|n*VlVxabwu>YkhtwH149vwWZWyTSQ-6^Q3EDD#KTv@ozO;bv-bBHF_wX1 z+MydVnjnq1QlU%fCp-s~TQ9~Fic1a6c%KH&x!w85*nJ`*|@FbkL74ndC1wpd)-V|6-=8d%2>p^SHBoOZvw;1xa5lo@SaB;uF7TqLdB; zo}F&Zn`3;G$=!XD9~q(J@Mf*%e=RTnp)*GB*E+4gCtDTmM3p*CGRv)KvQ{~GOCJ+6 zn(W>Hb2zt_l0~o|9H2Xe1x6q-by2Z;hId=z+#Yes*+i|2!7VeYu zpS9ZWe8$<9b_5jxz)Xg4x2woI*4|{DFqsbHYlT$v6*Vq|DHI=jAAZ-_NC0dEme+ zz2dE*Yy}iy#7r{k$Dk=3Y~*GATrQd5%qB`ibehk5vSj4EjM@u~0F~4~8BpqPObfR& zE|SPOeU4F8P6e&+JI+CLWVuE`V9Ii`lKACCBZ6c?skAFsb@`-wD@QeyzAcz<(*aSSJHEHX26J62U~(#YBy1@TESRJf}LP)BWWj@+0i zPPhl@#{fpqh@1VToDAyvE(rhz2#GBkO;xSP+0M`+Oc~`@ zSDB%$p@J6O)~YB2U>X2@zU>9MGbT)}oBcoYPN;p< zxCA0el3*a}16A15U<(AXbz&`G*o!?4UAu>yz9CI!x=rdiDV2D@njz;OyWg_?T}Y)h zbdw}|?>_dCI-GR7OG~_bD|*+bNed=;1kg4jCmuONhUXhlpcK#^Qn|AZ&8<8}TAXz~ zA|v<1j2BmS>E)VCD+GoTUum`S3|aX3a)iK9`smEkcq}mFVjomP#4OoJ)sww(Wzx+Z zz1@98E}gXq<2h&tU{Zc`bAe*lj4Z$+6zR zmc)QMDD)tJ*!)GtD!X9q#`))h>@w=h)A!HQM3M@|yA5rroBgqb2cPEO$4Vbu`CKR` zx0B~ye75fw9Pn_kzFlmvSvF1W`#%f@McE&cIYOn(O<6yFWcX5DT2qtaOGRyoeIQc) zP)2C7MHE)dIp#HSL$fW&aF1!wMu-&k{ocVvgL~_rp`N6qryuD+zPb~j?|1u92br;w zVa$LB)69PdeXLZ|CKu95)wfFy|8-?VlJm@899BG7)tq%aHsV@1pZ&OAf zi8TC^&6}wXEPk;Z+H_83L;>>NPwhMd9W?M19^XH|8ILj%rTC%@=z=_6RnsP3K+_}v zyiX?FFicqpsn?IVbRT<@BZ2BKQg|s%Kmz>S*_cHas1Wneq-5W%lsZ=Tv908zu9|#u zyTfp^rjdT{EuWF7ei^gT?xW!+oTE8S?H0d|0r!@qbJF}(es5+REuYRS(2kQiuSs{k z#&hY0^}V@AF!G&>^AN09pW34Yso2Hv>`4il+I^*`r%xn6hQ?)=4XUyC^?vXVbBg1S zl~^7>KV6uxJACNn`U9{84)iL{^BJ)-JMd+d4>GC3iVzgdusPv)8@n{*05a4(CVM=@ ztswQEQGlhj!}M+9DI=&~kY!*^c?r+ka$R;w=2MyT1rN)l<=LBDOaYmY=FK(jxo95a zrijxClU3=<(Q0=Od@=S_BCunb6PO%iB*rf2FuTM$*27qyJ&3<@kZIWD|NMfzYa9#= z`oD>2isxE>#sa}78$i%y!I5lcV$Aklforu7GnrpL2xVdfNIZU`sspGk9hn*D9@)+dU@mapCj!WS0m>Q zYxj&MOQJb}YHM6#-yE;r{vqz>-d@0&m_YXCxR7Mj7b7k$-#FG%(!g5e)QPpd=W|h# zN84WU8y-Z>Z@L@@;RW;iQ?R^mrm31__`^Kt7WS>)=Un3(+M0~kTba;E>3fwRjNTY) zt&Y*py6$vGs&OOa)Vruj{)dy=npM*842G?Hk&S@RP|`2iXM0`WbOTE{F7|ghRmS8&9n6beqme{husR(M&Y=w*SXW1sTEX3 z3Kc9KWmKU+sB6~)Tpuu&oPtnW#=RHmB02ZKFB32s4;N$MXm@TlkS^M^Bt7aN#FgSz z_hQG1`Eiaoe3_F;Ij{9X#3{CCPEkHb#ci-qgw!vzDFNy)umT%~r! zz8VD7wMS8J>|CA09*gQYc*t{3Bwrf#NJJOiyD6tRC5=d$?U{Rb9Brd;S`Y*=O zyilN7(~AlxRRk^$jJ$Dxfe6pMV7B;vfrBN?{h{ToW*mpt((zah#e|y%I+ejl0PNy9 zVL^*k>0^CXhJK6mWbHSwd8P_F6oAPz7T0tgwLTgJxGc92OZtsg_Y{lBk6v_wK09gf zV(L715(N^TVs>Pu7w;KRCBnCtJb2t z5O~jOlea1LV5sHd87(2$MnYypIukTv41gT49P*?b^A%2y!zcAYqw?EfDG_(M3}Du^ zk=eO7CqI5**aP$LwiSOWOtRFUeU4dKDrw&NWFp&?G`hZ&Z}+y?u2CbC3fqzPT>We^ zY55Xi(H`Cmfen-X3l6Lslx)((q&Peap7midPD;$@{u6hCY|M64 z)?gK0&XT>obLy3%tyy|ys9@S)@QVoxH8q0q5ChmqAs;mr5NKI`Y?TYr2p=L$(&a^j zIyHlx&LN7X z_HqCATsWIw5#j=lRRhgv&xfa zl#&2X7Wlz-IArJQC&+d^-r^B!NG*;qH4=aXm)e(Gft{n4S%#2*!qw%&F40v&7(C|M z?bqj4mK=(&=I%9(sz1)z9_PC-q*$z2go--pQEuwR!j3q3O_S5mF7pmFbgB6jMDQ9m zdXx&Xk}ra6@&PJL9ITYaNQ`N+gqz<Ki3G7cty;g}mu>~2f7ewyNPCO-Z39OR*9 z@xQ50OC?}e2|O9udm`m7ZWogTZV4Q(J`J;_Y|;S;73MvA#-7}miXcyzWC)((Q$>i0 z0tKMRRN1tvMSFH*`bW=~+Tcc$O{$p94BRI&hVsArKZOdcVnDLS6+5^!$7@@6*tjn$ z4EXeG04AEAqBtLxl!6cr#3uV2ri33?y~n#K35m-4n*qecaVm-hl{QT<5@F~k9dAIG zzL1=~vSAwkJkf&B@ADFZ6H#Z3lX;prD|#KnXAICgkN$j5YNv;jsN--uk$YnD)T+JB z0Ztgx2|_owb`heesg?uPZB>@z0fOFPHTKp!J(|w!sMfv- z!ja8ESjzv*qOXJQb81&PZ;RmCRSiyxsjwqXSdok|3^L!Hm7WkhUavJF71}gNwzG@Z z)MUdcIkh)`abUH0eAbAxS?e}OB*txCHdQ^c`F-~O&&1!=>Y;3&3j33`&2jHt+B}?S2gxZ;Nm)dwt)ferqE)|XJhu)dpU8V@^478Aai!Q&L? zCN;VI8^Sb_it)<0iW0|hi9Wok-4v4(vRqBV^(9=S-jWE6{RK;;0mGEsFj1iSCQckN zYCBs9YsDcBx8Mna&;CYfcQ6-JXaZ>^oXK~2oA@2MLnj%YNjU(W)LaelST+E*g zTagI9=y^V(d?K~r=?3=={|g zFGrtUf}yTDWO*EU6O0mA@Ov(4mO89C6~g^!8{B~Ne8x0cLN6O@Te+hi93FLz^Bj|Jix z!h;9MTSd|Ry_tNWysClU zm{z&v4)Tb5NcjJ~P@gs-{``LCek>Q%?C=ONSCdDq@XoXsB3Idy=Akh^!pf~RfC&t4 z?`Aj@8RQbXjN)sAYHl?kG%5Zy0Z&h4x}Gx{;a{pmmfOsVbx+O0ZDV#;{s_O|1dVzG zdU5t7yD^I9so?lic5*c?^)|0se%huA`96^NxlwK!uXT$Qy=qwFlx2RB2Fi?*VX;m( zx;>^#?q#h{lvE}_T_>o*U`O_O)4RQ+FA1H|?5)2igM#LI1U2ECc1w-xJzDPAck?Ym zu{ll38Vs0Mc=;GvZ@E54L&5Py%$X=OBXer>Lp0v8iy$;;Bej62(5W#5t8 zQ#Cu0bvT6ms9>D+2`H6*_3(jhw3Jov4>e(krBg#1>J#f=Z8UpBnmpfP>8}y_z}+hH z=Sgm}7)}!~Ok^cX%H{F7odPpSXcpJ?)+qXWQm)fnaUyWiZ=AEH_9K+iPhHAV+*A@7 zQ53{u`;a0z9|h#3`k<~}v`NJj#iw1G6Y~9b)6xXy?lAK5;h=5KHHmsMHzC@2IzE;o z`U3FlN9E7Re_PEI_Kc!|l5qjg%8N-wo5Ozc{RZpf>PiRG0C4mtdzw`7CqrpG9@RvF z!Ax*0B-)9U6EXhqN>ZV!849W{@M0gI+=c@Lg61sVAS8-S zqCh+^-vL5w0genv&$cW)b1dFGpeZZrwcmxVz3lO%{VmNg=-*GiVD2`e*H@%^BsZ`W zMq$mBBH}Vl;aZ&dQrB^684ExoB+i~rBROo4AOBLIlojuNSW~1`Wm!X6`MP(xAbg3c z9bhDr1Zmdh$RM^R5{4L4LLET;=;x1__~6U=SasgL4@3Os6m%bd59d4$u!aMc#;sNC zNpVnq6)MQoWRK(h^jb6=l=9+OX4Q$87OovdjlK!s#W^y-A`7*fWDz~U&v93Gp7x1D z;(L$=w3=8O7n_nb)2QxHI!p%V9}mF62h&;P5gho^h+goyLoY?V*r{LUA&+fHa~eqA zZ=lk^nkA3cHXejk?uewWX87E>D{rr!tZ#pN^=cDj7VY^|cLJeoU@qK47)r&{QOxho zS;HqDtma+t{5PxfU7~w79(g0INj03js`b@50Ld(G*X;55W|wGb7dI|ZA<_^7*l502YsMw%2)0$j;t5uXAd1b zOtbI*B30Tkt7=aBpH9IdhqL%(SDNVmKAfox)7D+XG$*pYl(b*l9z z0;ymK4nP;uC&em=EM~lo&Hb%8tBR9l0d;>YeUFN2lKM*uygDusm&c$qzsiIkYLnqg zVgR8Nz^kxNMo#(wvpAcJxe*PMkIE^x;jigP6LGyA`KV zgi)KxK0*zC%)wDdgy-+8qMffXjuWbGpOUgrcD^Kd-5lpMVIuEJB5 zF2Q^h>OuxYKl(Y9f zkxP}HmbiG8f5QW<9LMY;g;vB=pDM^Vn~h%2YpChkHB&2PAVXJVg~fROV}c*y7T9g{ z>Z5USAtL>h6Eyv6#0CSI!8xX>V%rf*=U-2 zemcCQPDu5MtN!7dA*Gorxe5n=Cf78;&h9a9#i?z-d5g7Br3kam%?uGY5BP##>de!^ zc9WNPRiJ>JPAj;$HqkOT*vZuHNhR zJ*mAf_`n_Jfk+vIX>1wmB*cZp~W+Lv%2;R9picQPnk$Ush63NKs!Fu6pM}X9w9g-RR zF%>wXy%Y0QI8n0+nb(6_G!`zu+zhyaFCTkb172B9DWhCtZ;u{o@MyJ8=mS>WR&rD# z4P)?}a(T5FCziDo(xizBghft;R-aB2tLHmbXVu^2{tX*kDVU^55$I)z(TZ9Zm68|{6{Bs0<)>{vF24swYf>* zlirET8i0Uu7v-8EJf-yWQ2x&zPJJE3!8xjG7belKj_+;ikJuC2nlL97m*yhLUL$?jhB?R)9M5v>mpjMS4TqwT?#2eO0YDqQ846)uj$! zew>b(KkloR^W*K6^nBmek;N0j&wfn^o>U%L4nNYc1rWu)_Mw zgX~C|_L--pCt}(GWGUzzGpBDHZa(K@Eb0$w`Tef^kvI()!F<~^1U50C-U82v$NUye zT~5w>;G=UbK`v)25W5$LF~jN@NW-%+Gwg;PQG;`oS(lUhTRj#1cZXUWfQG9w!e?qB z8I{`vZoMW{-J1gZ-vGwHx8LExWv}ocS#GTghdr5-G@ZqG&Tsq!1v*cJU7fuY3f-*c z#Jb=*D2vi>lMeLXh+IgfE7nE!%Eu(1SGgwp@$e8w#YltrewhIVU!)#>mU%0pjw-y` zK`cr3Q7ny$$K9DXv4xlU-5j^QZ$@gJ82OmVNGq2r`Pm7aq=p#t$%PnEi zC+ z=C!>f4_&#h=`W#wV^CZ>Yt6z`_m%9=ft(=6XEz2r8IvyH!8Eq&`F|ZR{jwD?UtZRG z&pdw4I$G?U@cPchvz0lo+@eCXLtoT`4C(k92g{Pqh>X96;a8UJJNpyaTsPEU)%L?L z*iEy4H#2@$x@mO&5pq76b;jVkGGR-zQ!BtKE^jt_kMfKu6oh+Y9rNYfYk%0~4{)qs6>X49@HRzJe zZ`9cHBFNWK@~`zPvq3Ns4i#P#T-!AL$)~Ql_h_QWhv%+W9W1j^czw=wMeE%6LGLvK zN*?R(@!;o;BbJs@G`O6Nyz8OSRAtMAd*>%eJ?y$2auC-gb^No2d#ej_k?CjU<+)^? z=1%|6WKI9pdGmW(eE4ePlR7b}5|Y9XqX!>)_hNNdPM2{s>M^em+k<(IHh*4CeO`zi zIvOSAt=gN$(ktpEv3AL+>P=(u(S>0%P?>CLLx=$0@V=F9*3s3aWPA=9A4pIa zPgxf4ZK4T9>taiwrXq40qAPI@gC3*_ep8zd`>L9i|Y@KtVhcc(h)pj*;jb%Pk&C+1wd0Bl2`sWf<0#4tvaAV>A( zt0Uxe%vul(3&mG<^Ubv0p#;3A{czqZqb`Fjf?_1URtr&q3z%?xu9v*>)6T9_+nFcp z;qtTaU*nm2v4LbSkN=_&OaA}a)^`)kmWgbeWU^qn#6z77qI2v`9<>9xq0Ah$Tir&V z9afvlN3)+0Tvp^!?!&hb<~OeChtCk4Yjo}{biK$Qf^};+IV#$O^};tV&W(FyyW{5Ja~XR6BgiTl~NDLsjc^OyA{*-iLYm8fr{3 zmo{Fv=^fQM_xG=~-&pREbKU3<=HC5epZVz;Ex~GgF%kIRU-j6~!RKd)?ngeKDgQEe z#`kf<8~XtNXEzGi4gtzLmF`c>q1b;HNRefYnc+?yZNEZ1c7H^ysT#ndw)#%va^>6x z7p?3~OSZ+le`(C-8|}#CNvr){e_)9!A6!gTDN8y##y7@U_cR_X7;$(WysoT%h+UM<3iNd147HqV$ zN>S!*^K*T-4^Nj4K_BgWOpCCBMdPzn=tfS^t~9R!@}7m)eVE*!$y<((b?2@cd2b*E z+4*VL|JLEdKls33XtHB!Jx+_3YF*d1lNIS3vMGf3IhliGEC&l&sI#)ptoC!)k&ASg?ZeLvt&CR^YuJj(x7VkiWK<5-;tz_`;mt znAQq%hA-6o;Kfh~xQ%$evjO%dq!O{7`IUUT@>d4^CQC z^2&wWSy^i6l#O8|){X)I9e}1cY?Q3~al22qGqgTyBN-haHraV38 z@PzC?U(MiofTRHIpnA0UR0v#x1%ibg2Jce5!BGO`2S9EM#^Qw)x(U>bs`5m#8f)5O z$Ug8+=$u7`^uk$g#6Uxc0>k5vgBa)(Jo&hxmB5FTw`!D<#OkGqj?)5*zsr*GG zG{~=TxpTM=V53;nNL*50L$UUmJ2sA1CPQYwpby)sKRFrsn059Ym+AWP_FK|fDsV+MUDv^4FYjfnXV3{#t=d7U z-}B}H3%4$Iy|{NbxH&cW4=yAKB`?OdM;dmLE>C8A&ME}8^B)XkHF{IOf!2FGT#;7o zIDfTEr^;_O!Bo4#O60cgTiI?jpGQ%k#KIDsW0f6)Za~!rW4hEfeQqc3nJc^X0la3z z91E2{N*!NHlg@c@eq}Ea@Ly+s_W!0Ivo99Tb-0^jP6eBzFPyp?RYDs|<$>woa+}J` z>1gA_)03P1s^(AB%B|WlWooJ2KIbEMnm-z5qD5hFrpgnmG>Ym0IHi^F?53HqtaHi> zSB|I&+LtqJubE|vK+j{lw5#VDZ#i_;I4LoRwUA4h{V^A_-#iHWaQ-jXoV`c)`K|6t ze$_&+tWb5It$Kd>ETyVpuYAUbZS@V^TMV`oETcWo6>gh<`x<9gakIA)k)|I-bnY84FhGc=an5)~@X|&WD0zS*xLDwry40wMiZqPs&`eqq8HKvZ`%y zMyW9xk$MYp0xvoK9ld2jZldK*ew?Ue&7n!}mJx?jC<~$L34N8)q|y}0$t+iW-#wP~ zsb1|tR(fw5$w*$DHzy9FljB`^rI(3axR`q?(l3*JEqj&Et&@t(vA>n+FJH9tYAwOf z`-37O?!Y%z85N~(q$&{OVhJd-GkxcF&PO0t<+R`D0kXKxjxpFR5SK!T%d@H~F3NYS zQS|({U7>-^H{yIv&5c%KP5++Y>y{*Om?aL*JZvDs$s;ZASk{`h)3!6K2 zKP)tNQDW(>Ek%1^ktrU@>)O-L@cXe^G%s+v+E_1yf9&k1 zSVUVZ%zrQ2RLFAA_eqJ{qa$5+*$fH@&)`sjaXk{s4d0n7S?2Q5jCX6*H0|>C;(kae zjmO_=u^Z-4uX3b!Ku>NLz+O?afC_$E8m(HQFRvv;my@s6Yr`0m*4_DlQfRGBZ1Tj7Salz9rM{^~uad<=Xa$_#8SE1*yY``ld9 zouq5*VB-C$AH2UxGsBp7w3+RXnG|3rs5s%ab+?cRd*!`KEf3!^#Ja@I9A`Vo0!mNhWf zR@sNusX1!qUYNtdR=GZ#M$WFix<$<%5()M)F~=DJ_`H04e+e_a%I6;FTH zb%Fg|V6R=ySHtSXA=9@JKPOwvYHjDmg&SgjeJ_~!?z4Bw82}q$QQ0;XE)mOXMX@1$oVrcPAF5Am-luvlRG(|{N zLfe~bEfB|9|H@BU;(Add;{_LB{S>f2`j5A0)Vs<8O@~LhZ^fA)vUYUSoS!RPpup% z-DWM@#;Ud=xU}nI2N30Y?<`$%2h1R04~KPgRlAdnkaB*?z3As57v1iO!e>nQuOCSv zl@=nm$)B=FtP!s3KT`T3Q-3o^nU#eK>L%OB93}F#f7=9-u4Jq#>RN=F5uOo4GJG%b z_uC}T^WdFI$f?2tE$f@LX_{qqPw%Tb9C#gi4o1hR7(LV6u$(s?XV)rZ_O|_fo?%k@ zaOcH)&}OQTTT}lSpWBDtA1}FmvylTl)<=TI8gjf#ll?zczgbFr@Jd-d@R3!2-{^rH zLY<Up$o{8nE~(`s&UBfO9sq6BUJ<9>|?SY(hG24O#coZaR{XS&eg{9@Vx>&3>2d4+pg6=U#Uc|eZew%F{)0uFG^VKVRc7VWY~dR=PL{2U@lMrZ+60ReevM@hRpgz!b9^1j z?XDh;3%1Nva(pIMsQnQ_m@MYIw6CnYU1eM?{Nlhk)urCeTv$8*@0v=2ym^$|yWRWN zx9v)J|8+~+bZ(lOJ2xKwcM+-n&QrMmub@rJ47rz2@<@19m)6Ip3HtZDQ=F~O`l?7C zTzCD`vNqRrwCClux#_^O&kmH1NZtwiabNzwOdnq{Rxe^WM!*vBYcNcISV8=ve-bE&FQi2H8N(yv>QB7(5<*MkREGs_l zp)sg$j@$xtb+P5c&9=DeA!r99sX)sF`=?N=T`$&$v&09Qfy3qVtrTx@;E_2RBh&Yd zHMH%LN&Qa!fb%txuMG3sLYGnCDiUtJylRGSRh}(XVm^p+ea6rkBd`a(YA%gdBF1X!u%9jE zXSVw(^)s6M7C7KaOl|u^m%|&ha>1*)j52~;PRqpD@;5SbaQt&`y^z&8+|0Y4uN{lu z#zHF26)80}58uKrHy>7#`(V7KqoV#W?xS+^Bih32+D0HURE;k2yy6AlNdK3xft{B} zwnpFl{r9~>tiZjAQNCaHf;@b9XFyjj+n}*l(R$%rXMT!%sWUgR45g$kR*!fJW&e2U zGr!WS_5A3`?H}dDe<@=m`ImQaBQWWZwkZquk7&Z!yn_PR{)mVAEa3-sefExL3c@t< z-ni^M^gjE|&MVE9(s-e|y~X5bQ;68(&uL!Qw<=m*=KIKKA%gV#uSp{jN*#=#@%%A8 zM{WXI`H`NIMw&y&2h`;0-;F$YnvamBHd87nZ|#^CA@!uH#v@Ft)cS*NtG{22a}PG> zl9k`R+wu^O-nLci+Vvdm$Zd+b-uPbZLP}pTcC>UuIcDErhfnhE8`G@HOR73WD&G*l z1;x*d?^n9k&^8Fz>&J%YE{@!HDgk;55Yg|A`C_zL)EubSjYo86@JC2Z`aa)vK2av@ z&T$N)YeFrnQmC7BT(VFI9<-8n{Zeh5o3e0F+DpKtKO{R5 zn{lM{3n%1PjYUW88dF@`CFAZ_Pw6Kub5(OHnkYky#Q&1L9fL%xR*U;$*=aH!BVi>P z)~IyLy`_m9{y4O_SX(5`t1lL7oG@e2vNYiItZ?71Q^VKVn&f>MA81!@k*;E`*5+pu z+v;5zE|q4f{c(b>V;T^byme+G{^5aXd|>tM3K%(2e>`ZGXzzPMO;6*cMzuzGVDc}w z9w8a`dk-Z}@9LriiT$4%Vt~ED#K)REqZ4wg=_Lqn{pQ>&X&t85YwP5|~g4gMM zZtKXdPA#J@rS^k+HmAPFi^HHHO2e;PL(JJW?AFxJ!)w#G_M}jI&-0qYJFTz2GwIz` zFwb+?uL?Q&>M>H-VSm;rT5Uk2R#I~A;JN9Q*muHL*kZPivdds>8~uM=uW}ZD3;%kS z+un2nJ{osn4X=qLF;c2=LeetUX7*;p06UVUgYR&)N`a({xF z$?{#pPCePvM9JJT28;)vIVb|F-u41-Va#2KRg(C0&E1P4QbwJN{dO6hVXh~@H3C5e zu$nY)Gc4RWvc#)pKD_VZWcp=09$_JY@{D72csX*_gY-niL?~#5Piz+=qOT(6_k^zG zY+~hw4>l|m>TpedM?!7-OkS6s3P-E9rDbA?ttI_TrO!iMo?iYc<%X(l8dWJ2wVe^G zNI5Y93wfqXe`+yjroB*D-D9z8s+wvDer>PV6@pj47Ft^bkiYY-4p7$SVos?`yAk(U!1EC~h(nm-#K zN6q-Oy}MdgZ-qVOw`GeB2#MbuMjb&sfC&@Jx<9vXI%ufZf(kuRV{KwOZIHSCHzKFB z7qdro3p@@Jmu>~`RW(2i^rtVrJN72#SlPM{*!LLBU{n6gh1;awwp2UScXBx@8_(!` z$3CVU*!kVvsQA=H{5*T<;V=0&tI6N|?*=ItncmF`tuEUg=6gLLn~B%|n)e7#z9>zb3J{Uhf=3+0m0Zm<5-o4C{x2Chkw@#N zu~@YehbZ-DxT$0y5iO_FW->L;sR(zl)DB4VF{M?SDTPq&{vTcE{Ydry{{OQaj(HBp z9vz&+v5qY?92|S^5wa3eA)D$Pd*;~6%wE}K)$5SGvI?ch3aPA?vnrOn1vN~G#o+!VwfZZqmj#{np)y)YJoxC5>6;1bQ>qBibU`W37F(iiSrs{^}vh%AY@SHw?B+u`31Cl&Zu^ z1^YQ^^Ugo+ia%C&4XqwWxTQRe0Y4g%eBEtZ6eQV znFWrO-FTfZ%wbI%lDNbNP`mY)cdu8kzI+INBTy5T`aHLtXW~QKeAV!W|=?{p7-;kt#C9){(OT^4IXSI5TEk7e$2mcsqUwyFUG(%zITd<^sRkJ^t^U}UYL+0A3H^daCtC&I= z<&TNwN*%Y4Xyw1=?nw5?UIb|Kscsm{Fw@+W>>Y(z62v&-v++&+9($|cziO>;!RgW? zHgHwG)_XOLbG;NU4OK;~ZbuDoO(;ezBM#c9RI8Z*DO;D2e z)+!FN|4lb~&zSSIX`p9Mu!T7+;@K0v8igmdI45(1c7zE(KzsS^r3L37V%y1HXRJmz z$*P6u z5B+lc#YU!6>zHr}@~B<3?dQ>`Oj>H-INyPztfVhrcl~gUG_x#$rF?Slg&3Q1!00bq z5$VCLI)@slorjDPSn;#;*LG^(q|%U@qNsu*Nub-Y#gt8uXb$0*Q1Apj)p|CHx$bm4 zs4hjFGJ5^EYza`{Y$4MUYW~H(rXl3Mz|WzAse=%Z|2y7QhRx9JhZrY;9X8aX;DB=BNLw{$)_i)+vcv z=&k$uZqv%|Z;IU9M>9=^gQtxlALve=yv=nRKCX9MdGTYR`t{@RZOsbNx0>Ctj0FY% zHn7cnXtzk`?DCSUKc;!KC07Xeq=i9bx@DZCTqR9#8O_}>gYTFQZKM7(14BGlAEPXV z29aMbXq37R*?wlc`zcj<5&Z6qI1Esp+NZxWSIWGcP-~1a;@qk)MSFL)Ze4lCuI{_Q z27UQ?z!363@KL*R40t&J7+RB?X8C3N(~i`o#n0%X-Sr>LsKeQ+q&3kA|1-&Z^!7l-*sp*oF)3-%iYzx zwYPJIs51&-St-lx7k%(Q(l<#=1mu`TMo^%p z4D(r=HHMiWg2KUk12iRB&cK2}DgWmAG_BI+uB+h)fom3^9-;tlT8>hh!YAj-gc~#N zN|NWv9Juf>IsCVqx$@aTj5&9qxCN7b$c!cvD7QQrn(KUE#)U}hpU9aeup6cU)!Abd z>SAG4k`>Gw8*UR2wN17SPHzu2M|;&_Hgl~YGHuEys!8Z89A*O7s;)C{i;oSc01RxJL5kPwF3T z!@9GzRK;;8|3{MFinvB|YRc3kJvml((Py=3_Li>*TVY4ilj= zZ;!M~s^g>@o9q-QOe*s>>oDwogu;gsdikB(`Q_3CLxTZnsmYfErM*bmtV5}0%En9n zQHJgnYsucyt_dSR^|^zQ)NPpxWj;-GR=A)i+Eojd0 zrr?hb)78r#rZg_DNK1BP-wtVEiQqZ9uDp?|{HjuN<)HN;Zt@P!a^(Je)37@gsW1x; zzS1`9-^(A|3y4$zwWut#D$mnhe=Ohjq)a62t$#h!uMgf-D=1iW2NCkg$__O9QJIND z-}=>MUykj2BSJql!p=RwvZATyiqofo`>+Z4hw+b=BJ{1nuX;3Yy*ldK5vGy;pWiy! z)eMc=`msbW#`H4P}$s2mMehfD6sKr2Q-0Y;>?3tcWg!@ zY>SeeVHVI`L!pMWFqxNr_bZ8{&FpH`neaZESJozlzWP@ZkWyq4v zh+e+;$sm@+!B@@KpnAyVdVlo4#R>aoNlSO4e;5Yr6Y7Fu6@nNJYvhey91RDZyhdEt z3%8;h5MwTos1^Mr)_}IAEzoZsh;;6FdtlrK!uqpmZ`)J#5_T$G{&`A$>dzSWPCdM5FStO_+LM^p5QZuisZDD?_61J?ptw_bL!+10moy8nOZTY`qXZSU5 z#U(jNkyG|e6i5Kf9huP!wi8ph>hRXnJkL1XPJy_Yqx&_AH`%MjONo|CbT%Qx2|5<+v2Ey8 z`R4pMh7YRS`5I@X$&%9xfo}=^5t%n-7HM6DSLI-Rj6lofRacdUmFeVY595=cqGzeJ z>%@KAfr)3NSOc*_WH8~W$v{QKEnK(ikP(i0vMgSV8Fom57BtLAN+hr&0oby{Ba@PD zxl)oOv(g~3YJhB%Q5E&`admNbR93Zkw0U-&xXRcVMWauZ<5LQC(EAzIf{<~$b9FP? z1Xunf`P%@KR6VXGVjq+&G?A%(wvjnMU$ISDxKF~T|SsI*ZXjD`NrR%q|vMXGJ%vE|FQg%@@AvmAy$p@ zUbIgK9?^P4PHL&DO1MBa;6upj*N)Cr$_p8a1>RB<#mQXAv{Kgo%m??wI=$ZN)x67Ctd5MCN&zVlj=P~U_qsAJv~j(M^Ps$Ah_dT zKnd+n|1s!*n*&dL9eg3Z?}PA$j9e%BvaBIpN31aEQ%NFd>}=`cRM2-5@xR9)Ffr{; zcPR=uLx@-NGcZMV*Tk{-nWs4Ii`?(1zi=KgBAy{be8@2$1LX~AC8afl?Q$$JgndfB zrOy_>zI2UgdKfs|^{Y zNmAj}*EkZn|3BN(zjE#7QcZPgzH^;*5^oy-X#SXXkr~kN;7Nn6jJ9lO7!4~ia8yl} zkHuiAHjblk_rWC2i(U)fndKOx+Vk+E%?2;MSdfK?=Wz3mb`nx{@?;l*2D@G2m1FVs zU(+P%@CqqcHi!%th{*)^`516on-?4YJjI4Qqqs=GSow9~x85ea>WWbIs?B@4AN}Gu2Re_vUM^ z(1^@;-6uW^iE+I5Yo$3&s-myN=>FYM_AGrKkUn{unf)vn}TNn;TE#oP3B<}hIKjx7=# zo;FA1%783^aQfL+kC^mRHBHqVy${S}`iMu2iN&d!DR@DG#0~7zrO+puaAz$5P*mnu zri4@Fk%t<$H-+-}hCZ1f9EUzk7YYwzNXC}+%`t;TwIpt2kGANOt#g8wZ(x8lJJ;j( z+tvm+YO1R?ubV!6Sh<&$y}4L?rd?f`a=UeatF*BhRKo8Jn|+L9>?y=2g=bFGH+fMd zM;~)WWzr%s)+l&UFIsH;qWA7*DpM&}Z(PnjI)EXvEX)!n%N#TckBXl0dFKB1=+uC& z+Zts^M+*_cU}(HZGRb@EsKIbL`&gpp{+!z`z{30Vt481EfJ9qa{;k_c3%rP2QS?sF z1fXo6<_Th^#ajAv&tq&cBnImgt}ZNT#{`Ae~Q@Bi?tHg{0y>`xGSbM647C`+aM8ex;FN^lqb z4w5c{Xl7G1f=9lpt^~h-(ZSZ6N>)O1{(kYCjmiJx!Nl$(Igo6hfA((-mT;9=d3*j! z_m_JYO$Sz}Q3@0g=+D>S&!HDzWVo+I*X!YM&g?pyKL)smKp7)KY9EB=o%@yXYXxd6 zebgzr3Gz~bOp(KQf7k~Mf7sdaj-v4|z#`3p3Fjn}uY51Q+tfN|kSFDz3sYUyK{j>0 z9hkAZ81d#d_qWK^{+&g&k8x=}d0mjGJuf1zkO>(*TIxPG+yFc?Lpq~0H)(KFC!pqo zpj)M@O1~(NVaBe`azy4{x#od1W-nfW$5rZf{WxY~EaQpmMoP${R@IhfP;uf@=5lh1 z*^XOSbFxSS-hx85K{2}>Kw%>AZcc^Nxa$ia7&|T!9rH7|4fjE^N)%n2t`@O6{09AF zdf47jba)!aJ4Q7-Qmu&$_fic&rMX{CQN$pL$rZq_Y!1y*TFao0#sSZ4HNga;Q`r6h z&kG*9xGB@L-vhcYd7{${gK((-|7IQdj9=e>tvQCegLT4^9WY*#AbrnfKkFFlVFj)g z{h3U8o6;xpa>E&=luT+oi&K}sYh@ln+_vwxndtZU2AQG2%W)^|n;jC>!oN7I@9#*Cl&z|crHwq`xM~`h7 zk(dVoVA3N>3Y7hfV_2h)#-lCwn=&X?MBj1Sc24zl>#%DgZ@AyLWnFwINg< zd$UEXQn1 zAH*;v(m#O2QlRT!U5;BHPi&X=bM1b)c^r}bmCGFXbI2WVAnJBTv?G&Pl7TdQ55jTV zKbG-~3~W?gN8Ag5gv+3~zKUwHg6#&1?u!O;j_Pn(Sf)7k`Lf=V!()2vnfRCRVDGa8 z$+t^HX96C1CsG8~cu_q;+4wHl{~D(GFx_bo#=msnG4j8J(o{MgeScI@43+(yKlh+i zTOIb;rVj1rUWsRpPxJNf&)17%lyUGyNit$RP*z+5HE{Rwcs6It25$>?uvMMvgD9Ud zo=z;7;2ieYA2X3l@R)-gq?d_5;kdiKuYXd4VZqZ!-LtfD>u;3tfReEd4LYe+LCXH_ zlbHi9B9YDjF2C6Z~0 zV_&V5&3l(j4)q>X-8X=XE1l&zlYA9r(p)W)RpuQ+b{?EvY5U@|axTVLDxB|5%bba2 z@pW~}AFq{aKGdZ|b21e^mNPF^(o>FG$rRNqI1i=FJ1`!@#B{ndWXf;#hF}bht$l1buDNNFkf6%sBmhA z;kwSs>6~GIT-N~&XWC3M1WdWh^)E2UQY0Uvwt)^%TG24!f>;(KmXj<;OuEVp*I|CD zKU!dclTm|5E#0W*1=r-eCquU~j?L(6i0GN zBxBuQcCp{hfvnBMLTo_ESXx?j0*5}M-ZPPIIp>%F<+!{Xs-_0{KEakoZA_}onG6@m zfnE2K0;m9PqFm)09T2*U1z^w+ES6ng8L2)h4l9X{HoPowRq|Jipheg1%5m3d7YZ=s)@!c+0(y}`SQo%e zUFv;C=?Rfa7OH0qFN=|6+0^c(ZHkdAU)*UBZ&cuilZsJHQ7uVRnlw9Ybo1$JjKuZ1 zJBBjAc6BX-@}DQ46^nhVy*`2_q^R7UGZwa@vEM2UAbcwMC3dPapOG1u7Iaga!U zINb;gGo`eq$72qpcZ+H@YD_e`AJ)V~mb<%Bq6LBh+d1$jc9G{vlVYv*Msa{l_<Lo zQ5NRX0TeA|XJ@8;m~aX9u{%4@=wPq%1f2iJj<1WV=lrNJw?U#W(9I zt_^g#nPJcD(O(!MV?G(3Z^;y62F;U>2v&v*asMl&LW|?7$`SixpfL7|W45Q7UOATy zDy(ZQ0nnjLSmq$3lZkcVh z4JkP$Hz@UJ)u>rf;@bJ=L_62w5||{H}F`-r{9qXks@zvOU-&Ld>d|Tmt{h{$P<--Ac zoQ1pYv91jHWk6M`&G(@k8?BVvl`9xX-;s@F=8O^}>?*{zh^woDFrhJcpKHN@5f`@T zQ+#lf5e$}wqi!xWug_!XB2-t+Cc=N@h>I>*rbtEnpO~+Z7mfn=X9U4g1v|x`__500 zTeRpS{9)4&7!-k{BcxGe@=KOAV{{8|SA_vRouz?Lw{`P`^8e9OG!Q&;a5OsTFdgVr zr;JDPdGd&P5BJ-_uvBYv5-NJIm5H9#c~UNhj)zy{gXu+!6etL-Q$Uiqm%9~>k|@0v zlbefc_Jtr$e$rHN&v;z*X@+M#07Pj6rpt^8G2qs#NcjwsD07s$SrROK6MEIAT9O=g z`qQk7HgF;u+&WX#>w&x$u5HK=k*+RUWN#oBhQE`b-INL?o9_2)yR$1gPkuTa5vsmK zrj5qCw-CH|W4TVz&$m8zKL0jg+*KPb!mJ2&&V-Jls9;hL6{!ho!KM`UBf$02ffG)3 z_HJ=6|Hvsa)+UQErvi5-k4LW77idaz637#vu=CWQQIOhX(ERgET4t7Wa{$FsIExy| z$U_rl7C{MA<7Ob7$aZL4wYU# znL5JZ!!}H$b&!qf5R_E0+(xtAO}CFq%xhrA#~gS7OA*_F`3{QPf^?CSjQ{=iK|Rag zqsa{kdKRUI7AWHs8h+(KNH1Up6BKzFU%*KN_$*)Jh*F)Hs!qSDNNoVVz%FRty*WC? zoF}L_HF}M(yMCcx{k4}A-|52QWv{15r5zHzV=KMEK( zsLE;aC1#(Ga>yJ~&z|WDh;v`~ZM}FgU6bh294T1*@-U5Yp*g-+pQAYN(=(?7xjQ6= z!84idW+o`lVWMu34#XXiLPtP>8?1j zOJ4pjhMoy(KkD~XI~Fc@wE|LCR-KXqD&>1a;Q@p7dYp*)w7E~_q@_wWHe*vG7kF-Q zWQ{=TrU`fisj&y54YI^+7@cAFK53{2u?{p4=GUjvSeg$n4@_)nl;RWEW%xLRCm$9Q zrdt05S<8?wdz`3ub)s#f9lNhuj~``L+nHXuv7+z3cd_1X^`*_9%u1vDkXxBks?wAN zQ4IhS)X)xRFlbWrO;9eFC_k3P#Fu@mtM!%PfbVIyz67y)L_>wddOu0-Ra4%VDrm>4 z`_hOWAAr@kpm{vkRz8LO$M|zB_}=z`5-KXhJI2szSZS~0%VP87?PTg6$Ws0Fo~=)> z@#FV$#%^nekG>y$PyB;>6kne(TKr-+A@LuW(WUgvgQ7`sE023H^hRaDpGs#=6OTt( z_Q#=lh`IOY<;@=jxA$*dk6aOk41%BpxREsflMyR!=Fxcb#4NYGYbawIO23BN*@g)e z4yj!?y{z-go?EVXgDXu$HwYFL;nX#uaVovGp}{18KtuG-vfRRPFI6dkzU*ULOb$eA z1p`~!EVY{?u4{AKI)=kxoCI?M0_w->nYVeHp%CcIEO*0@?n*d9CC^C*&pj8c87(Ag zEkZ8T7YQfFGYDpgkY}e574gNOi=0m_2#4&7Nh+d-bR-Csk}3ejmQrd8eDg{1^he`g zG!TTDo8+hQzP`0XhQBfmrg+9DYv?P8sE}@d#*{4d(VAQ`f%%lhK#bn-Q9e! zbo0D`JqA96>xNjaF`bx3)(2fP%+n0|5TeEjSx8oI41d7aOzC%S?}frjtwk7Lz~A4h zZw6fJy^&EA&tEh=cGVWwvJc9k0Qerk0tSED(g?3D#{B3`_?gGETurFcehHsf4<#Sn zAYl%=TKIlwOk7G%4}u3+4C3^#6poHhhJN3>u6dbbVfI;am9PCyQ6B(4g~qGx2x~y} zMNZ^l^@88~sC!-IRaighAOcU(kbvB#@VRMIjAQU~LZs?B9l)~6d+WarErWS*RKf=d zG;yFXP6%Z+|)W-KAhVWs&|p^NY83aA!>HS4!@;=1o@JC}!T@yP(gPI~O;tVUOfA3idq(~Vi$=qev)^d1C$ zpEzG;9|MZR>N7^!w%(}C+lXiQ5;66~+Wq=}4}nHo-b>}zN~Zlj1UlB947Wz+xcsdD z^VBrm0*QWr&{>Xa&FL%F?S3xeRsC$<_J=ny&di17PL@hnLFn`1#^LvTRsJ z&zg6Z$=Fo?Hr4v;-{;#?P3JO{b5L~1H&YDV6DKu~se~;DBl@({^&$uxr&N;Yl0zsUC zr#Y4+$iRYD1FSHFHh1W^qWi;TpC%rN9VAWr!qhDB)bERgTt#`k z7PZ;@4*$~}Tf=VGjU?cm%(W!(oI&&?0E)atLGVgD#^weMyesxYs9&nCnGCY8vd@D9 z4C%^JA-5q+iSLFqg81;bWH=4@(*h@>iRG=zds%(oU%od_AbzUY1)$p_owXUy?qQPe z31}Yl@9Ii@eb~r#>wpPl?kQu9Ks3j9Qz>8S>Z#afOwXY%mNLrsn*V#S9$_X9$WCvW zMSu_j21n6Zkmf$YkxQQLLfXb{y^9k5Bfa7U0{$I1JIFEM-i+~)#z&`ev-a=Py>%ed z#fFvu@RZLr(15D}W{37fuV%Ro68W#s5rb zCq3ee=1TEv8&RR>E5|}K>tfiKUN{gk+7iDC!V;&%*JxU&oVFXx&wKsFi@Rd|`ISpH zv&G3;t4dNRV@$6!za~^O&$RWM<15BrTA5)v&%Q`hG{>`T%=rPZE&g)eBX3jqH)@Re@8 z?$ItfjcR3JC-f7cPJ_5IIR$-bialH@H|OXVj;iD8;9TGUxW}d7p<|@NS%b%gWTarD zHux<7!=wLe&On1_YnxC1XGj9suR0OEnTKtA%or) z)uvt?V94*#q+7!f5qbvIBsXF;z#xwuO|iAd=$Z?getkFZtLtTt@%{RQ!Ud<+uhhCyZolq%ue<;Cz5LL^;5Dl$>^>)C zil;}FT8(tIzEg04%{G(p?)0Gdz;5EZ;h(ZXH6bNgM0#{zxE`lZyHMoiqTx4@A!B-v zJ$b?vtZ&PvE?f_a49VX!rtoJgzL9U+d`mFX-2fN44IsPaFgc09NbDR}QY#9hK(56l_ z8*TwXAp`pEPBpJRw@q>CL3*(c18oS8$j)C)@8GP%b1zAsrlV86y;0XH4G6@@fiNl! zrPbm`?$nV@&a5ES$%O{CPxT6Uv0+A= zpP$ilyJ$H_-WQw|z!nFEC1I)fwL2w+=j9ZR7lsBml0adnKF>eCJV>_%632vm)Se!g zy=3%+0}b+Fe;YyYo34$GF{TnVUaO#bJHQB?)|wq7@*Rz!)aM`D2d{1bFo{|fZg>3Y zPi+Qa++B0fFt;2F?k9|U-+d$UDdr?CBr~i>@+SOr| zr!Gi~*oz2H84CLcUzwc_ck!a8)o(o$TsC?li<25wcK{IjH3B*8tvHMlzRRh1uCVlg zNr$Mb$94AlEhnw1?7VPfYTWDlbuPKhV33IbDovgbApegHZ%*Khi1Fk?RX><3=YA$G4#YOJ#J}O`BlklK)l)9~*=lNZ0I^tnO=>6x z#9?(60AO!j0My?OGBDCxpY-e+)gA)l((Knc6J<4vr0_s1bjMCEnXow_T=4KKeq!uWom91SW z0!-vmv_*w}5Th$@)SE6t=8>4xI(JwJ)Rtq^L#jhPd zmOFi2`Wi%=yAcys5Y7uK6h7745LeqAeM{KGfB&945U)&qBH3YHxZMQjw=kJsdFG^8pvjPmf(>D+bhl@?}(Y#vG zAVey1h<4JRzGeb3&^X^qxY-(Tio)Jb#$`HJ9P#24Z%!83o|poSt!3(NQ<#cEKi)Nr)WrCaD9l z2zZErz1|bpb|T^D`l>;Wq_Cyqj)Z%3$|YHY7Y3ZwdbN29?#ycJ%ZMyzsEG3)e+lhs z^ZPFE?BCRlJmx7!y9I`*Vjz`VuoyDvgo&G2c4sc&I+GFl@->EBaN}glrPWXV!mw#od zFJboTT`|+@$H#wHF=mWCB41kh8*~Rsm^9){C>$8WVg@8Ncezt-#R!IE*4cK|49dlVPXL!5cG_(r2lU&X<= z(PmCkBq~q@eDr_X-dAzknz#Iosdn~K$>5&9miN1KJ(=)N zaYP{V#{wc$Su$xOV8fwHMv&5{}Oh z7a#&O^?J`@fO&IUyR?(TOHC|Ye(WvzmRVXnLRQqD{EFS_T$HFAwq5&~oboB83eAd0 zF0v|J_`^nXfX?KA(~~7@E7DZ*a;)`uFM1mJ(4+L}yT z-jSKA@!hX4>bsg)FrB$+q1k!mLfYg@z3;uZ@_5Sk6sPZ~biaKZuGHTz!h1Y%t$E;4 z(9fawbu@^gEP=pxC*0{C3xl8kn$El0%x;L%dtw`{@6mQ7c<(HR#Ym}AjY+8>*_taf zFUqLE?=7oK7c*9F!>oX+cw~zv!i+ZHW?L0<4&Tc6_y$uno%**ejz23O<@mUyh8H8V z-U$D~eN7dB#UgySa5{45Y>k*Hi`y?n|FQPHoXJ`<&=mR;hrmR5%H2d*G5E)V(x(em z-V5p+q@N0=wF6+_L8{pqSgH51cp16$A;hc?t_gw55hF}Hno8X$E{J2wJFV7yomBMy z2oq3Y74l>hV>H$L%&1>ZC)zL*OJdizaE(reDR^azR+s64kQ~2%C(sOs7NS?`{FV+x z2!>qBV&p8u=6|V@Fd`Z?>19T0f{+RRkjn9L+U{l+Qr^p?XrN5!Uv<{aAtU?RQ-5=I z2W0tF6{GPU88Cm@^k(#6gv3o7H_2tO137D=IPxmbBNO?MyAw}n+6-ZoB5C@e#V6Ya zMrGVvAjl|0xO7I=A(w9}pVL^i&7PE6?ao={S_3xE&WMnnoV8jrL|u9KK^EA@*x|9z$R0j!o!z{!7``Z3e@1A+wii=j8@jk{i!euDDPQ&7YtZ z=q(sFzB;V@I@lGI*y?XAlGOWpw=((>)1J;4)red=FLkvYGjpH87xKikcr$|@bH%2^ z;{IP5o??97$!ChWvkr-q1Z5|>MykYZqhi@V2CZ7Jy448Waejd^4s1HhdPB0lJ(6MS zrx`5b_DUzz!X_oos~pH5Xg?QU%3xKVh8)UW4o&!1Q~JmZ;lJ@8#j z3_F3OJ~&S>zU>e^$b*Tmi?w=mkyOUOuO>b4RF8pN;hCRz1l_7KwxJ#sM*@F~jRVlM zFA_>U@Y!YOIY~CI&#Bt;z19o`T~ow*b4g-Fri95NS(cL9?0LGrGN4f>dw!4N(a#3l zJPfYlu-;Uf>yH{Hx6A&%N`1f5AendD(XZtPt%l_|u(qEp=iU*={^d)J~AB9)nH733HWk*!pZD_9zx;<{qESFLP`|Avi8!BJ17gp5sBpZ)0 zagD4rPYP*D1~k<>8vBo)a)t9;%ij4!YT}}9;5$vf?>0|lZ(mlrn~Jf6(J%VH`P}Dx zxLh~?^3-VGycTrVah`&LX1FKzn+{>j5eTQ?uPnP=nGhkDe@%B zLxGDfkV;onv}ozo^INo{){bVqP?e~PSm=lFtFfbI4%hWS^rZ8R#|Iapu|o1fevbo6 zCm~7_+s4ftHFA}j^)7;8Ie3F|o|^HN#E$*>no^|@+SPil@)=LZfMA%xf+hqSGT!gN zRX&+ujq7?$`wg-gj-F5V-Sc7sWmWD%;S;l6t2 z5tqY3tn8knT@^;xsQ<*)0**0(A!1=t`yKj~lq}1#&9T4ct7n!+*QACsY zZcI_=6$knP@$gOgC5_#ogcY} zJG?t;je@{`MN-`Ed(BZR z)7$gTDB8!`03vsf=g}POv1?edwE`kq6-aOWkoJ1kPt!3rPnbfjf3YdRSHj5G=(o6U z=xZ=SS3{``iXgZmO%9O4L?!|ioGs&tC5B%UP!Avs9@r?fSThAmZMKlG-R@7Et&H&M z;lPw^QwJ%!EIJ3V20U(X$9sKs@9Hdx@$_E^_Ke4dASHoA2!tBupAipKS-f%2;AN$U zgMa)lGoff&b%JQnT1Kn|evJg6mZsD!sYZv#BkB69_91a>|A5~rJ=NQ*Q zQP_)s}&G+VD0oGuhKlR}^52CQ31ek$CQZ7XR# zn9Z9n-Z4$ur%ZxLXRk*uruQ|EF@8@9~=DtV|8sNJoakkMZyFQju;o23labdM^~kOepLPZ zAxcSsr|>W6eRe>5%EcBW5Q3E*aN6|bsbSkkFqSNx9gzAj5A&87fm21r|^7Z0j z_|!Q3GhOF|4(R^BWYuYJ$XV+b7?Bd*JOsCcl2=Ij3sw5&29`o*tct$I2eLYv2{5g3 zVR$BhlnR4-62uJG#-cAMa}kzi+}e^jF>VVC3Z$`z!h*%wq6yXJAXx=Qz>UdegJOB= zhgkKDvY{e;%vCy{lNvcU@i-mLZMbIML&rkc#?l*a#UvQshOvTUOCK~q%Xq$hyZJgb zFH@ZW-Mc>DahoHOSt9A1X@=PGx39g*9-mqn1^D=N73AMUWB3=R92bsf$Emm?8U7*R zdbh+juM-BO((Tc*3vJ3@^FGtMf&xzB->KzpDc(e!=kcX_vjyGATgcASlI7GP7+iTu z(bLT^yZH`v<--qgk`V+-mZ?9wKw5Y0xc6P{=t5Yk0QC+x-xbl|Vpi+WX*pm;r=8Du z&WV{2H|LK${mVradDp{u;VT;MiEhr3)Iuw5Qp8ieYyo&??yNKOHqiDyHe>PaL)IiW z5*>rgT^8PC z+zdGOBJy43}4j*<_E{4irAdD}wvXX^VX@yN1ksFC~~@#}l#2NU@|&Tm9|^omYrz zvG~b61{67?VSMf>_w~-J{Ety^e6x`oT1S4Q+;G@8`*~6~2flg^7y(oC*5apwj=G`% zH1#r^L@y*gn-j0-IP9&F~A$1LL7V{ zzi~7{^%nSqxRIfA_Zq`!&F8V4BhOd_Yu?sZ*grm9Et<6x~??G z(gRkQWNN8I8je*50OVo}UX>16zWn@#ikYX3rYWBCaL`TtXlq`QE;n8w6in}B@PE4cgQYLXV%_PIixw$$BlAC; zN)EOB-Yz;MBkg!oUT{g&mx3>F+fFuSHeVkzzd*|2_Pw3dalt&V zW&r_`^^Z+q`pm3oalM4(HK!47uH|~mBfRp%0}mZxycwfEfeBZ@%t49U`WG`7U%mU| z`mNYaw~sepS%@)0KR8e_!1^W&Kp9*YgGa!{;)UyxYF-SF-C<#J8Dy$G3YuXWJVVPE zQ1spHoYmggg+pdIw}M2*Jpp>|o=F%5BW662{rcRYO{C-foNbL;;{i9#^KK8Qi;MyM{S%d6Ma>^g)9*JZEFD%C7`qA$@aJ<$|#8IQA@S>N}1k z!9!IpXPz6F9fDf3(kurP{=h6$z^!(R;O^I=(~v9qHm{^OXnbCyDF-r^WOg~Z5-ijJ zu`lGf4b*LLE7tpB?;gx(jp<{UPh}gJ{)JQ+41wIy8@G(WdACQ~@W3LBA<0-B$L>9i zU+#H#0Un0kvPrPP&N&Va7MiI9T0m$2;uT12fD0$L^05v5jT_%ab+X*lV3ihbx(55p z_^y1sM^wT7wdsk7;^kYP*9ad13LVT~981>xf1&m zMw4wUlUyN4AEg;83V(NGN#_Fx$X=@DM;mI~8c1IofC-uOcyF|_G^#pB)T}TBP=Z$k zXqyo*wNwBSINIX)ldNEJ|D%SNgc~a_^G4yWMhWsT{c{O2zpM$K{|~F+YgYU#hnla= zwC(NUKKFoD>mdFFEW6PSgjW(#s5orm=iZXRc{-OPHmmh|4*H;RebpN9NQCN#kCk)% zF&#*Z6NXn``MGkd?@&Pp50X{MHjieZha4pX$x8E+Abx*HwD|O`v)Am|WFo0EYhx6; zCz_=vvBsd67zaCd1M_#S-;d5WlvjoZWk`78)vvz zX=jRXY{JlE9HwL{>ys0#-Xnu@VHlbR-)baFqGLNh!5(gmCW{@*?Ij&=>Q%Y~7-A0A zMO(e70&1;DZTqEKE1A8Oy?GCinkJh|59C+<2+a=_YkjTp>-(2zAF-N2?2K+H#MLEw zIghwyq<2*WQ25ru?RnzE5T&stdHp_3?av*?fLD5p7v6MsoW6C}$zV>;t%6v0=)KMD zRr=TElU2@>XHHf0=@p%7)Cqlmg_-+z;1U&H`eSEcNNf|5{g+yNo-Y1<3s%8uV*;RA z<FtV`8-k<7`&*o1j?(0x6x&OQz9MEoSoVc!;n( z-)dThLy{x8><`}Qb)CI(y?+7m+sp#EesduOVy-nBXBh0w?G8gF0t_DCrxka5=?>!h z1>qb2udZ|PXL|qR`1bX+n@iiw5M~(We(glkHfOVq%CHK#w?;0fhVlO!+*A-~Zv#7++RZ;_?{T*|r~Xf#UDi~dzuX`wZb^RBp~N+Gx z)SX@rc78^p7C{Mq&{vhD_^-9v(oO3^M2SQD^<;Wzwj9zDMIHf2W|p%1YMEWi9Yrh@ZCJem$cUq$KZ6_<_?$-Y0S+b%oGD;@TZt6Vu5p^Lk-2 z>P2O!Lwu#rB~WIRg1kuFjU%cu6$YmBnKhlh`cwrbrE`Bz^4#jP!8*{XsgP{QT^fZo zNTG7h4L%dF6w6KtG=~<TyN^e3COa|+&w3`R>U#_ljyn8 zS7!M83o8rzrBO_Gp4Y=0nr7nA79PBC(FGab z9?KIehj^@N#H1Zt6vEo{vMkeuK9ZnnJ+m+rzzMz=DB(hjGfp`j!Byx+;`VMS@9(QHj z5vJ;g;f|ja)6#7tBpqz4vaS*jYY+8+bw~|*oo&)F{k#N9P+3#YAG_8u*P`yZ$1oS4 z{4L5eI&1m7V>g|M;1P1h+O!a->(Xu?%I7`mQm2Mo@60Cew+bJ2X~T73RDa7U53r4Y zc3i5LJKwo}FS1_@*qr-F=|BvDKJ`8$++WckIF&g#8`H+92V>_08aD93^L!iOR?CQQ+YEZS{C&96dlz$$@ zma3|-QNdWq!>0nO9QId6LENjC_?@Cbi2YsX(&v|~VmdN~x>@f42pZkJ5cco6>pf(mLrV0n52d*{)*N1{C6f*i3|Aipna%h?N0Ro z6^Am~403lXv16ZJ>0N)3Dj5U;`&={oF&P!Kc6Nu@OK1DbalS6N1$$0F4FNf=f`?v_ z@%3RYn56RgC+A6wQq|mog|)vo?Ib;N;*e2QrI|MM507h;mxF1R59ryFW(k1FGQ7HP zZ$w9&4SQqmbE}(>H;gTtS=Jsp2vxGqn`U2={T$}^!TCfs@vSJ$Ko`$yTv32!+Ut3~ zSe#U-k8t9f#(9nkGch&tk6dix#lFfMvETaJ%M;nL=brB5TshKFWnTL+>;COe1qtc} zlZZP~ewEg)R^3nI+UFlX9F}e}kKB3&zEq3UHusIRp46tmBM+q3Up!LXvVwjx`>XG) z2#@ww_;r0t+VSzo2RwAg@^(&G>DZj<;dgpUG#ioAW#9~%p-)rv2m!1@J#75}0IN?5 zhz)7H43@B*y~lFkfmX=;EAC`NsN}WH7$oUk@dQUJO=!h#;9WK0*MK$5qgrpY>0mIT z`VsYvhzAX&RPtW4Kq(&Ks{8tV7{E|{OSdKnYXq_0dweX-p>F+6`Mcj^%3$VVPmZUS zN(-=3G|vg3!7A%FDOTJs_36tC-9gR~IW;m!G(rQg4@ybBWVg|7%P#pY+wAc1LXSXg zG}R42qI5|MS6Jm}Hl$%nO(rELIZy#41J@nYAwhc0q&&>{!yocZ0=ebfAWFGl)4N&p zh!V_0({42--?I;WQAzT*@6zO-`=L4OqgzRO_rkj7_`~*htlf(~?v>_uxO5(D{?$3A zL3!dmC8<8e#lu+QI3@-f{_`0BFm>O#UGYnWXWWbu)|@&ChS!fo#4TCg=x$N^`x~2` zM!Q3Ie&V_8!=G3+F?K3y10f?yLsBDAE``F^^Hxm)6}p@i$(&_fMx+|-EXMLA$JoIA z`D6RXvdD#2PAo(fpT^++QudL0RNn^a2HI5zIaO$yYmKup)iQ}I$7%?OFnY6X zZ?~#e)98)RB+<_KI<<4u?W2r-iS0tVJn>P>sgX9l1R%EMk!wV ziO-bHEG-dkxmiTcAZg_67Td<~@pcBV)zenyhHjF@JOIz$^X^hUt^>4?sXpk-K@H|` z2L&SZy$pvJM&fdNIvDX_lD?U2wUv9#172wEP%Q}QG;!a|>{^zzUk1V;<|jC51Gkc# zGt8$L;REsMYMS1U_@gmDX4LD_Wn+(NvQt}b|MS(g`kex(Mdi`%hFuX>yQ^Q3pG)WO zee;<2*>oY!PSIff*TUZ(QZhW(F95a2Br|p7LJaTpjA(ySx2V9HvV*!v9<;fBswL_VT$E)aPL8xW9w0jI`T@#FGf1E+vVgWW4=yaP|;# zHI~@Bv=WRrsjLOHS`c!mmHrg?$Wc=maJFItIa^L>0X_&gEAq!%HDVuHhQH1M}; zWi3e!ZnHxW9VZAB)XJNwaJ);0(CP>;i|Y{wsVq2uHM$Stpo@@FVT2qipI|M&z$zeb zTKCZ~6?~HGaZTE)<4W$5+2uOP_`H&Pa*KR?`X3XRV5k2B6!j$-)RAL( dDGOrA)zjz6AQgAT+xGS6OjiBz z<8eZt=Hth6;(~IDw{%^*c>Ll;dso+txS;0t=B|qulf^#v_V&p_UvZG@@vdWAk|UV* zOdnVK3~^A#zn7R9n{$%0GwPe`lEuMsnHg~z$?AG_*QKud=4N$$y{iLLoSf|9<0Fh) zypO9e$Ti5|~)ZUMvpsaSifzb>+uNmhyaD{eyhsGIH#hRypFJ zARqhU@^T*@Q{CKLviPjag5+^RNpeO`a*%LwpG4^A<5OHwT;5Qx5PSOwgQ!gEmgK-> zp{tKDVoT;qv5%{|S$*JmeL-AMfF#II=(9pB+)`XDULLetAui4gqf(jW8^XjH8RA&6 zI4*8$@s_I1i<|g9zOHeBK8?q_5|d+H1B1%5FO+u2+G-(6DJI6*pZe~UYxukIXNzLi@H2c>{FE& zURN9olF0HbxI>kikRG}rCu2*T@L=7p_~hhbd3;<>PJ~c+@>oqqxa;YzBh95TiE)zT zExAFiOsytAD>*W+a80s2Iw&%3+xDF0al(@1fW7tQ$w97nZlAewF#XF5>MiobeU-(# zwr6as*mU;du`ha$CJTHr3etwpZSUB->iEUu30^KI>NakP^S*MTQhmI+zU%lS!_oEI z;X5ZbU%PbVL`(V2FK?WxUw5^28`a+7N>}~WmYfp@i=W)BIZ&=pA3xrFv1?%TZhcqR zgZ{I}yDsL2dyn@hw~B&Yh2AF9-Q{rs0TOQ{RfwbpNEIQErzSA}7YA>Fni!dqEJmb} zf&KyzyLc(yA2=Kivw-3KkL&8(;!S&U72NIHxcMa|g~j1ZmgMf)xGB#+XZzMAJO0-q z#`oWM|2LX2qy-F}#Fs_ZDy@l5e2B|6*5PdU@nr^q5@&7PfyB+~jFmX1U7&(vWl(xB zN~b&nK^%c@ua%NJr^N(|(B(6n(d@{&P^!}fsnOJpAzNVz^@N1yLD{c$%gY4jHzEw( zCa?mov#REVC{hYz#RIJ=ypXBcO3Yap#8Dht?}&6&O*a0)7%uk7*-eihwLbslL)-NW zsXckAiw}xra)P%`3E1xb{PWuOKMXf6V|@zWP9)6BA~UfzqV?~sMF}J!!@E5ox#8G_ zL5vlDv_ojbVAz7T!t>`vRY&atUCBvRejtwTV#rOxbmA{iiKAKR{i8Kp9(!n^P@iwv z@yR`_AJ$*B$5dj88vA8moK}JSd9g;|0w@zAjH4TIR5KRY51#n!g&0Eq2knNv&`kj0_jfl06aaJ`D}hgI`Lkz(1!C z(L72E1L?${{&@FI6Br@G`f_9#5gwAPReC0+?MJL_YjtXD7-Y`P#G`|+#g++&-t4lI zJXd4?o{E(~b!?=-dav$XoAx@EK>beT zQvvtDk{fF_Vk^!25z;TVH3i+bOOupvRx`k>pZq+pdsb zDKEeKED5`GblNb?$TulSyGxt4T%n$Ok&E?ooy4$xoy`N*VEwF-W*=%QWUnO!))IwY|#O-rihH#=qz+7h=nAo#4-&YKK(<^t@Cb6709rXd{WWq}8!(XGN#i z(D4uxjNPEc?5715$OgaDd2GAzjr2Q{8}-vKUnE82@_+o6$f(4qz!Wn&@6fd2_x0eX z(t_KZ4U;Z$7VWzj;g5DjZyE+pGxd)*#&$wD5+$|1p*%y~WeeWk{Cp_)gP(m<%_uXgG|rm_OLAGf1(RgKjSOsF2uAjx3D1*s2Y zHVY9G#!(wk9WsTrFAD`|nX}?R+$Zc0p~P^rNj(;d*<}A0j4Q*4{4Fb`#a?jcxl=kp zKE3{G7eZ6PYTHM;yiGd5JE6CE7fni4kWUDe|V@J>n+LVuYwYb=&@lBKOfR*i)k zn|wK;{hIOD3Qyb@fApjh&ozo(CSzi0mx3C@r+QX!lk7v~gncHARbeF+nirA$EBoEQ z)yD?^4O0_q`{{Xt2S5DSqtJb@>Kx=&Tc>Qnh)jdT%eP*0Mpd)%;_jcZiv160FF_jnZffd{u$`qz*?IqO+45>Jo2eGX` zf(J!#6+_lfUf-&5IyMU4k_EArj8-nGD_oAtJiMDAJ3+$!UI{Mv!qj~FrB6AtSk3L3 zlXr4qOuI?c*3wTdxGo|yWZ1?@T(n6Y3fHswWX5;2zui7{*k3|{t| z@orTEW$cHOzvaOMVIfT02a!F}m2@{!5gA6+v`Q?Ex=#SQU^Er@%~Dx7hON0Tvkuao zaxXNL1!Twx2S>2Zvm%T^_Y&wf5LZB>Zta5ow7#2ut!`N7PQpzA&?dljC5`!R$inWu<%S)+j<0Q|dz;&B-Cf3Jcl`rRFYEdgvyFmF0V}%Bf%?om5 z)|qxo7__y4u}C%9ip`7};Rcsl5bgzU(&F7qIa6bpBt&;oXBST4hZhdrQ}16*A1^EQ z#+=g=!euwzG=>8}PQ&tanJh(}PCH>KEF5pWmh$Z|zQ;-VXxkD?A7FabxyqqYFD`OQ^7*!*xYE zw%$rOyiq*on=jLCDb4E)#BHni-iRgQ@)rEaonoRgkZ}fT{fArQxa`)^_ME>DeKZYx zE1I-F>A3mo{3{#FHI^N_(#lp`mo<@z4+APAEf_Nn;!GF}Iiu&`);zBb;CHmS-jJ$%Dzqx}l0!3s4PH85j*NW0rTu&*EdM($x^ z@uuA%7rOh+M{dhUhZ38B8#e3XD2!2Qvi;^Yhv9*ker*#vHPpC0{MP8iW?~pm6b#kFxm(`UE4AO+j8ct#SdF2XJ7?srok7*0QVX80{#m!=!TqayG`zcJ1zg%q+ROv z50vByq=rjL+w$r-PP-Tj{C--zK2q$mKyP^u)$Zn*v{9R-k&+*Jmbqf0mj~dp33dHv zk1*yW(%9{hqYREu&uuG+(D7IkSre)~0T=1J)YcJ_N&d#$6pgqROtQ2*^OYUzY$Uy~ z`a;D|H}ac42RjSdH_!^`Ic$kLiqmx5TXz*%LX%7&>qgU7@2nlOY--}=>kK0xeGKy2 z&Y6ppxKLXBvy;n$^Ru5IP9criAV80U3&*wX`HdBFFN)RK#6U_OS`^ zp{8g#!`U_gVucc;s@u5JP3y$Y0$xuzR}BsT5u~J_`e|eH!D3o(7Y1l(K=^Y23Tzgqco!c$B z(!^?KN9*o2GD#W@4F4xgDK^S}QHUsgEF6_+xn$oZq&FkWGdd4)Mgq_b3~7L>sP zL97u#(;YrHG`bBP1)2IdLDFjpMl>a#;zAk&C-fYtWEOkI=zv;MU<%s?2+<=QVk)a$^GpCrCA8)`Lqc&zXNQ6D(P&l)ggK1vrH86{Byc z@z}!~7L>b_hMx*Z^pMHM)8P<1au^NS8y>2AZMe}%NRyrIjvJuZ2RiTtf{l}h-K?y) z-g+;4K7qctar((eF0S+xFd{qqr`r!I!msDDR?JprcL+Ycc2SU7v+gCZHYxsb;a4w? z(&zLGk0v>JHjjB_b_#m(nFDP4Y5R)n5iB<)$L?wFH--J6EovBHRDxlKRw+vQ`FY&Y zh@xZpOFH%K8}47{nZ!2xmTA=ja+GDc`Lqn82kX_(VYNP|#x`oXW<&~{9X=H_cR zxR{3$vnX~N&{6Qu#~L`!{16mIjD(EHDwF8pK9INYM0)B{e33LA z+zSoD#}5RVEbreP9V8TgAKVV7(YkFS!Fhe=nxK%GDtPUK-31*_@3!QwUdKsAd%#o| z>5?Um;ie`Oh1=nsPi=i7Et+&k?9eH}K-@#g9c2t_Z1W_E*g(GHy0*CC-pI4t%(j)_W}dd|E$c&<(<)BHv$Oet^0j#rVIXq58h7$8D z7UPu&M#{)S*I8JL?0IsIO$ZWb^$*c;lb?uwT2vYEByE`jGXhwf43wrdsi)~3DSc}nKxs&PXd$mHGg+>TcY%h$#Uk~eO4aBU9HR7L zc+&_8onj?Ml$8DKY%RT%>ySU|Dv;2WP6Rt>R5XpZ#xWx@y`*k;$l#k%`AzjHveJH% zBsqoU-v@my^5i$qbA($^f@khoD>&{9YG<%YXAZ!P!kk*ty~D4nQz%z=TF1nh9~{RS z8~47S1dNeeIzB6q{$@U+jKO8k>u>xE&dvIPq0!+$QkCB=#{1(9KN^S7Ip~ssA$qIk zDsT@z>hG-^{e-xJTNZk*!6NPN3+rtOTCmiek(@TAd{s~bJ0_;&@BWovdJK2OsqD^@ z8SHY>KGu-G=H#=x-#L_Au>WP&f6EXQA;{59)Z|S)S#S!~DPa>jJIXP^V#XM=9s$A}>%UU;C6@*&N>9!&Iw$E#VRY&yj&h zCDl{I?~X1xjE<6UmCxW$uPBTbiRPri(X7rggGD5(=aHNt{Y!e)*Vfg<|5q=w@;-35 z!2^ltRi6@xjt@1ONL-m90UOnC#mR~EUi=n<%fX;)SAvv4Id>ODmP7={Vw%$(dc^-z zSFv;BQ$_ZUT#I^Uf;VptujN3HJ1QsGL@+Nb8_;(vRX&I%m=j+2}C$ zyv)~D{}P7jb1m?MJ6#`kQ;pbY>#z^mYg^k65X?m(&uK15S! zszLnk@?=8OEz^Etn~{L9{51?=NbWiL`Z2#5r#v}1cxaOkh1I>A*mljti{hN=fJN_1 z_BXoJa@F#fo@VFhdc&{Phribc@qHY7a#{(+j(xglf`PznqTanOB?DMQ>Q}maWP*2g zw*u=$e9Q6>I+GNVy1Wx}c%)3>sU;j-Rc(tLSv$(W+Uk>=U_E(`O|L#xrqwy;F8t}K zLDPFpXVJN3YzL2rQ{LtKdmpPya33*;qLCfDtqArnxsY?-hmsM*rlaJIC?Wf;J#uiH z?oE*u5-@1xwA+9|cwVE89FNXjtF6Cfbbk}A&@=IPj}J18482k=bpV%pNxK8KR#i4) z9W=Pp3CfR6il1(eoca=--)&0cMATrw@BCY$a>Ow>fiPNI`hDzuIb!l6?)24?tpaqg z9*ro$;nz!{e<6peVxTX;qIhUrh`W0YZlwj2k>Nstr7$tHLfZqzer_5EKfDh_DDCx2 zg%dY4KOLn0BU|zSzckGB%z0;~x9}_L1TBL5gF8j~+^X+7oW`^o6pd3I$0xq|&S|+x z)s}r-`X75VhZsHANFXr19d7A#AOt+2y)^g_zyL_)rx+VuMWr^Rbr~^%W6V+pZnM?< zO2VB&RG`fqZF;3vo}|2U2$jhI434R{hw3`^w=lT+$6RPXT!*8Nv&yDbm6}y&d*iq% zvL#CB`BvWh6j^;6+X`?CjoM-?%LtE$z+RZzZbZ}p|T$wS?zuY<;kqO^&QaTU?-Rl<8#<8yG`OpAy#o zz7}~+mN_GPH@SV|ObL^ofbHOxV>{7ccWo3oG6cUL&sz=IAAS3~4sMQV<*YhxtNAt? zpMg%|H(G8ey=AKY>JPI9mie+Y@Ik$LRWLd_JVD}*y&kAYT~W9n z2|DMcjf-Fm>eAx)X-6Yf2M0GGT5YGXq*5=Nz7=uDbr_*K5g&;}>$`?@0e$PVj0Q{15+uQWQjVegO%>FD zodPDXchqc*x3LPwe38Xr*-9L}rAvg*dR-OltKQu;aDaMb;vOpSg-RRGaDvW;)>LH< zv9CRLLs_CM<&2?NUd2v>xfiB>EQ|jm z%wzV6z6SSpXouJvrIM>a>hdDVBdT?#rO;WJXBt3*O&BwH`BLF4QhNMNk(*w9tNgDc zEmABte%rE%4R0!fgptiHBRY22!!RLsk%s?|?b$ZGQ4KhAGe-+`*2+LT|M4aXm#Qox zt%nMgIt>m?;msHXSd0oc3zg^>8@BzVR6SE5z#>_KjW7DblDU`F)|?x%{6gLXrPtIn zhtu-PTN7dPC%3lq144J+@$}_AhIk-*9sW1qv!Nf1M+L+}>+~4eDLwc}Z?kZx`G_B| z6oz7|ItbMf{8i~a^65wFh_^2Bn^lgr?Q7}!`-oY_D77XxX5Bja%1O1^HiYzbm7_+C z@&~ro3*rXOk%~1|wbMNkQq+!Wr!sX1UD!p- zT}f?-HnWb-zYpJb)MRZ!-|J13xd%gy32XInihB7U%5G`lcET zh?YuF^HQyySMScaI3UvW7NG=`)WHe8#ocg#!*HTKH8w!%hda+V@!U>TYdLPaf44_M z6xKLluB00SSFH^g87qxqKT3BOdFGv^N4ftrn}MSax=U-(_eQ7zsQR`} zdxF~JqGjWrFVh~ga@5KJxnBGYTh|}Bvd~5gxc#RaB)>Mf`%)(gLz?s8aNiqD`^eWk*=A$_II(Jq)W(0}_ z>0AK|or!x15yRrU$#0$d{Fuf5nnKPphwqJWM0Ys!IglF)0ai=+0eIUfg9iMR-ttiN zE8Cce@ru*n_bzc5#57wjRJ^tU_E$)wCXHUwiSuNfpl=0r?ixV1knBvPW=gc!ZmFS> zi3%eAQx$2}+sEiJMm34~E_|LV?{^^9qi|@oW21&Zuv6SLFScLKyTn)rhM0#?HM)4CKD&RTm1U%iH{xHi=_o3fV|uT73f`!_rtbg zoNndH@Gnjl|8_V*PaU%+;p3&d1zY-~WH)sD-aS{CV~l zbsD3WTU)_B0@{B{**r6AbgoAIEi=a_kjYlY=@CZ3{OMq9h6|)IW~(sEOt$=hXp@`3 zaqe3(zSveX<{y+IqG4c|Hx04Y)KFoU=m8w+_enzYTnUUT{l z89R8advGDG#mtz%vo)4^mv(4vh#fi>^B;P*vWZmG)=cv1Rbzz6uolW(n?Ar05F?9B z_GIiTXfv40%4uLM)e=RYHQ_uvYa8cIf<0T$nMD)<6G*UCZAcZiammh9;QEOiIV< z&eq*hE^h5uBk;nd+fCR_=R?#Vum8bZj}}y3I>k7=LyBuA$*15>a{%Pqe<-C*j0^qz ziQ%~wpRxoiS-n-{kp4G-)UQUJkc!?QF{YcL=!feA3r#d(#2?K8#H=_|zvhox2v79l z{sM>SImKhBK0*sBcVGG*E}-=hoLs@XskhN!!-NG%-flASe=U+AXy!X{^wIZgB$i-+ z8QntK?Jx(A4#(eIo!P9wQ$i8E@izpE{XbU&`oEFEHCp5CX*gKWYOJv!a}@oI0Rsfl zdp)rMMgs`CDS}&JjIi2+%I3sEW!PIj_@=kVEMw zI?0B2m}3N61?~^%twDl{#w)*Xntse8_|QsZg`m*Fb`7IqoxuGL*P^*+?%uXaQK@_S z>ht-6{ewqseDyDJJGs#`_RtqB%OagbX`3_eKsITa$VEwQrlEoOMytDslR`Bjm0`RsW_p#%}&CSz%7BbJs~Lp=baDjZ9P43 zf5KB_gWe7N^M0`F$^HeWbArDNjy0;^O14#ZFiHtKIOup{rR>KoHof*MrB=wVkJnCC z+2;8QAO$GLKHQ75j((hc#4?2{4Ad8sgi(rf>k-26(I(NZ%i1}sZ_E5 z@NwmQ&l_&s-~W7kRPB0TQAU&QH%!IpBSW?J+ap*M_SKA0SnijM>z3LpkPHIO2S+?Qms0^9Ir@y`hEP%OxUwJFXxtc@_Qr-Udx6PyHv zf%IwoN&D_)S~@ywUXQF>A=#MX!QjpC(eK$^Px{Ww=R|9%X?--XKH${ z9j0sCg#l|SJ^>8xMxMH(b^%otp-5QcZ03mQ{tTKi0_6%OQ`Sr#z zfY2Yq{1Oe-F@+?q{$H>$FC}~9u)cW&mg!xs`-6-Esk3cQV-~iw zhxf)-T>5yM@vkkxNTNPjW0F~y#9}Px5bgMX0>PrV5~DR^RTemRPU}UTxW$>mR6bAON1X3c2hwhB)H$q8(K02){P(p^cl*%Pjj2AvbB+)7;JH+OOY72bitomzc%Z7KCK`=zL9i}9)jvVOTx zd%>XbeSSI9wrN{}6N$RYGd*(S+8)V2jQAagdR`~shz*x*ql%D`y2I=CwPs%f9rHXa zCQ&_@-GRf=A*LE|*2CW>PP=R;fHH$ej@1hZe zFP850{-EIrYoN)KFrUQ2%76rSJH!^^$0M7e5@QLfEn3~+;m6h1GGd1sD=nT6B|;Xz z?tE&;G=|C&3ZD$dCah-tVe(>bt(2)e+)|#h@C?ZSjF_d`QnaFrBJ_Y}s^RUl6fV=Y zt)|-zRL)BQX6dHReHHp^%G_qw+K(E-kW2t4hgmtKL`u&k&%Sn}(GIuWd z1c>lVmgwitxF#B!o~~u2$x6?`-Jx@yC0Ti1(nxTr{P`M7Qnxzi$6wue7()6P102{R z#-Cl9#MNFXslq>98yH|<09jT(QWi=JF!4j{f<;cKVRa00#Ph?N>u=uu1pyQ;glPeI zyV9kW`>Vng`F|$v@u{0&t!L@ z=Zz*Y-g@S86E1-3e<6rGs5u8b-}3eb?poK6x0ZU}Z@luvvb%DCaUkA*07rk&{}nnJ zO8yL0Kmo%47VCPMN=33vlzCvLjmqV?d$JmA=K)nLO`p>wl?@Oa$?Hh_A*jC&OtzN5 zz2>STjuycC`ED8Mc+}Kx&N=X%u}VN^x7!9EUZoV;LNlI){5v=cHDd-klpjq(9Y_+F zr8C&|Xg;?uvJfM>h&r|CJoWu-H{d+&5)=rG9Yy^qlLDCh0ibuH<|hbaSE*@mCWT2*$e_~;P0hC0~$dRN?K^pT!9_!I3;WNz%W1#mW+yI)x| z^_G?1bK7u&e1O_+X1QB`!NYsl+{)2e{>zSIv{B?ied~7omVPh>_V;ei)GhpqA)<$W|vfkoO!7z!B%fD5U!i()C@$d7| zvizw=fKJ^uw1Yi*06BRGCyH$Gu7b}1O5?=wkQYOZPN>F3s~%zm`=~$ZPrKAt`ue*u zn2JUpjz)FR6Yb-w>0=ELtD1a=`QHPX zTdAZ|MAS5G$0C7hx5B|wt*ch%*ty6y!ZKww=%E)1EW2R_-L+TfX~k!j@&v7l?~F5b zZJ|^K=UlIh!we&CV@)NQ6STm(*S=3@&G1H0`zA)0x)sdpo})E%b16iK&C zDl^IKW4B2gKWT=z!7cU4wT3?YRmlO;uU_9=11`6YKb-A1uu=bGgHLS~SCxT2IBQy& zxki=kV=)=r?2kAev#&e$hs}&z^P!DagoY`_@oU+ndm1l65E2A_!s7e7^AdY;*GO|O z^}(`xo%qc$LHdXAYjpNc_xF`qJKqkF^RkaF4(iQrkuwVo&kw(HE=?!g>-3-9^F0Gc z{&eMMJIq+6c;m8eaaV;H4)RLVVlTD@zk&fP4+miZX|fgmKrY!&3z(U#f_0WKv;%OP zJpyxDmo6&e(?>F;|IX4vo#k9w0+1`v3fz|)8du{s%~!+U(9N=wH%{JhP2yz1dO#so0rlcZ^y@QN4v|tW_K(9@1 z!Z&)?7{Rx?{t3r3X34t_{MvpO;YI5hEyf}(b$aK`qyQ)wZclA$3-U8%mEau9UUQR_ z#>R8*shh3VJNFh3#8b+vr96`b?zvzf7k@o} zi{^WBi%$%8a4fM8f7ptJ2a@hHz|`yMEX^)!TWc`vt{~Z=S)Z(iKaZiVt`Cw+@klDU zL=D&%`Is1eMi(s;_s?OM7@uQ<1>%{I!6moJk5eAPl$jPFv6|9%K2JM51~2-#y77k4 zjwtECi!9oeDE>9qWDJGhUN{JBh49EWD}{kt*6s7=2Jlh#%PoH&C;*gDTYm0CTYaP) z?g6NWZOa`i{_o5u5x|mYdHT+QYWt}q%XztusPeU=$Zqx^K&cHYq|Yp!i7NH6%a%pI zksCn^kI?SN&@|jcIC)7iGU#R$tZ;7RU=X<3i}G z3Nc0sV^J;t{^vKbEt$`s5AH99!4O1@J7ALHg{{_Ei8*HlACS@l!BSit)DJtNhiH6Q z`Vl6BS4sSrri*dTc>0}!50CQ@`%UWAKc5dPF|wBtL{gx$q)T}M|L0QAXMOj{4umry zw~8(9_^zPp@62d_HZZ^>R>}AkC430jwX*&3(oVz*X|f15N#_UH=pN33!yx0?nM-== z|5%1*>zY)Y8&;BWf1>bT{%8AYi`sAO`C)>bG9UmWO9;Y^oM}T*UZ@5yG+7Q3g~|G^ zVVFstJ65{+`S7B5STNkkK_ljE@-vH~q?Ieiq^9y;{G=!2HqvKaCjz+vqim;;l11a@ z=o&5b>BmSdiIF>+Xl+U7!v*xQ*PVL_^g`BQ|E-V&xtA`^cDV7+D5DWAtT_!!!-EG} z>CbskU>{8~O2!$dO$6#^lGoY0dVWcY!Zj@_;7EbNmV}xDV*GD+%e3}j6HjY%=vK6) zFoHAafRJgj=K7=S!nMvQ*Mk&d#JEPTOYpZ%Id)@cfqMj2>D38K{1?q0$NU-LP^rb~ znZq%UlxN+MQ1c_Coo=io2orIUCqEHb^E+VgpZVS58Iq*B8~kGxTS$GcKM#A^#!9Pj zPlg#l(vRO0Poc1kR0Qn&OAA==&P=s!UYiGj?PE(l*E$K5u1gqejg3w~)2Yf1EK5P& z8~7Ou*qEGf8cT53H)8>s0PcmUDqR)<#k`f4pUvkzf!o-98xQ`A&Dwr<$6(wV@fL}X zDH2?}y0{H^_0lu}UY;a=8AjC@j)AH1+mON@F@Q&G4XF<(9lLmw)qA=e@&0a~G z3Dlvo-_%#o^nd(2@Yn(=CjPih0t85}bs27<5@X}I#Q|=tCCZZT{BKy%A*E!(yYNw| z46BT{W6udp#5*-88%jZ>7$KP)8pCRZFrrexofNT{*o+Xm0(vPp9j|z+C@Ay zxxeZCnsVy>qAYUXsn4MGx?>OI#^>HVYkuAgPPNTs=;IJ?VsY@?=ucioF79ebe1sq% z=MLScB=>AeFB|}nwf<9aGU`&43%v}gkv&!4B&d$0M~=iy;8&UjoKqVURG&nJ=RJ#5 z55EDtp63S?Qtwc#r`mYFvxkje1L6-0?k}X*B?q_AOZ_&VvApvFFrLgyFWHqa=DW?k zf!C77F0GyFdc5+Xx~2!b%~@lQedFrm7R=P7NVKTn4mS5YJbO)->~ z>Q7Mfs7bJ#)N%q@`R8K!iRIvi5r#QX>h|1vuBHipeWw)XVJ86)W^ayrRq(lwuA(h$ z{;&=4L%^eArx1fJrlsc%4hboEuJsQ2S^79_-HtM8Yf+$v2+$OTGsxD49BPP<-5f!9 zJto)=S>-s$U4`peaM7-BB?q_D0Nx|zE|heS0io@ywD!QXF;RkEy4UCy6;e6EGKC4M zVYQ^W9`B*QJphlh6)!M`wQG}UC!FeSaOxDR1P(1WTm$EX?{SE8cMOqs@P8&Y!DYOU zC*kw#5}a_!WVfz{c3GySkM&yfgcb8iQm-N?MSy@}bdUyqILsBc+O@#SH*Oaz0q|E- zYC4{rVLG))dseCd`GwgSQbdK6AT+zxdC;y?&cbKsT_6w~`q+MyaQ8)kF!%EBeXwoe zI72a(WN5T@<0xpt=FosbOz!SX?e1kOr2{ZFSmXN$%rz|f;5{wz_tsma036!JY{>8} z5bG^@04&`Ny#$9wiD1mh2<;bN_jc{%?A!TZLMerxbywqgE40UBj#iZrNa>CPHtV+g zNhz^CU6I3%uFL1(3vJbwNZHZlONA7HZq56B(M18`=1fL3pLPQPg!SQ31Ngc z2sb@HhHIllJO%!UG)O>56t2m!D)E8*pDJxHamS7Ru|`3uMTkSeysS={;p6%F`T1FE zwIkzu$@_;Nd*P5oi%dC$UKd4o~oeeN&a z)>2Qa5ZUjBt=3P0@7V3dPu_fu{f64Op!3q-H#(eoZY?OYm9tAvPm#k1u51zAD#JSk zsxovxedl8tVx*jm%r$X0nvR&jZ=M(!4!~B~Ak3IMYTDxy45zR4w&hcV&J@MB`98=g z(;A$uVG5SseVa{L#**NRfTjJ3`DnwtrzMns(iZI*Z8chJA4-b>vzHc(XM%JO$itnV zZK@`B1WVVUFC`E}u`P{7gxr=|6)HUsg`dzAy+v5oC6&9X|EPpW=y+4r24HW0o=9y=kA9}KdDG`$!+fp#BeTOUWq7=ni#ur@3` z(f|tUEcKAwMX<16x-Lks9&B*@y#MU6&!5z3bI6f~#;fGL0yUUodXBhV^&EJMQ1x%B zkQLj=OgY}a8*9ZIuccb6p?i!A#IPi34RGM-{yMyT`V11VIaX@fz8bGua*=_H6utN6 z4`2O+#1|o+E4nd4TS1s>?H8ny{;ox4+jN?wSe3MyaQnWC6E63{`A-J|@k!4A>@0jq z6|lO~k3ZZLU^@NKe^BIf+j^#G+t1ne82G>f>dD(ppXH&l{jq-^2vBOr6EU`AJkp+7y;cTPJ!LVtB$!)CW)cpa;+v{zs(+h* zZ_2rIcPJ=&NwwRg=|2oylqw99+~YxDa$4@L zkFV3t0UMkOVjvI14$0Ri-}i5`Rat~M;V@<_u{04c(uHYP4MM3mjyblD>Ij!IguTtj zckvQ#{I3qsR4KBzccRSQpU8JT$fh3Q%xjk;GOJMSPU|?bp9|dwjmu9m=Izrfc)?4~!EaP~|b{3`D}x(zUjV zHf)$VL`wG42UQi?EqXiI0J%TWHMCWJ4EYrHgvjq8O{*x47HXnU>z?ue7qbA`gHxJT zH^z^hf{Lz^yVVE4rXj8x*C(iggB*65*a#-rS>vGYp?xQ0BP-f_P^i;_MB)Dbh60SWp=n2 zq%1Ge+j(DpCC(qsH(~wIzEdU(P>H-l!hOg1RD2S9YVF$VgNC@EdF9}$6w(ed1=SfA z-B8yai!JY*vfql>JL&^6vgOOPT{MM$ATb4&QaFp_;i5jGFD45uKN(5H+S^F1>FdI{ zY@p;T*unag%nBo9{e41a$VXpBN)2ekUx(7ES@#%U0=Wjp>&;=-Adu2CVE86pAn$cJ ze2p1}sIGP4olzEI8A*`GOD};tClZb5OTn(Er13>9@mPM(O?bsE4^zHZ%;>}*m7ETh zXWx-XE5d_JyMGks_ZlsicpC0(!~J1swDG-mZQ1u0HZ%W%qtpMjJYIM$=bwp?@j@|c zC3{OmC_)q%czX@c$%!nfpLt^p^hhTd&k0W_q$pxx8R8fu%y=&2(k5J}E zuNd7*kI^2aS+dw^SRn+0$20g8=9u*5ohB zS44;KJ2RPz!r(h5+$R>7pjP?j#U@3eaMM<&Dl>xf1=pfKK57Z4vYlJ)-n_>JuIpRS zDR)s3@4R<<_3V+36LmlO-1P7@5i)*h-rt-2?U2bZxY9OwKkQ}M_p0KatQZyJJC=ZuLqSUc7mcwo|H0Jb)6)G{uU2Sr$-DHNi*NH-l#byS3o zav5g)GdRJnWVNU)*TV$#+z!#k*Y`Aw3E&Xs2*@*!PH^o?o=#_=a>dyVD?c1YBJE^& z5m6OvH9$~ZX|oJRV_ardi{{RqN1RhMYCBgNg}eGl+t8*sV8~c5xaN0ukOQdt$aq`*MN9=n`R!> zQ#pP;laWVQtdUb>dZ=4_Do&3jp*y9q!KU}dA;+5DfsOYu5`*;c^&yOilv090i0U~& zf^6sDBBNYQ`!kVr&R`}LY$BZpD~7pQq)>CEgspEdOngOd3V@t}U*+0|`29_D+1X`> zwIz=zEZAaSM0BKA*(6s>UGE`L!VleN`wWI&+ew(0*LVN-J7~TZ3qJh0$YtWx?CT+F zqF%fT8T}9-#Vom%30Z*5k`N(LXRZXRH>BVzIwJ2IzP2;J#JVrJ_9l{npYhUCP>pfI zBBb~6uJY@>1JM|~bv2f7ooB!R*eL@}w<$(dnZBfOyfFaiDXN=x;(nF*5wO+Wh55c! zN|54dSoU*Z{6U08y0sw07I6BiokrD74{LC|xIYPj5xCk1*r4~vf6*>eJBGr9Xk8@$ zK>J?vBLAs8{r73^m4FzAi?*z?(nz*(xWb&>{MCg|?8Xb$?b>Rt)L7z2 zmWzrr0^Oy}$h0n=Ym%;GxA4-}!>IM0=9OC6mK7ylpb#&xu$9|sLUv$h{ zU|VWZU8<@9Tq(YCk*?MvAjF)0bM(gxJHacA?yx;xm+k>KFC`xk2t-bzcWG;%EsCiS z^z`=9YugUOZKv@7lohk=RmU=DM@M;8b<PT82)ouF1y)*1>V9(@xi1yBf)Ow zjFRsTYwaDaWC(Z50E2czlLfVKa`bd^FiC|48Yl}PsXcC zDo5*;v27+y3ZumBh`h*4+ls%W?*|R9Zcng&c&UAuc#5Q1?^+gc+o=_Na!9*R>oRy6 zo9%*Y!;X>p;tV_Z<^;F)i=C!DE|1n;fY}X;m6&nPa=L!Gabc(H;fmOqQI=t#~*D%pe(NyJlk~=`+l3w*pSXde5(%N;ueb&eU9V;&&F7ep7 zGvLx&SgYwiB|Z2aci^5SsVTsQ3085UH*_uM&bmQYnPM3uUl2t+oZcMge{WtyS-U}N zttLjy&NdzGK5;A2^M{lYZGC8gOinD$@1g~F310Vyd&J;Y-#F$j=_mb=vgeH{!jYc+ zh-ZF^uvPhQsN|v)KW!JVRBoawhN@+!bDn&UQkFX`NG|QO7jz#+c7T!*#hNgpD1vUWg#Um4T%EWD_~)AT(_sW^+wg$4IV-u&)=upp`I3Nq^``?;Tr zrKRj71IA#j1$cPni|=3Jfr&BEM~R23Gz~=35}5S{s~5siX~A zxl)rwSKJ{y2e*Ww#R7kyt)z`&MD8XL;qNtH?Btrb1)Lb%cY(__m-H&I?Ezz(%zzoM zT>K+Z#r8B{s8`g$GO@ELaPzE+q|m9H1ZFtm5P0>nIE(bL^MZHG8K?K(5tqE5w%DNk zOwEyDS?3Tv?$F@Q|IeTI|4$>Hip4Yn;JGvcO%7-PqF!~2QG?h;65fp>56xALqgS%Z zqy8Vh{>7__bBzOq=ays=LYP2+aG!8TKmsC0B6bok1_TTU2r3vbDk|Ejh}5c`T)3!6 zBch_B4M>$%v;k?ws_i6zprSjdRkUh@+Sb;zMWrom-J3J}`_?&YopsJW|G}(e=6&Ah zcYQUU2)qnUX$@8~Kk|A>paZg1KM*c{E;HggZ}P&jh4QhYk8j`^d%~Smac!mghOO=u zf!ET%QGMdP^4{F~FD>^@ti89{-_Hbj$dBaT?-rJWPy0(`8aw*Bbm+@j9&^t=6Kle( ztd}GH4M*?UL47ETd9i0^ZK_su?`F|yuGs>@IrEh{FYF%mc$r$#g0z3PHKKgSlv&nq zNnQQJj>L$Ga5;GS-Vri<#xD=GOkPg~zyEUr^&S~3I=qS(SI1f+D7hb!!u7jz|60+u zWarxGWiwi)0Z_*~&RZM0E#+b$H!|yG;9`gP@gL-j=#5<~dw4qHHPjXsP|5tuc-;Mt z--IPGFmIenoZK*x!nne&tj&3;TCD_MMopwt<;~Urst9gMGB@^Pu*5^B7Cj)*f0r6V zNL)~)E|;ZHgfB0+SO{gkl5O(t7;oRJ!%Nf9$>Kw<^4aIMpmHH@P-$3237Bqimz#kp zk`MvN%!J#u-h1PVj>+P9@euy@`;_k>^xyXm$bJoD<@JtJ}W%n z6#rFt>~Lg$G#Hh-=$8tm?=P#XT>%&1&`{!WzYY-bQ|GV~?wN8GqF%B5MrHVCZ(hj= zR4_@5^6+b?n6cww?rL89&B(8)HimDIKMy=b-R$#w>)P5t#c&QFH4nw2qJqM~6ZXUk=QfzMg zCA-E)a3@ra0dGKV<-jApNHCmOP4tqVL;p^wfT1<`e~9f*vilQf(P~Baj4>^AwGLo} ztNflN2c$GInPG@&hsf=SIk9I>J+5MAUjyJc41UL8f|^VOARqyxIR=hV+7mMSkR+r4M6B8op&pZQQ#j!-EboQheIheYe!i8a z({o2k{-`gs23)tZ-Vp}E%zA4;rwxx8hS|tdBEf#*{96D<-CgjJQ2h z=JAI8v*2GeWpnIi;y#;kI}mMiGH6#ad8?P?(w2Q>8?PBRryiUoYLxRt6FFgPK0Y+Bb0)KKqL*_mq8cb8gj zL5C*>?Zj_6>QzSgX2ReCFRhUg*p8~}mage|<;#Y>XiyCKiOP08GAObtE|tq@{LQ)di}wAOzlDY6 zcmor!pAM|g>A0DLwLpv_Ct2L&^~R+ghca5gYFD)-g0aewa;^Ba(|m_KIFXby zdI)lVc@H>%4qW#riVqwP(o?TxSiH^nIOw5yi^1dg#|J7>fBT-w-u-jVfR1RJ#8PIg zRJZL*xLiT>vt|ts-HM#(o`uMst!6#i0{CK0{yB&?g{4=WY?wVpZPq)_em@Y4nLY74 zjSlZlFrH*APO!nE(arrV9-+(#8BWpfNk|$~!M@dIw~QD~!K98j#0}m})Nh_XG)o%Q ztARtKZ9pXAH}VRNdq_2Dotw(r23@LC#E_?>CD7=zL;Gq@9x{5{>K^|H(=+RW{_`Wx zOATCg5?r3pdj?J5gWrKl`ks>0ZF%Od`vB9!-gdHo)P0gqf8c8BEx*M4Y><7ytqRUT zzP}P(8c{BOLj*`_5!d=-Dj2%4hOoGpXZ^;&at7O?r8mz%8z3J3=kmW#JA8q9Zh$iX z(*!aR6R%}~#7C@_A1`Yq<4Aa0ee78G@k^`HxDeQ~&5{F?1vEB8K;f$DBaO$Cw8HxgTMy$nKkmhzZcY0}wsxVODj{;OzLx zIn`eS2ss1w@Fvk(Uo#wi8P|e^ZS2FI(vj|y2pKsX60Z9C>z&ctmqejZ1rCRf;GB0% z0LM#w6-ary5v#o6&}U%*IXtu0yDI2k zlgm3-4pMA5y3#y2GsU~g+o8F=Y6C?fQije?0vw|JXm=c?j2+IcVj)-E(SyZM;U^yB zEfyZD;OyPXg6Cd`_;M^M)w~i{4p}e4R}&eR+Gr|UdMStUU!YjcyNU)gyM~xiX)cT~|;v${pUTM4Qujx0n$(9Of;J9M;rShE~v*U-$ag0Z1`YXocVXOIZ)E6&iv=_9l*5BiyrLHDA^#>*)`q+zwT-^(W|rIo-ry@<4jJFOm& zUvwS_lrHGO?}G!fL~Mn(gkYR>pt^o$ta_7b(U$1upXKYeicYORQE-=nJ%qTQe3$QF zYoArg}?bqa)Q=o27C25ZK8^tFVq<+TByAk0LvGti; ze)*uB`P;{zr+WJtC~rCA-1DpQkYU+Nf|!`NSI81ronmT+Uuh4E=#z$soMZjjltjCv zBH<*TV3VWSwimDBw(pB+QWO1s0jjH`#Ai{@Q~kH0lUIosg_Xm^i&U{KJ;|AZqQ@Ja zosU^Gg2B%5`1^Y2u7kQaL%xUPgm%ZqWIT)5=g082B2bYt%u{X2H|XKH5=zbvR8vdHhQ;? zxD>-UPrD_{$fH+yQ;F{qNFXduf-Uq)!P_*tw~yP+n7?^=cH!cK;J_DPOg>rTt^wYt(08haU3PJX z0~zA*8r{4ZYu>>WOd(9&$X6?`zDIhF$+TWHox13ej$P6TFmXUPaVhAn2Gw(2O+`7S zEcTd%C9bAmbYdJ}$IDvODBtqpoh)j1?;0{DMd(mx0(9cm;D62$FO)t`2m6?EhgPRuN? z*s`a2A?i7$Cl^!|JU1V++^U5!M|@|STmxU?`j34-EHeX_+zZCK$>D6k!op(AXY#s) zm!ghIvfe+nC(MHQNL|%A^~d4)JAL!a8Tw*Lm8h(K>c##V_hU$mLP%{n;Ky>zKw?*} zIT*)t0LGme$`9FR$i=QHP*wlf6-QLC+HxyG8Y0o{Q2jZl)_Ymi{G#=(*o;faiFcMw zIYDr3ADex;LN;MAG90$h+7^P)!L1J%{8yzguWHR$NMiCDm)W=GUz@KmZCc4dz30`A z-E3rCa&wT>%+ZT$Hdi&L*rqiY6m==qp&?9fKKUsPX!8oCZty~6X!y6vQugDk;|6oL z8w*r_Oklh}jvOBG5><*>3H3<>#Rd$^19=Ay9<&jNvsoGLcmyoj`N3KMM1+-XDM5Qu zr-0~1DSdn-4GCWDfTDsFuZCS-CmEj++WS7Q5;Od@}>GJRS z&Gr&BYp}67Vh5ex6)Q2xSbp(GQr{~rwLM*g{q%V_`@r*NTm7sjeNb|4j~i2p_Syla z_twRf*qNGY-xVu(it*~YxuG{-fSh{ z>oeC>8=%N*sR>WKt-5MJ25&SDjP(RLNk2E{chvwJTGuKbM8%37r0Pf zhsB4n`CUhBoDjo44ojJ&xh6m-!Fn@~K1S8=Zi`UF?@P)8nh9*O#s?{$cCf=M4DE5U zw3Y?NeY5{ka@;rM#qD9hLfk57GU!Msf57J68Wb@uk(T)G$GFQ|0uyCM(%Lw8c6D3L z^_p#K{iI6fx2ri<#JPK79;Wom*n#!b9{=(WYzKQ~Y7HC^7`u;UK{kmP*eo}7K{69iP-z zv(JGie;0_la0vi1v|+?`D_-(yPp(+R-Hd@y9Im$x5}?;GAPv^m{g_pj?=v1CJ4!Xi z6zUM4i(cuU_BZm;ay&vI7s^X@7-7oR3sWMd#WJV<3h}O>2e`BqtMOFYS=B8DY`OVx zs8Nf}dLNWgrZ|2RzRX`lr%9RWojjZYA#QF1BvO?4TF5iir-Z<*gI?fJgfUVbm?Z>_Bm~=7Njb;2XccqGg9w{oI)r2y?+q(hStW=t5^^fJs4+nKNWgZ;GEcuZRkILIaZJILd$UBH~Hcs-|~R15aN zT$IR@4N!x;D3uo24j7p9aLDYseeB8uEqXJ3X!8u~|wF;oeH zP4VMvvbY%MY#!j&R4ro)l{L;IB=|$7BJG4%J)MKl$gK1Jh?}l z#+@fgTArdv0uzNYNnLyNGLa1v*CSB%#0q@Hhe*A zD}N!cS|fw%($4%bR?4#6I%KH*`fKFKK_}1t8z@w zIaP=vZs2bf;UQg}kO$-p)_X|@yRwQ~h?xZkLXfgCv#5($?#LC*eIwc+JRZuJAC5EI z3Gk~=>-%K=TEbg2Qt@Tz!B2@M5rb!}WuHoK@y<>E^=AgB<5NqNuNZu?3%T)*Y|ULTHOays)WyG+&g0G8s|oug~b z$&5fq1X{fEJ7s5-&Lee^9LBuv;)IURaJe&~5u3q!JuT(~&=o;Lj0YS8k* zif*iM10@fjQ`T_N{F99BmFdkb>?Kf1@R~R1z>ReuVSW z-f>z*%i*`c_n2uy?Fm?z2WY*R$AX#CcR1=9IJA>G6X2~%tn&&8miK#|G(;Nj!mpK1 zniQu>bh|@14w!!}J5k?lm;E+>qY}i3H1#5Vg~WpS^a|fox?6-OXK3NPI%2- z6K?P~zm$!C2oE2m(DESsnj0h|^`mEQV{78`9_+k;y=y+dE&c1sT-TeYYE%xijiSGU zD~6>@wy`TJh+k=#AelSov8JE(qttjc^7GXN{XQ=UYqrQ_zO&b5*ZP~0%$b)iQ^7TM zMo_Lw`^&+sOqSVVoWvMN-$1#;WN{Xtdu1w^0gXb^T8ihX0GU}Bny4=2ec$~I-SsVX zuR6a;+$ZMtPNc?UsK8r-(}6C9-#G68YCRtZ!#gGSA59DXV8l=qBTTixdF&N)OGh$( zawW^RS3K+3g9a8Ku+!VPR(82e5b`2>8(<`Tdrgd_2{2%66KocWm|jBH0E*%iUe@ue zRV)#W{Cjsi`|vr=VyBTZ?WAgT9k9?N=9R(OPNDoagVAHkOTQKZ9??@oc=@<%;MQN@ z+j2nIt3jg6+dSJyEzxINP}Q1@XJJ-UH33Jbh&bc{E%&KJw{W6)&z4?;>)LbD44qF9bN~I5bmX5iE>KN9Rt#;>wYbI1=}Nt=U~Qe|*0v ze2}}466K2_H)%B#m0+8O4h#SwiV{qSY7FpgYo0BX&H0VuMQDtES&Anvw4>H@6612Z z0Ck`NNQY$hjCk=>I~sCLiKH3p!pH0!Stl8@Lqjs-RRB<^^;oUa12_)HjmdJ^ z*J*&20Kwrd;h>TX&{3A=@L;C!P2(IC3=D+P{j$Fik+w8q4XSEUhv6(0#xdD2T6tpn3l@kEna$Q++Y7s-R$=>M(hH zPc1xF+&6)PGuHj@krLN(+BDW1s?8ohdl5)MCY)Hgg>%Wgrwna_yp^r1>aWB0I(GDgV!*Ytjp^%l+7_DNs`BJ=aXXm) zUz??Q8F82Zt2|P864lX{HAo1utG?S(?_DMH2>CX7A54C?B4|Nnrxl^i_hR!I)8!x5 zIOmUjFXD?D9`ENff+ZT7%PZ*fE1$NJ&qiwTG>_3Er}nh{Q5zU^#;B5Cq&OMkav^&O zBJ~eK<8|%?yBXL4Ib&%~0n4xQ5Z%Z0TeFv-cE|BU$lR2#-}{pUJ}uYLWYE?eEfZ7n zA$Lqg=y^fkn+fEbZu<%K44XB(a!5<~@0O^PGVhPnACD{82{_=hDA-fJ6q4cB6=6N_ zGZ}RJ3&<%wSVnQ2+2l1ryrl0VS8oG;g6%${<( zhM`#B3pKEh#8kvMyg_LRclw=8q_700p;bXM7ko@)peajTgU;f&!A1}#*t2jtKiS)K zQA9@CwFzoD@^>{iF#3cBl_q-5ooOor?DY%Zj-99h=C4 z@O{qhqh6Pp?|{;On6K7d3p@X2Nb$j2ZL0Ia%(zUK z=y8g-X4!gN?Fo&K+}bLb)qI?xG3$X42TiW+Q8)<(STdXCs=QGoy$vp0K5e}f+++^w zKNGZx*>!ry(S&t9*XEn$r0h5QkiyRqX7sLXCM%vO%DPjcdj@jpj1K z+C*Rp1K3BnEW-aZ!E?|`+CfP?Jgqo!Aje7i;%-yIy=7l7UGp;^h}B{IfzleG$A^`! z{?K1_+7D}f{WR& z0W3PGmP2;If1PD?p~=jRn4eeYI1G)$(%ZN(%y%43#!%19QchgF#n~ZY%^fS{RaK7* zhNXzq7jRlM@YIuuwh2-D$LnPVzYuy9R}g!Zj|im3D#MT_P+Si3T7)$*m&J(C+|Sr% z)Ctysd+>yDrvo_1wQKf-;~)CfiM6gfEcGQ*sx&8Y);8~cFmK{1XVw(y!r27Nf5B(^ z6M(IR%5?0P<1x1m2#qUjY#DB6jtD@a8wF{vR z6Hr+H6ckvsu40|1!Y}^8^aqMlJqG zXJLcGgiD-h#u7x^egP+!AE2OLgX_xw9~P(#S1~k~&P(RB%ANlBn_`{A^+kV|t(vQnrCodzwx|0gSPy{?g zcM~*>6;d(h*>dlRyr*=*zAn@d@Ot-gVw z($9JE#x&Q!+QZ(#fx;I>w>wBMk_SwOmp)_iszmX2Nx<_=H1Q*4DZ_5-c?CNArq?g+ zu^!@hS9*F%ohHPPlt9Pzi_Yy29s>^0`Sr|y$xIfnHNibHbg#xWD|r%B`tF41;h;En z_7D$QR)~U#LkY@IC)+Ad5V3t+3_9-%rWgYfcuvBS_zNJ@of-lQ2EBe%!ZXY{ z!P~`i5pDQ}a`wr6yxpSOkDk){WMK=CNs?E@0SE_JZNQI&~jvzj(S(?XFhpaILJkqv7*qqUPd8gC+BpsduKk_ zRq18NoEjeC7?aHco*F;Cbud0kT4Fv>=j3QL zs(gETg3``9-g;f#;1E0j(RN8Nhv!{EWxIb&N{Zm&YkPGoq|JiIpWcjpz;M~qa{vY% zD$6a9-Jh^Z=%`mdKjo;jD_Ltg+nCaL^!3bL&6^km%rF_#U7L2S>*lW+=#U-9CW!m( z-=4$#lY_L&NN3bx5~AiFeLeH5otOdlpw=&k73UWxBmI(I%N?P2Z26f&pXtdLiX@&Y zCScKkDi-y#jarxiwh0S!i?7Z0JU8&)gCULvoZj^wJwDFgdMG$@kpq8AKp}_vV|H6#_jtwCF2_ zhsD?K`s_kvj7R5!cbJfvUfB_*O2$pMgV=O7sdF>7c^FkgVl}v@wBF3Bx)CrP zD5ky?R@5AjJ-#8-UGx|sT>3T*JI}Hsa~)>SjtMJ&m}(3%>#;DpTVQO8QPlCw_m#B9 zLrpb0`&v=h5m3yzeVj#cotB>`TsBUCgh2#*-Vm%C8#j2ViTJk+`W`k0J_%nc0jv0*?$?RA;7!`o3t&_CtjRc{Gi!wZIQ zA{(yivm@X$Jp9(EAtZ%F{@s)!kgVyBxHk+i!)*|1);%dobN`GYT%OzD09!jFK?VIf zyb2CWv9jM$)%h#!)9GtAkJCTysku*RFGe2@g-^)^y);iGNnz$SkRgF$9p9i`zmEvQ|+2#B?fy%@{#jW`d+5jY+1i1v2|22>`^U*jD*a~`$ zc%$*$an?H;NZ3l=_EVcY^SW|Exhl`4_g=3G&MgMTd;_2+Kde~=lwMfcfNrEf_$6B!qME1&b|P=Qw}jY*TIZ%;!N-C zysv#-Ga>*Qu3PKFy0;!on4;JT0L&OGt(Q%-y9mmy{F$-0pee+u&_4G3=>!y}CO-|& zGH+Y_cL`ZDTjjD^-Pv@z?YJJ5ozz@8Eh!SJ|!Cacu zzp`%I`b$~E%n^&CW@0thu4lZZoVJ@bVF@_Q$Ht{Mx6;KEB@_Cf=WWdQfB_DmA%m3o z8IA_k6<=C)=G-I$ct1+5HR=T&s<6FrgfI;wmB7JQepV3IR46!KXTV4ROR4}x;&QJwtlGn~;$`SKj?N5L z$S2}yn6F8|67qyfin7+Zvzn^|pE8{@HoQ}Tc9-9Y=c&?bzhCNF0lAyUN^NE^nVzTe z^9yU#$cGFEmkv510588Fo{MPsjaE7%nw0f0-?eP7fjqq05S4K!1h z*D~D5`?R~C-Wj8?I`^{bB~5_)Xj~09w1wii&0I^}V*aqz!k#gF?N0(`OQ5~)1-JLM zhljtyjUaQl5XfM45dc^=QY(n!wuDH1S1ip6^;<_p2C>2O{zcNt zCQv@BVJ=2lL9UA#5+;~eTKC|URJI3ZR~f#HuT(}QJEtVXu${#4(3LM=c`Zk0rxF|5 zSl|CnZhOD`&O^@9dc0#lR@hn-eueQ$HnjKprL!5sO_&9&p40?O(xLTE4u`2$ESwz4_KAP~ht_*_v-$20(Skq9osEy2QR((~HDTZJTYE|O zb3Ny+^0R(FK0Xo!DWs_NOqf z@y)(Y_zuje>YIE(=|)#Zg`;B=$VJzy6tC}VsVOC9Xd2uGe}FHe2V`;&;@>oB>u2tS zacQ+xe|I10Hz!fiIacaAxEla>s;tZ%Zn1xiQs7!u%1Pn(bEE1@*&D?ysTyPx!|lj+ z&BOf(N?3RoU<3)#jI!BH*NxA?f?*Op1=NR4UEOx^qJ=wsf^u?hx~^x|16a0Q=SDAu zMsfg^ZL%uMWjhzR>aeZ^Pks5>*3EowTc9=DNu+qwmZPB{)iuGPE z&TgAy*ZVe`_T?y^vX)A$n92^#hb+!nn&iY0StHid?^KuhJn+5tFNJHfxSSgcp|mov z1ZiW%0x7~NF?{>?M!y|^KEB9;me@BPbd-NA=ukRUkxzZIrXcNWpl9RxuUY_vYlggg zm8ZjuR=-^~B>b}0SC-n(Z^amEb4@OpDOwC-1tss?#Mu8l0~)jK75kDN0R;IaEl{m8 z{2m;A^BKGHdSmZqE%$>8Ic^gp@kR@K!Bz;~PUxc3$j{D|$>`Pl{C(r6V5#^x>r)aK znr2dG!qz&{FOxd`lkwnheJ%83VlcNH>7W_F9kGxo#oqg1<$_`qIN)#!p??+SQ%i z&WP!Kjcik#iP&sBoGLqYr9xo|*$6CMArP5nD^6Fb2Y69pZn*1y1>Cey>k9weEl#@T z(rDLRKk*znH39l$_k8Z!HSSSbEi2xug7}ygM2Cr-H-t`N-r^cmD6A;kLVfnc;{pkJ zN=*PG+PCjRQeI0SX8`C{?6#GB|fv zRP%3>iz2sZonjJF5BD9`A1D-YoydNd$%*gC{~&!v7&a?P!^=1M(87t>X~)(Apk(jLjjffd%(T4N=4x-YhhFrKR{^*euVs( zD5mIs3SI|cPP}^VIPF{YinFPn;#ccj(r!gP)Hn3s?{+NzbmVO=Ba|x|^BT=-gXk$a z_MR-Z43u8k@$XPOA=TDEk;rn){_N^L=gv)?rGJX99>J>SZyFwXWZDA29b5G^Ad+2$ z*-wlb*A1Y8+3Sqc^~RNhTF_xT>`uI*^h&RUJXRYx#PpU09vc_j#EX7RO|p@dcePaZ zTC9?WU=>QfR#xq0e~3OmD+X9$XTwNF^&>lg;$^fr%YlH)8O@sjKh@9R9~69B@ump9 z7c$0>iU_-#ixc)71{p{?@gY+nrqZEKjh2yAt@ub5+FFVf@Km&Z&qKh#E1l!*sJJCB z{p6O!J!P1SqwmmRSxWax3mkbl^eTtFT&Z*3sHJ1c-OVR0%uKp0j=ith_H+wedCeyz zUw1EzoIf}kBz;dL_!0ami7IPny%1Shapv=>+>L`ZpfpqU&0zS?8;+F2KYC41q?{Br zGfg4PPc9zb(y}q}P$}^$Fuu3%|iMr)N9xc9d{EjG4K(UTVq6DLLK?e=Uvs z3hgNYi&Q3q46|$IO6MS2@W;uXpq?L{g?46Qf9n(4Fw)rw^X4b@k?ziLM9TToQ%oOc(bjlxXG-^E_0eS9<laa4J(kF0^&rQ?lRp1&K&&Ej;BwAfwtQ z=Z?vAz?Zdn{69;_T#e`Jy}oBB*!#KVqk5MyQsO|{eZ}K@ON>^h1ydH6#tDY7&$K%W z@8_=rIa^v_zY5uB=++*8({_?mj!OSXf2uFsYw@;?!q$vAB}u> zy%-7=znVq@GOf&{78y-N@;F54hYN=3Y*I@W4IuB{hMt~#YZM8OA4h_Q`}yrAhM2HO z!Av*s*@U_N@lD9%1tVyOmYvjr3j$U007$H?LU7=n7onWcSg~+wzY~9}CFLY`L&OE0 z-%%}Cu-86}HsGa*h`3q4L(h`-1@8Wx1z`)mdPu5hND8tpZ1rf(SA z`uf>X|1kTQw>!71S;AJT&a;v9n`a&6v-&E%{jgVkMO*15P3LTI%we#O-BDvtR3r$D_VR0_sZVSO1{N(l+C)BQocKiy=IUme!)Z94+p%f);}j%u_#M0+F2AA5(n0oe{1iO&4#@IwVR}a%iR1y8L$ye>Op` zH)e62>M74%rn>(%KOeA{V^;xMm7d{SSZe$K%}-SICvIV|p(xcq>eKzE+)9V$=&8(n z-R>|qLLlY?z=F~$iALOimFwm%ZsiYev_N_XmY6v~k{`m3V8vx3HmFOOUq!{m2GJ9& za(=`!Y9>gYTT%3-FK)5AWzofYbjrHCepb*}YW?P^5?N912)*yt+O9u|Wqi!2*h>jY|{Lu}>JTd@stpvIb-* zt~PNz3vGI59%-_y!8<+SdS0cH?K7TpY6a}92y%`pw}b~tvEfxK7dibr%**{DX@UZG z?B;iHBHkVfMl-uEJZIL$(vj^aO;dim04}+zMoJg8?seZ0p+x2x*?FKeG4Ijt^*`^o zILDHJuJl;+H3N6nux&81$;&hR5DTT3P-(e+ReKq4dNK%%BCaC@26fZq-Nqb9t*c8N;#tx`Hzt{Osu(2^xU^{s~;aNz@gATemm6<`KozlRm|7f|q ziCj7S@zcGRzfv15G_re_tP5_M#Nglg6W1W`5QF3e&W?IKr}~A=gs5a0B4R% z`BT5`_}b0lJiQuc752URP9aY60`2muK8le=u!6^8xkY54#|5gN|C)qcD{iKhn&pkU zT>ptyHK6dKI435wUK4HDtQU`28&$I2QXRhmukq}qg_pjis8}_`HYsX@?m~he#H_^2 z8csB-Mpkh9b(@h-j>T?ZRL|u{Cnyhwy|8=`Yf>?%0A?s<^=vSv1bq1aM|s1<48eEC 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 diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/parasite2.gif b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/parasite2.gif deleted file mode 100644 index 60d03c7d32dc0ffa190de50336ef6c672d7cf27a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32135 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μIB@O>;H0L{ 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 H>GuBxk&qhX diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/shock-gs.gif b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AnimatedGIFPanel/data/gifs/shock-gs.gif deleted file mode 100644 index 1d023d9d934b01a3ef99a2d6e79fa4189268081a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34454 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 magnitude * direction - return force; - } -}; diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/AuroraDemo.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/AuroraDemo.ino deleted file mode 100644 index 14b61be..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/AuroraDemo.ino +++ /dev/null @@ -1,150 +0,0 @@ -#include - -/*--------------------- MATRIX GPIO CONFIG -------------------------*/ -#define R1_PIN 25 -#define G1_PIN 26 -#define B1_PIN 27 -#define R2_PIN 14 -#define G2_PIN 12 -#define B2_PIN 13 -#define A_PIN 23 -#define B_PIN 19 // Changed from library default -#define C_PIN 5 -#define D_PIN 17 -#define E_PIN -1 -#define LAT_PIN 4 -#define OE_PIN 15 -#define CLK_PIN 16 - - -/*--------------------- MATRIX PANEL CONFIG -------------------------*/ -#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. -#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. -#define PANEL_CHAIN 1 // Total number of panels chained one to another - -/* -//Another way of creating config structure -//Custom pin mapping for all pins -HUB75_I2S_CFG::i2s_pins _pins={R1, G1, BL1, R2, G2, BL2, CH_A, CH_B, CH_C, CH_D, CH_E, LAT, OE, CLK}; -HUB75_I2S_CFG mxconfig( - 64, // width - 64, // height - 4, // chain length - _pins, // pin mapping - HUB75_I2S_CFG::FM6126A // driver chip -); - -*/ -MatrixPanel_I2S_DMA *dma_display = nullptr; - -// Module configuration -HUB75_I2S_CFG mxconfig( - PANEL_RES_X, // module width - PANEL_RES_Y, // module height - PANEL_CHAIN // Chain length -); - - -//mxconfig.gpio.e = -1; // Assign a pin if you have a 64x64 panel -//mxconfig.clkphase = false; // Change this if you have issues with ghosting. -//mxconfig.driver = HUB75_I2S_CFG::FM6126A; // Change this according to your pane. - - - -#include - -#include "Effects.h" -Effects effects; - -#include "Drawable.h" -#include "Playlist.h" -//#include "Geometry.h" - -#include "Patterns.h" -Patterns patterns; - -/* -------------------------- Some variables -------------------------- */ -unsigned long fps = 0, fps_timer; // fps (this is NOT a matrix refresh rate!) -unsigned int default_fps = 30, pattern_fps = 30; // default fps limit (this is not a matrix refresh counter!) -unsigned long ms_animation_max_duration = 20000; // 20 seconds -unsigned long last_frame=0, ms_previous=0; - -void setup() -{ - /************** SERIAL **************/ - Serial.begin(115200); - delay(250); - - /************** DISPLAY **************/ - Serial.println("...Starting Display"); - dma_display = new MatrixPanel_I2S_DMA(mxconfig); - dma_display->begin(); - dma_display->setBrightness8(90); //0-255 - - dma_display->fillScreenRGB888(128,0,0); - delay(1000); - dma_display->fillScreenRGB888(0,0,128); - delay(1000); - dma_display->clearScreen(); - delay(1000); - Serial.println("**************** Starting Aurora Effects Demo ****************"); - - - // setup the effects generator - effects.Setup(); - - delay(500); - Serial.println("Effects being loaded: "); - listPatterns(); - - - patterns.moveRandom(1); // start from a random pattern - - Serial.print("Starting with pattern: "); - Serial.println(patterns.getCurrentPatternName()); - patterns.start(); - ms_previous = millis(); - fps_timer = millis(); -} - -void loop() -{ - // menu.run(mainMenuItems, mainMenuItemCount); - - if ( (millis() - ms_previous) > ms_animation_max_duration ) - { - patterns.stop(); - patterns.moveRandom(1); - //patterns.move(1); - patterns.start(); - - Serial.print("Changing pattern to: "); - Serial.println(patterns.getCurrentPatternName()); - - ms_previous = millis(); - - // Select a random palette as well - //effects.RandomPalette(); - } - - if ( 1000 / pattern_fps + last_frame < millis()){ - last_frame = millis(); - pattern_fps = patterns.drawFrame(); - if (!pattern_fps) - pattern_fps = default_fps; - - ++fps; - } - - if (fps_timer + 1000 < millis()){ - Serial.printf_P(PSTR("Effect fps: %ld\n"), fps); - fps_timer = millis(); - fps = 0; - } - -} - - -void listPatterns() { - patterns.listPatterns(); -} \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Boid.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Boid.h deleted file mode 100644 index 61a1758..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Boid.h +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from "Flocking" in "The Nature of Code" by Daniel Shiffman: http://natureofcode.com/ - * Copyright (c) 2014 Daniel Shiffman - * http://www.shiffman.net - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -// Flocking -// Daniel Shiffman -// The Nature of Code, Spring 2009 - -// Boid class -// Methods for Separation, Cohesion, Alignment added - -class Boid { - public: - - PVector location; - PVector velocity; - PVector acceleration; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - float desiredseparation = 4; - float neighbordist = 8; - byte colorIndex = 0; - float mass; - - boolean enabled = true; - - Boid() {} - - Boid(float x, float y) { - acceleration = PVector(0, 0); - velocity = PVector(randomf(), randomf()); - location = PVector(x, y); - maxspeed = 1.5; - maxforce = 0.05; - } - - static float randomf() { - return mapfloat(random(0, 255), 0, 255, -.5, .5); - } - - static float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) { - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; - } - - void run(Boid boids [], uint8_t boidCount) { - flock(boids, boidCount); - update(); - // wrapAroundBorders(); - // render(); - } - - // Method to update location - void update() { - // Update velocity - velocity += acceleration; - // Limit speed - velocity.limit(maxspeed); - location += velocity; - // Reset acceleration to 0 each cycle - acceleration *= 0; - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration += force; - } - - void repelForce(PVector obstacle, float radius) { - //Force that drives boid away from obstacle. - - PVector futPos = location + velocity; //Calculate future position for more effective behavior. - PVector dist = obstacle - futPos; - float d = dist.mag(); - - if (d <= radius) { - PVector repelVec = location - obstacle; - repelVec.normalize(); - if (d != 0) { //Don't divide by zero. - // float scale = 1.0 / d; //The closer to the obstacle, the stronger the force. - repelVec.normalize(); - repelVec *= (maxforce * 7); - if (repelVec.mag() < 0) { //Don't let the boids turn around to avoid the obstacle. - repelVec.y = 0; - } - } - applyForce(repelVec); - } - } - - // We accumulate a new acceleration each time based on three rules - void flock(Boid boids [], uint8_t boidCount) { - PVector sep = separate(boids, boidCount); // Separation - PVector ali = align(boids, boidCount); // Alignment - PVector coh = cohesion(boids, boidCount); // Cohesion - // Arbitrarily weight these forces - sep *= 1.5; - ali *= 1.0; - coh *= 1.0; - // Add the force vectors to acceleration - applyForce(sep); - applyForce(ali); - applyForce(coh); - } - - // Separation - // Method checks for nearby boids and steers away - PVector separate(Boid boids [], uint8_t boidCount) { - PVector steer = PVector(0, 0); - int count = 0; - // For every boid in the system, check if it's too close - for (int i = 0; i < boidCount; i++) { - Boid other = boids[i]; - if (!other.enabled) - continue; - float d = location.dist(other.location); - // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) - if ((d > 0) && (d < desiredseparation)) { - // Calculate vector pointing away from neighbor - PVector diff = location - other.location; - diff.normalize(); - diff /= d; // Weight by distance - steer += diff; - count++; // Keep track of how many - } - } - // Average -- divide by how many - if (count > 0) { - steer /= (float) count; - } - - // As long as the vector is greater than 0 - if (steer.mag() > 0) { - // Implement Reynolds: Steering = Desired - Velocity - steer.normalize(); - steer *= maxspeed; - steer -= velocity; - steer.limit(maxforce); - } - return steer; - } - - // Alignment - // For every nearby boid in the system, calculate the average velocity - PVector align(Boid boids [], uint8_t boidCount) { - PVector sum = PVector(0, 0); - int count = 0; - for (int i = 0; i < boidCount; i++) { - Boid other = boids[i]; - if (!other.enabled) - continue; - float d = location.dist(other.location); - if ((d > 0) && (d < neighbordist)) { - sum += other.velocity; - count++; - } - } - if (count > 0) { - sum /= (float) count; - sum.normalize(); - sum *= maxspeed; - PVector steer = sum - velocity; - steer.limit(maxforce); - return steer; - } - else { - return PVector(0, 0); - } - } - - // Cohesion - // For the average location (i.e. center) of all nearby boids, calculate steering vector towards that location - PVector cohesion(Boid boids [], uint8_t boidCount) { - PVector sum = PVector(0, 0); // Start with empty vector to accumulate all locations - int count = 0; - for (int i = 0; i < boidCount; i++) { - Boid other = boids[i]; - if (!other.enabled) - continue; - float d = location.dist(other.location); - if ((d > 0) && (d < neighbordist)) { - sum += other.location; // Add location - count++; - } - } - if (count > 0) { - sum /= count; - return seek(sum); // Steer towards the location - } - else { - return PVector(0, 0); - } - } - - // A method that calculates and applies a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - PVector seek(PVector target) { - PVector desired = target - location; // A vector pointing from the location to the target - // Normalize desired and scale to maximum speed - desired.normalize(); - desired *= maxspeed; - // Steering = Desired minus Velocity - PVector steer = desired - velocity; - steer.limit(maxforce); // Limit to maximum steering force - return steer; - } - - // A method that calculates a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - void arrive(PVector target) { - PVector desired = target - location; // A vector pointing from the location to the target - float d = desired.mag(); - // Normalize desired and scale with arbitrary damping within 100 pixels - desired.normalize(); - if (d < 4) { - float m = map(d, 0, 100, 0, maxspeed); - desired *= m; - } - else { - desired *= maxspeed; - } - - // Steering = Desired minus Velocity - PVector steer = desired - velocity; - steer.limit(maxforce); // Limit to maximum steering force - applyForce(steer); - //Serial.println(d); - } - - void wrapAroundBorders() { - if (location.x < 0) location.x = MATRIX_WIDTH - 1; - if (location.y < 0) location.y = MATRIX_HEIGHT - 1; - if (location.x >= MATRIX_WIDTH) location.x = 0; - if (location.y >= MATRIX_HEIGHT) location.y = 0; - } - - void avoidBorders() { - PVector desired = velocity; - - if (location.x < 8) desired = PVector(maxspeed, velocity.y); - if (location.x >= MATRIX_WIDTH - 8) desired = PVector(-maxspeed, velocity.y); - if (location.y < 8) desired = PVector(velocity.x, maxspeed); - if (location.y >= MATRIX_HEIGHT - 8) desired = PVector(velocity.x, -maxspeed); - - if (desired != velocity) { - PVector steer = desired - velocity; - steer.limit(maxforce); - applyForce(steer); - } - - if (location.x < 0) location.x = 0; - if (location.y < 0) location.y = 0; - if (location.x >= MATRIX_WIDTH) location.x = MATRIX_WIDTH - 1; - if (location.y >= MATRIX_HEIGHT) location.y = MATRIX_HEIGHT - 1; - } - - bool bounceOffBorders(float bounce) { - bool bounced = false; - - if (location.x >= MATRIX_WIDTH) { - location.x = MATRIX_WIDTH - 1; - velocity.x *= -bounce; - bounced = true; - } - else if (location.x < 0) { - location.x = 0; - velocity.x *= -bounce; - bounced = true; - } - - if (location.y >= MATRIX_HEIGHT) { - location.y = MATRIX_HEIGHT - 1; - velocity.y *= -bounce; - bounced = true; - } - else if (location.y < 0) { - location.y = 0; - velocity.y *= -bounce; - bounced = true; - } - - return bounced; - } - - void render() { - //// Draw a triangle rotated in the direction of velocity - //float theta = velocity.heading2D() + radians(90); - //fill(175); - //stroke(0); - //pushMatrix(); - //translate(location.x,location.y); - //rotate(theta); - //beginShape(TRIANGLES); - //vertex(0, -r*2); - //vertex(-r, r*2); - //vertex(r, r*2); - //endShape(); - //popMatrix(); - //dma_display->drawBackgroundPixelRGB888(location.x, location.y, CRGB::Blue); - } -}; - -static const uint8_t AVAILABLE_BOID_COUNT = 40; -Boid boids[AVAILABLE_BOID_COUNT]; diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Drawable.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Drawable.h deleted file mode 100644 index 56b3eb2..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Drawable.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Drawable_H -#define Drawable_H - -class Drawable{ -public: - char* name; - - virtual bool isRunnable() { - return false; - } - - virtual bool isPlaylist() { - return false; - } - - // a single frame should be drawn as fast as possible, without any delay or blocking - // return how many millisecond delay is requested before the next call to drawFrame() - virtual unsigned int drawFrame() { - dma_display->fillScreen(0); - //backgroundLayer.fillScreen({ 0, 0, 0 }); - return 0; - }; - - virtual void printTesting() - { - Serial.println("Testing..."); - } - - virtual void start() {}; - virtual void stop() {}; -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Effects.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Effects.h deleted file mode 100644 index 1b50329..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Effects.h +++ /dev/null @@ -1,848 +0,0 @@ - -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from "Funky Clouds" by Stefan Petrick: https://gist.github.com/anonymous/876f908333cd95315c35 - * Portions of this code are adapted from "NoiseSmearing" by Stefan Petrick: https://gist.github.com/StefanPetrick/9ee2f677dbff64e3ba7a - * Copyright (c) 2014 Stefan Petrick - * http://www.stefan-petrick.de/wordpress_beta - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Effects_H -#define Effects_H - -/* ---------------------------- GLOBAL CONSTANTS ----------------------------- */ - -const int MATRIX_CENTER_X = MATRIX_WIDTH / 2; -const int MATRIX_CENTER_Y = MATRIX_HEIGHT / 2; -// US vs GB, huh? :) -//const byte MATRIX_CENTRE_X = MATRIX_CENTER_X - 1; -//const byte MATRIX_CENTRE_Y = MATRIX_CENTER_Y - 1; -#define MATRIX_CENTRE_X MATRIX_CENTER_X -#define MATRIX_CENTRE_Y MATRIX_CENTER_Y - - -const uint16_t NUM_LEDS = (MATRIX_WIDTH * MATRIX_HEIGHT) + 1; // one led spare to capture out of bounds - -// forward declaration -uint16_t XY16( uint16_t x, uint16_t y); - -/* Convert x,y co-ordinate to flat array index. - * x and y positions start from 0, so must not be >= 'real' panel width or height - * (i.e. 64 pixels or 32 pixels.). Max value: MATRIX_WIDTH-1 etc. - * Ugh... uint8_t - really??? this weak method can't cope with 256+ pixel matrices :( - */ -uint16_t XY( uint8_t x, uint8_t y) -{ - return XY16(x, y); -} - -/** - * The one for 256+ matrices - * otherwise this: - * for (uint8_t i = 0; i < MATRIX_WIDTH; i++) {} - * turns into an infinite loop - */ -uint16_t XY16( uint16_t x, uint16_t y) -{ - if( x >= MATRIX_WIDTH) return 0; - if( y >= MATRIX_HEIGHT) return 0; - - return (y * MATRIX_WIDTH) + x + 1; // everything offset by one to compute out of bounds stuff - never displayed by ShowFrame() -} - - -uint8_t beatcos8(accum88 beats_per_minute, uint8_t lowest = 0, uint8_t highest = 255, uint32_t timebase = 0, uint8_t phase_offset = 0) -{ - uint8_t beat = beat8(beats_per_minute, timebase); - uint8_t beatcos = cos8(beat + phase_offset); - uint8_t rangewidth = highest - lowest; - uint8_t scaledbeat = scale8(beatcos, rangewidth); - uint8_t result = lowest + scaledbeat; - return result; -} - -uint8_t mapsin8(uint8_t theta, uint8_t lowest = 0, uint8_t highest = 255) { - uint8_t beatsin = sin8(theta); - uint8_t rangewidth = highest - lowest; - uint8_t scaledbeat = scale8(beatsin, rangewidth); - uint8_t result = lowest + scaledbeat; - return result; -} - -uint8_t mapcos8(uint8_t theta, uint8_t lowest = 0, uint8_t highest = 255) { - uint8_t beatcos = cos8(theta); - uint8_t rangewidth = highest - lowest; - uint8_t scaledbeat = scale8(beatcos, rangewidth); - uint8_t result = lowest + scaledbeat; - return result; -} - -// Array of temperature readings at each simulation cell -//byte heat[NUM_LEDS]; // none of the currently enabled effects uses this - -uint32_t noise_x; -uint32_t noise_y; -uint32_t noise_z; -uint32_t noise_scale_x; -uint32_t noise_scale_y; - -//uint8_t noise[MATRIX_WIDTH][MATRIX_HEIGHT]; -uint8_t **noise = nullptr; // we will allocate mem later -uint8_t noisesmoothing; - -class Effects { -public: - CRGB *leds; - //CRGB leds[NUM_LEDS]; - //CRGB leds2[NUM_LEDS]; // Faptastic: getting rid of this and any dependant effects or algos. to save memory 24*64*32 bytes of ram (50k). - - Effects(){ - // we do dynamic allocation for leds buffer, otherwise esp32 toolchain can't link static arrays of such a big size for 256+ matrices - leds = (CRGB *)malloc(NUM_LEDS * sizeof(CRGB)); - - // allocate mem for noise effect - // (there should be some guards for malloc errors eventually) - noise = (uint8_t **)malloc(MATRIX_WIDTH * sizeof(uint8_t *)); - for (int i = 0; i < MATRIX_WIDTH; ++i) { - noise[i] = (uint8_t *)malloc(MATRIX_HEIGHT * sizeof(uint8_t)); - } - - ClearFrame(); - //dma_display->clearScreen(); - } - ~Effects(){ - free(leds); - for (int i = 0; i < MATRIX_WIDTH; ++i) { - free(noise[i]); - } - free(noise); - } - - /* The only 'framebuffer' we have is what is contained in the leds and leds2 variables. - * We don't store what the color a particular pixel might be, other than when it's turned - * into raw electrical signal output gobbly-gook (i.e. the DMA matrix buffer), but this * is not reversible. - * - * As such, any time these effects want to write a pixel color, we first have to update - * the leds or leds2 array, and THEN write it to the RGB panel. This enables us to 'look up' the array to see what a pixel color was previously, each drawFrame(). - */ - void drawBackgroundFastLEDPixelCRGB(int16_t x, int16_t y, CRGB color) - { - leds[XY(x, y)] = color; - //dma_display->drawPixelRGB888(x, y, color.r, color.g, color.b); - } - - // write one pixel with the specified color from the current palette to coordinates - void Pixel(int x, int y, uint8_t colorIndex) { - leds[XY(x, y)] = ColorFromCurrentPalette(colorIndex); - //dma_display->drawPixelRGB888(x, y, temp.r, temp.g, temp.b); // now draw it? - } - - void PrepareFrame() { - // leds = (CRGB*) backgroundLayer.backBuffer(); - } - - void ShowFrame() { - //#if (FASTLED_VERSION >= 3001000) - // nblendPaletteTowardPalette(currentPalette, targetPalette, 24); - //#else - currentPalette = targetPalette; - //#endif - - // backgroundLayer.swapBuffers(); - // leds = (CRGB*) backgroundLayer.backBuffer(); - // LEDS.countFPS(); - - for (int y=0; ydrawPixelRGB888( x, y, leds[_pixel].r, leds[_pixel].g, leds[_pixel].b); - } // end loop to copy fast led to the dma matrix - } - } - - // scale the brightness of the screenbuffer down - void DimAll(byte value) - { - for (int i = 0; i < NUM_LEDS; i++) - { - leds[i].nscale8(value); - } - } - - void ClearFrame() - { - memset(leds, 0x00, NUM_LEDS * sizeof(CRGB)); // flush - } - - - -/* - void CircleStream(uint8_t value) { - DimAll(value); ShowFrame(); - - for (uint8_t offset = 0; offset < MATRIX_CENTER_X; offset++) { - boolean hasprev = false; - uint16_t prevxy = 0; - - for (uint8_t theta = 0; theta < 255; theta++) { - uint8_t x = mapcos8(theta, offset, (MATRIX_WIDTH - 1) - offset); - uint8_t y = mapsin8(theta, offset, (MATRIX_HEIGHT - 1) - offset); - - uint16_t xy = XY(x, y); - - if (hasprev) { - leds[prevxy] += leds[xy]; - } - - prevxy = xy; - hasprev = true; - } - } - - for (uint8_t x = 0; x < MATRIX_WIDTH; x++) { - for (uint8_t y = 0; y < MATRIX_HEIGHT; y++) { - uint16_t xy = XY(x, y); - leds[xy] = leds2[xy]; - leds[xy].nscale8(value); - leds2[xy].nscale8(value); - } - } - } -*/ - - // palettes - static const int paletteCount = 10; - int paletteIndex = -1; - TBlendType currentBlendType = LINEARBLEND; - CRGBPalette16 currentPalette; - CRGBPalette16 targetPalette; - char* currentPaletteName; - - static const int HeatColorsPaletteIndex = 6; - static const int RandomPaletteIndex = 9; - - void Setup() { - currentPalette = RainbowColors_p; - loadPalette(0); - NoiseVariablesSetup(); - } - - void CyclePalette(int offset = 1) { - loadPalette(paletteIndex + offset); - } - - void RandomPalette() { - loadPalette(RandomPaletteIndex); - } - - void loadPalette(int index) { - paletteIndex = index; - - if (paletteIndex >= paletteCount) - paletteIndex = 0; - else if (paletteIndex < 0) - paletteIndex = paletteCount - 1; - - switch (paletteIndex) { - case 0: - targetPalette = RainbowColors_p; - currentPaletteName = (char *)"Rainbow"; - break; - //case 1: - // targetPalette = RainbowStripeColors_p; - // currentPaletteName = (char *)"RainbowStripe"; - // break; - case 1: - targetPalette = OceanColors_p; - currentPaletteName = (char *)"Ocean"; - break; - case 2: - targetPalette = CloudColors_p; - currentPaletteName = (char *)"Cloud"; - break; - case 3: - targetPalette = ForestColors_p; - currentPaletteName = (char *)"Forest"; - break; - case 4: - targetPalette = PartyColors_p; - currentPaletteName = (char *)"Party"; - break; - case 5: - setupGrayscalePalette(); - currentPaletteName = (char *)"Grey"; - break; - case HeatColorsPaletteIndex: - targetPalette = HeatColors_p; - currentPaletteName = (char *)"Heat"; - break; - case 7: - targetPalette = LavaColors_p; - currentPaletteName = (char *)"Lava"; - break; - case 8: - setupIcePalette(); - currentPaletteName = (char *)"Ice"; - break; - case RandomPaletteIndex: - loadPalette(random(0, paletteCount - 1)); - paletteIndex = RandomPaletteIndex; - currentPaletteName = (char *)"Random"; - break; - } - } - - void setPalette(String paletteName) { - if (paletteName == "Rainbow") - loadPalette(0); - //else if (paletteName == "RainbowStripe") - // loadPalette(1); - else if (paletteName == "Ocean") - loadPalette(1); - else if (paletteName == "Cloud") - loadPalette(2); - else if (paletteName == "Forest") - loadPalette(3); - else if (paletteName == "Party") - loadPalette(4); - else if (paletteName == "Grayscale") - loadPalette(5); - else if (paletteName == "Heat") - loadPalette(6); - else if (paletteName == "Lava") - loadPalette(7); - else if (paletteName == "Ice") - loadPalette(8); - else if (paletteName == "Random") - RandomPalette(); - } - - void listPalettes() { - Serial.println(F("{")); - Serial.print(F(" \"count\": ")); - Serial.print(paletteCount); - Serial.println(","); - Serial.println(F(" \"results\": [")); - - String paletteNames [] = { - "Rainbow", - // "RainbowStripe", - "Ocean", - "Cloud", - "Forest", - "Party", - "Grayscale", - "Heat", - "Lava", - "Ice", - "Random" - }; - - for (int i = 0; i < paletteCount; i++) { - Serial.print(F(" \"")); - Serial.print(paletteNames[i]); - if (i == paletteCount - 1) - Serial.println(F("\"")); - else - Serial.println(F("\",")); - } - - Serial.println(" ]"); - Serial.println("}"); - } - - void setupGrayscalePalette() { - targetPalette = CRGBPalette16(CRGB::Black, CRGB::White); - } - - void setupIcePalette() { - targetPalette = CRGBPalette16(CRGB::Black, CRGB::Blue, CRGB::Aqua, CRGB::White); - } - - // Oscillators and Emitters - - // the oscillators: linear ramps 0-255 - byte osci[6]; - - // sin8(osci) swinging between 0 to MATRIX_WIDTH - 1 - byte p[6]; - - // set the speeds (and by that ratios) of the oscillators here - void MoveOscillators() { - osci[0] = osci[0] + 5; - osci[1] = osci[1] + 2; - osci[2] = osci[2] + 3; - osci[3] = osci[3] + 4; - osci[4] = osci[4] + 1; - if (osci[4] % 2 == 0) - osci[5] = osci[5] + 1; // .5 - for (int i = 0; i < 4; i++) { - p[i] = map8(sin8(osci[i]), 0, MATRIX_WIDTH - 1); //why? to keep the result in the range of 0-MATRIX_WIDTH (matrix size) - } - } - - - // All the caleidoscope functions work directly within the screenbuffer (leds array). - // Draw whatever you like in the area x(0-15) and y (0-15) and then copy it arround. - - // rotates the first 16x16 quadrant 3 times onto a 32x32 (+90 degrees rotation for each one) - void Caleidoscope1() { - for (int x = 0; x < MATRIX_CENTER_X; x++) { - for (int y = 0; y < MATRIX_CENTER_Y; y++) { - leds[XY16(MATRIX_WIDTH - 1 - x, y)] = leds[XY16(x, y)]; - leds[XY16(MATRIX_WIDTH - 1 - x, MATRIX_HEIGHT - 1 - y)] = leds[XY16(x, y)]; - leds[XY16(x, MATRIX_HEIGHT - 1 - y)] = leds[XY16(x, y)]; - } - } - } - - - // mirror the first 16x16 quadrant 3 times onto a 32x32 - void Caleidoscope2() { - for (int x = 0; x < MATRIX_CENTER_X; x++) { - for (int y = 0; y < MATRIX_CENTER_Y; y++) { - leds[XY16(MATRIX_WIDTH - 1 - x, y)] = leds[XY16(y, x)]; - leds[XY16(x, MATRIX_HEIGHT - 1 - y)] = leds[XY16(y, x)]; - leds[XY16(MATRIX_WIDTH - 1 - x, MATRIX_HEIGHT - 1 - y)] = leds[XY16(x, y)]; - } - } - } - - // copy one diagonal triangle into the other one within a 16x16 - void Caleidoscope3() { - for (int x = 0; x <= MATRIX_CENTRE_X && x < MATRIX_HEIGHT; x++) { - for (int y = 0; y <= x && y= 0; y--) { - leds[XY16(x, y)] = leds[XY16(y, x)]; - } - } - } - - void Caleidoscope6() { - for (int x = 1; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 7)] = leds[XY16(x, 0)]; - } //a - for (int x = 2; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 6)] = leds[XY16(x, 1)]; - } //b - for (int x = 3; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 5)] = leds[XY16(x, 2)]; - } //c - for (int x = 4; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 4)] = leds[XY16(x, 3)]; - } //d - for (int x = 5; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 3)] = leds[XY16(x, 4)]; - } //e - for (int x = 6; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 2)] = leds[XY16(x, 5)]; - } //f - for (int x = 7; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 1)] = leds[XY16(x, 6)]; - } //g - } - - // create a square twister to the left or counter-clockwise - // x and y for center, r for radius - void SpiralStream(int x, int y, int r, byte dimm) { - for (int d = r; d >= 0; d--) { // from the outside to the inside - for (int i = x - d; i <= x + d; i++) { - leds[XY16(i, y - d)] += leds[XY16(i + 1, y - d)]; // lowest row to the right - leds[XY16(i, y - d)].nscale8(dimm); - } - for (int i = y - d; i <= y + d; i++) { - leds[XY16(x + d, i)] += leds[XY16(x + d, i + 1)]; // right column up - leds[XY16(x + d, i)].nscale8(dimm); - } - for (int i = x + d; i >= x - d; i--) { - leds[XY16(i, y + d)] += leds[XY16(i - 1, y + d)]; // upper row to the left - leds[XY16(i, y + d)].nscale8(dimm); - } - for (int i = y + d; i >= y - d; i--) { - leds[XY16(x - d, i)] += leds[XY16(x - d, i - 1)]; // left column down - leds[XY16(x - d, i)].nscale8(dimm); - } - } - } - - // expand everything within a circle - void Expand(int centerX, int centerY, int radius, byte dimm) { - if (radius == 0) - return; - - int currentRadius = radius; - - while (currentRadius > 0) { - int a = radius, b = 0; - int radiusError = 1 - a; - - int nextRadius = currentRadius - 1; - int nextA = nextRadius - 1, nextB = 0; - int nextRadiusError = 1 - nextA; - - while (a >= b) - { - // move them out one pixel on the radius - leds[XY16(a + centerX, b + centerY)] = leds[XY16(nextA + centerX, nextB + centerY)]; - leds[XY16(b + centerX, a + centerY)] = leds[XY16(nextB + centerX, nextA + centerY)]; - leds[XY16(-a + centerX, b + centerY)] = leds[XY16(-nextA + centerX, nextB + centerY)]; - leds[XY16(-b + centerX, a + centerY)] = leds[XY16(-nextB + centerX, nextA + centerY)]; - leds[XY16(-a + centerX, -b + centerY)] = leds[XY16(-nextA + centerX, -nextB + centerY)]; - leds[XY16(-b + centerX, -a + centerY)] = leds[XY16(-nextB + centerX, -nextA + centerY)]; - leds[XY16(a + centerX, -b + centerY)] = leds[XY16(nextA + centerX, -nextB + centerY)]; - leds[XY16(b + centerX, -a + centerY)] = leds[XY16(nextB + centerX, -nextA + centerY)]; - - // dim them - leds[XY16(a + centerX, b + centerY)].nscale8(dimm); - leds[XY16(b + centerX, a + centerY)].nscale8(dimm); - leds[XY16(-a + centerX, b + centerY)].nscale8(dimm); - leds[XY16(-b + centerX, a + centerY)].nscale8(dimm); - leds[XY16(-a + centerX, -b + centerY)].nscale8(dimm); - leds[XY16(-b + centerX, -a + centerY)].nscale8(dimm); - leds[XY16(a + centerX, -b + centerY)].nscale8(dimm); - leds[XY16(b + centerX, -a + centerY)].nscale8(dimm); - - b++; - if (radiusError < 0) - radiusError += 2 * b + 1; - else - { - a--; - radiusError += 2 * (b - a + 1); - } - - nextB++; - if (nextRadiusError < 0) - nextRadiusError += 2 * nextB + 1; - else - { - nextA--; - nextRadiusError += 2 * (nextB - nextA + 1); - } - } - - currentRadius--; - } - } - - // give it a linear tail to the right - void StreamRight(byte scale, int fromX = 0, int toX = MATRIX_WIDTH, int fromY = 0, int toY = MATRIX_HEIGHT) - { - for (int x = fromX + 1; x < toX; x++) { - for (int y = fromY; y < toY; y++) { - leds[XY16(x, y)] += leds[XY16(x - 1, y)]; - leds[XY16(x, y)].nscale8(scale); - } - } - for (int y = fromY; y < toY; y++) - leds[XY16(0, y)].nscale8(scale); - } - - // give it a linear tail to the left - void StreamLeft(byte scale, int fromX = MATRIX_WIDTH, int toX = 0, int fromY = 0, int toY = MATRIX_HEIGHT) - { - for (int x = toX; x < fromX; x++) { - for (int y = fromY; y < toY; y++) { - leds[XY16(x, y)] += leds[XY16(x + 1, y)]; - leds[XY16(x, y)].nscale8(scale); - } - } - for (int y = fromY; y < toY; y++) - leds[XY16(0, y)].nscale8(scale); - } - - // give it a linear tail downwards - void StreamDown(byte scale) - { - for (int x = 0; x < MATRIX_WIDTH; x++) { - for (int y = 1; y < MATRIX_HEIGHT; y++) { - leds[XY16(x, y)] += leds[XY16(x, y - 1)]; - leds[XY16(x, y)].nscale8(scale); - } - } - for (int x = 0; x < MATRIX_WIDTH; x++) - leds[XY16(x, 0)].nscale8(scale); - } - - // give it a linear tail upwards - void StreamUp(byte scale) - { - for (int x = 0; x < MATRIX_WIDTH; x++) { - for (int y = MATRIX_HEIGHT - 2; y >= 0; y--) { - leds[XY16(x, y)] += leds[XY16(x, y + 1)]; - leds[XY16(x, y)].nscale8(scale); - } - } - for (int x = 0; x < MATRIX_WIDTH; x++) - leds[XY16(x, MATRIX_HEIGHT - 1)].nscale8(scale); - } - - // give it a linear tail up and to the left - void StreamUpAndLeft(byte scale) - { - for (int x = 0; x < MATRIX_WIDTH - 1; x++) { - for (int y = MATRIX_HEIGHT - 2; y >= 0; y--) { - leds[XY16(x, y)] += leds[XY16(x + 1, y + 1)]; - leds[XY16(x, y)].nscale8(scale); - } - } - for (int x = 0; x < MATRIX_WIDTH; x++) - leds[XY16(x, MATRIX_HEIGHT - 1)].nscale8(scale); - for (int y = 0; y < MATRIX_HEIGHT; y++) - leds[XY16(MATRIX_WIDTH - 1, y)].nscale8(scale); - } - - // give it a linear tail up and to the right - void StreamUpAndRight(byte scale) - { - for (int x = 0; x < MATRIX_WIDTH - 1; x++) { - for (int y = MATRIX_HEIGHT - 2; y >= 0; y--) { - leds[XY16(x + 1, y)] += leds[XY16(x, y + 1)]; - leds[XY16(x, y)].nscale8(scale); - } - } - // fade the bottom row - for (int x = 0; x < MATRIX_WIDTH; x++) - leds[XY16(x, MATRIX_HEIGHT - 1)].nscale8(scale); - - // fade the right column - for (int y = 0; y < MATRIX_HEIGHT; y++) - leds[XY16(MATRIX_WIDTH - 1, y)].nscale8(scale); - } - - // just move everything one line down - void MoveDown() { - for (int y = MATRIX_HEIGHT - 1; y > 0; y--) { - for (int x = 0; x < MATRIX_WIDTH; x++) { - leds[XY16(x, y)] = leds[XY16(x, y - 1)]; - } - } - } - - // just move everything one line down - void VerticalMoveFrom(int start, int end) { - for (int y = end; y > start; y--) { - for (int x = 0; x < MATRIX_WIDTH; x++) { - leds[XY16(x, y)] = leds[XY16(x, y - 1)]; - } - } - } - - // copy the rectangle defined with 2 points x0, y0, x1, y1 - // to the rectangle beginning at x2, x3 - void Copy(byte x0, byte y0, byte x1, byte y1, byte x2, byte y2) { - for (int y = y0; y < y1 + 1; y++) { - for (int x = x0; x < x1 + 1; x++) { - leds[XY16(x + x2 - x0, y + y2 - y0)] = leds[XY16(x, y)]; - } - } - } - - // rotate + copy triangle (MATRIX_CENTER_X*MATRIX_CENTER_X) - void RotateTriangle() { - for (int x = 1; x < MATRIX_CENTER_X; x++) { - for (int y = 0; y < x; y++) { - leds[XY16(x, 7 - y)] = leds[XY16(7 - x, y)]; - } - } - } - - // mirror + copy triangle (MATRIX_CENTER_X*MATRIX_CENTER_X) - void MirrorTriangle() { - for (int x = 1; x < MATRIX_CENTER_X; x++) { - for (int y = 0; y < x; y++) { - leds[XY16(7 - y, x)] = leds[XY16(7 - x, y)]; - } - } - } - - // draw static rainbow triangle pattern (MATRIX_CENTER_XxWIDTH / 2) - // (just for debugging) - void RainbowTriangle() { - for (int i = 0; i < MATRIX_CENTER_X; i++) { - for (int j = 0; j <= i; j++) { - Pixel(7 - i, j, i * j * 4); - } - } - } - - void BresenhamLine(int x0, int y0, int x1, int y1, byte colorIndex) - { - BresenhamLine(x0, y0, x1, y1, ColorFromCurrentPalette(colorIndex)); - } - - void BresenhamLine(int x0, int y0, int x1, int y1, CRGB color) - { - int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1; - int dy = -abs(y1 - y0), sy = y0 < y1 ? 1 : -1; - int err = dx + dy, e2; - for (;;) { - leds[XY16(x0, y0)] += color; - if (x0 == x1 && y0 == y1) break; - e2 = 2 * err; - if (e2 > dy) { - err += dy; - x0 += sx; - } - if (e2 < dx) { - err += dx; - y0 += sy; - } - } - } - - - CRGB ColorFromCurrentPalette(uint8_t index = 0, uint8_t brightness = 255, TBlendType blendType = LINEARBLEND) { - return ColorFromPalette(currentPalette, index, brightness, currentBlendType); - } - - CRGB HsvToRgb(uint8_t h, uint8_t s, uint8_t v) { - CHSV hsv = CHSV(h, s, v); - CRGB rgb; - hsv2rgb_spectrum(hsv, rgb); - return rgb; - } - - void NoiseVariablesSetup() { - noisesmoothing = 200; - - noise_x = random16(); - noise_y = random16(); - noise_z = random16(); - noise_scale_x = 6000; - noise_scale_y = 6000; - } - - void FillNoise() { - for (uint16_t i = 0; i < MATRIX_WIDTH; i++) { - uint32_t ioffset = noise_scale_x * (i - MATRIX_CENTRE_Y); - - for (uint16_t j = 0; j < MATRIX_HEIGHT; j++) { - uint32_t joffset = noise_scale_y * (j - MATRIX_CENTRE_Y); - - byte data = inoise16(noise_x + ioffset, noise_y + joffset, noise_z) >> 8; - - uint8_t olddata = noise[i][j]; - uint8_t newdata = scale8(olddata, noisesmoothing) + scale8(data, 256 - noisesmoothing); - data = newdata; - - noise[i][j] = data; - } - } - } - - // non leds2 memory version. - void MoveX(byte delta) - { - - CRGB tmp = 0; - - for (int y = 0; y < MATRIX_HEIGHT; y++) - { - - // Shift Left: https://codedost.com/c/arraypointers-in-c/c-program-shift-elements-array-left-direction/ - // Computationally heavier but doesn't need an entire leds2 array - - tmp = leds[XY16(0, y)]; - for (int m = 0; m < delta; m++) - { - // Do this delta time for each row... computationally expensive potentially. - for(int x = 0; x < MATRIX_WIDTH; x++) - { - leds[XY16(x, y)] = leds [XY16(x+1, y)]; - } - - leds[XY16(MATRIX_WIDTH-1, y)] = tmp; - } - - - /* - // Shift - for (int x = 0; x < MATRIX_WIDTH - delta; x++) { - leds2[XY(x, y)] = leds[XY(x + delta, y)]; - } - - // Wrap around - for (int x = MATRIX_WIDTH - delta; x < MATRIX_WIDTH; x++) { - leds2[XY(x, y)] = leds[XY(x + delta - MATRIX_WIDTH, y)]; - } - */ - } // end row loop - - /* - // write back to leds - for (uint8_t y = 0; y < MATRIX_HEIGHT; y++) { - for (uint8_t x = 0; x < MATRIX_WIDTH; x++) { - leds[XY(x, y)] = leds2[XY(x, y)]; - } - } - */ - } - - void MoveY(byte delta) - { - - CRGB tmp = 0; - for (int x = 0; x < MATRIX_WIDTH; x++) - { - tmp = leds[XY16(x, 0)]; - for (int m = 0; m < delta; m++) // moves - { - // Do this delta time for each row... computationally expensive potentially. - for(int y = 0; y < MATRIX_HEIGHT; y++) - { - leds[XY16(x, y)] = leds [XY16(x, y+1)]; - } - - leds[XY16(x, MATRIX_HEIGHT-1)] = tmp; - } - } // end column loop - } /// MoveY - - -}; - -#endif \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Geometry.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Geometry.h deleted file mode 100644 index 4e47557..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Geometry.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from Noel Bundy's work: https://github.com/TwystNeko/Object3d - * Copyright (c) 2014 Noel Bundy - * - * Portions of this code are adapted from the Petty library: https://code.google.com/p/peggy/ - * Copyright (c) 2008 Windell H Oskay. All right reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Geometry_H -#define Geometry_H - -struct Vertex -{ - float x, y, z; - Vertex() - { - this->set(0, 0, 0); - } - - Vertex(float x, float y, float z) - { - this->set(x, y, z); - } - - void set(float x, float y, float z) - { - this->x = x; - this->y = y; - this->z = z; - } -}; - -struct EdgePoint -{ - int x, y; - boolean visible; - - EdgePoint() - { - this->set(0, 0); - this->visible = false; - } - - void set(int a, int b) - { - this->x = a; - this->y = b; - } -}; - -struct Point -{ - float x, y; - - Point() - { - set(0, 0); - } - - Point(float x, float y) - { - set(x, y); - } - - void set(float x, float y) - { - this->x = x; - this->y = y; - } - -}; - -struct squareFace -{ - int length; - int sommets[4]; - int ed[4]; - - squareFace() - { - set(-1, -1, -1, -1); - } - - squareFace(int a, int b, int c, int d) - { - this->length = 4; - this->sommets[0] = a; - this->sommets[1] = b; - this->sommets[2] = c; - this->sommets[3] = d; - } - - void set(int a, int b, int c, int d) - { - this->length = 4; - this->sommets[0] = a; - this->sommets[1] = b; - this->sommets[2] = c; - this->sommets[3] = d; - } - -}; - -struct triFace -{ - int length; - int sommets[3]; - int ed[3]; - - triFace() - { - set(-1,-1,-1); - } - triFace(int a, int b, int c) - { - this->length =3; - this->sommets[0]=a; - this->sommets[1]=b; - this->sommets[2]=c; - } - void set(int a, int b, int c) - { - this->length =3; - this->sommets[0]=a; - this->sommets[1]=b; - this->sommets[2]=c; - } -}; - -#endif \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternAttract.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternAttract.h deleted file mode 100644 index dcb6491..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternAttract.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternAttract_H - -class PatternAttract : public Drawable { -private: - const int count = 8; - Attractor attractor; - -public: - PatternAttract() { - name = (char *)"Attract"; - } - - void start() { - int direction = random(0, 2); - if (direction == 0) - direction = -1; - - for (int i = 0; i < count; i++) { - Boid boid = Boid(15, 31 - i); - boid.mass = 1; // random(0.1, 2); - boid.velocity.x = ((float) random(40, 50)) / 100.0; - boid.velocity.x *= direction; - boid.velocity.y = 0; - boid.colorIndex = i * 32; - boids[i] = boid; - //dim = random(170, 250); - } - } - - unsigned int drawFrame() { - // dim all pixels on the display - uint8_t dim = beatsin8(2, 170, 250); - effects.DimAll(dim); - - for (int i = 0; i < count; i++) { - Boid boid = boids[i]; - - PVector force = attractor.attract(boid); - boid.applyForce(force); - - boid.update(); - effects.drawBackgroundFastLEDPixelCRGB(boid.location.x, boid.location.y, effects.ColorFromCurrentPalette(boid.colorIndex)); - - boids[i] = boid; - } - - effects.ShowFrame(); - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternBounce.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternBounce.h deleted file mode 100644 index 7340514..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternBounce.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternBounce_H - -class PatternBounce : public Drawable { -private: - static const int count = 32; - PVector gravity = PVector(0, 0.0125); - -public: - PatternBounce() { - name = (char *)"Bounce"; - } - - void start() { - unsigned int colorWidth = 256 / count; - for (int i = 0; i < count; i++) { - Boid boid = Boid(i, 0); - boid.velocity.x = 0; - boid.velocity.y = i * -0.01; - boid.colorIndex = colorWidth * i; - boid.maxforce = 10; - boid.maxspeed = 10; - boids[i] = boid; - } - } - - unsigned int drawFrame() { - // dim all pixels on the display - effects.DimAll(170); effects.ShowFrame(); - - for (int i = 0; i < count; i++) { - Boid boid = boids[i]; - - boid.applyForce(gravity); - - boid.update(); - - effects.drawBackgroundFastLEDPixelCRGB(boid.location.x, boid.location.y, effects.ColorFromCurrentPalette(boid.colorIndex)); - - if (boid.location.y >= MATRIX_HEIGHT - 1) { - boid.location.y = MATRIX_HEIGHT - 1; - boid.velocity.y *= -1.0; - } - - boids[i] = boid; - } - - return 15; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternCube.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternCube.h deleted file mode 100644 index f2c60bc..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternCube.h +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from Noel Bundy's work: https://github.com/TwystNeko/Object3d - * Copyright (c) 2014 Noel Bundy - * - * Portions of this code are adapted from the Petty library: https://code.google.com/p/peggy/ - * Copyright (c) 2008 Windell H Oskay. All right reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternCube_H -#define PatternCube_H - -class PatternCube : public Drawable { - private: - float focal = 30; // Focal of the camera - int cubeWidth = 28; // Cube size - float Angx = 20.0, AngxSpeed = 0.05; // rotation (angle+speed) around X-axis - float Angy = 10.0, AngySpeed = 0.05; // rotation (angle+speed) around Y-axis - float Ox = 15.5, Oy = 15.5; // position (x,y) of the frame center - int zCamera = 110; // distance from cube to the eye of the camera - - // Local vertices - Vertex local[8]; - // Camera aligned vertices - Vertex aligned[8]; - // On-screen projected vertices - Point screen[8]; - // Faces - squareFace face[6]; - // Edges - EdgePoint edge[12]; - int nbEdges; - // ModelView matrix - float m00, m01, m02, m10, m11, m12, m20, m21, m22; - - // constructs the cube - void make(int w) - { - nbEdges = 0; - - local[0].set(-w, w, w); - local[1].set(w, w, w); - local[2].set(w, -w, w); - local[3].set(-w, -w, w); - local[4].set(-w, w, -w); - local[5].set(w, w, -w); - local[6].set(w, -w, -w); - local[7].set(-w, -w, -w); - - face[0].set(1, 0, 3, 2); - face[1].set(0, 4, 7, 3); - face[2].set(4, 0, 1, 5); - face[3].set(4, 5, 6, 7); - face[4].set(1, 2, 6, 5); - face[5].set(2, 3, 7, 6); - - int f, i; - for (f = 0; f < 6; f++) - { - for (i = 0; i < face[f].length; i++) - { - face[f].ed[i] = this->findEdge(face[f].sommets[i], face[f].sommets[i ? i - 1 : face[f].length - 1]); - } - } - } - - // finds edges from faces - int findEdge(int a, int b) - { - int i; - for (i = 0; i < nbEdges; i++) - if ((edge[i].x == a && edge[i].y == b) || (edge[i].x == b && edge[i].y == a)) - return i; - edge[nbEdges++].set(a, b); - return i; - } - - // rotates according to angle x&y - void rotate(float angx, float angy) - { - int i; - float cx = cos(angx); - float sx = sin(angx); - float cy = cos(angy); - float sy = sin(angy); - - m00 = cy; - m01 = 0; - m02 = -sy; - m10 = sx * sy; - m11 = cx; - m12 = sx * cy; - m20 = cx * sy; - m21 = -sx; - m22 = cx * cy; - - for (i = 0; i < 8; i++) - { - aligned[i].x = m00 * local[i].x + m01 * local[i].y + m02 * local[i].z; - aligned[i].y = m10 * local[i].x + m11 * local[i].y + m12 * local[i].z; - aligned[i].z = m20 * local[i].x + m21 * local[i].y + m22 * local[i].z + zCamera; - - screen[i].x = floor((Ox + focal * aligned[i].x / aligned[i].z)); - screen[i].y = floor((Oy - focal * aligned[i].y / aligned[i].z)); - } - - for (i = 0; i < 12; i++) - edge[i].visible = false; - - Point *pa, *pb, *pc; - for (i = 0; i < 6; i++) - { - pa = screen + face[i].sommets[0]; - pb = screen + face[i].sommets[1]; - pc = screen + face[i].sommets[2]; - - boolean back = ((pb->x - pa->x) * (pc->y - pa->y) - (pb->y - pa->y) * (pc->x - pa->x)) < 0; - if (!back) - { - int j; - for (j = 0; j < 4; j++) - { - edge[face[i].ed[j]].visible = true; - } - } - } - } - - byte hue = 0; - int step = 0; - - public: - PatternCube() { - name = (char *)"Cube"; - make(cubeWidth); - } - - unsigned int drawFrame() { - uint8_t blurAmount = beatsin8(2, 10, 255); - -#if FASTLED_VERSION >= 3001000 - blur2d(effects.leds, MATRIX_WIDTH, MATRIX_HEIGHT, blurAmount); -#else - effects.DimAll(blurAmount); effects.ShowFrame(); -#endif - - zCamera = beatsin8(2, 100, 140); - AngxSpeed = beatsin8(3, 1, 10) / 100.0f; - AngySpeed = beatcos8(5, 1, 10) / 100.0f; - - // Update values - Angx += AngxSpeed; - Angy += AngySpeed; - if (Angx >= TWO_PI) - Angx -= TWO_PI; - if (Angy >= TWO_PI) - Angy -= TWO_PI; - - rotate(Angx, Angy); - - // Draw cube - int i; - - CRGB color = effects.ColorFromCurrentPalette(hue, 128); - - // Backface - EdgePoint *e; - for (i = 0; i < 12; i++) - { - e = edge + i; - if (!e->visible) { - dma_display->drawLine(screen[e->x].x, screen[e->x].y, screen[e->y].x, screen[e->y].y, color); - } - } - - color = effects.ColorFromCurrentPalette(hue, 255); - - // Frontface - for (i = 0; i < 12; i++) - { - e = edge + i; - if (e->visible) - { - dma_display->drawLine(screen[e->x].x, screen[e->x].y, screen[e->y].x, screen[e->y].y, color); - } - } - - step++; - if (step == 8) { - step = 0; - hue++; - } - - effects.ShowFrame(); - - return 20; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternElectricMandala.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternElectricMandala.h deleted file mode 100644 index 880de25..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternElectricMandala.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from "Funky Noise" by Stefan Petrick: https://github.com/StefanPetrick/FunkyNoise - * Copyright (c) 2014 Stefan Petrick - * http://www.stefan-petrick.de/wordpress_beta - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternElectricMandala_H - -class PatternElectricMandala : public Drawable { - private: - - // The coordinates for 16-bit noise spaces. -#define NUM_LAYERS 1 - - // used for the random based animations - int16_t dx; - int16_t dy; - int16_t dz; - int16_t dsx; - int16_t dsy; - - public: - PatternElectricMandala() { - name = (char *)"ElectricMandala"; - } - - void start() { - // set to reasonable values to avoid a black out - noisesmoothing = 200; - - // just any free input pin - //random16_add_entropy(analogRead(18)); - - // fill coordinates with random values - // set zoom levels - noise_x = random16(); - noise_y = random16(); - noise_z = random16(); - noise_scale_x = 6000; - noise_scale_y = 6000; - - // for the random movement - dx = random8(); - dy = random8(); - dz = random8(); - dsx = random8(); - dsy = random8(); - } - - unsigned int drawFrame() { -#if FASTLED_VERSION >= 3001000 - // a new parameter set every 15 seconds - EVERY_N_SECONDS(15) { - //SetupRandomPalette3(); - dy = random16(500) - 250; // random16(2000) - 1000 is pretty fast but works fine, too - dx = random16(500) - 250; - dz = random16(500) - 250; - noise_scale_x = random16(10000) + 2000; - noise_scale_y = random16(10000) + 2000; - } -#endif - - noise_y += dy; - noise_x += dx; - noise_z += dz; - - effects.FillNoise(); - ShowNoiseLayer(0, 1, 0); - - effects.Caleidoscope3(); - effects.Caleidoscope1(); - - effects.ShowFrame(); - - return 30; - } - - // show just one layer - void ShowNoiseLayer(byte layer, byte colorrepeat, byte colorshift) { - for (uint16_t i = 0; i < MATRIX_WIDTH; i++) { - for (uint16_t j = 0; j < MATRIX_HEIGHT; j++) { - - uint8_t color = noise[i][j]; - - uint8_t bri = color; - - // assign a color depending on the actual palette - CRGB pixel = ColorFromPalette(effects.currentPalette, colorrepeat * (color + colorshift), bri); - - effects.leds[XY16(i, j)] = pixel; - } - } - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFire.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFire.h deleted file mode 100644 index 83aa67c..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFire.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from FastLED Fire2012 example by Mark Kriegsman: https://github.com/FastLED/FastLED/tree/master/examples/Fire2012WithPalette - * Copyright (c) 2013 FastLED - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternFire_H -#define PatternFire_H - -#ifndef Effects_H -#include "Effects.h" -#endif - -class PatternFire : public Drawable { - private: - - public: - PatternFire() { - name = (char *)"Fire"; - } - - // There are two main parameters you can play with to control the look and - // feel of your fire: COOLING (used in step 1 above), and SPARKING (used - // in step 3 above). - // - // cooling: How much does the air cool as it rises? - // Less cooling = taller flames. More cooling = shorter flames. - // Default 55, suggested range 20-100 - int cooling = 100; - - // sparking: What chance (out of 255) is there that a new spark will be lit? - // Higher chance = more roaring fire. Lower chance = more flickery fire. - // Default 120, suggested range 50-200. - unsigned int sparking = 100; - - unsigned int drawFrame() { - // Add entropy to random number generator; we use a lot of it. - random16_add_entropy( random16()); - - effects.DimAll(235); - - for (int x = 0; x < MATRIX_WIDTH; x++) { - // Step 1. Cool down every cell a little - for (int y = 0; y < MATRIX_HEIGHT; y++) { - int xy = XY(x, y); - heat[xy] = qsub8(heat[xy], random8(0, ((cooling * 10) / MATRIX_HEIGHT) + 2)); - } - - // Step 2. Heat from each cell drifts 'up' and diffuses a little - for (int y = 0; y < MATRIX_HEIGHT; y++) { - heat[XY(x, y)] = (heat[XY(x, y + 1)] + heat[XY(x, y + 2)] + heat[XY(x, y + 2)]) / 3; - } - - // Step 2. Randomly ignite new 'sparks' of heat - if (random8() < sparking) { - // int x = (p[0] + p[1] + p[2]) / 3; - - int xy = XY(x, MATRIX_HEIGHT - 1); - heat[xy] = qadd8(heat[xy], random8(160, 255)); - } - - // Step 4. Map from heat cells to LED colors - for (int y = 0; y < MATRIX_HEIGHT; y++) { - int xy = XY(x, y); - byte colorIndex = heat[xy]; - - // Recommend that you use values 0-240 rather than - // the usual 0-255, as the last 15 colors will be - // 'wrapping around' from the hot end to the cold end, - // which looks wrong. - colorIndex = scale8(colorIndex, 200); - - // override color 0 to ensure a black background? - if (colorIndex != 0) - // effects.leds[xy] = CRGB::Black; - // else - effects.leds[xy] = effects.ColorFromCurrentPalette(colorIndex); - } - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(2); - effects.MoveFractionalNoiseX(2); - - - effects.ShowFrame(); - - return 15; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFlock.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFlock.h deleted file mode 100644 index 3ae31b1..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFlock.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from "Flocking" in "The Nature of Code" by Daniel Shiffman: http://natureofcode.com/ - * Copyright (c) 2014 Daniel Shiffman - * http://www.shiffman.net - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -// Flocking -// Daniel Shiffman -// The Nature of Code, Spring 2009 - -// Demonstration of Craig Reynolds' "Flocking" behavior -// See: http://www.red3d.com/cwr/ -// Rules: Cohesion, Separation, Alignment - -#ifndef PatternFlock_H -#define PatternFlock_H - -class PatternFlock : public Drawable { - public: - PatternFlock() { - name = (char *)"Flock"; - } - - static const int boidCount = 10; - Boid predator; - - PVector wind; - byte hue = 0; - bool predatorPresent = true; - - void start() { - for (int i = 0; i < boidCount; i++) { - boids[i] = Boid(15, 15); - boids[i].maxspeed = 0.380; - boids[i].maxforce = 0.015; - } - - predatorPresent = random(0, 2) >= 1; - if (predatorPresent) { - predator = Boid(31, 31); - predatorPresent = true; - predator.maxspeed = 0.385; - predator.maxforce = 0.020; - predator.neighbordist = 16.0; - predator.desiredseparation = 0.0; - } - } - - unsigned int drawFrame() { - effects.DimAll(230); effects.ShowFrame(); - - bool applyWind = random(0, 255) > 250; - if (applyWind) { - wind.x = Boid::randomf() * .015; - wind.y = Boid::randomf() * .015; - } - - CRGB color = effects.ColorFromCurrentPalette(hue); - - for (int i = 0; i < boidCount; i++) { - Boid * boid = &boids[i]; - - if (predatorPresent) { - // flee from predator - boid->repelForce(predator.location, 10); - } - - boid->run(boids, boidCount); - boid->wrapAroundBorders(); - PVector location = boid->location; - // PVector velocity = boid->velocity; - // backgroundLayer.drawLine(location.x, location.y, location.x - velocity.x, location.y - velocity.y, color); - // effects.leds[XY(location.x, location.y)] += color; - effects.drawBackgroundFastLEDPixelCRGB(location.x, location.y, color); - - if (applyWind) { - boid->applyForce(wind); - applyWind = false; - } - } - - if (predatorPresent) { - predator.run(boids, boidCount); - predator.wrapAroundBorders(); - color = effects.ColorFromCurrentPalette(hue + 128); - PVector location = predator.location; - // PVector velocity = predator.velocity; - // backgroundLayer.drawLine(location.x, location.y, location.x - velocity.x, location.y - velocity.y, color); - // effects.leds[XY(location.x, location.y)] += color; - effects.drawBackgroundFastLEDPixelCRGB(location.x, location.y, color); - } - - EVERY_N_MILLIS(200) { - hue++; - } - - EVERY_N_SECONDS(30) { - predatorPresent = !predatorPresent; - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFlowField.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFlowField.h deleted file mode 100644 index 38f1083..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternFlowField.h +++ /dev/null @@ -1,92 +0,0 @@ -/* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternFlowField_H - -class PatternFlowField : public Drawable { - public: - PatternFlowField() { - name = (char *)"FlowField"; - } - - uint16_t x; - uint16_t y; - uint16_t z; - - uint16_t speed = 1; - uint16_t scale = 26; - - static const int count = 40; - - byte hue = 0; - - void start() { - x = random16(); - y = random16(); - z = random16(); - - for (int i = 0; i < count; i++) { - boids[i] = Boid(random(MATRIX_WIDTH), 0); - } - } - - unsigned int drawFrame() { - effects.DimAll(240); - - // CRGB color = effects.ColorFromCurrentPalette(hue); - - for (int i = 0; i < count; i++) { - Boid * boid = &boids[i]; - - int ioffset = scale * boid->location.x; - int joffset = scale * boid->location.y; - - byte angle = inoise8(x + ioffset, y + joffset, z); - - boid->velocity.x = (float) sin8(angle) * 0.0078125 - 1.0; - boid->velocity.y = -((float)cos8(angle) * 0.0078125 - 1.0); - boid->update(); - - effects.drawBackgroundFastLEDPixelCRGB(boid->location.x, boid->location.y, effects.ColorFromCurrentPalette(angle + hue)); // color - - if (boid->location.x < 0 || boid->location.x >= MATRIX_WIDTH || - boid->location.y < 0 || boid->location.y >= MATRIX_HEIGHT) { - boid->location.x = random(MATRIX_WIDTH); - boid->location.y = 0; - } - } - - EVERY_N_MILLIS(200) { - hue++; - } - - x += speed; - y += speed; - z += speed; - - effects.ShowFrame(); - - return 50; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternIncrementalDrift.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternIncrementalDrift.h deleted file mode 100644 index f68c04f..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternIncrementalDrift.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternIncrementalDrift_H -#define PatternIncrementalDrift_H - -class PatternIncrementalDrift : public Drawable { - public: - PatternIncrementalDrift() { - name = (char *)"Incremental Drift"; - } - - unsigned int drawFrame() { - uint8_t dim = beatsin8(2, 230, 250); - effects.DimAll(dim); effects.ShowFrame(); - - for (int i = 2; i <= MATRIX_WIDTH / 2; i++) - { - CRGB color = effects.ColorFromCurrentPalette((i - 2) * (240 / (MATRIX_WIDTH / 2))); - - uint8_t x = beatcos8((17 - i) * 2, MATRIX_CENTER_X - i, MATRIX_CENTER_X + i); - uint8_t y = beatsin8((17 - i) * 2, MATRIX_CENTER_Y - i, MATRIX_CENTER_Y + i); - - effects.drawBackgroundFastLEDPixelCRGB(x, y, color); - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternIncrementalDrift2.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternIncrementalDrift2.h deleted file mode 100644 index 0ce06c2..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternIncrementalDrift2.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternIncrementalDrift2_H -#define PatternIncrementalDrift2_H - -class PatternIncrementalDrift2 : public Drawable { - public: - PatternIncrementalDrift2() { - name = (char *)"Incremental Drift Rose"; - } - - unsigned int drawFrame() { - uint8_t dim = beatsin8(2, 170, 250); - effects.DimAll(dim); effects.ShowFrame(); - - for (uint8_t i = 0; i < 32; i++) - { - CRGB color; - - uint8_t x = 0; - uint8_t y = 0; - - if (i < 16) { - x = beatcos8((i + 1) * 2, i, MATRIX_WIDTH - i); - y = beatsin8((i + 1) * 2, i, MATRIX_HEIGHT - i); - color = effects.ColorFromCurrentPalette(i * 14); - } - else - { - x = beatsin8((32 - i) * 2, MATRIX_WIDTH - i, i + 1); - y = beatcos8((32 - i) * 2, MATRIX_HEIGHT - i, i + 1); - color = effects.ColorFromCurrentPalette((31 - i) * 14); - } - - effects.drawBackgroundFastLEDPixelCRGB(x, y, color); - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternInfinity.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternInfinity.h deleted file mode 100644 index 0c068ad..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternInfinity.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternInfinity_H - -class PatternInfinity : public Drawable { -public: - PatternInfinity() { - name = (char *)"Infinity"; - } - - unsigned int drawFrame() { - // dim all pixels on the display slightly - // to 250/255 (98%) of their current brightness - blur2d(effects.leds, MATRIX_WIDTH > 255 ? 255 : MATRIX_WIDTH, MATRIX_HEIGHT > 255 ? 255 : MATRIX_HEIGHT, 250); - // effects.DimAll(250); effects.ShowFrame(); - - - // the Effects class has some sample oscillators - // that move from 0 to 255 at different speeds - effects.MoveOscillators(); - - // the horizontal position of the head of the infinity sign - // oscillates from 0 to the maximum horizontal and back - int x = (MATRIX_WIDTH - 1) - effects.p[1]; - - // the vertical position of the head oscillates - // from 8 to 23 and back (hard-coded for a 32x32 matrix) - int y = map8(sin8(effects.osci[3]), 8, 23); - - // the hue oscillates from 0 to 255, overflowing back to 0 - byte hue = sin8(effects.osci[5]); - - // draw a pixel at x,y using a color from the current palette - effects.Pixel(x, y, hue); - - effects.ShowFrame(); - return 30; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternInvaders.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternInvaders.h deleted file mode 100644 index e2df82e..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternInvaders.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Inspired by 'Space Invader Generator': https://the8bitpimp.wordpress.com/2013/05/07/space-invader-generator - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternInvaders_H -#define PatternInvaders_H - -class PatternInvadersSmall : public Drawable { - private: - uint8_t x = 1; - uint8_t y = 1; - - public: - PatternInvadersSmall() { - name = (char *)"Invaders Small"; - } - - void start() { - dma_display->fillScreen(0); - } - - unsigned int drawFrame() { - CRGB color1 = effects.ColorFromCurrentPalette(random(0, 255)); - - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - CRGB color = CRGB::Black; - - if (random(0, 2) == 1) color = color1; - - effects.drawBackgroundFastLEDPixelCRGB(x + i, y + j, color); - - if (i < 2) - effects.drawBackgroundFastLEDPixelCRGB(x + (4 - i), y + j, color); - } - } - - x += 6; - if (x > 25) { - x = 1; - y += 6; - } - - if (y > 25) y = x = 1; - - effects.ShowFrame(); - - return 125; - } -}; - -class PatternInvadersMedium : public Drawable { - private: - uint8_t x = 0; - uint8_t y = 0; - - public: - PatternInvadersMedium() { - name = (char *)"Invaders Medium"; - } - - void start() { - dma_display->fillScreen(0); - } - - unsigned int drawFrame() { - CRGB color1 = effects.ColorFromCurrentPalette(random(0, 255)); - - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - CRGB color = CRGB::Black; - - if (random(0, 2) == 1) color = color1; - - dma_display->fillRect(x + (i * 2), y + (j * 2), x + (i * 2 + 1), y + (j * 2 + 1), color); - - if (i < 2) - dma_display->fillRect(x + (8 - i * 2), y + (j * 2), x + (9 - i * 2), y + (j * 2 + 1), color); - } - } - - x += 11; - if (x > 22) { - x = 0; - y += 11; - } - - if (y > 22) y = x = 0; - - effects.ShowFrame(); - - return 500; - } -}; - -class PatternInvadersLarge : public Drawable { - private: - - public: - PatternInvadersLarge() { - name = (char *)"Invaders Large"; - } - - void start() { - dma_display->fillScreen(0); - } - - unsigned int drawFrame() { - dma_display->fillScreen(0); - - CRGB color1 = effects.ColorFromCurrentPalette(random(0, 255)); - - for (int x = 0; x < 3; x++) { - for (int y = 0; y < 5; y++) { - CRGB color = CRGB::Black; - - if (random(0, 2) == 1) { - color = color1; - } - - dma_display->fillRect(1 + x * 6, 1 + y * 6, 5 + x * 6, 5 + y * 6, color); - - if (x < 2) - dma_display->fillRect(1 + (4 - x) * 6, 1 + y * 6, 5 + (4 - x) * 6, 5 + y * 6, color); - } - } - - effects.ShowFrame(); - - return 2000; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternLife.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternLife.h deleted file mode 100644 index 7c9ef30..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternLife.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from Andrew: http://pastebin.com/f22bfe94d - * which, in turn, was "Adapted from the Life example on the Processing.org site" - * - * Made much more colorful by J.B. Langston: https://github.com/jblang/aurora/commit/6db5a884e3df5d686445c4f6b669f1668841929b - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternLife_H -#define PatternLife_H - -class Cell { -public: - byte alive : 1; - byte prev : 1; - byte hue: 6; - byte brightness; -}; - -class PatternLife : public Drawable { -private: - Cell world[MATRIX_WIDTH][MATRIX_HEIGHT]; - unsigned int density = 50; - int generation = 0; - - void randomFillWorld() { - for (int i = 0; i < MATRIX_WIDTH; i++) { - for (int j = 0; j < MATRIX_HEIGHT; j++) { - if (random(100) < density) { - world[i][j].alive = 1; - world[i][j].brightness = 255; - } - else { - world[i][j].alive = 0; - world[i][j].brightness = 0; - } - world[i][j].prev = world[i][j].alive; - world[i][j].hue = 0; - } - } - } - - int neighbours(int x, int y) { - return (world[(x + 1) % MATRIX_WIDTH][y].prev) + - (world[x][(y + 1) % MATRIX_HEIGHT].prev) + - (world[(x + MATRIX_WIDTH - 1) % MATRIX_WIDTH][y].prev) + - (world[x][(y + MATRIX_HEIGHT - 1) % MATRIX_HEIGHT].prev) + - (world[(x + 1) % MATRIX_WIDTH][(y + 1) % MATRIX_HEIGHT].prev) + - (world[(x + MATRIX_WIDTH - 1) % MATRIX_WIDTH][(y + 1) % MATRIX_HEIGHT].prev) + - (world[(x + MATRIX_WIDTH - 1) % MATRIX_WIDTH][(y + MATRIX_HEIGHT - 1) % MATRIX_HEIGHT].prev) + - (world[(x + 1) % MATRIX_WIDTH][(y + MATRIX_HEIGHT - 1) % MATRIX_HEIGHT].prev); - } - -public: - PatternLife() { - name = (char *)"Life"; - } - - unsigned int drawFrame() { - if (generation == 0) { - effects.ClearFrame(); - - randomFillWorld(); - } - - // Display current generation - for (int i = 0; i < MATRIX_WIDTH; i++) { - for (int j = 0; j < MATRIX_HEIGHT; j++) { - effects.leds[XY(i, j)] = effects.ColorFromCurrentPalette(world[i][j].hue * 4, world[i][j].brightness); - } - } - - // Birth and death cycle - for (int x = 0; x < MATRIX_WIDTH; x++) { - for (int y = 0; y < MATRIX_HEIGHT; y++) { - // Default is for cell to stay the same - if (world[x][y].brightness > 0 && world[x][y].prev == 0) - world[x][y].brightness *= 0.9; - int count = neighbours(x, y); - if (count == 3 && world[x][y].prev == 0) { - // A new cell is born - world[x][y].alive = 1; - world[x][y].hue += 2; - world[x][y].brightness = 255; - } else if ((count < 2 || count > 3) && world[x][y].prev == 1) { - // Cell dies - world[x][y].alive = 0; - } - } - } - - // Copy next generation into place - for (int x = 0; x < MATRIX_WIDTH; x++) { - for (int y = 0; y < MATRIX_HEIGHT; y++) { - world[x][y].prev = world[x][y].alive; - } - } - - - generation++; - if (generation >= 256) - generation = 0; - - effects.ShowFrame(); - - return 60; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternMaze.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternMaze.h deleted file mode 100644 index c469922..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternMaze.h +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Many thanks to Jamis Buck for the documentation of the Growing Tree maze generation algorithm: http://weblog.jamisbuck.org/2011/1/27/maze-generation-growing-tree-algorithm - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternMaze_H -#define PatternMaze_H - -class PatternMaze : public Drawable { -private: - enum Directions { - None = 0, - Up = 1, - Down = 2, - Left = 4, - Right = 8, - }; - - struct Point{ - int x; - int y; - - static Point New(int x, int y) { - Point point; - point.x = x; - point.y = y; - return point; - } - - Point Move(Directions direction) { - switch (direction) - { - case Up: - return New(x, y - 1); - - case Down: - return New(x, y + 1); - - case Left: - return New(x - 1, y); - - case Right: - default: - return New(x + 1, y); - } - } - - static Directions Opposite(Directions direction) { - switch (direction) { - case Up: - return Down; - - case Down: - return Up; - - case Left: - return Right; - - case Right: - default: - return Left; - } - } - }; - -// int width = 16; -// int height = 16; - - static const int width = MATRIX_WIDTH / 2; - static const int height = MATRIX_HEIGHT / 2; - - - Directions grid[width][height]; - - Point point; - - Point cells[256]; - int cellCount = 0; - - int algorithm = 0; - int algorithmCount = 1; - - byte hue = 0; - byte hueOffset = 0; - - Directions directions[4] = { Up, Down, Left, Right }; - - void removeCell(int index) {// shift cells after index down one - for (int i = index; i < cellCount - 1; i++) { - cells[i] = cells[i + 1]; - } - - cellCount--; - } - - void shuffleDirections() { - for (int a = 0; a < 4; a++) - { - int r = random(a, 4); - Directions temp = directions[a]; - directions[a] = directions[r]; - directions[r] = temp; - } - } - - Point createPoint(int x, int y) { - Point point; - point.x = x; - point.y = y; - return point; - } - - CRGB chooseColor(int index) { - byte h = index + hueOffset; - - switch (algorithm) { - case 0: - default: - return effects.ColorFromCurrentPalette(h); - - case 1: - return effects.ColorFromCurrentPalette(hue++); - } - } - - int chooseIndex(int max) { - switch (algorithm) { - case 0: - default: - // choose newest (recursive backtracker) - return max - 1; - - case 1: - // choose random(Prim's) - return random(max); - - // case 2: - // // choose oldest (not good, so disabling) - // return 0; - } - } - - void generateMaze() { - while (cellCount > 1) { - drawNextCell(); - } - } - - void drawNextCell() { - int index = chooseIndex(cellCount); - - if (index < 0) - return; - - point = cells[index]; - - Point imagePoint = createPoint(point.x * 2, point.y * 2); - - //effects.drawBackgroundFastLEDPixelCRGB(imagePoint.x, imagePoint.y, CRGB(CRGB::Gray)); - - shuffleDirections(); - - CRGB color = chooseColor(index); - - for (int i = 0; i < 4; i++) { - Directions direction = directions[i]; - - Point newPoint = point.Move(direction); - if (newPoint.x >= 0 && newPoint.y >= 0 && newPoint.x < width && newPoint.y < height && grid[newPoint.y][newPoint.x] == None) { - grid[point.y][point.x] = (Directions) ((int) grid[point.y][point.x] | (int) direction); - grid[newPoint.y][newPoint.x] = (Directions) ((int) grid[newPoint.y][newPoint.x] | (int) point.Opposite(direction)); - - Point newImagePoint = imagePoint.Move(direction); - - effects.drawBackgroundFastLEDPixelCRGB(newImagePoint.x, newImagePoint.y, color); - - cellCount++; - cells[cellCount - 1] = newPoint; - - index = -1; - break; - } - } - - if (index > -1) { - Point finishedPoint = cells[index]; - imagePoint = createPoint(finishedPoint.x * 2, finishedPoint.y * 2); - effects.drawBackgroundFastLEDPixelCRGB(imagePoint.x, imagePoint.y, color); - - removeCell(index); - } - } - -public: - PatternMaze() { - name = (char *)"Maze"; - } - - unsigned int drawFrame() { - if (cellCount < 1) { - - effects.ClearFrame(); - - // reset the maze grid - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - grid[y][x] = None; - } - } - - int x = random(width); - int y = random(height); - - cells[0] = createPoint(x, y); - - cellCount = 1; - - hue = 0; - hueOffset = random(0, 256); - - } - - drawNextCell(); - - if (cellCount < 1) { - algorithm++; - if (algorithm >= algorithmCount) - algorithm = 0; - - return 0; - } - - effects.ShowFrame(); - - return 0; - } - - void start() { - effects.ClearFrame(); - cellCount = 0; - hue = 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternMunch.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternMunch.h deleted file mode 100644 index f580828..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternMunch.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Munch pattern created by J.B. Langston: https://github.com/jblang/aurora/blob/master/PatternMunch.h - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternMunch_H -#define PatternMunch_H - - -class PatternMunch : public Drawable { -private: - byte count = 0; - byte dir = 1; - byte flip = 0; - byte generation = 0; - -public: - PatternMunch() { - name = (char *)"Munch"; - } - - unsigned int drawFrame() { - - for (uint16_t x = 0; x < MATRIX_WIDTH; x++) { - for (uint16_t y = 0; y < MATRIX_HEIGHT; y++) { - effects.leds[XY16(x, y)] = (x ^ y ^ flip) < count ? effects.ColorFromCurrentPalette(((x ^ y) << 2) + generation) : CRGB::Black; - - // The below is more pleasant - // effects.leds[XY(x, y)] = effects.ColorFromCurrentPalette(((x ^ y) << 2) + generation) ; - } - } - - count += dir; - - if (count <= 0 || count >= MATRIX_WIDTH) { - dir = -dir; - } - - if (count <= 0) { - if (flip == 0) - flip = MATRIX_WIDTH-1; - else - flip = 0; - } - - generation++; - - // show it ffs! - effects.ShowFrame(); - return 60; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternNoiseSmearing.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternNoiseSmearing.h deleted file mode 100644 index ab7ed7b..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternNoiseSmearing.h +++ /dev/null @@ -1,338 +0,0 @@ -/* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Portions of this code are adapted from "Noise Smearing" by Stefan Petrick: https://gist.githubusercontent.com/embedded-creations/5cd47d83cb0e04f4574d/raw/ebf6a82b4755d55cfba3bf6598f7b19047f89daf/NoiseSmearing.ino -* Copyright (c) 2014 Stefan Petrick -* http://www.stefan-petrick.de/wordpress_beta -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternNoiseSmearing_H -#define PatternNoiseSmearing_H - -byte patternNoiseSmearingHue = 0; - -class PatternMultipleStream : public Drawable { -public: - PatternMultipleStream() { - name = (char *)"MultipleStream"; - } - - // this pattern draws two points to the screen based on sin/cos if a counter - // (comment out NoiseSmearWithRadius to see pattern of pixels) - // these pixels are smeared by a large radius, giving a lot of movement - // the image is dimmed before each drawing to not saturate the screen with color - // the smear has an offset so the pixels usually have a trail leading toward the upper left - unsigned int drawFrame() { - static unsigned long counter = 0; -#if 0 - // this counter lets put delays between each frame and still get the same animation - counter++; -#else - // this counter updates in real time and can't be slowed down for debugging - counter = millis() / 10; -#endif - - byte x1 = 4 + sin8(counter * 2) / 10; - byte x2 = 8 + sin8(counter * 2) / 16; - byte y2 = 8 + cos8((counter * 2) / 3) / 16; - - effects.leds[XY(x1, x2)] = effects.ColorFromCurrentPalette(patternNoiseSmearingHue); - effects.leds[XY(x2, y2)] = effects.ColorFromCurrentPalette(patternNoiseSmearingHue + 128); - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(8); - effects.MoveFractionalNoiseX(); - - effects.MoveY(8); - effects.MoveFractionalNoiseY(); - - patternNoiseSmearingHue++; - - return 0; - } -}; - -class PatternMultipleStream2 : public Drawable { -public: - PatternMultipleStream2() { - name = (char *)"MultipleStream2"; - } - - unsigned int drawFrame() { - effects.DimAll(230); effects.ShowFrame(); - - byte xx = 4 + sin8(millis() / 9) / 10; - byte yy = 4 + cos8(millis() / 10) / 10; - effects.leds[XY(xx, yy)] += effects.ColorFromCurrentPalette(patternNoiseSmearingHue); - - xx = 8 + sin8(millis() / 10) / 16; - yy = 8 + cos8(millis() / 7) / 16; - effects.leds[XY(xx, yy)] += effects.ColorFromCurrentPalette(patternNoiseSmearingHue + 80); - - effects.leds[XY(15, 15)] += effects.ColorFromCurrentPalette(patternNoiseSmearingHue + 160); - - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseY(4); - - effects.MoveY(3); - effects.MoveFractionalNoiseX(4); - - patternNoiseSmearingHue++; - - return 0; - } -}; - -class PatternMultipleStream3 : public Drawable { -public: - PatternMultipleStream3() { - name = (char *)"MultipleStream3"; - } - - unsigned int drawFrame() { - //CLS(); - effects.DimAll(235); effects.ShowFrame(); - - for (uint8_t i = 3; i < 32; i = i + 4) { - effects.leds[XY(i, 15)] += effects.ColorFromCurrentPalette(i * 8); - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseY(4); - - effects.MoveY(3); - effects.MoveFractionalNoiseX(4); - - effects.ShowFrame(); - - return 1; - } -}; - -class PatternMultipleStream4 : public Drawable { -public: - PatternMultipleStream4() { - name = (char *)"MultipleStream4"; - } - - unsigned int drawFrame() { - - //CLS(); - effects.DimAll(235); effects.ShowFrame(); - - effects.leds[XY(15, 15)] += effects.ColorFromCurrentPalette(patternNoiseSmearingHue); - - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(8); - effects.MoveFractionalNoiseX(); - - effects.MoveY(8); - effects.MoveFractionalNoiseY(); - - patternNoiseSmearingHue++; - - return 0; - } -}; - -class PatternMultipleStream5 : public Drawable { -public: - PatternMultipleStream5() { - name = (char *)"MultipleStream5"; - } - - unsigned int drawFrame() { - - //CLS(); - effects.DimAll(235); effects.ShowFrame(); - - - for (uint8_t i = 3; i < 32; i = i + 4) { - effects.leds[XY(i, 31)] += effects.ColorFromCurrentPalette(i * 8); - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseY(4); - - effects.MoveY(4); - effects.MoveFractionalNoiseX(4); - - return 0; - } -}; - -class PatternMultipleStream8 : public Drawable { -public: - PatternMultipleStream8() { - name = (char *)"MultipleStream8"; - } - - unsigned int drawFrame() { - effects.DimAll(230); effects.ShowFrame(); - - // draw grid of rainbow dots on top of the dimmed image - for (uint8_t y = 1; y < 32; y = y + 6) { - for (uint8_t x = 1; x < 32; x = x + 6) { - - effects.leds[XY(x, y)] += effects.ColorFromCurrentPalette((x * y) / 4); - } - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseX(4); - - effects.MoveY(3); - effects.MoveFractionalNoiseY(4); - - return 0; - } -}; - -class PatternPaletteSmear : public Drawable { -public: - PatternPaletteSmear() { - name = (char *)"PaletteSmear"; - } - - unsigned int drawFrame() { - - effects.DimAll(170); effects.ShowFrame(); - - // draw a rainbow color palette - for (uint8_t y = 0; y < MATRIX_HEIGHT; y++) { - for (uint8_t x = 0; x < MATRIX_WIDTH; x++) { - effects.leds[XY(x, y)] += effects.ColorFromCurrentPalette(x * 8, y * 8 + 7); - } - } - - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - - effects.FillNoise(); - - effects.MoveX(3); - //effects.MoveFractionalNoiseY(4); - - effects.MoveY(3); - effects.MoveFractionalNoiseX(4); - effects.ShowFrame(); - - return 0; - } -}; - -class PatternRainbowFlag : public Drawable { -public: - PatternRainbowFlag() { - name = (char *)"RainbowFlag"; - } - - unsigned int drawFrame() { - effects.DimAll(10); effects.ShowFrame(); - - CRGB rainbow[7] = { - CRGB::Red, - CRGB::Orange, - CRGB::Yellow, - CRGB::Green, - CRGB::Blue, - CRGB::Violet - }; - - uint8_t y = 2; - - for (uint8_t c = 0; c < 6; c++) { - for (uint8_t j = 0; j < 5; j++) { - for (uint8_t x = 0; x < MATRIX_WIDTH; x++) { - effects.leds[XY(x, y)] += rainbow[c]; - } - - y++; - if (y >= MATRIX_HEIGHT) - break; - } - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseY(4); - - effects.MoveY(3); - effects.MoveFractionalNoiseX(4); - - return 0; - } -}; -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPendulumWave.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPendulumWave.h deleted file mode 100644 index 08fd5b7..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPendulumWave.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -* -* Inspired by and based on a loading animation for Prismata by Lunarch Studios: -* http://www.reddit.com/r/gifs/comments/2on8si/connecting_to_server_so_mesmerizing/cmow0sz -* -* Lunarch Studios Inc. hereby publishes the Actionscript 3 source code pasted in this -* comment under the Creative Commons CC0 1.0 Universal Public Domain Dedication. -* Lunarch Studios Inc. waives all rights to the work worldwide under copyright law, -* including all related and neighboring rights, to the extent allowed by law. -* You can copy, modify, distribute and perform the work, even for commercial purposes, -* all without asking permission. -* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternPendulumWave_H -#define PatternPendulumWave_H - -#define WAVE_BPM 25 -#define AMP_BPM 2 -#define SKEW_BPM 4 -#define WAVE_TIMEMINSKEW MATRIX_WIDTH/8 -#define WAVE_TIMEMAXSKEW MATRIX_WIDTH/2 - -class PatternPendulumWave : public Drawable { - public: - PatternPendulumWave() { - name = (char *)"Pendulum Wave"; - } - - unsigned int drawFrame() { - effects.ClearFrame(); - - for (int x = 0; x < MATRIX_WIDTH; ++x) - { - uint16_t amp = beatsin16(AMP_BPM, MATRIX_HEIGHT/8, MATRIX_HEIGHT-1); - uint16_t offset = (MATRIX_HEIGHT - beatsin16(AMP_BPM, 0, MATRIX_HEIGHT))/2; - - uint8_t y = beatsin16(WAVE_BPM, 0, amp, x*beatsin16(SKEW_BPM, WAVE_TIMEMINSKEW, WAVE_TIMEMAXSKEW)) + offset; - - effects.drawBackgroundFastLEDPixelCRGB(x, y, effects.ColorFromCurrentPalette(x * 7)); - } - effects.ShowFrame(); - return 20; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPlasma.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPlasma.h deleted file mode 100644 index 99500b1..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPlasma.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from LedEffects Plasma by Robert Atkins: https://bitbucket.org/ratkins/ledeffects/src/26ed3c51912af6fac5f1304629c7b4ab7ac8ca4b/Plasma.cpp?at=default - * Copyright (c) 2013 Robert Atkins - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternPlasma_H -#define PatternPlasma_H - -class PatternPlasma : public Drawable { -private: - int time = 0; - int cycles = 0; - -public: - PatternPlasma() { - name = (char *)"Plasma"; - } - - unsigned int drawFrame() { - for (int x = 0; x < MATRIX_WIDTH; x++) { - for (int y = 0; y < MATRIX_HEIGHT; y++) { - int16_t v = 0; - uint8_t wibble = sin8(time); - v += sin16(x * wibble * 2 + time); - v += cos16(y * (128 - wibble) * 2 + time); - v += sin16(y * x * cos8(-time) / 2); - - effects.Pixel(x, y, (v >> 8) + 127); - } - } - - time += 1; - cycles++; - - if (cycles >= 2048) { - time = 0; - cycles = 0; - } - - effects.ShowFrame(); - - return 30; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPulse.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPulse.h deleted file mode 100644 index 4d4ba69..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternPulse.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Based at least in part on someone else's work that I can no longer find. - * Please let me know if you recognize any of this code! - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternPulse_H -#define PatternPulse_H - -class PatternPulse : public Drawable { - private: - int hue; - int centerX = 0; - int centerY = 0; - int step = -1; - int maxSteps = 16; - float fadeRate = 0.8; - int diff; - - public: - PatternPulse() { - name = (char *)"Pulse"; - } - - unsigned int drawFrame() { - effects.DimAll(235); - - if (step == -1) { - centerX = random(32); - centerY = random(32); - hue = random(256); // 170; - step = 0; - } - - if (step == 0) { - dma_display->drawCircle(centerX, centerY, step, effects.ColorFromCurrentPalette(hue)); - step++; - } - else { - if (step < maxSteps) { - // initial pulse - dma_display->drawCircle(centerX, centerY, step, effects.ColorFromCurrentPalette(hue, pow(fadeRate, step - 2) * 255)); - - // secondary pulse - if (step > 3) { - dma_display->drawCircle(centerX, centerY, step - 3, effects.ColorFromCurrentPalette(hue, pow(fadeRate, step - 2) * 255)); - } - step++; - } - else { - step = -1; - } - } - - effects.standardNoiseSmearing(); - - effects.ShowFrame(); - - return 30; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternRadar.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternRadar.h deleted file mode 100644 index 1dc4484..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternRadar.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternRadar_H - -class PatternRadar : public Drawable { - private: - byte theta = 0; - byte hueoffset = 0; - - public: - PatternRadar() { - name = (char *)"Radar"; - } - - unsigned int drawFrame() { - effects.DimAll(254); effects.ShowFrame(); - - for (int offset = 0; offset < MATRIX_CENTER_X; offset++) { - byte hue = 255 - (offset * 16 + hueoffset); - CRGB color = effects.ColorFromCurrentPalette(hue); - uint8_t x = mapcos8(theta, offset, (MATRIX_WIDTH - 1) - offset); - uint8_t y = mapsin8(theta, offset, (MATRIX_HEIGHT - 1) - offset); - uint16_t xy = XY(x, y); - effects.leds[xy] = color; - - EVERY_N_MILLIS(25) { - theta += 2; - hueoffset += 1; - } - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSimplexNoise.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSimplexNoise.h deleted file mode 100644 index 0c47bff..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSimplexNoise.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from FastLED Fire2012 example by Mark Kriegsman: https://github.com/FastLED/FastLED/blob/master/examples/Noise/Noise.ino - * Copyright (c) 2013 FastLED - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternSimplexNoise_H -#define PatternSimplexNoise_H - -class PatternSimplexNoise : public Drawable { - public: - PatternSimplexNoise() { - name = (char *)"Noise"; - } - - void start() { - // Initialize our coordinates to some random values - noise_x = random16(); - noise_y = random16(); - noise_z = random16(); - } - - unsigned int drawFrame() { -#if FASTLED_VERSION >= 3001000 - // a new parameter set every 15 seconds - EVERY_N_SECONDS(15) { - noise_x = random16(); - noise_y = random16(); - noise_z = random16(); - } -#endif - - uint32_t speed = 100; - - effects.FillNoise(); - ShowNoiseLayer(0, 1, 0); - - // noise_x += speed; - noise_y += speed; - noise_z += speed; - - effects.ShowFrame(); - - return 30; - } - - // show just one layer - void ShowNoiseLayer(byte layer, byte colorrepeat, byte colorshift) { - for (uint16_t i = 0; i < MATRIX_WIDTH; i++) { - for (uint16_t j = 0; j < MATRIX_HEIGHT; j++) { - uint8_t pixel = noise[i][j]; - - // assign a color depending on the actual palette - effects.leds[XY16(i, j)] = effects.ColorFromCurrentPalette(colorrepeat * (pixel + colorshift), pixel); - } - } - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSnake.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSnake.h deleted file mode 100644 index e25756f..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSnake.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from LedEffects Snake by Robert Atkins: https://bitbucket.org/ratkins/ledeffects/src/26ed3c51912af6fac5f1304629c7b4ab7ac8ca4b/Snake.cpp?at=default - * Copyright (c) 2013 Robert Atkins - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternSnake_H -#define PatternSnake_H - -class PatternSnake : public Drawable { -private: - static const byte SNAKE_LENGTH = 16; - - CRGB colors[SNAKE_LENGTH]; - uint8_t initialHue; - - enum Direction { - UP, DOWN, LEFT, RIGHT - }; - - struct Pixel { - uint8_t x; - uint8_t y; - }; - - struct Snake { - Pixel pixels[SNAKE_LENGTH]; - - Direction direction; - - void newDirection() { - switch (direction) { - case UP: - case DOWN: - direction = random(0, 2) == 1 ? RIGHT : LEFT; - break; - - case LEFT: - case RIGHT: - direction = random(0, 2) == 1 ? DOWN : UP; - - default: - break; - } - } - - void shuffleDown() { - for (byte i = SNAKE_LENGTH - 1; i > 0; i--) { - pixels[i] = pixels[i - 1]; - } - } - - void reset() { - direction = UP; - for (int i = 0; i < SNAKE_LENGTH; i++) { - pixels[i].x = 0; - pixels[i].y = 0; - } - } - - void move() { - switch (direction) { - case UP: - pixels[0].y = (pixels[0].y + 1) % MATRIX_HEIGHT; - break; - case LEFT: - pixels[0].x = (pixels[0].x + 1) % MATRIX_WIDTH; - break; - case DOWN: - pixels[0].y = pixels[0].y == 0 ? MATRIX_HEIGHT - 1 : pixels[0].y - 1; - break; - case RIGHT: - pixels[0].x = pixels[0].x == 0 ? MATRIX_WIDTH - 1 : pixels[0].x - 1; - break; - } - } - - void draw(CRGB colors[SNAKE_LENGTH]) { - for (byte i = 0; i < SNAKE_LENGTH; i++) { - effects.leds[XY(pixels[i].x, pixels[i].y)] = colors[i] %= (255 - i * (255 / SNAKE_LENGTH)); - } - } - }; - - static const int snakeCount = 6; - Snake snakes[snakeCount]; - -public: - PatternSnake() { - name = (char *)"Snake"; - for (int i = 0; i < snakeCount; i++) { - Snake* snake = &snakes[i]; - snake->reset(); - } - } - - void start() - { - effects.ClearFrame(); - } - - unsigned int drawFrame() { - - - fill_palette(colors, SNAKE_LENGTH, initialHue++, 5, effects.currentPalette, 255, LINEARBLEND); - - for (int i = 0; i < snakeCount; i++) { - Snake* snake = &snakes[i]; - - snake->shuffleDown(); - - if (random(10) > 7) { - snake->newDirection(); - } - - snake->move(); - snake->draw(colors); - } - - effects.ShowFrame(); - - return 30; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpark.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpark.h deleted file mode 100644 index 74f3b16..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpark.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from FastLED Fire2012 example by Mark Kriegsman: https://github.com/FastLED/FastLED/tree/master/examples/Fire2012WithPalette - * Copyright (c) 2013 FastLED - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternSpark_H -#define PatternSpark_H - -class PatternSpark : public Drawable { - private: - - public: - PatternSpark() { - name = (char *)"Spark"; - } - - // There are two main parameters you can play with to control the look and - // feel of your fire: COOLING (used in step 1 above), and SPARKING (used - // in step 3 above). - // - // COOLING: How much does the air cool as it rises? - // Less cooling = taller flames. More cooling = shorter flames. - // Default 55, suggested range 20-100 - uint8_t cooling = 100; - - // SPARKING: What chance (out of 255) is there that a new spark will be lit? - // Higher chance = more roaring fire. Lower chance = more flickery fire. - // Default 120, suggested range 50-200. - uint8_t sparking = 50; - - unsigned int drawFrame() { - // Add entropy to random number generator; we use a lot of it. - random16_add_entropy( random16()); - - effects.DimAll(235); effects.ShowFrame(); - - for (uint8_t x = 0; x < MATRIX_WIDTH; x++) { - // Step 1. Cool down every cell a little - for (int y = 0; y < MATRIX_HEIGHT; y++) { - int xy = XY(x, y); - heat[xy] = qsub8(heat[xy], random8(0, ((cooling * 10) / MATRIX_HEIGHT) + 2)); - } - - // Step 2. Heat from each cell drifts 'up' and diffuses a little - for (int y = 0; y < MATRIX_HEIGHT; y++) { - heat[XY(x, y)] = (heat[XY(x, y + 1)] + heat[XY(x, y + 2)] + heat[XY(x, y + 2)]) / 3; - } - - // Step 2. Randomly ignite new 'sparks' of heat - if (random8() < sparking) { - uint8_t xt = random8(MATRIX_CENTRE_X - 2, MATRIX_CENTER_X + 3); - - int xy = XY(xt, MATRIX_HEIGHT - 1); - heat[xy] = qadd8(heat[xy], random8(160, 255)); - } - - // Step 4. Map from heat cells to LED colors - for (int y = 0; y < MATRIX_HEIGHT; y++) { - int xy = XY(x, y); - byte colorIndex = heat[xy]; - - // Recommend that you use values 0-240 rather than - // the usual 0-255, as the last 15 colors will be - // 'wrapping around' from the hot end to the cold end, - // which looks wrong. - colorIndex = scale8(colorIndex, 240); - - // override color 0 to ensure a black background? - if (colorIndex != 0) - // effects.leds[xy] = CRGB::Black; - // else - effects.leds[xy] = effects.ColorFromCurrentPalette(colorIndex); - } - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseX(4); - - effects.ShowFrame(); - - return 15; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpin.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpin.h deleted file mode 100644 index c3497e7..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpin.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternSpin_H - - - -class PatternSpin : public Drawable { -public: - PatternSpin() { - name = (char *)"Spin"; - } - - float degrees = 0; - float radius = 16; - - float speedStart = 1; - float velocityStart = 0.6; - - float maxSpeed = 30; - - float speed = speedStart; - float velocity = velocityStart; - - void start() { - speed = speedStart; - velocity = velocityStart; - degrees = 0; - } - - unsigned int drawFrame() { - effects.DimAll(190); effects.ShowFrame(); - - CRGB color = effects.ColorFromCurrentPalette(speed * 8); - - // start position - int x; - int y; - - // target position - float targetDegrees = degrees + speed; - float targetRadians = radians(targetDegrees); - int targetX = (int) (MATRIX_CENTER_X + radius * cos(targetRadians)); - int targetY = (int) (MATRIX_CENTER_Y - radius * sin(targetRadians)); - - float tempDegrees = degrees; - - do{ - float radians = radians(tempDegrees); - x = (int) (MATRIX_CENTER_X + radius * cos(radians)); - y = (int) (MATRIX_CENTER_Y - radius * sin(radians)); - - effects.drawBackgroundFastLEDPixelCRGB(x, y, color); - effects.drawBackgroundFastLEDPixelCRGB(y, x, color); - - tempDegrees += 1; - if (tempDegrees >= 360) - tempDegrees = 0; - } while (x != targetX || y != targetY); - - degrees += speed; - - // add velocity to the particle each pass around the accelerator - if (degrees >= 360) { - degrees = 0; - speed += velocity; - if (speed <= speedStart) { - speed = speedStart; - velocity *= -1; - } - else if (speed > maxSpeed){ - speed = maxSpeed - velocity; - velocity *= -1; - } - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpiral.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpiral.h deleted file mode 100644 index b8e6f07..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpiral.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Portions of this code are adapted from "Funky Clouds" by Stefan Petrick: - * https://gist.github.com/anonymous/876f908333cd95315c35 - * - * Copyright (c) 2014 Stefan Petrick - * http://www.stefan-petrick.de/wordpress_beta - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternSpiral_H -#define PatternSpiral_H - -class PatternSpiral : public Drawable { -private: - // Timer stuff (Oscillators) - struct timer { - unsigned long takt; - unsigned long lastMillis; - unsigned long count; - int delta; - byte up; - byte down; - }; - timer multiTimer[5]; - - int timers = sizeof(multiTimer) / sizeof(multiTimer[0]); - - // counts all variables with different speeds linear up and down - void UpdateTimers() - { - unsigned long now = millis(); - for (int i = 0; i < timers; i++) - { - while (now - multiTimer[i].lastMillis >= multiTimer[i].takt) - { - multiTimer[i].lastMillis += multiTimer[i].takt; - multiTimer[i].count = multiTimer[i].count + multiTimer[i].delta; - if ((multiTimer[i].count == multiTimer[i].up) || (multiTimer[i].count == multiTimer[i].down)) - { - multiTimer[i].delta = -multiTimer[i].delta; - } - } - } - } - -public: - PatternSpiral() { - name = (char *)"Spiral"; - } - - void start() { - // set all counting directions positive for the beginning - for (int i = 0; i < timers; i++) multiTimer[i].delta = 1; - - // set range (up/down), speed (takt=ms between steps) and starting point of all oscillators - - unsigned long now = millis(); - - multiTimer[0].lastMillis = now; - multiTimer[0].takt = 42; //x1 - multiTimer[0].up = MATRIX_WIDTH - 1; - multiTimer[0].down = 0; - multiTimer[0].count = 0; - - multiTimer[1].lastMillis = now; - multiTimer[1].takt = 55; //y1 - multiTimer[1].up = MATRIX_HEIGHT - 1; - multiTimer[1].down = 0; - multiTimer[1].count = 0; - - multiTimer[2].lastMillis = now; - multiTimer[2].takt = 3; //color - multiTimer[2].up = 255; - multiTimer[2].down = 0; - multiTimer[2].count = 0; - - multiTimer[3].lastMillis = now; - multiTimer[3].takt = 71; //x2 - multiTimer[3].up = MATRIX_WIDTH - 1; - multiTimer[3].down = 0; - multiTimer[3].count = 0; - - multiTimer[4].lastMillis = now; - multiTimer[4].takt = 89; //y2 - multiTimer[4].up = MATRIX_HEIGHT - 1; - multiTimer[4].down = 0; - multiTimer[4].count = 0; - } - - unsigned int drawFrame() { - // manage the Oscillators - UpdateTimers(); - - // draw just a line defined by 5 oscillators - effects.BresenhamLine( - multiTimer[3].count, // x1 - multiTimer[4].count, // y1 - multiTimer[0].count, // x2 - multiTimer[1].count, // y2 - multiTimer[2].count); // color - - // manipulate the screen buffer - // with fixed parameters (could be oscillators too) - // Params: center x, y, radius, scale color down - // --> NOTE: Affects always a SQUARE with an odd length - // effects.SpiralStream(15, 15, 10, 128); - - effects.SpiralStream(31, 15, 64, 128); // for 64 pixel wide matrix! - // effects.SpiralStream(47, 15, 10, 128); // for 64 pixel wide matrix! - - // why not several times?! - // effects.SpiralStream(16, 6, 6, 128); - // effects.SpiralStream(10, 24, 10, 128); - - // increase the contrast - effects.DimAll(250); effects.ShowFrame(); - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpiro.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpiro.h deleted file mode 100644 index c41a3c6..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSpiro.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternSpiro_H - -class PatternSpiro : public Drawable { - private: - byte theta1 = 0; - byte theta2 = 0; - byte hueoffset = 0; - - uint8_t radiusx = MATRIX_WIDTH / 4; - uint8_t radiusy = MATRIX_HEIGHT / 4; - uint8_t minx = MATRIX_CENTER_X - radiusx; - uint8_t maxx = MATRIX_CENTER_X + radiusx + 1; - uint8_t miny = MATRIX_CENTER_Y - radiusy; - uint8_t maxy = MATRIX_CENTER_Y + radiusy + 1; - - uint8_t spirocount = 1; - uint8_t spirooffset = 256 / spirocount; - boolean spiroincrement = true; - - boolean handledChange = false; - - public: - PatternSpiro() { - name = (char *)"Spiro"; - } - - void start(){ - effects.ClearFrame(); - }; - - unsigned int drawFrame() { - blur2d(effects.leds, MATRIX_WIDTH > 255 ? 255 : MATRIX_WIDTH, MATRIX_HEIGHT > 255 ? 255 : MATRIX_HEIGHT, 192); - - boolean change = false; - - for (int i = 0; i < spirocount; i++) { - uint8_t x = mapsin8(theta1 + i * spirooffset, minx, maxx); - uint8_t y = mapcos8(theta1 + i * spirooffset, miny, maxy); - - uint8_t x2 = mapsin8(theta2 + i * spirooffset, x - radiusx, x + radiusx); - uint8_t y2 = mapcos8(theta2 + i * spirooffset, y - radiusy, y + radiusy); - - CRGB color = effects.ColorFromCurrentPalette(hueoffset + i * spirooffset, 128); - effects.leds[XY(x2, y2)] += color; - - if((x2 == MATRIX_CENTER_X && y2 == MATRIX_CENTER_Y) || - (x2 == MATRIX_CENTRE_X && y2 == MATRIX_CENTRE_Y)) change = true; - } - - theta2 += 1; - - EVERY_N_MILLIS(25) { - theta1 += 1; - } - - EVERY_N_MILLIS(100) { - if (change && !handledChange) { - handledChange = true; - - if (spirocount >= MATRIX_WIDTH || spirocount == 1) spiroincrement = !spiroincrement; - - if (spiroincrement) { - if(spirocount >= 4) - spirocount *= 2; - else - spirocount += 1; - } - else { - if(spirocount > 4) - spirocount /= 2; - else - spirocount -= 1; - } - - spirooffset = 256 / spirocount; - } - - if(!change) handledChange = false; - } - - EVERY_N_MILLIS(33) { - hueoffset += 1; - } - - effects.ShowFrame(); - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSwirl.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSwirl.h deleted file mode 100644 index a81ed61..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternSwirl.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Portions of this code are adapted from SmartMatrixSwirl by Mark Kriegsman: https://gist.github.com/kriegsman/5adca44e14ad025e6d3b -* https://www.youtube.com/watch?v=bsGBT-50cts -* Copyright (c) 2014 Mark Kriegsman -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternSwirl_H - -class PatternSwirl : public Drawable { - private: - const uint8_t borderWidth = 2; - - public: - PatternSwirl() { - name = (char *)"Swirl"; - } - - void start() { - effects.ClearFrame(); - } - - unsigned int drawFrame() { - // Apply some blurring to whatever's already on the matrix - // Note that we never actually clear the matrix, we just constantly - // blur it repeatedly. Since the blurring is 'lossy', there's - // an automatic trend toward black -- by design. - uint8_t blurAmount = beatsin8(2, 10, 255); - -#if FASTLED_VERSION >= 3001000 - blur2d(effects.leds, MATRIX_WIDTH > 255 ? 255 : MATRIX_WIDTH, MATRIX_HEIGHT > 255 ? 255 : MATRIX_HEIGHT, blurAmount); -#else - effects.DimAll(blurAmount); -#endif - - // Use two out-of-sync sine waves - uint8_t i = beatsin8(256/MATRIX_HEIGHT, borderWidth, MATRIX_WIDTH - borderWidth); - uint8_t j = beatsin8(2048/MATRIX_WIDTH, borderWidth, MATRIX_HEIGHT - borderWidth); - - // Also calculate some reflections - uint8_t ni = (MATRIX_WIDTH - 1) - i; - uint8_t nj = (MATRIX_HEIGHT - 1) - j; - - // The color of each point shifts over time, each at a different speed. - uint16_t ms = millis(); - effects.leds[XY(i, j)] += effects.ColorFromCurrentPalette(ms / 11); - //effects.leds[XY(j, i)] += effects.ColorFromCurrentPalette(ms / 13); // this doesn't work for non-square matrices - effects.leds[XY(ni, nj)] += effects.ColorFromCurrentPalette(ms / 17); - //effects.leds[XY(nj, ni)] += effects.ColorFromCurrentPalette(ms / 29); // this doesn't work for non-square matrices - effects.leds[XY(i, nj)] += effects.ColorFromCurrentPalette(ms / 37); - effects.leds[XY(ni, j)] += effects.ColorFromCurrentPalette(ms / 41); - - - effects.ShowFrame(); - return 0; - - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternTest.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternTest.h deleted file mode 100644 index 61e870a..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternTest.h +++ /dev/null @@ -1,20 +0,0 @@ - -#ifndef PatternTest_H -#define PatternTest_H - -class PatternTest : public Drawable { - private: - - public: - PatternTest() { - name = (char *)"Test Pattern"; - } - - unsigned int drawFrame() { - - dma_display->fillScreen(dma_display->color565(128, 0, 0)); - return 1000; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternWave.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternWave.h deleted file mode 100644 index 8246a5f..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/PatternWave.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternWave_H -#define PatternWave_H - -class PatternWave : public Drawable { -private: - byte thetaUpdate = 0; - byte thetaUpdateFrequency = 0; - byte theta = 0; - - byte hueUpdate = 0; - byte hueUpdateFrequency = 0; - byte hue = 0; - - byte rotation = 0; - - uint8_t scale = 256 / MATRIX_WIDTH; - - uint8_t maxX = MATRIX_WIDTH - 1; - uint8_t maxY = MATRIX_HEIGHT - 1; - - uint8_t waveCount = 1; - -public: - PatternWave() { - name = (char *)"Wave"; - } - - void start() { - rotation = random(0, 4); - waveCount = random(1, 3); - - } - - unsigned int drawFrame() { - int n = 0; - - switch (rotation) { - case 0: - for (int x = 0; x < MATRIX_WIDTH; x++) { - n = quadwave8(x * 2 + theta) / scale; - effects.drawBackgroundFastLEDPixelCRGB(x, n, effects.ColorFromCurrentPalette(x + hue)); - if (waveCount == 2) - effects.drawBackgroundFastLEDPixelCRGB(x, maxY - n, effects.ColorFromCurrentPalette(x + hue)); - } - break; - - case 1: - for (int y = 0; y < MATRIX_HEIGHT; y++) { - n = quadwave8(y * 2 + theta) / scale; - effects.drawBackgroundFastLEDPixelCRGB(n, y, effects.ColorFromCurrentPalette(y + hue)); - if (waveCount == 2) - effects.drawBackgroundFastLEDPixelCRGB(maxX - n, y, effects.ColorFromCurrentPalette(y + hue)); - } - break; - - case 2: - for (int x = 0; x < MATRIX_WIDTH; x++) { - n = quadwave8(x * 2 - theta) / scale; - effects.drawBackgroundFastLEDPixelCRGB(x, n, effects.ColorFromCurrentPalette(x + hue)); - if (waveCount == 2) - effects.drawBackgroundFastLEDPixelCRGB(x, maxY - n, effects.ColorFromCurrentPalette(x + hue)); - } - break; - - case 3: - for (int y = 0; y < MATRIX_HEIGHT; y++) { - n = quadwave8(y * 2 - theta) / scale; - effects.drawBackgroundFastLEDPixelCRGB(n, y, effects.ColorFromCurrentPalette(y + hue)); - if (waveCount == 2) - effects.drawBackgroundFastLEDPixelCRGB(maxX - n, y, effects.ColorFromCurrentPalette(y + hue)); - } - break; - } - - effects.DimAll(254); - effects.ShowFrame(); - - if (thetaUpdate >= thetaUpdateFrequency) { - thetaUpdate = 0; - theta++; - } - else { - thetaUpdate++; - } - - if (hueUpdate >= hueUpdateFrequency) { - hueUpdate = 0; - hue++; - } - else { - hueUpdate++; - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Patterns.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Patterns.h deleted file mode 100644 index 100a545..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Patterns.h +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Patterns_H -#define Patterns_H - -#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0])) - -#include "Vector.h" -#include "Boid.h" -#include "Attractor.h" - -/* - * Note from mrfaptastic: - * - * Commented out patterns are due to the fact they either didn't work properly with a non-square display, - * or from my personal opinion, are crap. - */ - -#include "PatternTest.h" -//#include "PatternNoiseSmearing.h" // Doesn't seem to work, omitting. -#include "PatternSpiro.h" -#include "PatternRadar.h" -#include "PatternSwirl.h" -#include "PatternPendulumWave.h" -#include "PatternFlowField.h" -#include "PatternIncrementalDrift.h" -//#include "PatternIncrementalDrift2.h" // Doesn't seem to work, omitting. -#include "PatternMunch.h" -#include "PatternElectricMandala.h" -//#include "PatternSpin.h" // Doesn't seem to work, omitting. -#include "PatternSimplexNoise.h" -#include "PatternWave.h" -#include "PatternAttract.h" -//#include "PatternBounce.h" // Doesn't seem to work, omitting. -#include "PatternFlock.h" -#include "PatternInfinity.h" -#include "PatternPlasma.h" -#include "PatternSnake.h" -#include "PatternInvaders.h" -//#include "PatternCube.h" // Doesn't seem to work, omitting. -//#include "PatternFire.h" // Doesn't seem to work, omitting. -#include "PatternLife.h" -#include "PatternMaze.h" -//#include "PatternPulse.h" // Doesn't seem to work, omitting. -//#include "PatternSpark.h" // Doesn't seem to work, omitting. -#include "PatternSpiral.h" - -class Patterns : public Playlist { - private: - PatternTest patternTest; - // PatternRainbowFlag rainbowFlag; // doesn't work - // PatternPaletteSmear paletteSmear; - // PatternMultipleStream multipleStream; // doesn't work - // PatternMultipleStream2 multipleStream2; // doesn't work - // PatternMultipleStream3 multipleStream3; // doesn't work - // PatternMultipleStream4 multipleStream4; // doesn't work - // PatternMultipleStream5 multipleStream5; // doesn't work - // PatternMultipleStream8 multipleStream8; // doesn't work - PatternSpiro spiro; - // PatternRadar radar; - PatternSwirl swirl; - PatternPendulumWave pendulumWave; - PatternFlowField flowField; - PatternIncrementalDrift incrementalDrift; - // PatternIncrementalDrift2 incrementalDrift2; - PatternMunch munch; - PatternElectricMandala electricMandala; - // PatternSpin spin; - PatternSimplexNoise simplexNoise; - PatternWave wave; - PatternAttract attract; - // PatternBounce bounce; - PatternFlock flock; - PatternInfinity infinity; - PatternPlasma plasma; - PatternInvadersSmall invadersSmall; - // PatternInvadersMedium invadersMedium; - // PatternInvadersLarge invadersLarge; - PatternSnake snake; - // PatternCube cube; - // PatternFire fire; - PatternLife life; - PatternMaze maze; - // PatternPulse pulse; - // PatternSpark spark; - PatternSpiral spiral; - - int currentIndex = 0; - Drawable* currentItem; - - int getCurrentIndex() { - return currentIndex; - } - - //const static int PATTERN_COUNT = 37; - - const static int PATTERN_COUNT = 17; - - Drawable* shuffledItems[PATTERN_COUNT]; - - Drawable* items[PATTERN_COUNT] = { - // &patternTest, // ok - &spiro, // cool - // &paletteSmear, // fail - // &multipleStream, // fail - // &multipleStream8,// fail - // &multipleStream5,// fail - // &multipleStream3,// fail - // &radar, // fail - // &multipleStream4, // fail - // &multipleStream2, // fail - &life, // ok - &flowField, - &pendulumWave, //11 ok - - &incrementalDrift, //12 ok - // &incrementalDrift2, // 13 fail - &munch, // 14 ok - &electricMandala, // 15 ok - // &spin, // 16 ok but repetitive - &simplexNoise, // 17 - cool! - // &wave, // 18 ok (can't work with 256+ matrix due to uint8_t vars) - // &rainbowFlag, //20 // fail - &attract, // 21 ok - &swirl, // 22 - // &bounce, // bouncing line crap - &flock, // works - &infinity, // works - &plasma, // works - &invadersSmall, // works ish - // &invadersMedium, // fail - // &invadersLarge, // fail - &snake, // ok - // &cube, // works ish - // &fire, // ok ish - &maze, // ok - // &pulse,// fail - // &spark, // same as fire - &spiral, // ok - }; - - public: - Patterns() { - // add the items to the shuffledItems array - for (int a = 0; a < PATTERN_COUNT; a++) { - shuffledItems[a] = items[a]; - } - - shuffleItems(); - - this->currentItem = items[0]; - this->currentItem->start(); - } - - char* Drawable::name = (char *)"Patterns"; - - void stop() { - if (currentItem) - currentItem->stop(); - } - - void start() { - if (currentItem) - currentItem->start(); - } - - void move(int step) { - currentIndex += step; - - if (currentIndex >= PATTERN_COUNT) currentIndex = 0; - else if (currentIndex < 0) currentIndex = PATTERN_COUNT - 1; - - if (effects.paletteIndex == effects.RandomPaletteIndex) - effects.RandomPalette(); - - moveTo(currentIndex); - - //if (!isTimeAvailable && currentItem == &analogClock) - // move(step); - } - - void moveRandom(int step) { - currentIndex += step; - - if (currentIndex >= PATTERN_COUNT) currentIndex = 0; - else if (currentIndex < 0) currentIndex = PATTERN_COUNT - 1; - - if (effects.paletteIndex == effects.RandomPaletteIndex) - effects.RandomPalette(); - - if (currentItem) - currentItem->stop(); - - currentItem = shuffledItems[currentIndex]; - - if (currentItem) - currentItem->start(); - - // if (!isTimeAvailable && currentItem == &analogClock) - // moveRandom(step); - } - - void shuffleItems() { - for (int a = 0; a < PATTERN_COUNT; a++) - { - int r = random(a, PATTERN_COUNT); - Drawable* temp = shuffledItems[a]; - shuffledItems[a] = shuffledItems[r]; - shuffledItems[r] = temp; - } - } - - - unsigned int drawFrame() { - return currentItem->drawFrame(); - } - - void listPatterns() { - Serial.println(F("{")); - Serial.print(F(" \"count\": ")); - Serial.print(PATTERN_COUNT); - Serial.println(","); - Serial.println(F(" \"results\": [")); - - for (int i = 0; i < PATTERN_COUNT; i++) { - Serial.print(F(" \"")); - Serial.print(i, DEC); - Serial.print(F(": ")); - Serial.print(items[i]->name); - if (i == PATTERN_COUNT - 1) - Serial.println(F("\"")); - else - Serial.println(F("\",")); - } - - Serial.println(" ]"); - Serial.println("}"); - } - - char * getCurrentPatternName() - { - return currentItem->name; - } - - void moveTo(int index) { - if (currentItem) - currentItem->stop(); - - currentIndex = index; - - currentItem = items[currentIndex]; - - if (currentItem) - currentItem->start(); - } - - bool setPattern(String name) { - for (int i = 0; i < PATTERN_COUNT; i++) { - if (name.compareTo(items[i]->name) == 0) { - moveTo(i); - return true; - } - } - - return false; - } - - - bool setPattern(int index) { - if (index >= PATTERN_COUNT || index < 0) - return false; - - moveTo(index); - - return true; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Playlist.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Playlist.h deleted file mode 100644 index 29c0c87..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Playlist.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Playlist_H -#define Playlist_H - -class Playlist : public Drawable { -public: - virtual bool isPlaylist() { - return true; - } - - boolean isCurrentItemFinished = true; - - virtual void move(int step) = 0; - virtual void moveRandom(int step) = 0; - virtual int getCurrentIndex(); -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/README.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/README.md deleted file mode 100644 index 2344367..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/README.md +++ /dev/null @@ -1,6 +0,0 @@ -A port of Aurora visualisations -====== - -Not all of the visualisations have been ported. About 17 of 37 work, or have been included as I think they look best. - -Original source: https://github.com/pixelmatix/aurora \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Vector.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Vector.h deleted file mode 100644 index 8acbadc..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/AuroraDemo/Vector.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Vector_H -#define Vector_H - -template -class Vector2 { -public: - T x, y; - - Vector2() :x(0), y(0) {} - Vector2(T x, T y) : x(x), y(y) {} - Vector2(const Vector2& v) : x(v.x), y(v.y) {} - - Vector2& operator=(const Vector2& v) { - x = v.x; - y = v.y; - return *this; - } - - bool isEmpty() { - return x == 0 && y == 0; - } - - bool operator==(Vector2& v) { - return x == v.x && y == v.y; - } - - bool operator!=(Vector2& v) { - return !(x == y); - } - - Vector2 operator+(Vector2& v) { - return Vector2(x + v.x, y + v.y); - } - Vector2 operator-(Vector2& v) { - return Vector2(x - v.x, y - v.y); - } - - Vector2& operator+=(Vector2& v) { - x += v.x; - y += v.y; - return *this; - } - Vector2& operator-=(Vector2& v) { - x -= v.x; - y -= v.y; - return *this; - } - - Vector2 operator+(double s) { - return Vector2(x + s, y + s); - } - Vector2 operator-(double s) { - return Vector2(x - s, y - s); - } - Vector2 operator*(double s) { - return Vector2(x * s, y * s); - } - Vector2 operator/(double s) { - return Vector2(x / s, y / s); - } - - Vector2& operator+=(double s) { - x += s; - y += s; - return *this; - } - Vector2& operator-=(double s) { - x -= s; - y -= s; - return *this; - } - Vector2& operator*=(double s) { - x *= s; - y *= s; - return *this; - } - Vector2& operator/=(double s) { - x /= s; - y /= s; - return *this; - } - - void set(T x, T y) { - this->x = x; - this->y = y; - } - - void rotate(double deg) { - double theta = deg / 180.0 * M_PI; - double c = cos(theta); - double s = sin(theta); - double tx = x * c - y * s; - double ty = x * s + y * c; - x = tx; - y = ty; - } - - Vector2& normalize() { - if (length() == 0) return *this; - *this *= (1.0 / length()); - return *this; - } - - float dist(Vector2 v) const { - Vector2 d(v.x - x, v.y - y); - return d.length(); - } - float length() const { - return sqrt(x * x + y * y); - } - - float mag() const { - return length(); - } - - float magSq() { - return (x * x + y * y); - } - - void truncate(double length) { - double angle = atan2f(y, x); - x = length * cos(angle); - y = length * sin(angle); - } - - Vector2 ortho() const { - return Vector2(y, -x); - } - - static float dot(Vector2 v1, Vector2 v2) { - return v1.x * v2.x + v1.y * v2.y; - } - static float cross(Vector2 v1, Vector2 v2) { - return (v1.x * v2.y) - (v1.y * v2.x); - } - - void limit(float max) { - if (magSq() > max*max) { - normalize(); - *this *= max; - } - } -}; - -typedef Vector2 PVector; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/BitmapIcons.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/BitmapIcons.ino deleted file mode 100644 index ab1b6e4..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/BitmapIcons.ino +++ /dev/null @@ -1,204 +0,0 @@ -#include -#include -#include "Dhole_weather_icons32px.h" - -/*--------------------- DEBUG -------------------------*/ -#define Sprintln(a) (Serial.println(a)) -#define SprintlnDEC(a, x) (Serial.println(a, x)) - -#define Sprint(a) (Serial.print(a)) -#define SprintDEC(a, x) (Serial.print(a, x)) - - -/*--------------------- RGB DISPLAY PINS -------------------------*/ -#define R1_PIN 25 -#define G1_PIN 26 -#define B1_PIN 27 -#define R2_PIN 14 -#define G2_PIN 12 -#define B2_PIN 13 -#define A_PIN 23 -#define B_PIN 19 // Changed from library default -#define C_PIN 5 -#define D_PIN 17 -#define E_PIN -1 -#define LAT_PIN 4 -#define OE_PIN 15 -#define CLK_PIN 16 - - -/*--------------------- MATRIX LILBRARY CONFIG -------------------------*/ -#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. -#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. -#define PANEL_CHAIN 1 // Total number of panels chained one to another - -MatrixPanel_I2S_DMA *dma_display = nullptr; - -// Module configuration -HUB75_I2S_CFG mxconfig( - PANEL_RES_X, // module width - PANEL_RES_Y, // module height - PANEL_CHAIN // Chain length -); - -/* -//Another way of creating config structure -//Custom pin mapping for all pins -HUB75_I2S_CFG::i2s_pins _pins={R1, G1, BL1, R2, G2, BL2, CH_A, CH_B, CH_C, CH_D, CH_E, LAT, OE, CLK}; -HUB75_I2S_CFG mxconfig( - 64, // width - 64, // height - 4, // chain length - _pins, // pin mapping - HUB75_I2S_CFG::FM6126A // driver chip -); - -*/ - - -//mxconfig.gpio.e = -1; // Assign a pin if you have a 64x64 panel -//mxconfig.clkphase = false; // Change this if you have issues with ghosting. -//mxconfig.driver = HUB75_I2S_CFG::FM6126A; // Change this according to your pane. - - -/* - * Wifi Logo, generated with the following steps: - * - * Python and Paint.Net needs to be installed. - * - * 1. SAVE BITMAP AS 1BIT COLOUR in paint.net - * 2. Run: bmp2hex.py -i -x - * 3. Copy paste output into sketch. - * - */ - -const char wifi_image1bit[] PROGMEM = { - 0x00,0x00,0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x01,0x00, - 0x00,0x00,0x00,0xf0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x1f, - 0x00,0x00,0x00,0x00,0xfe,0x07,0xe0,0x7f,0x00,0x00,0x00,0x80,0xff,0x00,0x00, - 0xff,0x01,0x00,0x00,0xc0,0x1f,0x00,0x00,0xf8,0x03,0x00,0x00,0xe0,0x0f,0x00, - 0x00,0xf0,0x07,0x00,0x00,0xf0,0x03,0xf0,0x0f,0xc0,0x0f,0x00,0x00,0xe0,0x01, - 0xff,0xff,0x80,0x07,0x00,0x00,0xc0,0xc0,0xff,0xff,0x03,0x03,0x00,0x00,0x00, - 0xe0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xf8,0x0f,0xf0,0x1f,0x00,0x00,0x00, - 0x00,0xfc,0x01,0x80,0x3f,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x3e,0x00,0x00, - 0x00,0x00,0x38,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x10,0xe0,0x07,0x08,0x00, - 0x00,0x00,0x00,0x00,0xfc,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x7f,0x00, - 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xf8, - 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00, - 0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x07,0x00,0x00,0x00,0x00, - 0x00,0x00,0xe0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00, - 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00 }; - - -void drawXbm565(int x, int y, int width, int height, const char *xbm, uint16_t color = 0xffff) -{ - if (width % 8 != 0) { - width = ((width / 8) + 1) * 8; - } - for (int i = 0; i < width * height / 8; i++ ) { - unsigned char charColumn = pgm_read_byte(xbm + i); - for (int j = 0; j < 8; j++) { - int targetX = (i * 8 + j) % width + x; - int targetY = (8 * i / (width)) + y; - if (bitRead(charColumn, j)) { - dma_display->drawPixel(targetX, targetY, color); - } - } - } -} - -/* Bitmaps */ -int current_icon = 0; -static int num_icons = 22; - -static char icon_name[22][30] = { -"cloud_moon_bits", -"cloud_sun_bits", -"clouds_bits", -"cloud_wind_moon_bits", -"cloud_wind_sun_bits", -"cloud_wind_bits", -"cloud_bits", -"lightning_bits", -"moon_bits", -"rain0_sun_bits", -"rain0_bits", -"rain1_moon_bits", -"rain1_sun_bits", -"rain1_bits", -"rain2_bits", -"rain_lightning_bits", -"rain_snow_bits", -"snow_moon_bits", -"snow_sun_bits", -"snow_bits", -"sun_bits", -"wind_bits" }; - -static char *icon_bits[22] = { cloud_moon_bits, -cloud_sun_bits, -clouds_bits, -cloud_wind_moon_bits, -cloud_wind_sun_bits, -cloud_wind_bits, -cloud_bits, -lightning_bits, -moon_bits, -rain0_sun_bits, -rain0_bits, -rain1_moon_bits, -rain1_sun_bits, -rain1_bits, -rain2_bits, -rain_lightning_bits, -rain_snow_bits, -snow_moon_bits, -snow_sun_bits, -snow_bits, -sun_bits, -wind_bits}; - - - -void setup() { - - // put your setup code here, to run once: - delay(1000); Serial.begin(115200); delay(200); - - - /************** DISPLAY **************/ - Sprintln("...Starting Display"); - dma_display = new MatrixPanel_I2S_DMA(mxconfig); - dma_display->begin(); - dma_display->setBrightness8(90); //0-255 - dma_display->clearScreen(); - - dma_display->fillScreen(dma_display->color444(0, 1, 0)); - - // Fade a Red Wifi Logo In - for (int r=0; r < 255; r++ ) - { - drawXbm565(0,0,64,32, wifi_image1bit, dma_display->color565(r,0,0)); - delay(10); - } - - delay(2000); - dma_display->clearScreen(); -} - - -void loop() { - - // Loop through Weather Icons - Serial.print("Showing icon "); - Serial.println(icon_name[current_icon]); - drawXbm565(0,0, 32, 32, icon_bits[current_icon]); - - current_icon = (current_icon +1 ) % num_icons; - delay(2000); - dma_display->clearScreen(); - -} \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/Dhole_weather_icons32px.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/Dhole_weather_icons32px.h deleted file mode 100644 index 5fb8b3b..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/Dhole_weather_icons32px.h +++ /dev/null @@ -1,308 +0,0 @@ -#define cloud_moon_width 32 -#define cloud_moon_height 32 -static char cloud_moon_bits[] = { - 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x7C, 0x00, - 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, - 0x00, 0x00, 0xE3, 0x00, 0x00, 0x00, 0xC3, 0x01, 0x00, 0xF0, 0x87, 0xC3, - 0x00, 0xFC, 0x1F, 0xFF, 0x00, 0x1E, 0x3C, 0xFE, 0x00, 0x06, 0x30, 0x60, - 0x00, 0x07, 0xF0, 0x79, 0x00, 0x03, 0xE0, 0x3F, 0xE0, 0x03, 0x00, 0x0F, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x07, 0x38, 0x00, 0x80, 0x03, - 0xF0, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0x00, 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 cloud_sun_width 32 -#define cloud_sun_height 32 -static char cloud_sun_bits[] = { - 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0xC1, 0x60, - 0x00, 0x80, 0x03, 0x70, 0x00, 0x00, 0xF3, 0x33, 0x00, 0x00, 0xF8, 0x07, - 0x00, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0xF0, 0x07, 0x18, - 0x00, 0xFC, 0x1F, 0xD8, 0x00, 0x1E, 0x3C, 0xD8, 0x00, 0x06, 0x30, 0x18, - 0x00, 0x07, 0xF0, 0x1D, 0x00, 0x03, 0xE0, 0x0F, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x07, 0x38, 0x00, 0x80, 0x03, - 0xF0, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0x00, 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 clouds_width 32 -#define clouds_height 32 -static char clouds_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xC0, 0xFF, 0x01, - 0x00, 0xE0, 0xC1, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xF0, 0x07, 0x1F, - 0x00, 0xFC, 0x1F, 0x3E, 0x00, 0x1E, 0x3C, 0x70, 0x00, 0x06, 0x30, 0xE0, - 0x00, 0x07, 0xF0, 0xC1, 0x00, 0x03, 0xE0, 0xC3, 0xE0, 0x03, 0x00, 0xC7, - 0xF0, 0x01, 0x00, 0xCE, 0x38, 0x00, 0x00, 0xCC, 0x1C, 0x00, 0x00, 0xEC, - 0x0C, 0x00, 0x00, 0x6C, 0x0C, 0x00, 0x00, 0x2C, 0x0C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x07, 0x38, 0x00, 0x80, 0x03, - 0xF0, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0x00, 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 cloud_wind_moon_width 32 -#define cloud_wind_moon_height 32 -static char cloud_wind_moon_bits[] = { - 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x7C, 0x00, - 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, - 0x00, 0x00, 0xE3, 0x00, 0x00, 0x00, 0xC3, 0x01, 0x00, 0xF0, 0x87, 0xC3, - 0x00, 0xFC, 0x1F, 0xFF, 0x00, 0x1E, 0x3C, 0xFE, 0x00, 0x06, 0x30, 0x60, - 0x00, 0x07, 0xF0, 0x79, 0x00, 0x03, 0xE0, 0x3F, 0xE0, 0x03, 0x00, 0x0F, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, - 0xFC, 0xFF, 0x3F, 0x0E, 0xFC, 0xFF, 0x3F, 0x07, 0x00, 0x00, 0x80, 0x03, - 0xFF, 0xFF, 0xEF, 0x01, 0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFC, 0xFF, 0x3F, 0x00, 0xFC, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define cloud_wind_sun_width 32 -#define cloud_wind_sun_height 32 -static char cloud_wind_sun_bits[] = { - 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0xC1, 0x60, - 0x00, 0x80, 0x03, 0x70, 0x00, 0x00, 0xF3, 0x33, 0x00, 0x00, 0xF8, 0x07, - 0x00, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0xF0, 0x07, 0x18, - 0x00, 0xFC, 0x1F, 0xD8, 0x00, 0x1E, 0x3C, 0xD8, 0x00, 0x06, 0x30, 0x18, - 0x00, 0x07, 0xF0, 0x1D, 0x00, 0x03, 0xE0, 0x0F, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, - 0xFC, 0xFF, 0x3F, 0x0E, 0xFC, 0xFF, 0x3F, 0x07, 0x00, 0x00, 0x80, 0x03, - 0xFF, 0xFF, 0xEF, 0x01, 0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFC, 0xFF, 0x3F, 0x00, 0xFC, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define cloud_wind_width 32 -#define cloud_wind_height 32 -static char cloud_wind_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, - 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x06, 0x30, 0x00, - 0x00, 0x07, 0xF0, 0x01, 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, - 0xFC, 0xFF, 0x3F, 0x0E, 0xFC, 0xFF, 0x3F, 0x07, 0x00, 0x00, 0x80, 0x03, - 0xFF, 0xFF, 0xEF, 0x01, 0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFC, 0xFF, 0x3F, 0x00, 0xFC, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define cloud_width 32 -#define cloud_height 32 -static char cloud_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, - 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x06, 0x30, 0x00, - 0x00, 0x07, 0xF0, 0x01, 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x07, 0x38, 0x00, 0x80, 0x03, - 0xF0, 0xFF, 0xFF, 0x01, 0xE0, 0xFF, 0xFF, 0x00, 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 lightning_width 32 -#define lightning_height 32 -static char lightning_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, - 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x06, 0x30, 0x00, - 0x00, 0x07, 0xF0, 0x01, 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0xC0, 0x01, 0x0C, - 0x0C, 0xC0, 0x01, 0x0E, 0x1C, 0xC0, 0x00, 0x07, 0x38, 0xE0, 0x80, 0x03, - 0xF0, 0x6F, 0xFC, 0x01, 0xE0, 0xEF, 0xFD, 0x00, 0x00, 0x80, 0x01, 0x00, - 0x00, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define moon_width 32 -#define moon_height 32 -static char moon_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x78, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, - 0x80, 0x1B, 0x00, 0x00, 0xC0, 0x19, 0x00, 0x00, 0xE0, 0x1C, 0x00, 0x00, - 0x60, 0x0C, 0x00, 0x00, 0x70, 0x0C, 0x00, 0x00, 0x30, 0x0C, 0x00, 0x00, - 0x30, 0x0C, 0x00, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, - 0x18, 0x38, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, 0x18, 0x70, 0x00, 0x00, - 0x38, 0xE0, 0x01, 0x18, 0x30, 0xC0, 0x87, 0x1F, 0x70, 0x00, 0xFF, 0x1F, - 0x60, 0x00, 0xFC, 0x0C, 0xE0, 0x00, 0x00, 0x0E, 0xC0, 0x01, 0x00, 0x07, - 0x80, 0x03, 0x80, 0x03, 0x00, 0x0F, 0xE0, 0x01, 0x00, 0x3E, 0xFC, 0x00, - 0x00, 0xF8, 0x3F, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define rain0_sun_width 32 -#define rain0_sun_height 32 -static char rain0_sun_bits[] = { - 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0xC1, 0x60, - 0x00, 0x80, 0x03, 0x70, 0x00, 0x00, 0xF3, 0x33, 0x00, 0x00, 0xF8, 0x07, - 0x00, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0xF0, 0x07, 0x18, - 0x00, 0xFC, 0x1F, 0xD8, 0x00, 0x1E, 0x3C, 0xD8, 0x00, 0x06, 0x30, 0x18, - 0x00, 0x07, 0xF0, 0x1D, 0x00, 0x03, 0xE0, 0x0F, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x60, 0x06, 0x0C, - 0x0C, 0x60, 0x06, 0x0E, 0x1C, 0x70, 0x07, 0x07, 0x38, 0x30, 0x83, 0x03, - 0xF0, 0x33, 0xFB, 0x01, 0xE0, 0x01, 0xF8, 0x00, 0x00, 0xCC, 0x00, 0x00, - 0x00, 0xCC, 0x00, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define rain0_width 32 -#define rain0_height 32 -static char rain0_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, - 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x06, 0x30, 0x00, - 0x00, 0x07, 0xF0, 0x01, 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x60, 0x06, 0x0C, - 0x0C, 0x60, 0x06, 0x0E, 0x1C, 0x70, 0x07, 0x07, 0x38, 0x30, 0x83, 0x03, - 0xF0, 0x33, 0xFB, 0x01, 0xE0, 0x01, 0xF8, 0x00, 0x00, 0xCC, 0x00, 0x00, - 0x00, 0xCC, 0x00, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define rain1_moon_width 32 -#define rain1_moon_height 32 -static char rain1_moon_bits[] = { - 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x7C, 0x00, - 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, - 0x00, 0x00, 0xE3, 0x00, 0x00, 0x00, 0xC3, 0x01, 0x00, 0xF0, 0x87, 0xC3, - 0x00, 0xFC, 0x1F, 0xFF, 0x00, 0x1E, 0x3C, 0xFE, 0x00, 0x06, 0x30, 0x60, - 0x00, 0x07, 0xF0, 0x79, 0x00, 0x03, 0xE0, 0x3F, 0xE0, 0x03, 0x00, 0x0F, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x60, 0x06, 0x0C, - 0x0C, 0x60, 0x06, 0x0E, 0x1C, 0x70, 0x07, 0x07, 0x38, 0x30, 0x83, 0x03, - 0xF0, 0xBB, 0xFB, 0x01, 0xE0, 0x99, 0xF9, 0x00, 0x00, 0xDC, 0x01, 0x00, - 0x00, 0xCC, 0x00, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define rain1_sun_width 32 -#define rain1_sun_height 32 -static char rain1_sun_bits[] = { - 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0xC1, 0x60, - 0x00, 0x80, 0x03, 0x70, 0x00, 0x00, 0xF3, 0x33, 0x00, 0x00, 0xF8, 0x07, - 0x00, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0xF0, 0x07, 0x18, - 0x00, 0xFC, 0x1F, 0xD8, 0x00, 0x1E, 0x3C, 0xD8, 0x00, 0x06, 0x30, 0x18, - 0x00, 0x07, 0xF0, 0x1D, 0x00, 0x03, 0xE0, 0x0F, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x60, 0x06, 0x0C, - 0x0C, 0x60, 0x06, 0x0E, 0x1C, 0x70, 0x07, 0x07, 0x38, 0x30, 0x83, 0x03, - 0xF0, 0xBB, 0xFB, 0x01, 0xE0, 0x99, 0xF9, 0x00, 0x00, 0xDC, 0x01, 0x00, - 0x00, 0xCC, 0x00, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define rain1_width 32 -#define rain1_height 32 -static char rain1_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, - 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x06, 0x30, 0x00, - 0x00, 0x07, 0xF0, 0x01, 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x60, 0x06, 0x0C, - 0x0C, 0x60, 0x06, 0x0E, 0x1C, 0x70, 0x07, 0x07, 0x38, 0x30, 0x83, 0x03, - 0xF0, 0xBB, 0xFB, 0x01, 0xE0, 0x99, 0xF9, 0x00, 0x00, 0xDC, 0x01, 0x00, - 0x00, 0xCC, 0x00, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define rain2_width 32 -#define rain2_height 32 -static char rain2_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, - 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x06, 0x30, 0x00, - 0x00, 0x07, 0xF0, 0x01, 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x66, 0x66, 0x0C, - 0x0C, 0x66, 0x66, 0x0E, 0x1C, 0x77, 0x77, 0x07, 0x38, 0x33, 0x33, 0x03, - 0xB0, 0xBB, 0xBB, 0x01, 0x80, 0x99, 0x99, 0x00, 0xC0, 0xDD, 0x1D, 0x00, - 0xC0, 0xCC, 0x0C, 0x00, 0xC0, 0xEE, 0x0C, 0x00, 0x00, 0x66, 0x00, 0x00, - 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define rain_lightning_width 32 -#define rain_lightning_height 32 -static char rain_lightning_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, - 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x06, 0x30, 0x00, - 0x00, 0x07, 0xF0, 0x01, 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0xCC, 0x1C, 0x0C, - 0x0C, 0xCC, 0x1C, 0x0E, 0x1C, 0xEE, 0x0C, 0x07, 0x38, 0x66, 0x8E, 0x03, - 0x70, 0x77, 0xC6, 0x01, 0x20, 0x33, 0xDE, 0x00, 0x80, 0x3B, 0x18, 0x00, - 0x80, 0x19, 0x0C, 0x00, 0x80, 0x1D, 0x0C, 0x00, 0x00, 0x0C, 0x04, 0x00, - 0x00, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define rain_snow_width 32 -#define rain_snow_height 32 -static char rain_snow_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, - 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x06, 0x30, 0x00, - 0x00, 0x07, 0xF0, 0x01, 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0xCC, 0x08, 0x0C, - 0x0C, 0xCC, 0x1C, 0x0E, 0x1C, 0xEE, 0x36, 0x07, 0x38, 0x66, 0x9C, 0x03, - 0x70, 0x77, 0xC8, 0x01, 0x20, 0x33, 0xE2, 0x00, 0x80, 0x3B, 0x07, 0x00, - 0x80, 0x99, 0x0D, 0x00, 0x80, 0x1D, 0x07, 0x00, 0x00, 0x0C, 0x02, 0x00, - 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define snow_moon_width 32 -#define snow_moon_height 32 -static char snow_moon_bits[] = { - 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x7C, 0x00, - 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, - 0x00, 0x00, 0xE3, 0x00, 0x00, 0x00, 0xC3, 0x01, 0x00, 0xF0, 0x87, 0xC3, - 0x00, 0xFC, 0x1F, 0xFF, 0x00, 0x1E, 0x3C, 0xFE, 0x00, 0x06, 0x30, 0x60, - 0x00, 0x07, 0xF0, 0x79, 0x00, 0x03, 0xE0, 0x3F, 0xE0, 0x03, 0x00, 0x0F, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0E, 0x1C, 0x40, 0x00, 0x07, 0x38, 0xE0, 0x80, 0x03, - 0xF0, 0xB1, 0xF1, 0x01, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x44, 0x04, 0x00, - 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x00, 0x0E, 0x0E, 0x00, - 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define snow_sun_width 32 -#define snow_sun_height 32 -static char snow_sun_bits[] = { - 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0xC1, 0x60, - 0x00, 0x80, 0x03, 0x70, 0x00, 0x00, 0xF3, 0x33, 0x00, 0x00, 0xF8, 0x07, - 0x00, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0xF0, 0x07, 0x18, - 0x00, 0xFC, 0x1F, 0xD8, 0x00, 0x1E, 0x3C, 0xD8, 0x00, 0x06, 0x30, 0x18, - 0x00, 0x07, 0xF0, 0x1D, 0x00, 0x03, 0xE0, 0x0F, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0E, 0x1C, 0x40, 0x00, 0x07, 0x38, 0xE0, 0x80, 0x03, - 0xF0, 0xB1, 0xF1, 0x01, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x44, 0x04, 0x00, - 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x00, 0x0E, 0x0E, 0x00, - 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define snow_width 32 -#define snow_height 32 -static char snow_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, - 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x06, 0x30, 0x00, - 0x00, 0x07, 0xF0, 0x01, 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0x00, 0x07, - 0xF0, 0x01, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, - 0x0C, 0x00, 0x00, 0x0E, 0x1C, 0x40, 0x00, 0x07, 0x38, 0xE0, 0x80, 0x03, - 0xF0, 0xB1, 0xF1, 0x01, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x44, 0x04, 0x00, - 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x00, 0x0E, 0x0E, 0x00, - 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define sun_width 32 -#define sun_height 32 -static char sun_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, - 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x83, 0xC1, 0x00, - 0x00, 0x07, 0xE0, 0x00, 0x00, 0xE6, 0x67, 0x00, 0x00, 0xF0, 0x0F, 0x00, - 0x00, 0x38, 0x1C, 0x00, 0x00, 0x1C, 0x38, 0x00, 0x00, 0x0C, 0x30, 0x00, - 0xF0, 0x0D, 0xB0, 0x0F, 0xF0, 0x0D, 0xB0, 0x0F, 0x00, 0x0C, 0x30, 0x00, - 0x00, 0x1C, 0x38, 0x00, 0x00, 0x38, 0x1C, 0x00, 0x00, 0xF0, 0x0F, 0x00, - 0x00, 0xE6, 0x67, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x83, 0xC1, 0x00, - 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, - 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -#define wind_width 32 -#define wind_height 32 -static char wind_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x80, 0x01, - 0xF0, 0xFF, 0xFF, 0x19, 0xF0, 0xFF, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x30, - 0xFC, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, - 0xF0, 0xFF, 0xFF, 0x01, 0xF0, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/README.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/README.md deleted file mode 100644 index 155365e..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Xbm Bitmap example -## Requirements -* To generate the required Xbm data to be copied into the Sketch. Have python and [paint.net](https://www.getpaint.net/) installed. -* Bitmap should match the resolution of your display configuration. - -## Instructions - 1. SAVE BITMAP AS 1BIT COLOUR in paint.net - 1. Run: bmp2hex.py -i -x (e.g. "bmp2hex.py -i -x WiFi1bit.bmp") - 1. Copy paste output into sketch. - - ![bmp2hex usage screenshot](screenshot.jpg) - - diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/WiFi1bit.bmp b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/WiFi1bit.bmp deleted file mode 100644 index 2bace875e7a19436599d5ae500049f88e70ee10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmZWkyA47y477s(!g<{bMk4}au*`rjX0_txw@E}1{B%iDMt`$0EH zqKh(K|5PrOEs&SAs*WNZ6oN==kX3|Xq?VSjKm!RnAe=F0d`T)1%{|(MMa0fYehvaQ HMq2GJ6R|gq diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/bmp2hex.py b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/bmp2hex.py deleted file mode 100644 index 49e1c65..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/bmp2hex.py +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/env python - -##@file bmp2hex.py -# @ingroup util -# A script for converting a 1-bit bitmap to HEX for use in an Arduino sketch. -# -# The BMP format is well publicized. The byte order of the actual bitmap is a -# little unusual. The image is stored bottom to top, left to right. In addition, -# The pixel rows are rounded to DWORDS which are 4 bytes long. SO, to convert this -# to left to right, top to bottom, no byte padding. We have to do some calculations -# as we loop through the rows and bytes of the image. See below for more -# -# Usage: -# >>>bmp2hex.py [-i] [-r] [-n] [-d] [-x] [-w ] [-b ] -# -# @param infile The file to convert. -# @param tablename The name of the table to create -# @param raw "-r", bitmap written as raw table [optional] -# @param invert "-i", to invert image pixel colors [optional] -# @param tablewidth "-w , The number of characters for each row of the output table [optional] -# @param sizebytes "-b , Bytes = 0, 1, or 2. 0 = auto. 1 = 1-byte for sizes. 2 = 2-byte sizes (big endian) [optional] -# @param named "-n", use a names structure [optional] -## @param double "-d", use double bytes rather than single ones [optional] -# @param xbm "-x", use XBM format (bits reversed in byte) [optional] -# @param version "-v", returns version number -# -# @author Robert Gallup 2016-02 -# -# Author: Robert Gallup (bg@robertgallup.com) -# License: MIT Opensource License -# -# Copyright 2016-2018 Robert Gallup -# - -import sys, array, os, textwrap, math, random, argparse - -class DEFAULTS(object): - STRUCTURE_NAME = 'GFXMeta' - VERSION = '2.3.4' - -def main (): - - # Default parameters - infile = "" - tablename = "" - tablewidth = 16 - sizebytes = 0 - invert = False - raw = False - named = False - double = False - xbm = False - version = False - - # Set up parser and handle arguments - parser = argparse.ArgumentParser() - # parser.add_argument ("infile", help="The BMP file(s) to convert", type=argparse.FileType('r'), nargs='+', default=['-']) - parser.add_argument ("infile", help="The BMP file(s) to convert", type=argparse.FileType('r'), nargs='*', default=['-']) - parser.add_argument ("-r", "--raw", help="Outputs all data in raw table format", action="store_true") - parser.add_argument ("-i", "--invert", help="Inverts bitmap pixels", action="store_true") - parser.add_argument ("-w", "--width", help="Output table width in hex bytes [default: 16]", type=int) - parser.add_argument ("-b", "--bytes", help="Byte width of BMP sizes: 0=auto, 1, or 2 (big endian) [default: 0]", type=int) - parser.add_argument ("-n", "--named", help="Uses named structure (" + DEFAULTS.STRUCTURE_NAME + ") for data", action="store_true") -# parser.add_argument ("-d", "--double", help="Defines data in 'words' rather than bytes", action="store_true") - parser.add_argument ("-x", "--xbm", help="Uses XBM bit order (low order bit is first pixel of byte)", action="store_true") - parser.add_argument ("-v", "--version", help="Returns the current bmp2hex version", action="store_true") - args = parser.parse_args() - - # Required arguments - infile = args.infile - - # Options - if args.raw: - raw = args.raw - if args.invert: - invert = args.invert - if args.width: - tablewidth = args.width - if args.bytes: - sizebytes = args.bytes % 3 - if args.named: - named = args.named - # if args.double: - # double = args.double - double = False - if args.xbm: - xbm = args.xbm - if args.version: - print ('// bmp2hex version ' + DEFAULTS.VERSION) - - # Output named structure, if requested - if (named): - print ('struct ' + DEFAULTS.STRUCTURE_NAME + ' {') - print (' unsigned int width;') - print (' unsigned int height;') - print (' unsigned int bitDepth;') - print (' int baseline;') - print (' ' + getDoubleType(double)[0] + 'pixel_data;') - print ('};') - print ('') - - # Do the work - for f in args.infile: - if f == '-': - sys.exit() - bmp2hex(f.name, tablewidth, sizebytes, invert, raw, named, double, xbm) - -# Utility function. Return a long int from array (little endian) -def getLONG(a, n): - return (a[n+3] * (2**24)) + (a[n+2] * (2**16)) + (a[n+1] * (2**8)) + (a[n]) - -# Utility function. Return an int from array (little endian) -def getINT(a, n): - return ((a[n+1] * (2**8)) + (a[n])) - -# Reverses pixels in byte -def reflect(a): - r = 0 - for i in range(8): - r <<= 1 - r |= (a & 0x01) - a >>= 1 - return (r) - -# Returns as a tuple, the data type and length for double versus short data types -def getDoubleType (d): - if d: - dType = 'uint16_t' + ' *' - dLen = 2 - else: - dType = 'uint8_t' + ' *' - dLen = 1 - - return (dType, dLen) - - -# Main conversion function -def bmp2hex(infile, tablewidth, sizebytes, invert, raw, named, double, xbm): - - # Set up some variables to handle the "-d" option - (pixelDataType, dataByteLength) = getDoubleType(double) - - # Set the table name to the uppercase root of the file name - tablename = os.path.splitext(infile)[0].upper() - - # Convert tablewidth to characters from hex bytes - tablewidth = int(tablewidth) * 6 - - # Initialize output buffer - outstring = '' - - # Open File - fin = open(os.path.expanduser(infile), "rb") - uint8_tstoread = os.path.getsize(os.path.expanduser(infile)) - valuesfromfile = array.array('B') - try: - valuesfromfile.fromfile(fin, uint8_tstoread) - finally: - fin.close() - - # Get bytes from file - values=valuesfromfile.tolist() - - # Exit if it's not a Windows BMP - if ((values[0] != 0x42) or (values[1] != 0x4D)): - sys.exit ("Error: Unsupported BMP format. Make sure your file is a Windows BMP.") - - # Calculate width, height - dataOffset = getLONG(values, 10) # Offset to image data - pixelWidth = getLONG(values, 18) # Width of image - pixelHeight = getLONG(values, 22) # Height of image - bitDepth = getINT (values, 28) # Bits per pixel - dataSize = getLONG(values, 34) # Size of raw data - - # Calculate line width in bytes and padded byte width (each row is padded to 4-byte multiples) - byteWidth = int(math.ceil(float(pixelWidth * bitDepth)/8.0)) - paddedWidth = int(math.ceil(float(byteWidth)/4.0)*4.0) - - # For auto (sizebytes = 0), set sizebytes to 1 or 2, depending on size of the bitmap - if (sizebytes==0): - if (pixelWidth>255) or (pixelHeight>255): - sizebytes = 2 - else: - sizebytes = 1 - - # The invert byte is set based on the invert command line flag (but, the logic is reversed for 1-bit files) - invertbyte = 0xFF if invert else 0x00 - if (bitDepth == 1): - invertbyte = invertbyte ^ 0xFF - - # Output the hex table declaration - # With "raw" output, output just an array of chars - if (raw): - # Output the data declaration - print ('PROGMEM unsigned char const ' + tablename + ' [] = {') - - # Output the size of the BMP - if (not (sizebytes%2)): - print ("{0:#04X}".format((pixelWidth>>8) & 0xFF) + ", " + "{0:#04X}".format(pixelWidth & 0xFF) + ", " + \ - "{0:#04X}".format((pixelHeight>>8) & 0xFF) + ", " + "{0:#04X}".format(pixelHeight & 0xFF) + ",") - else: - print ("{0:#04X}".format(pixelWidth & 0xFF) + ", " + "{0:#04X}".format(pixelHeight & 0xFF) + ",") - - elif (named): - print ('PROGMEM ' + getDoubleType(double)[0] + ' const ' + tablename + '_PIXELS[] = {') - - elif (xbm): - print ('#define ' + tablename + '_width ' + str(pixelWidth)) - print ('#define ' + tablename + '_height ' + str(pixelHeight)) - print ('PROGMEM ' + getDoubleType(double)[0] + ' const ' + tablename + '_bits[] = {') - - else: - print ('PROGMEM const struct {') - print (' unsigned int width;') - print (' unsigned int height;') - print (' unsigned int bitDepth;') - print (' ' + pixelDataType + 'pixel_data[{0}];'.format(byteWidth * pixelHeight / dataByteLength)) - print ('} ' + tablename + ' = {') - print ('{0}, {1}, {2}, {{'.format(pixelWidth, pixelHeight, bitDepth)) - - # Generate HEX bytes for pixel data in output buffer - try: - for i in range(pixelHeight): - for j in range (byteWidth): - ndx = dataOffset + ((pixelHeight-1-i) * paddedWidth) + j - v = values[ndx] ^ invertbyte - if (xbm): - v = reflect(v) - # print ("{0:#04x}".format(v)) - outstring += "{0:#04x}".format(v) + ", " - - # Wrap the output buffer. Print. Then, finish. - finally: - outstring = textwrap.fill(outstring[:-2], tablewidth) - print (outstring) - - if (named): - print ('};') - print (DEFAULTS.STRUCTURE_NAME + ' const ' + tablename + ' = {{{0}, {1}, {2}, 0, '.format(pixelWidth, pixelHeight, bitDepth) + \ - pixelDataType + tablename + "_PIXELS};\n\n") - else: - if (not (raw or xbm)): - print ("}") - print ("};") - - -# Only run if launched from commandline -if __name__ == '__main__': main() \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/screenshot.jpg b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BitmapIcons/screenshot.jpg deleted file mode 100644 index 11482604eb41d8b386f1c3b028cd82842f949499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133201 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 N$i&4*S*(mte+A&fx5)qi diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BouncingSquares/BouncingSquares.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BouncingSquares/BouncingSquares.ino deleted file mode 100644 index 6a01225..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/BouncingSquares/BouncingSquares.ino +++ /dev/null @@ -1,84 +0,0 @@ -#include - -MatrixPanel_I2S_DMA *display = nullptr; - -uint16_t myDARK = display->color565(64, 64, 64); -uint16_t myWHITE = display->color565(192, 192, 192); -uint16_t myRED = display->color565(255, 0, 0); -uint16_t myGREEN = display->color565(0, 255, 0); -uint16_t myBLUE = display->color565(0, 0, 255); - -uint16_t colours[5] = { myDARK, myWHITE, myRED, myGREEN, myBLUE }; - -struct Square -{ - float xpos, ypos; - float velocityx; - float velocityy; - boolean xdir, ydir; - uint16_t square_size; - uint16_t colour; -}; - -const int numSquares = 25; -Square Squares[numSquares]; - -void setup() -{ - // put your setup code here, to run once: - delay(1000); - Serial.begin(115200); - delay(200); - - Serial.println("...Starting Display"); - HUB75_I2S_CFG mxconfig; - //mxconfig.double_buff = true; // Turn of double buffer - mxconfig.clkphase = false; - - // OK, now we can create our matrix object - display = new MatrixPanel_I2S_DMA(mxconfig); - display->begin(); // setup display with pins as pre-defined in the library - - // Create some Squares - for (int i = 0; i < numSquares; i++) - { - Squares[i].square_size = random(2,10); - Squares[i].xpos = random(0, display->width() - Squares[i].square_size); - Squares[i].ypos = random(0, display->height() - Squares[i].square_size); - Squares[i].velocityx = static_cast (rand()) / static_cast (RAND_MAX); - Squares[i].velocityy = static_cast (rand()) / static_cast (RAND_MAX); - //Squares[i].xdir = (random(2) == 1) ? true:false; - //Squares[i].ydir = (random(2) == 1) ? true:false; - - int random_num = random(6); - Squares[i].colour = colours[random_num]; - } -} - -void loop() -{ - display->flipDMABuffer(); // not used if double buffering isn't enabled - delay(25); - display->clearScreen(); - - for (int i = 0; i < numSquares; i++) - { - // Draw rect and then calculate - display->fillRect(Squares[i].xpos, Squares[i].ypos, Squares[i].square_size, Squares[i].square_size, Squares[i].colour); - - if (Squares[i].square_size + Squares[i].xpos >= display->width()) { - Squares[i].velocityx *= -1; - } else if (Squares[i].xpos <= 0) { - Squares[i].velocityx = abs (Squares[i].velocityx); - } - - if (Squares[i].square_size + Squares[i].ypos >= display->height()) { - Squares[i].velocityy *= -1; - } else if (Squares[i].ypos <= 0) { - Squares[i].velocityy = abs (Squares[i].velocityy); - } - - Squares[i].xpos += Squares[i].velocityx; - Squares[i].ypos += Squares[i].velocityy; - } -} diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/ChainedPanels.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/ChainedPanels.ino deleted file mode 100644 index 33379c6..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/ChainedPanels.ino +++ /dev/null @@ -1,239 +0,0 @@ -/****************************************************************************** - ----------- - Steps to use - ----------- - - 1) In the sketch (i.e. this example): - - - Set values for NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, PANEL_CHAIN. - There are comments beside them explaining what they are in more detail. - - Other than where the matrix is defined and matrix.begin in the setup, you - should now be using the virtual display for everything (drawing pixels, writing text etc). - You can do a find and replace of all calls if it's an existing sketch - (just make sure you don't replace the definition and the matrix.begin) - - If the sketch makes use of MATRIX_HEIGHT or MATRIX_WIDTH, these will need to be - replaced with the width and height of your virtual screen. - Either make new defines and use that, or you can use virtualDisp.width() or .height() - - Thanks to: - - * Brian Lough for the original example as raised in this issue: - https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/26 - - YouTube: https://www.youtube.com/brianlough - Tindie: https://www.tindie.com/stores/brianlough/ - Twitter: https://twitter.com/witnessmenow - - * Galaxy-Man for the kind donation of panels make/test that this is possible: - https://github.com/Galaxy-Man - -*****************************************************************************/ - - - /****************************************************************************** - * VIRTUAL DISPLAY / MATRIX PANEL CHAINING CONFIGURATION - * - * Note 1: If chaining from the top right to the left, and then S curving down - * then serpentine_chain = true and top_down_chain = true - * (these being the last two parameters of the virtualDisp(...) constructor. - * - * Note 2: If chaining starts from the bottom up, then top_down_chain = false. - * - * Note 3: By default, this library has serpentine_chain = true, that is, every - * second row has the panels 'upside down' (rotated 180), so the output - * pin of the row above is right above the input connector of the next - * row. - - Example 1 panel chaining: - +-----------------+-----------------+-------------------+ - | 64x32px PANEL 3 | 64x32px PANEL 2 | 64x32px PANEL 1 | - | ------------ <-------- | ------------xx | - | [OUT] | [IN] | [OUT] [IN] | [OUT] [ESP IN] | - +--------|--------+-----------------+-------------------+ - | 64x32px|PANEL 4 | 64x32px PANEL 5 | 64x32px PANEL 6 | - | \|/ ----------> | -----> | - | [IN] [OUT] | [IN] [OUT] | [IN] [OUT] | - +-----------------+-----------------+-------------------+ - - Example 1 configuration: - - #define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. - #define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. - - #define NUM_ROWS 2 // Number of rows of chained INDIVIDUAL PANELS - #define NUM_COLS 3 // Number of INDIVIDUAL PANELS per ROW - - virtualDisp(dma_display, NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, true, true); - - = 192x64 px virtual display, with the top left of panel 3 being pixel co-ord (0,0) - - ========================================================== - - Example 2 panel chaining: - - +-------------------+ - | 64x32px PANEL 1 | - | ----------------- | - | [OUT] [ESP IN] | - +-------------------+ - | 64x32px PANEL 2 | - | | - | [IN] [OUT] | - +-------------------+ - | 64x32px PANEL 3 | - | | - | [OUT] [IN] | - +-------------------+ - | 64x32px PANEL 4 | - | | - | [IN] [OUT] | - +-------------------+ - - Example 2 configuration: - - #define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. - #define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. - - #define NUM_ROWS 4 // Number of rows of chained INDIVIDUAL PANELS - #define NUM_COLS 1 // Number of INDIVIDUAL PANELS per ROW - - virtualDisp(dma_display, NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, true, true); - - virtualDisp(dma_display, NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, true, true); - - = 128x64 px virtual display, with the top left of panel 1 being pixel co-ord (0,0) - - ========================================================== - - Example 3 panel chaining (bottom up): - - +-----------------+-----------------+ - | 64x32px PANEL 4 | 64x32px PANEL 3 | - | <---------- | - | [OUT] [IN] | [OUT] [in] | - +-----------------+-----------------+ - | 64x32px PANEL 1 | 64x32px PANEL 2 | - | ----------> | - | [ESP IN] [OUT] | [IN] [OUT] | - +-----------------+-----------------+ - - Example 1 configuration: - - #define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. - #define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. - - #define NUM_ROWS 2 // Number of rows of chained INDIVIDUAL PANELS - #define NUM_COLS 2 // Number of INDIVIDUAL PANELS per ROW - - virtualDisp(dma_display, NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, true, false); - - = 128x64 px virtual display, with the top left of panel 4 being pixel co-ord (0,0) - -*/ - - - - -#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. -#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. - -#define NUM_ROWS 2 // Number of rows of chained INDIVIDUAL PANELS -#define NUM_COLS 2 // Number of INDIVIDUAL PANELS per ROW -#define PANEL_CHAIN NUM_ROWS*NUM_COLS // total number of panels chained one to another - -// Change this to your needs, for details on VirtualPanel pls read the PDF! -#define SERPENT true -#define TOPDOWN false - -// library includes -#include - -// placeholder for the matrix object -MatrixPanel_I2S_DMA *dma_display = nullptr; - -// placeholder for the virtual display object -VirtualMatrixPanel *virtualDisp = nullptr; - - -/****************************************************************************** - * Setup! - ******************************************************************************/ -void setup() { - - delay(2000); - Serial.begin(115200); - Serial.println(""); Serial.println(""); Serial.println(""); - Serial.println("*****************************************************"); - Serial.println(" HELLO !"); - Serial.println("*****************************************************"); - - - /****************************************************************************** - * Create physical DMA panel class AND virtual (chained) display class. - ******************************************************************************/ - - /* - The configuration for MatrixPanel_I2S_DMA object is held in HUB75_I2S_CFG structure, - All options has it's predefined default values. So we can create a new structure and redefine only the options we need - - Please refer to the '2_PatternPlasma.ino' example for detailed example of how to use the MatrixPanel_I2S_DMA configuration - */ - - HUB75_I2S_CFG mxconfig( - PANEL_RES_X, // module width - PANEL_RES_Y, // module height - PANEL_CHAIN // chain length - ); - - //mxconfig.driver = HUB75_I2S_CFG::FM6126A; // in case that we use panels based on FM6126A chip, we can set it here before creating MatrixPanel_I2S_DMA object - - // Sanity checks - if (NUM_ROWS <= 1) { - Serial.println(F("There is no reason to use the VirtualDisplay class for a single horizontal chain and row!")); - } - - // OK, now we can create our matrix object - dma_display = new MatrixPanel_I2S_DMA(mxconfig); - - // let's adjust default brightness to about 75% - dma_display->setBrightness8(192); // range is 0-255, 0 - 0%, 255 - 100% - - // Allocate memory and start DMA display - if( not dma_display->begin() ) - Serial.println("****** !KABOOM! I2S memory allocation failed ***********"); - - // create VirtualDisplay object based on our newly created dma_display object - virtualDisp = new VirtualMatrixPanel((*dma_display), NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, SERPENT, TOPDOWN); - - // So far so good, so continue - virtualDisp->fillScreen(virtualDisp->color444(0, 0, 0)); - virtualDisp->drawDisplayTest(); // draw text numbering on each screen to check connectivity - - delay(3000); - - Serial.println("Chain of 64x32 panels for this example:"); - Serial.println("+--------+---------+"); - Serial.println("| 4 | 3 |"); - Serial.println("| | |"); - Serial.println("+--------+---------+"); - Serial.println("| 1 | 2 |"); - Serial.println("| (ESP) | |"); - Serial.println("+--------+---------+"); - - virtualDisp->setFont(&FreeSansBold12pt7b); - virtualDisp->setTextColor(virtualDisp->color565(0, 0, 255)); - virtualDisp->setTextSize(2); - virtualDisp->setCursor(10, virtualDisp->height()-20); - - // Red text inside red rect (2 pix in from edge) - virtualDisp->print("1234"); - virtualDisp->drawRect(1,1, virtualDisp->width()-2, virtualDisp->height()-2, virtualDisp->color565(255,0,0)); - - // White line from top left to bottom right - virtualDisp->drawLine(0,0, virtualDisp->width()-1, virtualDisp->height()-1, virtualDisp->color565(255,255,255)); -} - -void loop() { - - -} // end loop diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/README.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/README.md deleted file mode 100644 index ca55860..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/README.md +++ /dev/null @@ -1,41 +0,0 @@ -## Chained Panels example - Chaining individual LED matrix panels to make a larger panel ## - -This is the PatternPlasma Demo adopted for use with multiple LED Matrix Panel displays arranged in a non standard order (i.e. a grid) to make a bigger display. - -### What do we mean by 'non standard order'? ### - -When you link / chain multiple panels together, the ESP32-HUB75-MatrixPanel-I2S-DMA library treats as one wide horizontal panel. This would be a 'standard' (default) order. - -Non-standard order is essentially the creation of a non-horizontal-only display that you can draw to in the same way you would any other display, with VirtualDisplay library looking after the pixel mapping to the physical chained panels. - -For example: You bought four (4) 64x32px panels, and wanted to use them to create a 128x64pixel display. You would use the VirtualMatrixPanel class. - -[Refer to this document](VirtualMatrixPanel.pdf) for an explanation and refer to this example on how to use. - - -### Steps to Use ### - -1. [Refer to this document](VirtualMatrixPanel.pdf) for an explanation and refer to this example on how to use. - -2. In your Arduino sketch, configure these defines accordingly: -``` -#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. -#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. - -#define NUM_ROWS 2 // Number of rows of chained INDIVIDUAL PANELS -#define NUM_COLS 2 // Number of INDIVIDUAL PANELS per ROW -``` - -3. In your Arduino sketch, use the 'VirtualMatrixPanel' class instance (virtualDisp) to draw to the display (i.e. drawPixel), instead of the underling MatrixPanel_I2S_DMA class instance (dma_display). - - -#### Thanks to #### -* Brian Lough for the Virtual to Real pixel co-ordinate code. - -YouTube: https://www.youtube.com/brianlough - -Tindie: https://www.tindie.com/stores/brianlough/ - -Twitter: https://twitter.com/witnessmenow - -* Galaxy-Man for the donation of hardware for testing. diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/VirtualMatrixPanel.odp b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/VirtualMatrixPanel.odp deleted file mode 100644 index c0b2082501911eb858137fb6e782fbeb4a084fcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129540 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 !tyadx)%GH`No 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 diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/VirtualMatrixPanel.pdf b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanels/VirtualMatrixPanel.pdf deleted file mode 100644 index cddb4eaca5d00c02c4a8251b26fae499f8348e7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372927 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 VG3{~8T1S?CiugR4t>$PbpKZoN=^{T&ef$|r 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%0Ad_f* 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�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 diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Attractor.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Attractor.h deleted file mode 100644 index 668ba53..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Attractor.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from "Attractor" in "The Nature of Code" by Daniel Shiffman: http://natureofcode.com/ - * Copyright (c) 2014 Daniel Shiffman - * http://www.shiffman.net - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "Vector.h" - -class Attractor { -public: - float mass; // Mass, tied to size - float G; // Gravitational Constant - PVector location; // Location - - Attractor() { - location = PVector(MATRIX_CENTRE_X, MATRIX_CENTRE_Y); - mass = 10; - G = .5; - } - - PVector attract(Boid m) { - PVector force = location - m.location; // Calculate direction of force - float d = force.mag(); // Distance between objects - d = constrain(d, 5.0, 32.0); // Limiting the distance to eliminate "extreme" results for very close or very far objects - force.normalize(); // Normalize vector (distance doesn't matter here, we just want this vector for direction) - float strength = (G * mass * m.mass) / (d * d); // Calculate gravitational force magnitude - force *= strength; // Get force vector --> magnitude * direction - return force; - } -}; diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Boid.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Boid.h deleted file mode 100644 index fa5a9e6..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Boid.h +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from "Flocking" in "The Nature of Code" by Daniel Shiffman: http://natureofcode.com/ - * Copyright (c) 2014 Daniel Shiffman - * http://www.shiffman.net - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -// Flocking -// Daniel Shiffman -// The Nature of Code, Spring 2009 - -// Boid class -// Methods for Separation, Cohesion, Alignment added - -class Boid { - public: - - PVector location; - PVector velocity; - PVector acceleration; - float maxforce; // Maximum steering force - float maxspeed; // Maximum speed - - float desiredseparation = 4; - float neighbordist = 8; - byte colorIndex = 0; - float mass; - - boolean enabled = true; - - Boid() {} - - Boid(float x, float y) { - acceleration = PVector(0, 0); - velocity = PVector(randomf(), randomf()); - location = PVector(x, y); - maxspeed = 1.5; - maxforce = 0.05; - } - - static float randomf() { - return mapfloat(random(0, 255), 0, 255, -.5, .5); - } - - static float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) { - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; - } - - void run(Boid boids [], uint8_t boidCount) { - flock(boids, boidCount); - update(); - // wrapAroundBorders(); - // render(); - } - - // Method to update location - void update() { - // Update velocity - velocity += acceleration; - // Limit speed - velocity.limit(maxspeed); - location += velocity; - // Reset acceleration to 0 each cycle - acceleration *= 0; - } - - void applyForce(PVector force) { - // We could add mass here if we want A = F / M - acceleration += force; - } - - void repelForce(PVector obstacle, float radius) { - //Force that drives boid away from obstacle. - - PVector futPos = location + velocity; //Calculate future position for more effective behavior. - PVector dist = obstacle - futPos; - float d = dist.mag(); - - if (d <= radius) { - PVector repelVec = location - obstacle; - repelVec.normalize(); - if (d != 0) { //Don't divide by zero. - // float scale = 1.0 / d; //The closer to the obstacle, the stronger the force. - repelVec.normalize(); - repelVec *= (maxforce * 7); - if (repelVec.mag() < 0) { //Don't let the boids turn around to avoid the obstacle. - repelVec.y = 0; - } - } - applyForce(repelVec); - } - } - - // We accumulate a new acceleration each time based on three rules - void flock(Boid boids [], uint8_t boidCount) { - PVector sep = separate(boids, boidCount); // Separation - PVector ali = align(boids, boidCount); // Alignment - PVector coh = cohesion(boids, boidCount); // Cohesion - // Arbitrarily weight these forces - sep *= 1.5; - ali *= 1.0; - coh *= 1.0; - // Add the force vectors to acceleration - applyForce(sep); - applyForce(ali); - applyForce(coh); - } - - // Separation - // Method checks for nearby boids and steers away - PVector separate(Boid boids [], uint8_t boidCount) { - PVector steer = PVector(0, 0); - int count = 0; - // For every boid in the system, check if it's too close - for (int i = 0; i < boidCount; i++) { - Boid other = boids[i]; - if (!other.enabled) - continue; - float d = location.dist(other.location); - // If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself) - if ((d > 0) && (d < desiredseparation)) { - // Calculate vector pointing away from neighbor - PVector diff = location - other.location; - diff.normalize(); - diff /= d; // Weight by distance - steer += diff; - count++; // Keep track of how many - } - } - // Average -- divide by how many - if (count > 0) { - steer /= (float) count; - } - - // As long as the vector is greater than 0 - if (steer.mag() > 0) { - // Implement Reynolds: Steering = Desired - Velocity - steer.normalize(); - steer *= maxspeed; - steer -= velocity; - steer.limit(maxforce); - } - return steer; - } - - // Alignment - // For every nearby boid in the system, calculate the average velocity - PVector align(Boid boids [], uint8_t boidCount) { - PVector sum = PVector(0, 0); - int count = 0; - for (int i = 0; i < boidCount; i++) { - Boid other = boids[i]; - if (!other.enabled) - continue; - float d = location.dist(other.location); - if ((d > 0) && (d < neighbordist)) { - sum += other.velocity; - count++; - } - } - if (count > 0) { - sum /= (float) count; - sum.normalize(); - sum *= maxspeed; - PVector steer = sum - velocity; - steer.limit(maxforce); - return steer; - } - else { - return PVector(0, 0); - } - } - - // Cohesion - // For the average location (i.e. center) of all nearby boids, calculate steering vector towards that location - PVector cohesion(Boid boids [], uint8_t boidCount) { - PVector sum = PVector(0, 0); // Start with empty vector to accumulate all locations - int count = 0; - for (int i = 0; i < boidCount; i++) { - Boid other = boids[i]; - if (!other.enabled) - continue; - float d = location.dist(other.location); - if ((d > 0) && (d < neighbordist)) { - sum += other.location; // Add location - count++; - } - } - if (count > 0) { - sum /= count; - return seek(sum); // Steer towards the location - } - else { - return PVector(0, 0); - } - } - - // A method that calculates and applies a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - PVector seek(PVector target) { - PVector desired = target - location; // A vector pointing from the location to the target - // Normalize desired and scale to maximum speed - desired.normalize(); - desired *= maxspeed; - // Steering = Desired minus Velocity - PVector steer = desired - velocity; - steer.limit(maxforce); // Limit to maximum steering force - return steer; - } - - // A method that calculates a steering force towards a target - // STEER = DESIRED MINUS VELOCITY - void arrive(PVector target) { - PVector desired = target - location; // A vector pointing from the location to the target - float d = desired.mag(); - // Normalize desired and scale with arbitrary damping within 100 pixels - desired.normalize(); - if (d < 4) { - float m = map(d, 0, 100, 0, maxspeed); - desired *= m; - } - else { - desired *= maxspeed; - } - - // Steering = Desired minus Velocity - PVector steer = desired - velocity; - steer.limit(maxforce); // Limit to maximum steering force - applyForce(steer); - //Serial.println(d); - } - - void wrapAroundBorders() { - if (location.x < 0) location.x = VPANEL_W - 1; - if (location.y < 0) location.y = VPANEL_H - 1; - if (location.x >= VPANEL_W) location.x = 0; - if (location.y >= VPANEL_H) location.y = 0; - } - - void avoidBorders() { - PVector desired = velocity; - - if (location.x < 8) desired = PVector(maxspeed, velocity.y); - if (location.x >= VPANEL_W - 8) desired = PVector(-maxspeed, velocity.y); - if (location.y < 8) desired = PVector(velocity.x, maxspeed); - if (location.y >= VPANEL_H - 8) desired = PVector(velocity.x, -maxspeed); - - if (desired != velocity) { - PVector steer = desired - velocity; - steer.limit(maxforce); - applyForce(steer); - } - - if (location.x < 0) location.x = 0; - if (location.y < 0) location.y = 0; - if (location.x >= VPANEL_W) location.x = VPANEL_W - 1; - if (location.y >= VPANEL_H) location.y = VPANEL_H - 1; - } - - bool bounceOffBorders(float bounce) { - bool bounced = false; - - if (location.x >= VPANEL_W) { - location.x = VPANEL_W - 1; - velocity.x *= -bounce; - bounced = true; - } - else if (location.x < 0) { - location.x = 0; - velocity.x *= -bounce; - bounced = true; - } - - if (location.y >= VPANEL_H) { - location.y = VPANEL_H - 1; - velocity.y *= -bounce; - bounced = true; - } - else if (location.y < 0) { - location.y = 0; - velocity.y *= -bounce; - bounced = true; - } - - return bounced; - } - - void render() { - //// Draw a triangle rotated in the direction of velocity - //float theta = velocity.heading2D() + radians(90); - //fill(175); - //stroke(0); - //pushMatrix(); - //translate(location.x,location.y); - //rotate(theta); - //beginShape(TRIANGLES); - //vertex(0, -r*2); - //vertex(-r, r*2); - //vertex(r, r*2); - //endShape(); - //popMatrix(); - //matrix.drawBackgroundPixelRGB888(location.x, location.y, CRGB::Blue); - } -}; - -static const uint8_t AVAILABLE_BOID_COUNT = 40; -Boid boids[AVAILABLE_BOID_COUNT]; diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/ChainedPanelsAuroraDemo.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/ChainedPanelsAuroraDemo.ino deleted file mode 100644 index 957201f..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/ChainedPanelsAuroraDemo.ino +++ /dev/null @@ -1,209 +0,0 @@ -#include - -/* Default library pin configuration for the reference - you can redefine only ones you need later on object creation - -#define R1 25 -#define G1 26 -#define BL1 27 -#define R2 14 -#define G2 12 -#define BL2 13 -#define CH_A 23 -#define CH_B 19 -#define CH_C 5 -#define CH_D 17 -#define CH_E -1 // assign to any available pin if using two panels or 64x64 panels with 1/32 scan -#define CLK 16 -#define LAT 4 -#define OE 15 - -*/ - - -/* -------------------------- Display Config Initialisation -------------------- */ -// Assume we have four 64x32 panels daisy-chained and ESP32 attached to the bottom right corner -#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. -#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. - -#define NUM_ROWS 2 // Number of rows of chained INDIVIDUAL PANELS -#define NUM_COLS 2 // Number of INDIVIDUAL PANELS per ROW -#define PANEL_CHAIN NUM_ROWS*NUM_COLS // total number of panels chained one to another - -// Change this to your needs, for details on VirtualPanel pls see ChainedPanels example -#define SERPENT false -#define TOPDOWN false - -// Virtual Panel dimensions - our combined panel would be a square 4x4 modules with a combined resolution of 128x128 pixels -#define VPANEL_W PANEL_RES_X*NUM_COLS // Kosso: All Pattern files have had the MATRIX_WIDTH and MATRIX_HEIGHT replaced by these. -#define VPANEL_H PANEL_RES_Y*NUM_ROWS // - -// Kosso added: Button with debounce -#define BTN_PIN 0 // Pattern advance. Using EPS32 Boot button. -int buttonState; // the current reading from the input pin -int lastButtonState = LOW; // the previous reading from the input pin -unsigned long lastDebounceTime = 0; // the last time the output pin was toggled -unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers - -// The palettes are set to change every 60 seconds. - -// Kosso added: Non-volatile memory to save last pattern index. -#include -Preferences preferences; -int lastPattern = 0; - - -/* -------------------------- Class Initialisation -------------------------- */ -#include -#include // Used for some mathematics calculations and effects. - -// placeholder for the matrix object -MatrixPanel_I2S_DMA *matrix = nullptr; - -// placeholder for the virtual display object -VirtualMatrixPanel *virtualDisp = nullptr; - -// Aurora related -#include "Effects.h" -Effects effects; - -#include "Drawable.h" -#include "Playlist.h" -//#include "Geometry.h" -#include "Patterns.h" -Patterns patterns; - -/* -------------------------- Some variables -------------------------- */ -unsigned long ms_current = 0; -unsigned long ms_previous = 0; -unsigned long ms_animation_max_duration = 20000; // 10 seconds -unsigned long next_frame = 0; - -void listPatterns(); - -void setup() -{ - // Setup serial interface - Serial.begin(115200); - delay(250); - - // Added a button to manually advance the pattern index. - pinMode(BTN_PIN, INPUT); - // For saving last pattern index. TO reboot with same. - preferences.begin("RGBMATRIX", false); - lastPattern = preferences.getInt("lastPattern", 0); - - // Configure your matrix setup here - HUB75_I2S_CFG mxconfig(PANEL_RES_X, PANEL_RES_Y, PANEL_CHAIN); - - // custom pin mapping (if required) - //HUB75_I2S_CFG::i2s_pins _pins={R1, G1, BL1, R2, G2, BL2, CH_A, CH_B, CH_C, CH_D, CH_E, LAT, OE, CLK}; - //mxconfig.gpio = _pins; - - // in case that we use panels based on FM6126A chip, we can change that - //mxconfig.driver = HUB75_I2S_CFG::FM6126A; - - // FM6126A panels could be cloked at 20MHz with no visual artefacts - // mxconfig.i2sspeed = HUB75_I2S_CFG::HZ_20M; - - // OK, now we can create our matrix object - matrix = new MatrixPanel_I2S_DMA(mxconfig); - - // let's adjust default brightness to about 75% - matrix->setBrightness8(96); // range is 0-255, 0 - 0%, 255 - 100% - - // Allocate memory and start DMA display - if( not matrix->begin() ) - Serial.println("****** !KABOOM! I2S memory allocation failed ***********"); - - // create VirtualDisplay object based on our newly created dma_display object - virtualDisp = new VirtualMatrixPanel((*matrix), NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, SERPENT, TOPDOWN); - - Serial.println("**************** Starting Aurora Effects Demo ****************"); - - Serial.print("MATRIX_WIDTH: "); Serial.println(PANEL_RES_X*PANEL_CHAIN); - Serial.print("MATRIX_HEIGHT: "); Serial.println(PANEL_RES_Y); - -#ifdef VPANEL_W - Serial.println("VIRTUAL PANEL WIDTH " + String(VPANEL_W)); - Serial.println("VIRTUAL PANEL HEIGHT " + String(VPANEL_H)); -#endif - - // setup the effects generator - effects.Setup(); - - delay(500); - Serial.println("Effects being loaded: "); - listPatterns(); - - Serial.println("LastPattern index: " + String(lastPattern)); - - patterns.setPattern(lastPattern); // // simple noise - patterns.start(); - - Serial.print("Starting with pattern: "); - Serial.println(patterns.getCurrentPatternName()); - - preferences.end(); - -} - - -void patternAdvance(){ - // Go to next pattern in the list (se Patterns.h) - patterns.stop(); - patterns.moveRandom(1); - //patterns.move(1); - patterns.start(); - // Select a random palette as well - effects.RandomPalette(); - Serial.print("Changing pattern to: "); - Serial.println(patterns.getCurrentPatternName()); - //Serial.println(patterns.getPatternIndex()); - //lastPattern = patterns.getPatternIndex(); - // Save last index. - preferences.begin("RGBMATRIX", false); - preferences.putInt("lastPattern", lastPattern); - preferences.end(); - -} - -void loop() -{ - // Boot button Pattern advance with debounce - int reading = digitalRead(BTN_PIN); - if (reading != lastButtonState) { - lastDebounceTime = millis(); - } - - if ((millis() - lastDebounceTime) > debounceDelay) { - if (reading != buttonState) { - buttonState = reading; - if (buttonState == LOW) { - Serial.println("NEXT PATTERN ..."); - patternAdvance(); - } - } - } - lastButtonState = reading; - // end button debounce - - ms_current = millis(); - - if ( (ms_current - ms_previous) > ms_animation_max_duration ) - { - patternAdvance(); - // just auto-change the palette - effects.RandomPalette(); - ms_previous = ms_current; - } - - if ( next_frame < ms_current) - next_frame = patterns.drawFrame() + ms_current; - -} - - -void listPatterns() { - patterns.listPatterns(); -} diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Drawable.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Drawable.h deleted file mode 100644 index b2169fe..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Drawable.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Drawable_H -#define Drawable_H - -class Drawable{ -public: - char* name; - - virtual bool isRunnable() { - return false; - } - - virtual bool isPlaylist() { - return false; - } - - // a single frame should be drawn as fast as possible, without any delay or blocking - // return how many millisecond delay is requested before the next call to drawFrame() - virtual unsigned int drawFrame() { - matrix->fillScreen(0); - //backgroundLayer.fillScreen({ 0, 0, 0 }); - return 0; - }; - - virtual void printTesting() - { - Serial.println("Testing..."); - } - - virtual void start() {}; - virtual void stop() {}; -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Effects.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Effects.h deleted file mode 100644 index 3d4affb..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Effects.h +++ /dev/null @@ -1,852 +0,0 @@ - -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from "Funky Clouds" by Stefan Petrick: https://gist.github.com/anonymous/876f908333cd95315c35 - * Portions of this code are adapted from "NoiseSmearing" by Stefan Petrick: https://gist.github.com/StefanPetrick/9ee2f677dbff64e3ba7a - * Copyright (c) 2014 Stefan Petrick - * http://www.stefan-petrick.de/wordpress_beta - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Effects_H -#define Effects_H - -/* ---------------------------- GLOBAL CONSTANTS ----------------------------- */ - -const int MATRIX_CENTER_X = VPANEL_W / 2; -const int MATRIX_CENTER_Y = VPANEL_H / 2; -// US vs GB, huh? :) -//const byte MATRIX_CENTRE_X = MATRIX_CENTER_X - 1; -//const byte MATRIX_CENTRE_Y = MATRIX_CENTER_Y - 1; -#define MATRIX_CENTRE_X MATRIX_CENTER_X -#define MATRIX_CENTRE_Y MATRIX_CENTER_Y - - -const uint16_t NUM_LEDS = (VPANEL_W * VPANEL_H) + 1; // one led spare to capture out of bounds - -// forward declaration -uint16_t XY16( uint16_t x, uint16_t y); - -/* Convert x,y co-ordinate to flat array index. - * x and y positions start from 0, so must not be >= 'real' panel width or height - * (i.e. 64 pixels or 32 pixels.). Max value: VPANEL_W-1 etc. - * Ugh... uint8_t - really??? this weak method can't cope with 256+ pixel matrices :( - */ -uint16_t XY( uint8_t x, uint8_t y) -{ - return XY16(x, y); -} - -/** - * The one for 256+ matrices - * otherwise this: - * for (uint8_t i = 0; i < VPANEL_W; i++) {} - * turns into an infinite loop - */ -uint16_t XY16( uint16_t x, uint16_t y) -{ - if( x >= VPANEL_W) return 0; - if( y >= VPANEL_H) return 0; - - return (y * VPANEL_W) + x + 1; // everything offset by one to compute out of bounds stuff - never displayed by ShowFrame() -} - - -uint8_t beatcos8(accum88 beats_per_minute, uint8_t lowest = 0, uint8_t highest = 255, uint32_t timebase = 0, uint8_t phase_offset = 0) -{ - uint8_t beat = beat8(beats_per_minute, timebase); - uint8_t beatcos = cos8(beat + phase_offset); - uint8_t rangewidth = highest - lowest; - uint8_t scaledbeat = scale8(beatcos, rangewidth); - uint8_t result = lowest + scaledbeat; - return result; -} - -uint8_t mapsin8(uint8_t theta, uint8_t lowest = 0, uint8_t highest = 255) { - uint8_t beatsin = sin8(theta); - uint8_t rangewidth = highest - lowest; - uint8_t scaledbeat = scale8(beatsin, rangewidth); - uint8_t result = lowest + scaledbeat; - return result; -} - -uint8_t mapcos8(uint8_t theta, uint8_t lowest = 0, uint8_t highest = 255) { - uint8_t beatcos = cos8(theta); - uint8_t rangewidth = highest - lowest; - uint8_t scaledbeat = scale8(beatcos, rangewidth); - uint8_t result = lowest + scaledbeat; - return result; -} - -// Array of temperature readings at each simulation cell -//byte heat[NUM_LEDS]; // none of the currently enabled effects uses this - -uint32_t noise_x; -uint32_t noise_y; -uint32_t noise_z; -uint32_t noise_scale_x; -uint32_t noise_scale_y; - -//uint8_t noise[VPANEL_W][VPANEL_H]; -uint8_t **noise = nullptr; // we will allocate mem later -uint8_t noisesmoothing; - -class Effects { -public: - CRGB *leds; - - Effects(){ - // we do dynamic allocation for leds buffer, otherwise esp32 toolchain can't link static arrays of such a big size for 256+ matrices - leds = (CRGB *)malloc(NUM_LEDS * sizeof(CRGB)); - - // allocate mem for noise effect - // (there should be some guards for malloc errors eventually) - noise = (uint8_t **)malloc(VPANEL_W * sizeof(uint8_t *)); - for (int i = 0; i < VPANEL_W; ++i) { - noise[i] = (uint8_t *)malloc(VPANEL_H * sizeof(uint8_t)); - } - - ClearFrame(); - } - ~Effects(){ - free(leds); - for (int i = 0; i < VPANEL_W; ++i) { - free(noise[i]); - } - free(noise); - } - - /* The only 'framebuffer' we have is what is contained in the leds and leds2 variables. - * We don't store what the color a particular pixel might be, other than when it's turned - * into raw electrical signal output gobbly-gook (i.e. the DMA matrix buffer), but this * is not reversible. - * - * As such, any time these effects want to write a pixel color, we first have to update - * the leds or leds2 array, and THEN write it to the RGB panel. This enables us to 'look up' the array to see what a pixel color was previously, each drawFrame(). - */ - void drawBackgroundFastLEDPixelCRGB(int16_t x, int16_t y, CRGB color) - { - leds[XY(x, y)] = color; - //matrix.drawPixelRGB888(x, y, color.r, color.g, color.b); - } - - // write one pixel with the specified color from the current palette to coordinates - void Pixel(int x, int y, uint8_t colorIndex) { - leds[XY(x, y)] = ColorFromCurrentPalette(colorIndex); - //matrix.drawPixelRGB888(x, y, temp.r, temp.g, temp.b); // now draw it? - } - - void PrepareFrame() { - // leds = (CRGB*) backgroundLayer.backBuffer(); - } - - void ShowFrame() { - //#if (FASTLED_VERSION >= 3001000) - // nblendPaletteTowardPalette(currentPalette, targetPalette, 24); - //#else - currentPalette = targetPalette; - //#endif - - // backgroundLayer.swapBuffers(); - // leds = (CRGB*) backgroundLayer.backBuffer(); - // LEDS.countFPS(); - - for (int y=0; ydrawPixelRGB888( x, y, leds[_pixel].r, leds[_pixel].g, leds[_pixel].b); - } // end loop to copy fast led to the dma matrix - } - } - - // scale the brightness of the screenbuffer down - void DimAll(byte value) - { - for (int i = 0; i < NUM_LEDS; i++) - { - leds[i].nscale8(value); - } - } - - void ClearFrame() - { - memset(leds, 0x00, NUM_LEDS * sizeof(CRGB)); // flush - } - - - -/* - void CircleStream(uint8_t value) { - DimAll(value); ShowFrame(); - - for (uint8_t offset = 0; offset < MATRIX_CENTER_X; offset++) { - boolean hasprev = false; - uint16_t prevxy = 0; - - for (uint8_t theta = 0; theta < 255; theta++) { - uint8_t x = mapcos8(theta, offset, (VPANEL_W - 1) - offset); - uint8_t y = mapsin8(theta, offset, (VPANEL_H - 1) - offset); - - uint16_t xy = XY(x, y); - - if (hasprev) { - leds[prevxy] += leds[xy]; - } - - prevxy = xy; - hasprev = true; - } - } - - for (uint8_t x = 0; x < VPANEL_W; x++) { - for (uint8_t y = 0; y < VPANEL_H; y++) { - uint16_t xy = XY(x, y); - leds[xy] = leds2[xy]; - leds[xy].nscale8(value); - leds2[xy].nscale8(value); - } - } - } -*/ - - // palettes - static const int paletteCount = 10; - int paletteIndex = -1; - TBlendType currentBlendType = LINEARBLEND; - CRGBPalette16 currentPalette; - CRGBPalette16 targetPalette; - char* currentPaletteName; - - static const int HeatColorsPaletteIndex = 6; - static const int RandomPaletteIndex = 9; - - void Setup() { - currentPalette = RainbowColors_p; - loadPalette(0); - NoiseVariablesSetup(); - } - - void CyclePalette(int offset = 1) { - loadPalette(paletteIndex + offset); - } - - void RandomPalette() { - loadPalette(RandomPaletteIndex); - } - - void loadPalette(int index) { - paletteIndex = index; - - if (paletteIndex >= paletteCount) - paletteIndex = 0; - else if (paletteIndex < 0) - paletteIndex = paletteCount - 1; - - switch (paletteIndex) { - case 0: - targetPalette = RainbowColors_p; - currentPaletteName = (char *)"Rainbow"; - break; - //case 1: - // targetPalette = RainbowStripeColors_p; - // currentPaletteName = (char *)"RainbowStripe"; - // break; - case 1: - targetPalette = OceanColors_p; - currentPaletteName = (char *)"Ocean"; - break; - case 2: - targetPalette = CloudColors_p; - currentPaletteName = (char *)"Cloud"; - break; - case 3: - targetPalette = ForestColors_p; - currentPaletteName = (char *)"Forest"; - break; - case 4: - targetPalette = PartyColors_p; - currentPaletteName = (char *)"Party"; - break; - case 5: - setupGrayscalePalette(); - currentPaletteName = (char *)"Grey"; - break; - case HeatColorsPaletteIndex: - targetPalette = HeatColors_p; - currentPaletteName = (char *)"Heat"; - break; - case 7: - targetPalette = LavaColors_p; - currentPaletteName = (char *)"Lava"; - break; - case 8: - setupIcePalette(); - currentPaletteName = (char *)"Ice"; - break; - case RandomPaletteIndex: - loadPalette(random(0, paletteCount - 1)); - paletteIndex = RandomPaletteIndex; - currentPaletteName = (char *)"Random"; - break; - } - } - - void setPalette(String paletteName) { - if (paletteName == "Rainbow") - loadPalette(0); - //else if (paletteName == "RainbowStripe") - // loadPalette(1); - else if (paletteName == "Ocean") - loadPalette(1); - else if (paletteName == "Cloud") - loadPalette(2); - else if (paletteName == "Forest") - loadPalette(3); - else if (paletteName == "Party") - loadPalette(4); - else if (paletteName == "Grayscale") - loadPalette(5); - else if (paletteName == "Heat") - loadPalette(6); - else if (paletteName == "Lava") - loadPalette(7); - else if (paletteName == "Ice") - loadPalette(8); - else if (paletteName == "Random") - RandomPalette(); - } - - void listPalettes() { - Serial.println(F("{")); - Serial.print(F(" \"count\": ")); - Serial.print(paletteCount); - Serial.println(","); - Serial.println(F(" \"results\": [")); - - String paletteNames [] = { - "Rainbow", - // "RainbowStripe", - "Ocean", - "Cloud", - "Forest", - "Party", - "Grayscale", - "Heat", - "Lava", - "Ice", - "Random" - }; - - for (int i = 0; i < paletteCount; i++) { - Serial.print(F(" \"")); - Serial.print(paletteNames[i]); - if (i == paletteCount - 1) - Serial.println(F("\"")); - else - Serial.println(F("\",")); - } - - Serial.println(" ]"); - Serial.println("}"); - } - - void setupGrayscalePalette() { - targetPalette = CRGBPalette16(CRGB::Black, CRGB::White); - } - - void setupIcePalette() { - targetPalette = CRGBPalette16(CRGB::Black, CRGB::Blue, CRGB::Aqua, CRGB::White); - } - - // Oscillators and Emitters - - // the oscillators: linear ramps 0-255 - byte osci[6]; - - // sin8(osci) swinging between 0 to VPANEL_W - 1 - byte p[6]; - - // set the speeds (and by that ratios) of the oscillators here - void MoveOscillators() { - osci[0] = osci[0] + 5; - osci[1] = osci[1] + 2; - osci[2] = osci[2] + 3; - osci[3] = osci[3] + 4; - osci[4] = osci[4] + 1; - if (osci[4] % 2 == 0) - osci[5] = osci[5] + 1; // .5 - for (int i = 0; i < 4; i++) { - p[i] = map8(sin8(osci[i]), 0, VPANEL_W - 1); //why? to keep the result in the range of 0-VPANEL_W (matrix size) - } - } - - - // All the caleidoscope functions work directly within the screenbuffer (leds array). - // Draw whatever you like in the area x(0-15) and y (0-15) and then copy it arround. - - // rotates the first 16x16 quadrant 3 times onto a 32x32 (+90 degrees rotation for each one) - void Caleidoscope1() { - for (int x = 0; x < MATRIX_CENTER_X; x++) { - for (int y = 0; y < MATRIX_CENTER_Y; y++) { - leds[XY16(VPANEL_W - 1 - x, y)] = leds[XY16(x, y)]; - leds[XY16(VPANEL_W - 1 - x, VPANEL_H - 1 - y)] = leds[XY16(x, y)]; - leds[XY16(x, VPANEL_H - 1 - y)] = leds[XY16(x, y)]; - } - } - } - - - // mirror the first 16x16 quadrant 3 times onto a 32x32 - void Caleidoscope2() { - for (int x = 0; x < MATRIX_CENTER_X; x++) { - for (int y = 0; y < MATRIX_CENTER_Y; y++) { - leds[XY16(VPANEL_W - 1 - x, y)] = leds[XY16(y, x)]; - leds[XY16(x, VPANEL_H - 1 - y)] = leds[XY16(y, x)]; - leds[XY16(VPANEL_W - 1 - x, VPANEL_H - 1 - y)] = leds[XY16(x, y)]; - } - } - } - - // copy one diagonal triangle into the other one within a 16x16 - void Caleidoscope3() { - for (int x = 0; x <= MATRIX_CENTRE_X && x < VPANEL_H; x++) { - for (int y = 0; y <= x && y= 0; y--) { - leds[XY16(x, y)] = leds[XY16(y, x)]; - } - } - } - - void Caleidoscope6() { - for (int x = 1; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 7)] = leds[XY16(x, 0)]; - } //a - for (int x = 2; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 6)] = leds[XY16(x, 1)]; - } //b - for (int x = 3; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 5)] = leds[XY16(x, 2)]; - } //c - for (int x = 4; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 4)] = leds[XY16(x, 3)]; - } //d - for (int x = 5; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 3)] = leds[XY16(x, 4)]; - } //e - for (int x = 6; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 2)] = leds[XY16(x, 5)]; - } //f - for (int x = 7; x < MATRIX_CENTER_X; x++) { - leds[XY16(7 - x, 1)] = leds[XY16(x, 6)]; - } //g - } - - // create a square twister to the left or counter-clockwise - // x and y for center, r for radius - void SpiralStream(int x, int y, int r, byte dimm) { - for (int d = r; d >= 0; d--) { // from the outside to the inside - for (int i = x - d; i <= x + d; i++) { - leds[XY16(i, y - d)] += leds[XY16(i + 1, y - d)]; // lowest row to the right - leds[XY16(i, y - d)].nscale8(dimm); - } - for (int i = y - d; i <= y + d; i++) { - leds[XY16(x + d, i)] += leds[XY16(x + d, i + 1)]; // right column up - leds[XY16(x + d, i)].nscale8(dimm); - } - for (int i = x + d; i >= x - d; i--) { - leds[XY16(i, y + d)] += leds[XY16(i - 1, y + d)]; // upper row to the left - leds[XY16(i, y + d)].nscale8(dimm); - } - for (int i = y + d; i >= y - d; i--) { - leds[XY16(x - d, i)] += leds[XY16(x - d, i - 1)]; // left column down - leds[XY16(x - d, i)].nscale8(dimm); - } - } - } - - // expand everything within a circle - void Expand(int centerX, int centerY, int radius, byte dimm) { - if (radius == 0) - return; - - int currentRadius = radius; - - while (currentRadius > 0) { - int a = radius, b = 0; - int radiusError = 1 - a; - - int nextRadius = currentRadius - 1; - int nextA = nextRadius - 1, nextB = 0; - int nextRadiusError = 1 - nextA; - - while (a >= b) - { - // move them out one pixel on the radius - leds[XY16(a + centerX, b + centerY)] = leds[XY16(nextA + centerX, nextB + centerY)]; - leds[XY16(b + centerX, a + centerY)] = leds[XY16(nextB + centerX, nextA + centerY)]; - leds[XY16(-a + centerX, b + centerY)] = leds[XY16(-nextA + centerX, nextB + centerY)]; - leds[XY16(-b + centerX, a + centerY)] = leds[XY16(-nextB + centerX, nextA + centerY)]; - leds[XY16(-a + centerX, -b + centerY)] = leds[XY16(-nextA + centerX, -nextB + centerY)]; - leds[XY16(-b + centerX, -a + centerY)] = leds[XY16(-nextB + centerX, -nextA + centerY)]; - leds[XY16(a + centerX, -b + centerY)] = leds[XY16(nextA + centerX, -nextB + centerY)]; - leds[XY16(b + centerX, -a + centerY)] = leds[XY16(nextB + centerX, -nextA + centerY)]; - - // dim them - leds[XY16(a + centerX, b + centerY)].nscale8(dimm); - leds[XY16(b + centerX, a + centerY)].nscale8(dimm); - leds[XY16(-a + centerX, b + centerY)].nscale8(dimm); - leds[XY16(-b + centerX, a + centerY)].nscale8(dimm); - leds[XY16(-a + centerX, -b + centerY)].nscale8(dimm); - leds[XY16(-b + centerX, -a + centerY)].nscale8(dimm); - leds[XY16(a + centerX, -b + centerY)].nscale8(dimm); - leds[XY16(b + centerX, -a + centerY)].nscale8(dimm); - - b++; - if (radiusError < 0) - radiusError += 2 * b + 1; - else - { - a--; - radiusError += 2 * (b - a + 1); - } - - nextB++; - if (nextRadiusError < 0) - nextRadiusError += 2 * nextB + 1; - else - { - nextA--; - nextRadiusError += 2 * (nextB - nextA + 1); - } - } - - currentRadius--; - } - } - - // give it a linear tail to the right - void StreamRight(byte scale, int fromX = 0, int toX = VPANEL_W, int fromY = 0, int toY = VPANEL_H) - { - for (int x = fromX + 1; x < toX; x++) { - for (int y = fromY; y < toY; y++) { - leds[XY16(x, y)] += leds[XY16(x - 1, y)]; - leds[XY16(x, y)].nscale8(scale); - } - } - for (int y = fromY; y < toY; y++) - leds[XY16(0, y)].nscale8(scale); - } - - // give it a linear tail to the left - void StreamLeft(byte scale, int fromX = VPANEL_W, int toX = 0, int fromY = 0, int toY = VPANEL_H) - { - for (int x = toX; x < fromX; x++) { - for (int y = fromY; y < toY; y++) { - leds[XY16(x, y)] += leds[XY16(x + 1, y)]; - leds[XY16(x, y)].nscale8(scale); - } - } - for (int y = fromY; y < toY; y++) - leds[XY16(0, y)].nscale8(scale); - } - - // give it a linear tail downwards - void StreamDown(byte scale) - { - for (int x = 0; x < VPANEL_W; x++) { - for (int y = 1; y < VPANEL_H; y++) { - leds[XY16(x, y)] += leds[XY16(x, y - 1)]; - leds[XY16(x, y)].nscale8(scale); - } - } - for (int x = 0; x < VPANEL_W; x++) - leds[XY16(x, 0)].nscale8(scale); - } - - // give it a linear tail upwards - void StreamUp(byte scale) - { - for (int x = 0; x < VPANEL_W; x++) { - for (int y = VPANEL_H - 2; y >= 0; y--) { - leds[XY16(x, y)] += leds[XY16(x, y + 1)]; - leds[XY16(x, y)].nscale8(scale); - } - } - for (int x = 0; x < VPANEL_W; x++) - leds[XY16(x, VPANEL_H - 1)].nscale8(scale); - } - - // give it a linear tail up and to the left - void StreamUpAndLeft(byte scale) - { - for (int x = 0; x < VPANEL_W - 1; x++) { - for (int y = VPANEL_H - 2; y >= 0; y--) { - leds[XY16(x, y)] += leds[XY16(x + 1, y + 1)]; - leds[XY16(x, y)].nscale8(scale); - } - } - for (int x = 0; x < VPANEL_W; x++) - leds[XY16(x, VPANEL_H - 1)].nscale8(scale); - for (int y = 0; y < VPANEL_H; y++) - leds[XY16(VPANEL_W - 1, y)].nscale8(scale); - } - - // give it a linear tail up and to the right - void StreamUpAndRight(byte scale) - { - for (int x = 0; x < VPANEL_W - 1; x++) { - for (int y = VPANEL_H - 2; y >= 0; y--) { - leds[XY16(x + 1, y)] += leds[XY16(x, y + 1)]; - leds[XY16(x, y)].nscale8(scale); - } - } - // fade the bottom row - for (int x = 0; x < VPANEL_W; x++) - leds[XY16(x, VPANEL_H - 1)].nscale8(scale); - - // fade the right column - for (int y = 0; y < VPANEL_H; y++) - leds[XY16(VPANEL_W - 1, y)].nscale8(scale); - } - - // just move everything one line down - void MoveDown() { - for (int y = VPANEL_H - 1; y > 0; y--) { - for (int x = 0; x < VPANEL_W; x++) { - leds[XY16(x, y)] = leds[XY16(x, y - 1)]; - } - } - } - - // just move everything one line down - void VerticalMoveFrom(int start, int end) { - for (int y = end; y > start; y--) { - for (int x = 0; x < VPANEL_W; x++) { - leds[XY16(x, y)] = leds[XY16(x, y - 1)]; - } - } - } - - // copy the rectangle defined with 2 points x0, y0, x1, y1 - // to the rectangle beginning at x2, x3 - void Copy(byte x0, byte y0, byte x1, byte y1, byte x2, byte y2) { - for (int y = y0; y < y1 + 1; y++) { - for (int x = x0; x < x1 + 1; x++) { - leds[XY16(x + x2 - x0, y + y2 - y0)] = leds[XY16(x, y)]; - } - } - } - - // rotate + copy triangle (MATRIX_CENTER_X*MATRIX_CENTER_X) - void RotateTriangle() { - for (int x = 1; x < MATRIX_CENTER_X; x++) { - for (int y = 0; y < x; y++) { - leds[XY16(x, 7 - y)] = leds[XY16(7 - x, y)]; - } - } - } - - // mirror + copy triangle (MATRIX_CENTER_X*MATRIX_CENTER_X) - void MirrorTriangle() { - for (int x = 1; x < MATRIX_CENTER_X; x++) { - for (int y = 0; y < x; y++) { - leds[XY16(7 - y, x)] = leds[XY16(7 - x, y)]; - } - } - } - - // draw static rainbow triangle pattern (MATRIX_CENTER_XxWIDTH / 2) - // (just for debugging) - void RainbowTriangle() { - for (int i = 0; i < MATRIX_CENTER_X; i++) { - for (int j = 0; j <= i; j++) { - Pixel(7 - i, j, i * j * 4); - } - } - } - - void BresenhamLine(int x0, int y0, int x1, int y1, byte colorIndex) - { - BresenhamLine(x0, y0, x1, y1, ColorFromCurrentPalette(colorIndex)); - } - - void BresenhamLine(int x0, int y0, int x1, int y1, CRGB color) - { - int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1; - int dy = -abs(y1 - y0), sy = y0 < y1 ? 1 : -1; - int err = dx + dy, e2; - for (;;) { - leds[XY16(x0, y0)] += color; - if (x0 == x1 && y0 == y1) break; - e2 = 2 * err; - if (e2 > dy) { - err += dy; - x0 += sx; - } - if (e2 < dx) { - err += dx; - y0 += sy; - } - } - } - - // write one pixel with the specified color from the current palette to coordinates - /* - void Pixel(int x, int y, uint8_t colorIndex) { - leds[XY(x, y)] = ColorFromCurrentPalette(colorIndex); - matrix.drawBackgroundPixelRGB888(x,y, leds[XY(x, y)]); // now draw it? - } - */ - - CRGB ColorFromCurrentPalette(uint8_t index = 0, uint8_t brightness = 255, TBlendType blendType = LINEARBLEND) { - return ColorFromPalette(currentPalette, index, brightness, currentBlendType); - } - - CRGB HsvToRgb(uint8_t h, uint8_t s, uint8_t v) { - CHSV hsv = CHSV(h, s, v); - CRGB rgb; - hsv2rgb_spectrum(hsv, rgb); - return rgb; - } - - void NoiseVariablesSetup() { - noisesmoothing = 200; - - noise_x = random16(); - noise_y = random16(); - noise_z = random16(); - noise_scale_x = 6000; - noise_scale_y = 6000; - } - - void FillNoise() { - for (uint16_t i = 0; i < VPANEL_W; i++) { - uint32_t ioffset = noise_scale_x * (i - MATRIX_CENTRE_Y); - - for (uint16_t j = 0; j < VPANEL_H; j++) { - uint32_t joffset = noise_scale_y * (j - MATRIX_CENTRE_Y); - - byte data = inoise16(noise_x + ioffset, noise_y + joffset, noise_z) >> 8; - - uint8_t olddata = noise[i][j]; - uint8_t newdata = scale8(olddata, noisesmoothing) + scale8(data, 256 - noisesmoothing); - data = newdata; - - noise[i][j] = data; - } - } - } - - // non leds2 memory version. - void MoveX(byte delta) - { - - CRGB tmp = 0; - - for (int y = 0; y < VPANEL_H; y++) - { - - // Shift Left: https://codedost.com/c/arraypointers-in-c/c-program-shift-elements-array-left-direction/ - // Computationally heavier but doesn't need an entire leds2 array - - tmp = leds[XY16(0, y)]; - for (int m = 0; m < delta; m++) - { - // Do this delta time for each row... computationally expensive potentially. - for(int x = 0; x < VPANEL_W; x++) - { - leds[XY16(x, y)] = leds [XY16(x+1, y)]; - } - - leds[XY16(VPANEL_W-1, y)] = tmp; - } - - - /* - // Shift - for (int x = 0; x < VPANEL_W - delta; x++) { - leds2[XY(x, y)] = leds[XY(x + delta, y)]; - } - - // Wrap around - for (int x = VPANEL_W - delta; x < VPANEL_W; x++) { - leds2[XY(x, y)] = leds[XY(x + delta - VPANEL_W, y)]; - } - */ - } // end row loop - - /* - // write back to leds - for (uint8_t y = 0; y < VPANEL_H; y++) { - for (uint8_t x = 0; x < VPANEL_W; x++) { - leds[XY(x, y)] = leds2[XY(x, y)]; - } - } - */ - } - - void MoveY(byte delta) - { - - CRGB tmp = 0; - for (int x = 0; x < VPANEL_W; x++) - { - tmp = leds[XY16(x, 0)]; - for (int m = 0; m < delta; m++) // moves - { - // Do this delta time for each row... computationally expensive potentially. - for(int y = 0; y < VPANEL_H; y++) - { - leds[XY16(x, y)] = leds [XY16(x, y+1)]; - } - - leds[XY16(x, VPANEL_H-1)] = tmp; - } - } // end column loop - } /// MoveY - - -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Geometry.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Geometry.h deleted file mode 100644 index 4e47557..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Geometry.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from Noel Bundy's work: https://github.com/TwystNeko/Object3d - * Copyright (c) 2014 Noel Bundy - * - * Portions of this code are adapted from the Petty library: https://code.google.com/p/peggy/ - * Copyright (c) 2008 Windell H Oskay. All right reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Geometry_H -#define Geometry_H - -struct Vertex -{ - float x, y, z; - Vertex() - { - this->set(0, 0, 0); - } - - Vertex(float x, float y, float z) - { - this->set(x, y, z); - } - - void set(float x, float y, float z) - { - this->x = x; - this->y = y; - this->z = z; - } -}; - -struct EdgePoint -{ - int x, y; - boolean visible; - - EdgePoint() - { - this->set(0, 0); - this->visible = false; - } - - void set(int a, int b) - { - this->x = a; - this->y = b; - } -}; - -struct Point -{ - float x, y; - - Point() - { - set(0, 0); - } - - Point(float x, float y) - { - set(x, y); - } - - void set(float x, float y) - { - this->x = x; - this->y = y; - } - -}; - -struct squareFace -{ - int length; - int sommets[4]; - int ed[4]; - - squareFace() - { - set(-1, -1, -1, -1); - } - - squareFace(int a, int b, int c, int d) - { - this->length = 4; - this->sommets[0] = a; - this->sommets[1] = b; - this->sommets[2] = c; - this->sommets[3] = d; - } - - void set(int a, int b, int c, int d) - { - this->length = 4; - this->sommets[0] = a; - this->sommets[1] = b; - this->sommets[2] = c; - this->sommets[3] = d; - } - -}; - -struct triFace -{ - int length; - int sommets[3]; - int ed[3]; - - triFace() - { - set(-1,-1,-1); - } - triFace(int a, int b, int c) - { - this->length =3; - this->sommets[0]=a; - this->sommets[1]=b; - this->sommets[2]=c; - } - void set(int a, int b, int c) - { - this->length =3; - this->sommets[0]=a; - this->sommets[1]=b; - this->sommets[2]=c; - } -}; - -#endif \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PaletteFireKoz.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PaletteFireKoz.h deleted file mode 100644 index 86799ee..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PaletteFireKoz.h +++ /dev/null @@ -1,3 +0,0 @@ -const uint8_t PROGMEM palette_fire[] = {/* RGB888 R,G,B,R,G,B,R,G,B,... */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x05,0x00,0x00,0x0a,0x00,0x00,0x10,0x00,0x00,0x15,0x00,0x00,0x1b,0x00,0x00,0x20,0x00,0x00,0x25,0x00,0x00,0x2b,0x00,0x00,0x31,0x00,0x00,0x36,0x00,0x00,0x3c,0x00,0x00,0x41,0x00,0x00,0x46,0x00,0x00,0x4c,0x00,0x00,0x52,0x00,0x00,0x57,0x00,0x00,0x5d,0x00,0x00,0x62,0x00,0x00,0x68,0x00,0x00,0x6d,0x00,0x00,0x73,0x00,0x00,0x79,0x00,0x00,0x7e,0x00,0x00,0x83,0x00,0x00,0x89,0x00,0x00,0x8e,0x00,0x00,0x94,0x00,0x00,0x9a,0x00,0x00,0x9f,0x00,0x00,0xa5,0x00,0x00,0xaa,0x00,0x00,0xb0,0x00,0x00,0xb5,0x00,0x00,0xbb,0x00,0x00,0xc0,0x00,0x00,0xc6,0x00,0x00,0xcb,0x00,0x00,0xd1,0x00,0x00,0xd7,0x00,0x00,0xdc,0x00,0x00,0xe1,0x00,0x00,0xe6,0x00,0x00,0xe8,0x02,0x00,0xe9,0x08,0x00,0xe9,0x0f,0x00,0xe9,0x13,0x00,0xe9,0x16,0x00,0xe9,0x1b,0x00,0xe9,0x21,0x00,0xe9,0x26,0x00,0xe9,0x2a,0x00,0xe9,0x2e,0x00,0xe9,0x32,0x00,0xe9,0x37,0x00,0xe9,0x3b,0x00,0xe9,0x3f,0x00,0xe9,0x44,0x00,0xe9,0x4a,0x00,0xe9,0x4e,0x00,0xe9,0x52,0x00,0xe9,0x56,0x00,0xe9,0x5a,0x00,0xe9,0x5d,0x00,0xe9,0x63,0x00,0xe9,0x67,0x00,0xe9,0x6b,0x00,0xe9,0x71,0x00,0xe9,0x77,0x00,0xe9,0x78,0x00,0xe9,0x7c,0x00,0xe9,0x81,0x00,0xe9,0x86,0x00,0xe9,0x8b,0x00,0xe9,0x8f,0x00,0xe9,0x93,0x00,0xe9,0x99,0x00,0xe9,0x9d,0x00,0xe9,0xa0,0x00,0xe9,0xa4,0x00,0xe9,0xaa,0x00,0xe9,0xb0,0x00,0xe9,0xb4,0x00,0xe9,0xb5,0x00,0xe9,0xb9,0x00,0xe9,0xbe,0x00,0xe9,0xc3,0x00,0xe9,0xc9,0x00,0xe9,0xce,0x00,0xe9,0xd2,0x00,0xe9,0xd6,0x00,0xe9,0xd9,0x00,0xe9,0xdd,0x00,0xe9,0xe2,0x00,0xe9,0xe7,0x02,0xe9,0xe9,0x0e,0xe9,0xe9,0x1c,0xe9,0xe9,0x28,0xe9,0xe9,0x38,0xe9,0xe9,0x48,0xe9,0xe9,0x57,0xe9,0xe9,0x67,0xe9,0xe9,0x73,0xe9,0xe9,0x81,0xe9,0xe9,0x90,0xe9,0xe9,0xa1,0xe9,0xe9,0xb1,0xe9,0xe9,0xbf,0xe9,0xe9,0xcb,0xe9,0xe9,0xcb,0xe9,0xe9,0xcd,0xe9,0xe9,0xd9,0xe9,0xe9,0xe5,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe0,0xe0,0xe0,0xdc,0xdc,0xdc,0xd8,0xd8,0xd8,0xd2,0xd2,0xd2,0xca,0xca,0xca,0xc1,0xc1,0xc1,0xb7,0xb7,0xb7,0xab,0xab,0xab,0x9d,0x9d,0x9d,0x8f,0x8f,0x8f,0x81,0x81,0x81,0x72,0x72,0x72,0x64,0x64,0x64,0x56,0x56,0x56,0x4a,0x4a,0x4a,0x3e,0x3e,0x3e,0x33,0x33,0x33,0x2a,0x2a,0x2a,0x22,0x22,0x22,0x1b,0x1b,0x1b,0x16,0x16,0x16,0x11,0x11,0x11,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternAttract.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternAttract.h deleted file mode 100644 index dcb6491..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternAttract.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternAttract_H - -class PatternAttract : public Drawable { -private: - const int count = 8; - Attractor attractor; - -public: - PatternAttract() { - name = (char *)"Attract"; - } - - void start() { - int direction = random(0, 2); - if (direction == 0) - direction = -1; - - for (int i = 0; i < count; i++) { - Boid boid = Boid(15, 31 - i); - boid.mass = 1; // random(0.1, 2); - boid.velocity.x = ((float) random(40, 50)) / 100.0; - boid.velocity.x *= direction; - boid.velocity.y = 0; - boid.colorIndex = i * 32; - boids[i] = boid; - //dim = random(170, 250); - } - } - - unsigned int drawFrame() { - // dim all pixels on the display - uint8_t dim = beatsin8(2, 170, 250); - effects.DimAll(dim); - - for (int i = 0; i < count; i++) { - Boid boid = boids[i]; - - PVector force = attractor.attract(boid); - boid.applyForce(force); - - boid.update(); - effects.drawBackgroundFastLEDPixelCRGB(boid.location.x, boid.location.y, effects.ColorFromCurrentPalette(boid.colorIndex)); - - boids[i] = boid; - } - - effects.ShowFrame(); - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternBounce.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternBounce.h deleted file mode 100644 index c0d595a..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternBounce.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternBounce_H - -class PatternBounce : public Drawable { -private: - static const int count = 32; - PVector gravity = PVector(0, 0.0125); - -public: - PatternBounce() { - name = (char *)"Bounce"; - } - - void start() { - unsigned int colorWidth = 256 / count; - for (int i = 0; i < count; i++) { - Boid boid = Boid(i, 0); - boid.velocity.x = 0; - boid.velocity.y = i * -0.01; - boid.colorIndex = colorWidth * i; - boid.maxforce = 10; - boid.maxspeed = 10; - boids[i] = boid; - } - } - - unsigned int drawFrame() { - // dim all pixels on the display - effects.DimAll(170); effects.ShowFrame(); - - for (int i = 0; i < count; i++) { - Boid boid = boids[i]; - - boid.applyForce(gravity); - - boid.update(); - - effects.drawBackgroundFastLEDPixelCRGB(boid.location.x, boid.location.y, effects.ColorFromCurrentPalette(boid.colorIndex)); - - if (boid.location.y >= VPANEL_H - 1) { - boid.location.y = VPANEL_H - 1; - boid.velocity.y *= -1.0; - } - - boids[i] = boid; - } - - return 15; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternCube.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternCube.h deleted file mode 100644 index bebf5c8..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternCube.h +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from Noel Bundy's work: https://github.com/TwystNeko/Object3d - * Copyright (c) 2014 Noel Bundy - * - * Portions of this code are adapted from the Petty library: https://code.google.com/p/peggy/ - * Copyright (c) 2008 Windell H Oskay. All right reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternCube_H -#define PatternCube_H - -class PatternCube : public Drawable { - private: - float focal = 30; // Focal of the camera - int cubeWidth = 28; // Cube size - float Angx = 20.0, AngxSpeed = 0.05; // rotation (angle+speed) around X-axis - float Angy = 10.0, AngySpeed = 0.05; // rotation (angle+speed) around Y-axis - float Ox = 15.5, Oy = 15.5; // position (x,y) of the frame center - int zCamera = 110; // distance from cube to the eye of the camera - - // Local vertices - Vertex local[8]; - // Camera aligned vertices - Vertex aligned[8]; - // On-screen projected vertices - Point screen[8]; - // Faces - squareFace face[6]; - // Edges - EdgePoint edge[12]; - int nbEdges; - // ModelView matrix - float m00, m01, m02, m10, m11, m12, m20, m21, m22; - - // constructs the cube - void make(int w) - { - nbEdges = 0; - - local[0].set(-w, w, w); - local[1].set(w, w, w); - local[2].set(w, -w, w); - local[3].set(-w, -w, w); - local[4].set(-w, w, -w); - local[5].set(w, w, -w); - local[6].set(w, -w, -w); - local[7].set(-w, -w, -w); - - face[0].set(1, 0, 3, 2); - face[1].set(0, 4, 7, 3); - face[2].set(4, 0, 1, 5); - face[3].set(4, 5, 6, 7); - face[4].set(1, 2, 6, 5); - face[5].set(2, 3, 7, 6); - - int f, i; - for (f = 0; f < 6; f++) - { - for (i = 0; i < face[f].length; i++) - { - face[f].ed[i] = this->findEdge(face[f].sommets[i], face[f].sommets[i ? i - 1 : face[f].length - 1]); - } - } - } - - // finds edges from faces - int findEdge(int a, int b) - { - int i; - for (i = 0; i < nbEdges; i++) - if ((edge[i].x == a && edge[i].y == b) || (edge[i].x == b && edge[i].y == a)) - return i; - edge[nbEdges++].set(a, b); - return i; - } - - // rotates according to angle x&y - void rotate(float angx, float angy) - { - int i; - float cx = cos(angx); - float sx = sin(angx); - float cy = cos(angy); - float sy = sin(angy); - - m00 = cy; - m01 = 0; - m02 = -sy; - m10 = sx * sy; - m11 = cx; - m12 = sx * cy; - m20 = cx * sy; - m21 = -sx; - m22 = cx * cy; - - for (i = 0; i < 8; i++) - { - aligned[i].x = m00 * local[i].x + m01 * local[i].y + m02 * local[i].z; - aligned[i].y = m10 * local[i].x + m11 * local[i].y + m12 * local[i].z; - aligned[i].z = m20 * local[i].x + m21 * local[i].y + m22 * local[i].z + zCamera; - - screen[i].x = floor((Ox + focal * aligned[i].x / aligned[i].z)); - screen[i].y = floor((Oy - focal * aligned[i].y / aligned[i].z)); - } - - for (i = 0; i < 12; i++) - edge[i].visible = false; - - Point *pa, *pb, *pc; - for (i = 0; i < 6; i++) - { - pa = screen + face[i].sommets[0]; - pb = screen + face[i].sommets[1]; - pc = screen + face[i].sommets[2]; - - boolean back = ((pb->x - pa->x) * (pc->y - pa->y) - (pb->y - pa->y) * (pc->x - pa->x)) < 0; - if (!back) - { - int j; - for (j = 0; j < 4; j++) - { - edge[face[i].ed[j]].visible = true; - } - } - } - } - - byte hue = 0; - int step = 0; - - public: - PatternCube() { - name = (char *)"Cube"; - make(cubeWidth); - } - - unsigned int drawFrame() { - uint8_t blurAmount = beatsin8(2, 10, 255); - -#if FASTLED_VERSION >= 3001000 - blur2d(effects.leds, VPANEL_W, VPANEL_H, blurAmount); -#else - effects.DimAll(blurAmount); effects.ShowFrame(); -#endif - - zCamera = beatsin8(2, 100, 140); - AngxSpeed = beatsin8(3, 1, 10) / 100.0f; - AngySpeed = beatcos8(5, 1, 10) / 100.0f; - - // Update values - Angx += AngxSpeed; - Angy += AngySpeed; - if (Angx >= TWO_PI) - Angx -= TWO_PI; - if (Angy >= TWO_PI) - Angy -= TWO_PI; - - rotate(Angx, Angy); - - // Draw cube - int i; - - CRGB color = effects.ColorFromCurrentPalette(hue, 128); - - // Backface - EdgePoint *e; - for (i = 0; i < 12; i++) - { - e = edge + i; - if (!e->visible) { - matrix.drawLine(screen[e->x].x, screen[e->x].y, screen[e->y].x, screen[e->y].y, color); - } - } - - color = effects.ColorFromCurrentPalette(hue, 255); - - // Frontface - for (i = 0; i < 12; i++) - { - e = edge + i; - if (e->visible) - { - matrix.drawLine(screen[e->x].x, screen[e->x].y, screen[e->y].x, screen[e->y].y, color); - } - } - - step++; - if (step == 8) { - step = 0; - hue++; - } - - effects.ShowFrame(); - - return 20; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternElectricMandala.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternElectricMandala.h deleted file mode 100644 index 1977a83..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternElectricMandala.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from "Funky Noise" by Stefan Petrick: https://github.com/StefanPetrick/FunkyNoise - * Copyright (c) 2014 Stefan Petrick - * http://www.stefan-petrick.de/wordpress_beta - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternElectricMandala_H - -class PatternElectricMandala : public Drawable { - private: - - // The coordinates for 16-bit noise spaces. -#define NUM_LAYERS 1 - - // used for the random based animations - int16_t dx; - int16_t dy; - int16_t dz; - int16_t dsx; - int16_t dsy; - - public: - PatternElectricMandala() { - name = (char *)"ElectricMandala"; - } - - void start() { - // set to reasonable values to avoid a black out - noisesmoothing = 200; - - // just any free input pin - //random16_add_entropy(analogRead(18)); - - // fill coordinates with random values - // set zoom levels - noise_x = random16(); - noise_y = random16(); - noise_z = random16(); - noise_scale_x = 6000; - noise_scale_y = 6000; - - // for the random movement - dx = random8(); - dy = random8(); - dz = random8(); - dsx = random8(); - dsy = random8(); - } - - unsigned int drawFrame() { -#if FASTLED_VERSION >= 3001000 - // a new parameter set every 15 seconds - EVERY_N_SECONDS(15) { - //SetupRandomPalette3(); - dy = random16(500) - 250; // random16(2000) - 1000 is pretty fast but works fine, too - dx = random16(500) - 250; - dz = random16(500) - 250; - noise_scale_x = random16(10000) + 2000; - noise_scale_y = random16(10000) + 2000; - } -#endif - - noise_y += dy; - noise_x += dx; - noise_z += dz; - - effects.FillNoise(); - ShowNoiseLayer(0, 1, 0); - - effects.Caleidoscope3(); - effects.Caleidoscope1(); - - effects.ShowFrame(); - - return 30; - } - - // show just one layer - void ShowNoiseLayer(byte layer, byte colorrepeat, byte colorshift) { - for (uint16_t i = 0; i < VPANEL_W; i++) { - for (uint16_t j = 0; j < VPANEL_H; j++) { - - uint8_t color = noise[i][j]; - - uint8_t bri = color; - - // assign a color depending on the actual palette - CRGB pixel = ColorFromPalette(effects.currentPalette, colorrepeat * (color + colorshift), bri); - - effects.leds[XY16(i, j)] = pixel; - } - } - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFire.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFire.h deleted file mode 100644 index 731aff9..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFire.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from FastLED Fire2012 example by Mark Kriegsman: https://github.com/FastLED/FastLED/tree/master/examples/Fire2012WithPalette - * Copyright (c) 2013 FastLED - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternFire_H -#define PatternFire_H - -#ifndef Effects_H -#include "Effects.h" -#endif - -class PatternFire : public Drawable { - private: - - public: - PatternFire() { - name = (char *)"Fire"; - } - - // There are two main parameters you can play with to control the look and - // feel of your fire: COOLING (used in step 1 above), and SPARKING (used - // in step 3 above). - // - // cooling: How much does the air cool as it rises? - // Less cooling = taller flames. More cooling = shorter flames. - // Default 55, suggested range 20-100 - int cooling = 100; - - // sparking: What chance (out of 255) is there that a new spark will be lit? - // Higher chance = more roaring fire. Lower chance = more flickery fire. - // Default 120, suggested range 50-200. - unsigned int sparking = 100; - - unsigned int drawFrame() { - // Add entropy to random number generator; we use a lot of it. - random16_add_entropy( random16()); - - effects.DimAll(235); - - for (int x = 0; x < VPANEL_W; x++) { - // Step 1. Cool down every cell a little - for (int y = 0; y < VPANEL_H; y++) { - int xy = XY(x, y); - heat[xy] = qsub8(heat[xy], random8(0, ((cooling * 10) / VPANEL_H) + 2)); - } - - // Step 2. Heat from each cell drifts 'up' and diffuses a little - for (int y = 0; y < VPANEL_H; y++) { - heat[XY(x, y)] = (heat[XY(x, y + 1)] + heat[XY(x, y + 2)] + heat[XY(x, y + 2)]) / 3; - } - - // Step 2. Randomly ignite new 'sparks' of heat - if (random8() < sparking) { - // int x = (p[0] + p[1] + p[2]) / 3; - - int xy = XY(x, VPANEL_H - 1); - heat[xy] = qadd8(heat[xy], random8(160, 255)); - } - - // Step 4. Map from heat cells to LED colors - for (int y = 0; y < VPANEL_H; y++) { - int xy = XY(x, y); - byte colorIndex = heat[xy]; - - // Recommend that you use values 0-240 rather than - // the usual 0-255, as the last 15 colors will be - // 'wrapping around' from the hot end to the cold end, - // which looks wrong. - colorIndex = scale8(colorIndex, 200); - - // override color 0 to ensure a black background? - if (colorIndex != 0) - // effects.leds[xy] = CRGB::Black; - // else - effects.leds[xy] = effects.ColorFromCurrentPalette(colorIndex); - } - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(2); - effects.MoveFractionalNoiseX(2); - - - effects.ShowFrame(); - - return 15; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFireKoz.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFireKoz.h deleted file mode 100644 index c553d6b..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFireKoz.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - Aurora: https://github.com/pixelmatix/aurora - Copyright (c) 2014 Jason Coon - - Added by @Kosso. Cobbled together from various places which I can't remember. I'll update this when I track it down. - Requires PaletteFireKoz.h - - Permission is hereby granted, free of charge, to any person obtaining a copy of - this software and associated documentation files (the "Software"), to deal in - the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - the Software, and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternFireKoz_H -#define PatternFireKoz_H - -class PatternFireKoz : public Drawable { - private: - - const int FIRE_HEIGHT = 800; - - int Bit = 0, NBit = 1; - float fire_c; - // might not need this buffer here... there some led buffers set up in Effects.h - uint8_t fireBuffer[VPANEL_W][VPANEL_H][2]; - - public: - PatternFireKoz() { - name = (char *)"FireKoz"; - } - - unsigned int drawFrame() { - - for (int x = 1; x < VPANEL_W - 1; x++) - { - fireBuffer[x][VPANEL_H - 2][Bit] = random(0, FIRE_HEIGHT); - if (random(0, 100) > 80) - { - fireBuffer[x][VPANEL_H - 2][Bit] = 0; - fireBuffer[x][VPANEL_H - 3][Bit] = 0; - } - } - for (int y = 1; y < VPANEL_H - 1; y++) - { - for (int x = 1; x < VPANEL_W - 1; x++) - { - fire_c = (fireBuffer[x - 1][y][Bit] + - fireBuffer[x + 1][y][Bit] + - fireBuffer[x][y - 1][Bit] + - fireBuffer[x][y + 1][Bit] + - fireBuffer[x][y][Bit]) / - 5.0; - - fire_c = (fireBuffer[x - 1][y][Bit] + - fireBuffer[x + 1][y][Bit] + - fireBuffer[x][y - 1][Bit] + - fireBuffer[x][y + 1][Bit] + - fireBuffer[x][y][Bit]) / - 5.0; - - if (fire_c > (FIRE_HEIGHT / 2) && fire_c < FIRE_HEIGHT) { - fire_c -= 0.2; - } else if (fire_c > (FIRE_HEIGHT / 4) && fire_c < (FIRE_HEIGHT / 2)) { - fire_c -= 0.4; - } else if (fire_c <= (FIRE_HEIGHT / 8)) { - fire_c -= 0.7; - } else { - fire_c -= 1; - } - if (fire_c < 0) - fire_c = 0; - if (fire_c >= FIRE_HEIGHT + 1) - fire_c = FIRE_HEIGHT - 1; - fireBuffer[x][y - 1][NBit] = fire_c; - int index = (int)fire_c * 3; - if (fire_c == 0) - { - effects.drawBackgroundFastLEDPixelCRGB(x, y, CRGB(0, 0, 0)); - } - else - { - effects.drawBackgroundFastLEDPixelCRGB(x, y, CRGB(palette_fire[index], palette_fire[index + 1], palette_fire[index + 2])); - } - } - } - //display.drawRect(0, 0, VPANEL_W, VPANEL_H, display.color565(25, 25, 25)); - - NBit = Bit; - Bit = 1 - Bit; - - effects.ShowFrame(); - - return 30; // no idea what this is for... - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFlock.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFlock.h deleted file mode 100644 index 3ae31b1..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFlock.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from "Flocking" in "The Nature of Code" by Daniel Shiffman: http://natureofcode.com/ - * Copyright (c) 2014 Daniel Shiffman - * http://www.shiffman.net - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -// Flocking -// Daniel Shiffman -// The Nature of Code, Spring 2009 - -// Demonstration of Craig Reynolds' "Flocking" behavior -// See: http://www.red3d.com/cwr/ -// Rules: Cohesion, Separation, Alignment - -#ifndef PatternFlock_H -#define PatternFlock_H - -class PatternFlock : public Drawable { - public: - PatternFlock() { - name = (char *)"Flock"; - } - - static const int boidCount = 10; - Boid predator; - - PVector wind; - byte hue = 0; - bool predatorPresent = true; - - void start() { - for (int i = 0; i < boidCount; i++) { - boids[i] = Boid(15, 15); - boids[i].maxspeed = 0.380; - boids[i].maxforce = 0.015; - } - - predatorPresent = random(0, 2) >= 1; - if (predatorPresent) { - predator = Boid(31, 31); - predatorPresent = true; - predator.maxspeed = 0.385; - predator.maxforce = 0.020; - predator.neighbordist = 16.0; - predator.desiredseparation = 0.0; - } - } - - unsigned int drawFrame() { - effects.DimAll(230); effects.ShowFrame(); - - bool applyWind = random(0, 255) > 250; - if (applyWind) { - wind.x = Boid::randomf() * .015; - wind.y = Boid::randomf() * .015; - } - - CRGB color = effects.ColorFromCurrentPalette(hue); - - for (int i = 0; i < boidCount; i++) { - Boid * boid = &boids[i]; - - if (predatorPresent) { - // flee from predator - boid->repelForce(predator.location, 10); - } - - boid->run(boids, boidCount); - boid->wrapAroundBorders(); - PVector location = boid->location; - // PVector velocity = boid->velocity; - // backgroundLayer.drawLine(location.x, location.y, location.x - velocity.x, location.y - velocity.y, color); - // effects.leds[XY(location.x, location.y)] += color; - effects.drawBackgroundFastLEDPixelCRGB(location.x, location.y, color); - - if (applyWind) { - boid->applyForce(wind); - applyWind = false; - } - } - - if (predatorPresent) { - predator.run(boids, boidCount); - predator.wrapAroundBorders(); - color = effects.ColorFromCurrentPalette(hue + 128); - PVector location = predator.location; - // PVector velocity = predator.velocity; - // backgroundLayer.drawLine(location.x, location.y, location.x - velocity.x, location.y - velocity.y, color); - // effects.leds[XY(location.x, location.y)] += color; - effects.drawBackgroundFastLEDPixelCRGB(location.x, location.y, color); - } - - EVERY_N_MILLIS(200) { - hue++; - } - - EVERY_N_SECONDS(30) { - predatorPresent = !predatorPresent; - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFlowField.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFlowField.h deleted file mode 100644 index be91ff2..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternFlowField.h +++ /dev/null @@ -1,92 +0,0 @@ -/* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternFlowField_H - -class PatternFlowField : public Drawable { - public: - PatternFlowField() { - name = (char *)"FlowField"; - } - - uint16_t x; - uint16_t y; - uint16_t z; - - uint16_t speed = 1; - uint16_t scale = 26; - - static const int count = 40; - - byte hue = 0; - - void start() { - x = random16(); - y = random16(); - z = random16(); - - for (int i = 0; i < count; i++) { - boids[i] = Boid(random(VPANEL_W), 0); - } - } - - unsigned int drawFrame() { - effects.DimAll(240); - - // CRGB color = effects.ColorFromCurrentPalette(hue); - - for (int i = 0; i < count; i++) { - Boid * boid = &boids[i]; - - int ioffset = scale * boid->location.x; - int joffset = scale * boid->location.y; - - byte angle = inoise8(x + ioffset, y + joffset, z); - - boid->velocity.x = (float) sin8(angle) * 0.0078125 - 1.0; - boid->velocity.y = -((float)cos8(angle) * 0.0078125 - 1.0); - boid->update(); - - effects.drawBackgroundFastLEDPixelCRGB(boid->location.x, boid->location.y, effects.ColorFromCurrentPalette(angle + hue)); // color - - if (boid->location.x < 0 || boid->location.x >= VPANEL_W || - boid->location.y < 0 || boid->location.y >= VPANEL_H) { - boid->location.x = random(VPANEL_W); - boid->location.y = 0; - } - } - - EVERY_N_MILLIS(200) { - hue++; - } - - x += speed; - y += speed; - z += speed; - - effects.ShowFrame(); - - return 50; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternIncrementalDrift.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternIncrementalDrift.h deleted file mode 100644 index 573c765..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternIncrementalDrift.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternIncrementalDrift_H -#define PatternIncrementalDrift_H - -class PatternIncrementalDrift : public Drawable { - public: - PatternIncrementalDrift() { - name = (char *)"Incremental Drift"; - } - - unsigned int drawFrame() { - uint8_t dim = beatsin8(2, 230, 250); - effects.DimAll(dim); effects.ShowFrame(); - - for (int i = 2; i <= VPANEL_W / 2; i++) - { - CRGB color = effects.ColorFromCurrentPalette((i - 2) * (240 / (VPANEL_W / 2))); - - uint8_t x = beatcos8((17 - i) * 2, MATRIX_CENTER_X - i, MATRIX_CENTER_X + i); - uint8_t y = beatsin8((17 - i) * 2, MATRIX_CENTER_Y - i, MATRIX_CENTER_Y + i); - - effects.drawBackgroundFastLEDPixelCRGB(x, y, color); - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternIncrementalDrift2.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternIncrementalDrift2.h deleted file mode 100644 index 03312f6..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternIncrementalDrift2.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternIncrementalDrift2_H -#define PatternIncrementalDrift2_H - -class PatternIncrementalDrift2 : public Drawable { - public: - PatternIncrementalDrift2() { - name = (char *)"Incremental Drift Rose"; - } - - unsigned int drawFrame() { - uint8_t dim = beatsin8(2, 170, 250); - effects.DimAll(dim); effects.ShowFrame(); - - for (int i = 2; i < VPANEL_H / 2; ++i) - //for (uint8_t i = 0; i < 32; i++) - { - CRGB color; - - uint8_t x = 0; - uint8_t y = 0; - - if (i < 16) { - x = beatcos8((i + 1) * 2, i, VPANEL_W - i); - y = beatsin8((i + 1) * 2, i, VPANEL_H - i); - color = effects.ColorFromCurrentPalette(i * 14); - } - else - { - x = beatsin8((32 - i) * 2, VPANEL_W - i, i + 1); - y = beatcos8((32 - i) * 2, VPANEL_H - i, i + 1); - color = effects.ColorFromCurrentPalette((31 - i) * 14); - } - - effects.drawBackgroundFastLEDPixelCRGB(x, y, color); - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternInfinity.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternInfinity.h deleted file mode 100644 index c99f329..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternInfinity.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternInfinity_H - -class PatternInfinity : public Drawable { -public: - PatternInfinity() { - name = (char *)"Infinity"; - } - - unsigned int drawFrame() { - // dim all pixels on the display slightly - // to 250/255 (98%) of their current brightness - blur2d(effects.leds, VPANEL_W > 255 ? 255 : VPANEL_W, VPANEL_H > 255 ? 255 : VPANEL_H, 250); - // effects.DimAll(250); effects.ShowFrame(); - - - // the Effects class has some sample oscillators - // that move from 0 to 255 at different speeds - effects.MoveOscillators(); - - // the horizontal position of the head of the infinity sign - // oscillates from 0 to the maximum horizontal and back - int x = (VPANEL_W - 1) - effects.p[1]; - - // the vertical position of the head oscillates - // from 8 to 23 and back (hard-coded for a 32x32 matrix) - int y = map8(sin8(effects.osci[3]), 8, 23); - - // the hue oscillates from 0 to 255, overflowing back to 0 - byte hue = sin8(effects.osci[5]); - - // draw a pixel at x,y using a color from the current palette - effects.Pixel(x, y, hue); - - effects.ShowFrame(); - return 30; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternInvaders.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternInvaders.h deleted file mode 100644 index 98f3200..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternInvaders.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Inspired by 'Space Invader Generator': https://the8bitpimp.wordpress.com/2013/05/07/space-invader-generator - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternInvaders_H -#define PatternInvaders_H - -class PatternInvadersSmall : public Drawable { - private: - uint8_t x = 1; - uint8_t y = 1; - - public: - PatternInvadersSmall() { - name = (char *)"Invaders Small"; - } - - void start() { - matrix->fillScreen(0); - } - - unsigned int drawFrame() { - CRGB color1 = effects.ColorFromCurrentPalette(random(0, 255)); - - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - CRGB color = CRGB::Black; - - if (random(0, 2) == 1) color = color1; - - effects.drawBackgroundFastLEDPixelCRGB(x + i, y + j, color); - - if (i < 2) - effects.drawBackgroundFastLEDPixelCRGB(x + (4 - i), y + j, color); - } - } - - x += 6; - if (x > 25) { - x = 1; - y += 6; - } - - if (y > 25) y = x = 1; - - effects.ShowFrame(); - - return 125; - } -}; - -class PatternInvadersMedium : public Drawable { - private: - uint8_t x = 0; - uint8_t y = 0; - - public: - PatternInvadersMedium() { - name = (char *)"Invaders Medium"; - } - - void start() { - matrix->fillScreen(0); - } - - unsigned int drawFrame() { - CRGB color1 = effects.ColorFromCurrentPalette(random(0, 255)); - - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 5; j++) { - CRGB color = CRGB::Black; - - if (random(0, 2) == 1) color = color1; - - matrix->fillRect(x + (i * 2), y + (j * 2), x + (i * 2 + 1), y + (j * 2 + 1), color); - - if (i < 2) - matrix->fillRect(x + (8 - i * 2), y + (j * 2), x + (9 - i * 2), y + (j * 2 + 1), color); - } - } - - x += 11; - if (x > 22) { - x = 0; - y += 11; - } - - if (y > 22) y = x = 0; - - effects.ShowFrame(); - - return 500; - } -}; - -class PatternInvadersLarge : public Drawable { - private: - - public: - PatternInvadersLarge() { - name = (char *)"Invaders Large"; - } - - void start() { - matrix->fillScreen(0); - } - - unsigned int drawFrame() { - matrix->fillScreen(0); - - CRGB color1 = effects.ColorFromCurrentPalette(random(0, 255)); - - for (int x = 0; x < 3; x++) { - for (int y = 0; y < 5; y++) { - CRGB color = CRGB::Black; - - if (random(0, 2) == 1) { - color = color1; - } - - matrix->fillRect(1 + x * 6, 1 + y * 6, 5 + x * 6, 5 + y * 6, color); - - if (x < 2) - matrix->fillRect(1 + (4 - x) * 6, 1 + y * 6, 5 + (4 - x) * 6, 5 + y * 6, color); - } - } - - effects.ShowFrame(); - - return 2000; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternLife.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternLife.h deleted file mode 100644 index 8074e40..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternLife.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from Andrew: http://pastebin.com/f22bfe94d - * which, in turn, was "Adapted from the Life example on the Processing.org site" - * - * Made much more colorful by J.B. Langston: https://github.com/jblang/aurora/commit/6db5a884e3df5d686445c4f6b669f1668841929b - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternLife_H -#define PatternLife_H - -class Cell { -public: - byte alive : 1; - byte prev : 1; - byte hue: 6; - byte brightness; -}; - -class PatternLife : public Drawable { -private: - Cell world[VPANEL_W][VPANEL_H]; - unsigned int density = 50; - int generation = 0; - - void randomFillWorld() { - for (int i = 0; i < VPANEL_W; i++) { - for (int j = 0; j < VPANEL_H; j++) { - if (random(100) < density) { - world[i][j].alive = 1; - world[i][j].brightness = 255; - } - else { - world[i][j].alive = 0; - world[i][j].brightness = 0; - } - world[i][j].prev = world[i][j].alive; - world[i][j].hue = 0; - } - } - } - - int neighbours(int x, int y) { - return (world[(x + 1) % VPANEL_W][y].prev) + - (world[x][(y + 1) % VPANEL_H].prev) + - (world[(x + VPANEL_W - 1) % VPANEL_W][y].prev) + - (world[x][(y + VPANEL_H - 1) % VPANEL_H].prev) + - (world[(x + 1) % VPANEL_W][(y + 1) % VPANEL_H].prev) + - (world[(x + VPANEL_W - 1) % VPANEL_W][(y + 1) % VPANEL_H].prev) + - (world[(x + VPANEL_W - 1) % VPANEL_W][(y + VPANEL_H - 1) % VPANEL_H].prev) + - (world[(x + 1) % VPANEL_W][(y + VPANEL_H - 1) % VPANEL_H].prev); - } - -public: - PatternLife() { - name = (char *)"Life"; - } - - unsigned int drawFrame() { - if (generation == 0) { - effects.ClearFrame(); - - randomFillWorld(); - } - - // Display current generation - for (int i = 0; i < VPANEL_W; i++) { - for (int j = 0; j < VPANEL_H; j++) { - effects.leds[XY(i, j)] = effects.ColorFromCurrentPalette(world[i][j].hue * 4, world[i][j].brightness); - } - } - - // Birth and death cycle - for (int x = 0; x < VPANEL_W; x++) { - for (int y = 0; y < VPANEL_H; y++) { - // Default is for cell to stay the same - if (world[x][y].brightness > 0 && world[x][y].prev == 0) - world[x][y].brightness *= 0.9; - int count = neighbours(x, y); - if (count == 3 && world[x][y].prev == 0) { - // A new cell is born - world[x][y].alive = 1; - world[x][y].hue += 2; - world[x][y].brightness = 255; - } else if ((count < 2 || count > 3) && world[x][y].prev == 1) { - // Cell dies - world[x][y].alive = 0; - } - } - } - - // Copy next generation into place - for (int x = 0; x < VPANEL_W; x++) { - for (int y = 0; y < VPANEL_H; y++) { - world[x][y].prev = world[x][y].alive; - } - } - - - generation++; - if (generation >= 256) - generation = 0; - - effects.ShowFrame(); - - return 60; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternMaze.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternMaze.h deleted file mode 100644 index b4e26a9..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternMaze.h +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Many thanks to Jamis Buck for the documentation of the Growing Tree maze generation algorithm: http://weblog.jamisbuck.org/2011/1/27/maze-generation-growing-tree-algorithm - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternMaze_H -#define PatternMaze_H - -class PatternMaze : public Drawable { -private: - enum Directions { - None = 0, - Up = 1, - Down = 2, - Left = 4, - Right = 8, - }; - - struct Point{ - int x; - int y; - - static Point New(int x, int y) { - Point point; - point.x = x; - point.y = y; - return point; - } - - Point Move(Directions direction) { - switch (direction) - { - case Up: - return New(x, y - 1); - - case Down: - return New(x, y + 1); - - case Left: - return New(x - 1, y); - - case Right: - default: - return New(x + 1, y); - } - } - - static Directions Opposite(Directions direction) { - switch (direction) { - case Up: - return Down; - - case Down: - return Up; - - case Left: - return Right; - - case Right: - default: - return Left; - } - } - }; - -// int width = 16; -// int height = 16; - - static const int width = VPANEL_W / 2; - static const int height = VPANEL_H / 2; - - - Directions grid[width][height]; - - Point point; - - Point cells[256]; - int cellCount = 0; - - int algorithm = 0; - int algorithmCount = 1; - - byte hue = 0; - byte hueOffset = 0; - - Directions directions[4] = { Up, Down, Left, Right }; - - void removeCell(int index) {// shift cells after index down one - for (int i = index; i < cellCount - 1; i++) { - cells[i] = cells[i + 1]; - } - - cellCount--; - } - - void shuffleDirections() { - for (int a = 0; a < 4; a++) - { - int r = random(a, 4); - Directions temp = directions[a]; - directions[a] = directions[r]; - directions[r] = temp; - } - } - - Point createPoint(int x, int y) { - Point point; - point.x = x; - point.y = y; - return point; - } - - CRGB chooseColor(int index) { - byte h = index + hueOffset; - - switch (algorithm) { - case 0: - default: - return effects.ColorFromCurrentPalette(h); - - case 1: - return effects.ColorFromCurrentPalette(hue++); - } - } - - int chooseIndex(int max) { - switch (algorithm) { - case 0: - default: - // choose newest (recursive backtracker) - return max - 1; - - case 1: - // choose random(Prim's) - return random(max); - - // case 2: - // // choose oldest (not good, so disabling) - // return 0; - } - } - - void generateMaze() { - while (cellCount > 1) { - drawNextCell(); - } - } - - void drawNextCell() { - int index = chooseIndex(cellCount); - - if (index < 0) - return; - - point = cells[index]; - - Point imagePoint = createPoint(point.x * 2, point.y * 2); - - //effects.drawBackgroundFastLEDPixelCRGB(imagePoint.x, imagePoint.y, CRGB(CRGB::Gray)); - - shuffleDirections(); - - CRGB color = chooseColor(index); - - for (int i = 0; i < 4; i++) { - Directions direction = directions[i]; - - Point newPoint = point.Move(direction); - if (newPoint.x >= 0 && newPoint.y >= 0 && newPoint.x < width && newPoint.y < height && grid[newPoint.y][newPoint.x] == None) { - grid[point.y][point.x] = (Directions) ((int) grid[point.y][point.x] | (int) direction); - grid[newPoint.y][newPoint.x] = (Directions) ((int) grid[newPoint.y][newPoint.x] | (int) point.Opposite(direction)); - - Point newImagePoint = imagePoint.Move(direction); - - effects.drawBackgroundFastLEDPixelCRGB(newImagePoint.x, newImagePoint.y, color); - - cellCount++; - cells[cellCount - 1] = newPoint; - - index = -1; - break; - } - } - - if (index > -1) { - Point finishedPoint = cells[index]; - imagePoint = createPoint(finishedPoint.x * 2, finishedPoint.y * 2); - effects.drawBackgroundFastLEDPixelCRGB(imagePoint.x, imagePoint.y, color); - - removeCell(index); - } - } - -public: - PatternMaze() { - name = (char *)"Maze"; - } - - unsigned int drawFrame() { - if (cellCount < 1) { - - effects.ClearFrame(); - - // reset the maze grid - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - grid[y][x] = None; - } - } - - int x = random(width); - int y = random(height); - - cells[0] = createPoint(x, y); - - cellCount = 1; - - hue = 0; - hueOffset = random(0, 256); - - } - - drawNextCell(); - - if (cellCount < 1) { - algorithm++; - if (algorithm >= algorithmCount) - algorithm = 0; - - return 0; - } - - effects.ShowFrame(); - - return 0; - } - - void start() { - effects.ClearFrame(); - cellCount = 0; - hue = 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternMunch.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternMunch.h deleted file mode 100644 index 092dca1..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternMunch.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Munch pattern created by J.B. Langston: https://github.com/jblang/aurora/blob/master/PatternMunch.h - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternMunch_H -#define PatternMunch_H - - -class PatternMunch : public Drawable { -private: - byte count = 0; - byte dir = 1; - byte flip = 0; - byte generation = 0; - -public: - PatternMunch() { - name = (char *)"Munch"; - } - - unsigned int drawFrame() { - - for (uint16_t x = 0; x < VPANEL_W; x++) { - for (uint16_t y = 0; y < VPANEL_H; y++) { - effects.leds[XY16(x, y)] = (x ^ y ^ flip) < count ? effects.ColorFromCurrentPalette(((x ^ y) << 2) + generation) : CRGB::Black; - - // The below is more pleasant - // effects.leds[XY(x, y)] = effects.ColorFromCurrentPalette(((x ^ y) << 2) + generation) ; - } - } - - count += dir; - - if (count <= 0 || count >= VPANEL_W) { - dir = -dir; - } - - if (count <= 0) { - if (flip == 0) - flip = VPANEL_W-1; - else - flip = 0; - } - - generation++; - - // show it ffs! - effects.ShowFrame(); - return 60; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternNoiseSmearing.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternNoiseSmearing.h deleted file mode 100644 index 2d6723a..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternNoiseSmearing.h +++ /dev/null @@ -1,338 +0,0 @@ -/* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Portions of this code are adapted from "Noise Smearing" by Stefan Petrick: https://gist.githubusercontent.com/embedded-creations/5cd47d83cb0e04f4574d/raw/ebf6a82b4755d55cfba3bf6598f7b19047f89daf/NoiseSmearing.ino -* Copyright (c) 2014 Stefan Petrick -* http://www.stefan-petrick.de/wordpress_beta -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternNoiseSmearing_H -#define PatternNoiseSmearing_H - -byte patternNoiseSmearingHue = 0; - -class PatternMultipleStream : public Drawable { -public: - PatternMultipleStream() { - name = (char *)"MultipleStream"; - } - - // this pattern draws two points to the screen based on sin/cos if a counter - // (comment out NoiseSmearWithRadius to see pattern of pixels) - // these pixels are smeared by a large radius, giving a lot of movement - // the image is dimmed before each drawing to not saturate the screen with color - // the smear has an offset so the pixels usually have a trail leading toward the upper left - unsigned int drawFrame() { - static unsigned long counter = 0; -#if 0 - // this counter lets put delays between each frame and still get the same animation - counter++; -#else - // this counter updates in real time and can't be slowed down for debugging - counter = millis() / 10; -#endif - - byte x1 = 4 + sin8(counter * 2) / 10; - byte x2 = 8 + sin8(counter * 2) / 16; - byte y2 = 8 + cos8((counter * 2) / 3) / 16; - - effects.leds[XY(x1, x2)] = effects.ColorFromCurrentPalette(patternNoiseSmearingHue); - effects.leds[XY(x2, y2)] = effects.ColorFromCurrentPalette(patternNoiseSmearingHue + 128); - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(8); - effects.MoveFractionalNoiseX(); - - effects.MoveY(8); - effects.MoveFractionalNoiseY(); - - patternNoiseSmearingHue++; - - return 0; - } -}; - -class PatternMultipleStream2 : public Drawable { -public: - PatternMultipleStream2() { - name = (char *)"MultipleStream2"; - } - - unsigned int drawFrame() { - effects.DimAll(230); effects.ShowFrame(); - - byte xx = 4 + sin8(millis() / 9) / 10; - byte yy = 4 + cos8(millis() / 10) / 10; - effects.leds[XY(xx, yy)] += effects.ColorFromCurrentPalette(patternNoiseSmearingHue); - - xx = 8 + sin8(millis() / 10) / 16; - yy = 8 + cos8(millis() / 7) / 16; - effects.leds[XY(xx, yy)] += effects.ColorFromCurrentPalette(patternNoiseSmearingHue + 80); - - effects.leds[XY(15, 15)] += effects.ColorFromCurrentPalette(patternNoiseSmearingHue + 160); - - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseY(4); - - effects.MoveY(3); - effects.MoveFractionalNoiseX(4); - - patternNoiseSmearingHue++; - - return 0; - } -}; - -class PatternMultipleStream3 : public Drawable { -public: - PatternMultipleStream3() { - name = (char *)"MultipleStream3"; - } - - unsigned int drawFrame() { - //CLS(); - effects.DimAll(235); effects.ShowFrame(); - - for (uint8_t i = 3; i < 32; i = i + 4) { - effects.leds[XY(i, 15)] += effects.ColorFromCurrentPalette(i * 8); - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseY(4); - - effects.MoveY(3); - effects.MoveFractionalNoiseX(4); - - effects.ShowFrame(); - - return 1; - } -}; - -class PatternMultipleStream4 : public Drawable { -public: - PatternMultipleStream4() { - name = (char *)"MultipleStream4"; - } - - unsigned int drawFrame() { - - //CLS(); - effects.DimAll(235); effects.ShowFrame(); - - effects.leds[XY(15, 15)] += effects.ColorFromCurrentPalette(patternNoiseSmearingHue); - - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(8); - effects.MoveFractionalNoiseX(); - - effects.MoveY(8); - effects.MoveFractionalNoiseY(); - - patternNoiseSmearingHue++; - - return 0; - } -}; - -class PatternMultipleStream5 : public Drawable { -public: - PatternMultipleStream5() { - name = (char *)"MultipleStream5"; - } - - unsigned int drawFrame() { - - //CLS(); - effects.DimAll(235); effects.ShowFrame(); - - - for (uint8_t i = 3; i < 32; i = i + 4) { - effects.leds[XY(i, 31)] += effects.ColorFromCurrentPalette(i * 8); - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseY(4); - - effects.MoveY(4); - effects.MoveFractionalNoiseX(4); - - return 0; - } -}; - -class PatternMultipleStream8 : public Drawable { -public: - PatternMultipleStream8() { - name = (char *)"MultipleStream8"; - } - - unsigned int drawFrame() { - effects.DimAll(230); effects.ShowFrame(); - - // draw grid of rainbow dots on top of the dimmed image - for (uint8_t y = 1; y < 32; y = y + 6) { - for (uint8_t x = 1; x < 32; x = x + 6) { - - effects.leds[XY(x, y)] += effects.ColorFromCurrentPalette((x * y) / 4); - } - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseX(4); - - effects.MoveY(3); - effects.MoveFractionalNoiseY(4); - - return 0; - } -}; - -class PatternPaletteSmear : public Drawable { -public: - PatternPaletteSmear() { - name = (char *)"PaletteSmear"; - } - - unsigned int drawFrame() { - - effects.DimAll(170); effects.ShowFrame(); - - // draw a rainbow color palette - for (uint8_t y = 0; y < VPANEL_H; y++) { - for (uint8_t x = 0; x < VPANEL_W; x++) { - effects.leds[XY(x, y)] += effects.ColorFromCurrentPalette(x * 8, y * 8 + 7); - } - } - - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - - effects.FillNoise(); - - effects.MoveX(3); - //effects.MoveFractionalNoiseY(4); - - effects.MoveY(3); - effects.MoveFractionalNoiseX(4); - effects.ShowFrame(); - - return 0; - } -}; - -class PatternRainbowFlag : public Drawable { -public: - PatternRainbowFlag() { - name = (char *)"RainbowFlag"; - } - - unsigned int drawFrame() { - effects.DimAll(10); effects.ShowFrame(); - - CRGB rainbow[7] = { - CRGB::Red, - CRGB::Orange, - CRGB::Yellow, - CRGB::Green, - CRGB::Blue, - CRGB::Violet - }; - - uint8_t y = 2; - - for (uint8_t c = 0; c < 6; c++) { - for (uint8_t j = 0; j < 5; j++) { - for (uint8_t x = 0; x < VPANEL_W; x++) { - effects.leds[XY(x, y)] += rainbow[c]; - } - - y++; - if (y >= VPANEL_H) - break; - } - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseY(4); - - effects.MoveY(3); - effects.MoveFractionalNoiseX(4); - - return 0; - } -}; -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPendulumWave.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPendulumWave.h deleted file mode 100644 index 985e15a..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPendulumWave.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -* -* Inspired by and based on a loading animation for Prismata by Lunarch Studios: -* http://www.reddit.com/r/gifs/comments/2on8si/connecting_to_server_so_mesmerizing/cmow0sz -* -* Lunarch Studios Inc. hereby publishes the Actionscript 3 source code pasted in this -* comment under the Creative Commons CC0 1.0 Universal Public Domain Dedication. -* Lunarch Studios Inc. waives all rights to the work worldwide under copyright law, -* including all related and neighboring rights, to the extent allowed by law. -* You can copy, modify, distribute and perform the work, even for commercial purposes, -* all without asking permission. -* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternPendulumWave_H -#define PatternPendulumWave_H - -#define WAVE_BPM 25 -#define AMP_BPM 2 -#define SKEW_BPM 4 -#define WAVE_TIMEMINSKEW VPANEL_W/8 -#define WAVE_TIMEMAXSKEW VPANEL_W/2 - -class PatternPendulumWave : public Drawable { - public: - PatternPendulumWave() { - name = (char *)"Pendulum Wave"; - } - - unsigned int drawFrame() { - effects.ClearFrame(); - - for (int x = 0; x < VPANEL_W; ++x) - { - uint16_t amp = beatsin16(AMP_BPM, VPANEL_H/8, VPANEL_H-1); - uint16_t offset = (VPANEL_H - beatsin16(AMP_BPM, 0, VPANEL_H))/2; - - uint8_t y = beatsin16(WAVE_BPM, 0, amp, x*beatsin16(SKEW_BPM, WAVE_TIMEMINSKEW, WAVE_TIMEMAXSKEW)) + offset; - - effects.drawBackgroundFastLEDPixelCRGB(x, y, effects.ColorFromCurrentPalette(x * 7)); - } - effects.ShowFrame(); - return 20; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPlasma.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPlasma.h deleted file mode 100644 index dcecc97..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPlasma.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from LedEffects Plasma by Robert Atkins: https://bitbucket.org/ratkins/ledeffects/src/26ed3c51912af6fac5f1304629c7b4ab7ac8ca4b/Plasma.cpp?at=default - * Copyright (c) 2013 Robert Atkins - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternPlasma_H -#define PatternPlasma_H - -class PatternPlasma : public Drawable { -private: - int time = 0; - int cycles = 0; - -public: - PatternPlasma() { - name = (char *)"Plasma"; - } - - unsigned int drawFrame() { - for (int x = 0; x < VPANEL_W; x++) { - for (int y = 0; y < VPANEL_H; y++) { - int16_t v = 0; - uint8_t wibble = sin8(time); - v += sin16(x * wibble * 6 + time); - v += cos16(y * (128 - wibble) * 6 + time); - v += sin16(y * x * cos8(-time) / 8); - - effects.Pixel(x, y, (v >> 8) + 127); - } - } - - time += 1; - cycles++; - - if (cycles >= 2048) { - time = 0; - cycles = 0; - } - - effects.ShowFrame(); - - return 30; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPulse.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPulse.h deleted file mode 100644 index 8992a4d..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternPulse.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Based at least in part on someone else's work that I can no longer find. - * Please let me know if you recognize any of this code! - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternPulse_H -#define PatternPulse_H - -class PatternPulse : public Drawable { - private: - int hue; - int centerX = 0; - int centerY = 0; - int step = -1; - int maxSteps = 16; - float fadeRate = 0.8; - int diff; - - public: - PatternPulse() { - name = (char *)"Pulse"; - } - - unsigned int drawFrame() { - effects.DimAll(235); - - if (step == -1) { - centerX = random(32); - centerY = random(32); - hue = random(256); // 170; - step = 0; - } - - if (step == 0) { - matrix.drawCircle(centerX, centerY, step, effects.ColorFromCurrentPalette(hue)); - step++; - } - else { - if (step < maxSteps) { - // initial pulse - matrix.drawCircle(centerX, centerY, step, effects.ColorFromCurrentPalette(hue, pow(fadeRate, step - 2) * 255)); - - // secondary pulse - if (step > 3) { - matrix.drawCircle(centerX, centerY, step - 3, effects.ColorFromCurrentPalette(hue, pow(fadeRate, step - 2) * 255)); - } - step++; - } - else { - step = -1; - } - } - - effects.standardNoiseSmearing(); - - effects.ShowFrame(); - - return 30; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternRadar.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternRadar.h deleted file mode 100644 index 602078b..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternRadar.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternRadar_H - -class PatternRadar : public Drawable { - private: - byte theta = 0; - byte hueoffset = 0; - - public: - PatternRadar() { - name = (char *)"Radar"; - } - - unsigned int drawFrame() { - effects.DimAll(254); effects.ShowFrame(); - - for (int offset = 0; offset < MATRIX_CENTER_X; offset++) { - byte hue = 255 - (offset * 16 + hueoffset); - CRGB color = effects.ColorFromCurrentPalette(hue); - uint8_t x = mapcos8(theta, offset, (VPANEL_W - 1) - offset); - uint8_t y = mapsin8(theta, offset, (VPANEL_H - 1) - offset); - uint16_t xy = XY(x, y); - effects.leds[xy] = color; - - EVERY_N_MILLIS(25) { - theta += 2; - hueoffset += 1; - } - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSimplexNoise.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSimplexNoise.h deleted file mode 100644 index 3810ec0..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSimplexNoise.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from FastLED Fire2012 example by Mark Kriegsman: https://github.com/FastLED/FastLED/blob/master/examples/Noise/Noise.ino - * Copyright (c) 2013 FastLED - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternSimplexNoise_H -#define PatternSimplexNoise_H - -class PatternSimplexNoise : public Drawable { - public: - PatternSimplexNoise() { - name = (char *)"Noise"; - } - - void start() { - // Initialize our coordinates to some random values - noise_x = random16(); - noise_y = random16(); - noise_z = random16(); - } - - unsigned int drawFrame() { -#if FASTLED_VERSION >= 3001000 - // a new parameter set every 15 seconds - EVERY_N_SECONDS(15) { - noise_x = random16(); - noise_y = random16(); - noise_z = random16(); - } -#endif - - uint32_t speed = 100; - - effects.FillNoise(); - ShowNoiseLayer(0, 1, 0); - - // noise_x += speed; - noise_y += speed; - noise_z += speed; - - effects.ShowFrame(); - - return 30; - } - - // show just one layer - void ShowNoiseLayer(byte layer, byte colorrepeat, byte colorshift) { - for (uint16_t i = 0; i < VPANEL_W; i++) { - for (uint16_t j = 0; j < VPANEL_H; j++) { - uint8_t pixel = noise[i][j]; - - // assign a color depending on the actual palette - effects.leds[XY16(i, j)] = effects.ColorFromCurrentPalette(colorrepeat * (pixel + colorshift), pixel); - } - } - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSnake.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSnake.h deleted file mode 100644 index 00895ab..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSnake.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from LedEffects Snake by Robert Atkins: https://bitbucket.org/ratkins/ledeffects/src/26ed3c51912af6fac5f1304629c7b4ab7ac8ca4b/Snake.cpp?at=default - * Copyright (c) 2013 Robert Atkins - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternSnake_H -#define PatternSnake_H - -class PatternSnake : public Drawable { -private: - static const byte SNAKE_LENGTH = 16; - - CRGB colors[SNAKE_LENGTH]; - uint8_t initialHue; - - enum Direction { - UP, DOWN, LEFT, RIGHT - }; - - struct Pixel { - uint8_t x; - uint8_t y; - }; - - struct Snake { - Pixel pixels[SNAKE_LENGTH]; - - Direction direction; - - void newDirection() { - switch (direction) { - case UP: - case DOWN: - direction = random(0, 2) == 1 ? RIGHT : LEFT; - break; - - case LEFT: - case RIGHT: - direction = random(0, 2) == 1 ? DOWN : UP; - - default: - break; - } - } - - void shuffleDown() { - for (byte i = SNAKE_LENGTH - 1; i > 0; i--) { - pixels[i] = pixels[i - 1]; - } - } - - void reset() { - direction = UP; - for (int i = 0; i < SNAKE_LENGTH; i++) { - pixels[i].x = 0; - pixels[i].y = 0; - } - } - - void move() { - switch (direction) { - case UP: - pixels[0].y = (pixels[0].y + 1) % VPANEL_H; - break; - case LEFT: - pixels[0].x = (pixels[0].x + 1) % VPANEL_W; - break; - case DOWN: - pixels[0].y = pixels[0].y == 0 ? VPANEL_H - 1 : pixels[0].y - 1; - break; - case RIGHT: - pixels[0].x = pixels[0].x == 0 ? VPANEL_W - 1 : pixels[0].x - 1; - break; - } - } - - void draw(CRGB colors[SNAKE_LENGTH]) { - for (byte i = 0; i < SNAKE_LENGTH; i++) { - effects.leds[XY(pixels[i].x, pixels[i].y)] = colors[i] %= (255 - i * (255 / SNAKE_LENGTH)); - } - } - }; - - static const int snakeCount = 6; - Snake snakes[snakeCount]; - -public: - PatternSnake() { - name = (char *)"Snake"; - for (int i = 0; i < snakeCount; i++) { - Snake* snake = &snakes[i]; - snake->reset(); - } - } - - void start() - { - effects.ClearFrame(); - } - - unsigned int drawFrame() { - - - fill_palette(colors, SNAKE_LENGTH, initialHue++, 5, effects.currentPalette, 255, LINEARBLEND); - - for (int i = 0; i < snakeCount; i++) { - Snake* snake = &snakes[i]; - - snake->shuffleDown(); - - if (random(10) > 7) { - snake->newDirection(); - } - - snake->move(); - snake->draw(colors); - } - - effects.ShowFrame(); - - return 30; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpark.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpark.h deleted file mode 100644 index 059d97c..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpark.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Portions of this code are adapted from FastLED Fire2012 example by Mark Kriegsman: https://github.com/FastLED/FastLED/tree/master/examples/Fire2012WithPalette - * Copyright (c) 2013 FastLED - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternSpark_H -#define PatternSpark_H - -class PatternSpark : public Drawable { - private: - - public: - PatternSpark() { - name = (char *)"Spark"; - } - - // There are two main parameters you can play with to control the look and - // feel of your fire: COOLING (used in step 1 above), and SPARKING (used - // in step 3 above). - // - // COOLING: How much does the air cool as it rises? - // Less cooling = taller flames. More cooling = shorter flames. - // Default 55, suggested range 20-100 - uint8_t cooling = 100; - - // SPARKING: What chance (out of 255) is there that a new spark will be lit? - // Higher chance = more roaring fire. Lower chance = more flickery fire. - // Default 120, suggested range 50-200. - uint8_t sparking = 50; - - unsigned int drawFrame() { - // Add entropy to random number generator; we use a lot of it. - random16_add_entropy( random16()); - - effects.DimAll(235); effects.ShowFrame(); - - for (uint8_t x = 0; x < VPANEL_W; x++) { - // Step 1. Cool down every cell a little - for (int y = 0; y < VPANEL_H; y++) { - int xy = XY(x, y); - heat[xy] = qsub8(heat[xy], random8(0, ((cooling * 10) / VPANEL_H) + 2)); - } - - // Step 2. Heat from each cell drifts 'up' and diffuses a little - for (int y = 0; y < VPANEL_H; y++) { - heat[XY(x, y)] = (heat[XY(x, y + 1)] + heat[XY(x, y + 2)] + heat[XY(x, y + 2)]) / 3; - } - - // Step 2. Randomly ignite new 'sparks' of heat - if (random8() < sparking) { - uint8_t xt = random8(MATRIX_CENTRE_X - 2, MATRIX_CENTER_X + 3); - - int xy = XY(xt, VPANEL_H - 1); - heat[xy] = qadd8(heat[xy], random8(160, 255)); - } - - // Step 4. Map from heat cells to LED colors - for (int y = 0; y < VPANEL_H; y++) { - int xy = XY(x, y); - byte colorIndex = heat[xy]; - - // Recommend that you use values 0-240 rather than - // the usual 0-255, as the last 15 colors will be - // 'wrapping around' from the hot end to the cold end, - // which looks wrong. - colorIndex = scale8(colorIndex, 240); - - // override color 0 to ensure a black background? - if (colorIndex != 0) - // effects.leds[xy] = CRGB::Black; - // else - effects.leds[xy] = effects.ColorFromCurrentPalette(colorIndex); - } - } - - // Noise - noise_x += 1000; - noise_y += 1000; - noise_z += 1000; - noise_scale_x = 4000; - noise_scale_y = 4000; - effects.FillNoise(); - - effects.MoveX(3); - effects.MoveFractionalNoiseX(4); - - effects.ShowFrame(); - - return 15; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpin.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpin.h deleted file mode 100644 index c3497e7..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpin.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternSpin_H - - - -class PatternSpin : public Drawable { -public: - PatternSpin() { - name = (char *)"Spin"; - } - - float degrees = 0; - float radius = 16; - - float speedStart = 1; - float velocityStart = 0.6; - - float maxSpeed = 30; - - float speed = speedStart; - float velocity = velocityStart; - - void start() { - speed = speedStart; - velocity = velocityStart; - degrees = 0; - } - - unsigned int drawFrame() { - effects.DimAll(190); effects.ShowFrame(); - - CRGB color = effects.ColorFromCurrentPalette(speed * 8); - - // start position - int x; - int y; - - // target position - float targetDegrees = degrees + speed; - float targetRadians = radians(targetDegrees); - int targetX = (int) (MATRIX_CENTER_X + radius * cos(targetRadians)); - int targetY = (int) (MATRIX_CENTER_Y - radius * sin(targetRadians)); - - float tempDegrees = degrees; - - do{ - float radians = radians(tempDegrees); - x = (int) (MATRIX_CENTER_X + radius * cos(radians)); - y = (int) (MATRIX_CENTER_Y - radius * sin(radians)); - - effects.drawBackgroundFastLEDPixelCRGB(x, y, color); - effects.drawBackgroundFastLEDPixelCRGB(y, x, color); - - tempDegrees += 1; - if (tempDegrees >= 360) - tempDegrees = 0; - } while (x != targetX || y != targetY); - - degrees += speed; - - // add velocity to the particle each pass around the accelerator - if (degrees >= 360) { - degrees = 0; - speed += velocity; - if (speed <= speedStart) { - speed = speedStart; - velocity *= -1; - } - else if (speed > maxSpeed){ - speed = maxSpeed - velocity; - velocity *= -1; - } - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpiral.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpiral.h deleted file mode 100644 index 64ef15d..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpiral.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Portions of this code are adapted from "Funky Clouds" by Stefan Petrick: - * https://gist.github.com/anonymous/876f908333cd95315c35 - * - * Copyright (c) 2014 Stefan Petrick - * http://www.stefan-petrick.de/wordpress_beta - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternSpiral_H -#define PatternSpiral_H - -class PatternSpiral : public Drawable { -private: - // Timer stuff (Oscillators) - struct timer { - unsigned long takt; - unsigned long lastMillis; - unsigned long count; - int delta; - byte up; - byte down; - }; - timer multiTimer[5]; - - int timers = sizeof(multiTimer) / sizeof(multiTimer[0]); - - // counts all variables with different speeds linear up and down - void UpdateTimers() - { - unsigned long now = millis(); - for (int i = 0; i < timers; i++) - { - while (now - multiTimer[i].lastMillis >= multiTimer[i].takt) - { - multiTimer[i].lastMillis += multiTimer[i].takt; - multiTimer[i].count = multiTimer[i].count + multiTimer[i].delta; - if ((multiTimer[i].count == multiTimer[i].up) || (multiTimer[i].count == multiTimer[i].down)) - { - multiTimer[i].delta = -multiTimer[i].delta; - } - } - } - } - -public: - PatternSpiral() { - name = (char *)"Spiral"; - } - - void start() { - // set all counting directions positive for the beginning - for (int i = 0; i < timers; i++) multiTimer[i].delta = 1; - - // set range (up/down), speed (takt=ms between steps) and starting point of all oscillators - - unsigned long now = millis(); - - multiTimer[0].lastMillis = now; - multiTimer[0].takt = 42; //x1 - multiTimer[0].up = VPANEL_W - 1; - multiTimer[0].down = 0; - multiTimer[0].count = 0; - - multiTimer[1].lastMillis = now; - multiTimer[1].takt = 55; //y1 - multiTimer[1].up = VPANEL_H - 1; - multiTimer[1].down = 0; - multiTimer[1].count = 0; - - multiTimer[2].lastMillis = now; - multiTimer[2].takt = 3; //color - multiTimer[2].up = 255; - multiTimer[2].down = 0; - multiTimer[2].count = 0; - - multiTimer[3].lastMillis = now; - multiTimer[3].takt = 71; //x2 - multiTimer[3].up = VPANEL_W - 1; - multiTimer[3].down = 0; - multiTimer[3].count = 0; - - multiTimer[4].lastMillis = now; - multiTimer[4].takt = 89; //y2 - multiTimer[4].up = VPANEL_H - 1; - multiTimer[4].down = 0; - multiTimer[4].count = 0; - } - - unsigned int drawFrame() { - // manage the Oscillators - UpdateTimers(); - - // draw just a line defined by 5 oscillators - effects.BresenhamLine( - multiTimer[3].count, // x1 - multiTimer[4].count, // y1 - multiTimer[0].count, // x2 - multiTimer[1].count, // y2 - multiTimer[2].count); // color - - // manipulate the screen buffer - // with fixed parameters (could be oscillators too) - // Params: center x, y, radius, scale color down - // --> NOTE: Affects always a SQUARE with an odd length - // effects.SpiralStream(15, 15, 10, 128); - - effects.SpiralStream(31, 15, 64, 128); // for 64 pixel wide matrix! - // effects.SpiralStream(47, 15, 10, 128); // for 64 pixel wide matrix! - - // why not several times?! - // effects.SpiralStream(16, 6, 6, 128); - // effects.SpiralStream(10, 24, 10, 128); - - // increase the contrast - effects.DimAll(250); effects.ShowFrame(); - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpiro.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpiro.h deleted file mode 100644 index 4b91e12..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSpiro.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternSpiro_H - -class PatternSpiro : public Drawable { - private: - byte theta1 = 0; - byte theta2 = 0; - byte hueoffset = 0; - - uint8_t radiusx = VPANEL_W / 4; - uint8_t radiusy = VPANEL_H / 4; - uint8_t minx = MATRIX_CENTER_X - radiusx; - uint8_t maxx = MATRIX_CENTER_X + radiusx + 1; - uint8_t miny = MATRIX_CENTER_Y - radiusy; - uint8_t maxy = MATRIX_CENTER_Y + radiusy + 1; - - uint8_t spirocount = 1; - uint8_t spirooffset = 256 / spirocount; - boolean spiroincrement = true; - - boolean handledChange = false; - - public: - PatternSpiro() { - name = (char *)"Spiro"; - } - - void start(){ - effects.ClearFrame(); - }; - - unsigned int drawFrame() { - blur2d(effects.leds, VPANEL_W > 255 ? 255 : VPANEL_W, VPANEL_H > 255 ? 255 : VPANEL_H, 192); - - boolean change = false; - - for (int i = 0; i < spirocount; i++) { - uint8_t x = mapsin8(theta1 + i * spirooffset, minx, maxx); - uint8_t y = mapcos8(theta1 + i * spirooffset, miny, maxy); - - uint8_t x2 = mapsin8(theta2 + i * spirooffset, x - radiusx, x + radiusx); - uint8_t y2 = mapcos8(theta2 + i * spirooffset, y - radiusy, y + radiusy); - - CRGB color = effects.ColorFromCurrentPalette(hueoffset + i * spirooffset, 128); - effects.leds[XY(x2, y2)] += color; - - if((x2 == MATRIX_CENTER_X && y2 == MATRIX_CENTER_Y) || - (x2 == MATRIX_CENTRE_X && y2 == MATRIX_CENTRE_Y)) change = true; - } - - theta2 += 1; - - EVERY_N_MILLIS(25) { - theta1 += 1; - } - - EVERY_N_MILLIS(100) { - if (change && !handledChange) { - handledChange = true; - - if (spirocount >= VPANEL_W || spirocount == 1) spiroincrement = !spiroincrement; - - if (spiroincrement) { - if(spirocount >= 4) - spirocount *= 2; - else - spirocount += 1; - } - else { - if(spirocount > 4) - spirocount /= 2; - else - spirocount -= 1; - } - - spirooffset = 256 / spirocount; - } - - if(!change) handledChange = false; - } - - EVERY_N_MILLIS(33) { - hueoffset += 1; - } - - effects.ShowFrame(); - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSwirl.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSwirl.h deleted file mode 100644 index 49f3273..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternSwirl.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -* Aurora: https://github.com/pixelmatix/aurora -* Copyright (c) 2014 Jason Coon -* -* Portions of this code are adapted from SmartMatrixSwirl by Mark Kriegsman: https://gist.github.com/kriegsman/5adca44e14ad025e6d3b -* https://www.youtube.com/watch?v=bsGBT-50cts -* Copyright (c) 2014 Mark Kriegsman -* -* Permission is hereby granted, free of charge, to any person obtaining a copy of -* this software and associated documentation files (the "Software"), to deal in -* the Software without restriction, including without limitation the rights to -* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -* the Software, and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef PatternSwirl_H - -class PatternSwirl : public Drawable { - private: - const uint8_t borderWidth = 2; - - public: - PatternSwirl() { - name = (char *)"Swirl"; - } - - void start() { - effects.ClearFrame(); - } - - unsigned int drawFrame() { - // Apply some blurring to whatever's already on the matrix - // Note that we never actually clear the matrix, we just constantly - // blur it repeatedly. Since the blurring is 'lossy', there's - // an automatic trend toward black -- by design. - uint8_t blurAmount = beatsin8(2, 10, 255); - -#if FASTLED_VERSION >= 3001000 - blur2d(effects.leds, VPANEL_W > 255 ? 255 : VPANEL_W, VPANEL_H > 255 ? 255 : VPANEL_H, blurAmount); -#else - effects.DimAll(blurAmount); -#endif - - // Use two out-of-sync sine waves - uint8_t i = beatsin8(256/VPANEL_H, borderWidth, VPANEL_W - borderWidth); - uint8_t j = beatsin8(2048/VPANEL_W, borderWidth, VPANEL_H - borderWidth); - - // Also calculate some reflections - uint8_t ni = (VPANEL_W - 1) - i; - uint8_t nj = (VPANEL_H - 1) - j; - - // The color of each point shifts over time, each at a different speed. - uint16_t ms = millis(); - effects.leds[XY(i, j)] += effects.ColorFromCurrentPalette(ms / 11); - //effects.leds[XY(j, i)] += effects.ColorFromCurrentPalette(ms / 13); // this doesn't work for non-square matrices - effects.leds[XY(ni, nj)] += effects.ColorFromCurrentPalette(ms / 17); - //effects.leds[XY(nj, ni)] += effects.ColorFromCurrentPalette(ms / 29); // this doesn't work for non-square matrices - effects.leds[XY(i, nj)] += effects.ColorFromCurrentPalette(ms / 37); - effects.leds[XY(ni, j)] += effects.ColorFromCurrentPalette(ms / 41); - - - effects.ShowFrame(); - return 0; - - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternTest.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternTest.h deleted file mode 100644 index 7a4a07d..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternTest.h +++ /dev/null @@ -1,20 +0,0 @@ - -#ifndef PatternTest_H -#define PatternTest_H - -class PatternTest : public Drawable { - private: - - public: - PatternTest() { - name = (char *)"Test Pattern"; - } - - unsigned int drawFrame() { - - matrix->fillScreen(matrix->color565(128, 0, 0)); - return 1000; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternWave.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternWave.h deleted file mode 100644 index 90e7448..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/PatternWave.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PatternWave_H -#define PatternWave_H - -class PatternWave : public Drawable { -private: - byte thetaUpdate = 0; - byte thetaUpdateFrequency = 0; - byte theta = 0; - - byte hueUpdate = 0; - byte hueUpdateFrequency = 0; - byte hue = 0; - - byte rotation = 0; - - uint8_t scale = 256 / VPANEL_W; - - uint8_t maxX = VPANEL_W - 1; - uint8_t maxY = VPANEL_H - 1; - - uint8_t waveCount = 1; - -public: - PatternWave() { - name = (char *)"Wave"; - } - - void start() { - rotation = random(0, 4); - waveCount = random(1, 3); - - } - - unsigned int drawFrame() { - int n = 0; - - switch (rotation) { - case 0: - for (int x = 0; x < VPANEL_W; x++) { - n = quadwave8(x * 2 + theta) / scale; - effects.drawBackgroundFastLEDPixelCRGB(x, n, effects.ColorFromCurrentPalette(x + hue)); - if (waveCount == 2) - effects.drawBackgroundFastLEDPixelCRGB(x, maxY - n, effects.ColorFromCurrentPalette(x + hue)); - } - break; - - case 1: - for (int y = 0; y < VPANEL_H; y++) { - n = quadwave8(y * 2 + theta) / scale; - effects.drawBackgroundFastLEDPixelCRGB(n, y, effects.ColorFromCurrentPalette(y + hue)); - if (waveCount == 2) - effects.drawBackgroundFastLEDPixelCRGB(maxX - n, y, effects.ColorFromCurrentPalette(y + hue)); - } - break; - - case 2: - for (int x = 0; x < VPANEL_W; x++) { - n = quadwave8(x * 2 - theta) / scale; - effects.drawBackgroundFastLEDPixelCRGB(x, n, effects.ColorFromCurrentPalette(x + hue)); - if (waveCount == 2) - effects.drawBackgroundFastLEDPixelCRGB(x, maxY - n, effects.ColorFromCurrentPalette(x + hue)); - } - break; - - case 3: - for (int y = 0; y < VPANEL_H; y++) { - n = quadwave8(y * 2 - theta) / scale; - effects.drawBackgroundFastLEDPixelCRGB(n, y, effects.ColorFromCurrentPalette(y + hue)); - if (waveCount == 2) - effects.drawBackgroundFastLEDPixelCRGB(maxX - n, y, effects.ColorFromCurrentPalette(y + hue)); - } - break; - } - - effects.DimAll(254); - effects.ShowFrame(); - - if (thetaUpdate >= thetaUpdateFrequency) { - thetaUpdate = 0; - theta++; - } - else { - thetaUpdate++; - } - - if (hueUpdate >= hueUpdateFrequency) { - hueUpdate = 0; - hue++; - } - else { - hueUpdate++; - } - - return 0; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Patterns.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Patterns.h deleted file mode 100644 index 398d57b..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Patterns.h +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Patterns_H -#define Patterns_H - -#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0])) - -#include "Vector.h" -#include "Boid.h" -#include "Attractor.h" - -/* - * Note from mrfaptastic: - * - * Commented out patterns are due to the fact they either didn't work properly with a non-square display, - * or from my personal opinion, are crap. - */ - -#include "PatternTest.h" -//#include "PatternNoiseSmearing.h" // Doesn't seem to work, omitting. -#include "PatternSpiro.h" -#include "PatternRadar.h" -#include "PatternSwirl.h" -#include "PatternPendulumWave.h" -#include "PatternFlowField.h" -#include "PatternIncrementalDrift.h" -#include "PatternIncrementalDrift2.h" // Doesn't seem to work, omitting. -#include "PatternMunch.h" -#include "PatternElectricMandala.h" -//#include "PatternSpin.h" // Doesn't seem to work, omitting. -#include "PatternSimplexNoise.h" -#include "PatternWave.h" -#include "PatternAttract.h" -//#include "PatternBounce.h" // Doesn't seem to work, omitting. -#include "PatternFlock.h" -#include "PatternInfinity.h" -#include "PatternPlasma.h" -#include "PatternSnake.h" -#include "PatternInvaders.h" -//#include "PatternCube.h" // Doesn't seem to work, omitting. -//#include "PatternFire.h" // Doesn't seem to work, omitting. -#include "PatternLife.h" -#include "PatternMaze.h" -//#include "PatternPulse.h" // Doesn't seem to work, omitting. -//#include "PatternSpark.h" // Doesn't seem to work, omitting. -#include "PatternSpiral.h" - -class Patterns : public Playlist { - private: - PatternTest patternTest; - // PatternRainbowFlag rainbowFlag; // doesn't work - // PatternPaletteSmear paletteSmear; - // PatternMultipleStream multipleStream; // doesn't work - // PatternMultipleStream2 multipleStream2; // doesn't work - // PatternMultipleStream3 multipleStream3; // doesn't work - // PatternMultipleStream4 multipleStream4; // doesn't work - // PatternMultipleStream5 multipleStream5; // doesn't work - // PatternMultipleStream8 multipleStream8; // doesn't work - PatternSpiro spiro; - // PatternRadar radar; - PatternSwirl swirl; - PatternPendulumWave pendulumWave; - PatternFlowField flowField; - PatternIncrementalDrift incrementalDrift; - PatternIncrementalDrift2 incrementalDrift2; - PatternMunch munch; - PatternElectricMandala electricMandala; - // PatternSpin spin; - PatternSimplexNoise simplexNoise; - PatternWave wave; - PatternAttract attract; - // PatternBounce bounce; - PatternFlock flock; - PatternInfinity infinity; - PatternPlasma plasma; - PatternInvadersSmall invadersSmall; - // PatternInvadersMedium invadersMedium; - // PatternInvadersLarge invadersLarge; - PatternSnake snake; - // PatternCube cube; - // PatternFire fire; - PatternLife life; - PatternMaze maze; - // PatternPulse pulse; - // PatternSpark spark; - PatternSpiral spiral; - - int currentIndex = 0; - Drawable* currentItem; - - int getCurrentIndex() { - return currentIndex; - } - - const static int PATTERN_COUNT = 14; - - Drawable* shuffledItems[PATTERN_COUNT]; - - Drawable* items[PATTERN_COUNT] = { - // &patternTest, // ok - &spiro, // cool - // &paletteSmear, // fail - // &multipleStream, // fail - // &multipleStream8,// fail - // &multipleStream5,// fail - // &multipleStream3,// fail - // &radar, // fail - // &multipleStream4, // fail - // &multipleStream2, // fail - &life, // ok - &flowField, - &pendulumWave, //11 ok - - &incrementalDrift, //12 ok - &incrementalDrift2, // 13 fail - &munch, // 14 ok - // &electricMandala, // 15 ok, but ugly (vortigont) - // &spin, // 16 ok but repetitive - // &simplexNoise, // 17 - cool! - // &wave, // 18 ok (can't work with 256+ matrix due to uint8_t vars) - // &rainbowFlag, //20 // fail - &attract, // 21 ok - // &swirl, // 22 ok, but ugly (vortigont) - // &bounce, // bouncing line crap - &flock, // works - &infinity, // works - &plasma, // works - // &invadersSmall, // works ish, but ugly (vortigont) - // &invadersMedium, // fail - // &invadersLarge, // fail - &snake, // ok - // &cube, // works ish - // &fire, // ok ish - &maze, // ok - // &pulse,// fail - // &spark, // same as fire - &spiral, // ok - }; - - public: - Patterns() { - // add the items to the shuffledItems array - for (int a = 0; a < PATTERN_COUNT; a++) { - shuffledItems[a] = items[a]; - } - - shuffleItems(); - - this->currentItem = items[0]; - this->currentItem->start(); - } - - char* Drawable::name = (char *)"Patterns"; - - void stop() { - if (currentItem) - currentItem->stop(); - } - - void start() { - if (currentItem) - currentItem->start(); - } - - void move(int step) { - currentIndex += step; - - if (currentIndex >= PATTERN_COUNT) currentIndex = 0; - else if (currentIndex < 0) currentIndex = PATTERN_COUNT - 1; - - if (effects.paletteIndex == effects.RandomPaletteIndex) - effects.RandomPalette(); - - moveTo(currentIndex); - - //if (!isTimeAvailable && currentItem == &analogClock) - // move(step); - } - - void moveRandom(int step) { - currentIndex += step; - - if (currentIndex >= PATTERN_COUNT) currentIndex = 0; - else if (currentIndex < 0) currentIndex = PATTERN_COUNT - 1; - - if (effects.paletteIndex == effects.RandomPaletteIndex) - effects.RandomPalette(); - - if (currentItem) - currentItem->stop(); - - currentItem = shuffledItems[currentIndex]; - - if (currentItem) - currentItem->start(); - - // if (!isTimeAvailable && currentItem == &analogClock) - // moveRandom(step); - } - - void shuffleItems() { - for (int a = 0; a < PATTERN_COUNT; a++) - { - int r = random(a, PATTERN_COUNT); - Drawable* temp = shuffledItems[a]; - shuffledItems[a] = shuffledItems[r]; - shuffledItems[r] = temp; - } - } - - - unsigned int drawFrame() { - return currentItem->drawFrame(); - } - - void listPatterns() { - Serial.println(F("{")); - Serial.print(F(" \"count\": ")); - Serial.print(PATTERN_COUNT); - Serial.println(","); - Serial.println(F(" \"results\": [")); - - for (int i = 0; i < PATTERN_COUNT; i++) { - Serial.print(F(" \"")); - Serial.print(i, DEC); - Serial.print(F(": ")); - Serial.print(items[i]->name); - if (i == PATTERN_COUNT - 1) - Serial.println(F("\"")); - else - Serial.println(F("\",")); - } - - Serial.println(" ]"); - Serial.println("}"); - } - - char * getCurrentPatternName() - { - return currentItem->name; - } - - void moveTo(int index) { - if (currentItem) - currentItem->stop(); - - currentIndex = index; - - currentItem = items[currentIndex]; - - if (currentItem) - currentItem->start(); - } - - bool setPattern(String name) { - for (int i = 0; i < PATTERN_COUNT; i++) { - if (name.compareTo(items[i]->name) == 0) { - moveTo(i); - return true; - } - } - - return false; - } - - - bool setPattern(int index) { - if (index >= PATTERN_COUNT || index < 0) - return false; - - moveTo(index); - - return true; - } -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Playlist.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Playlist.h deleted file mode 100644 index 29c0c87..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Playlist.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Playlist_H -#define Playlist_H - -class Playlist : public Drawable { -public: - virtual bool isPlaylist() { - return true; - } - - boolean isCurrentItemFinished = true; - - virtual void move(int step) = 0; - virtual void moveRandom(int step) = 0; - virtual int getCurrentIndex(); -}; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Vector.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Vector.h deleted file mode 100644 index 8acbadc..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsAuroraDemo/Vector.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Aurora: https://github.com/pixelmatix/aurora - * Copyright (c) 2014 Jason Coon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef Vector_H -#define Vector_H - -template -class Vector2 { -public: - T x, y; - - Vector2() :x(0), y(0) {} - Vector2(T x, T y) : x(x), y(y) {} - Vector2(const Vector2& v) : x(v.x), y(v.y) {} - - Vector2& operator=(const Vector2& v) { - x = v.x; - y = v.y; - return *this; - } - - bool isEmpty() { - return x == 0 && y == 0; - } - - bool operator==(Vector2& v) { - return x == v.x && y == v.y; - } - - bool operator!=(Vector2& v) { - return !(x == y); - } - - Vector2 operator+(Vector2& v) { - return Vector2(x + v.x, y + v.y); - } - Vector2 operator-(Vector2& v) { - return Vector2(x - v.x, y - v.y); - } - - Vector2& operator+=(Vector2& v) { - x += v.x; - y += v.y; - return *this; - } - Vector2& operator-=(Vector2& v) { - x -= v.x; - y -= v.y; - return *this; - } - - Vector2 operator+(double s) { - return Vector2(x + s, y + s); - } - Vector2 operator-(double s) { - return Vector2(x - s, y - s); - } - Vector2 operator*(double s) { - return Vector2(x * s, y * s); - } - Vector2 operator/(double s) { - return Vector2(x / s, y / s); - } - - Vector2& operator+=(double s) { - x += s; - y += s; - return *this; - } - Vector2& operator-=(double s) { - x -= s; - y -= s; - return *this; - } - Vector2& operator*=(double s) { - x *= s; - y *= s; - return *this; - } - Vector2& operator/=(double s) { - x /= s; - y /= s; - return *this; - } - - void set(T x, T y) { - this->x = x; - this->y = y; - } - - void rotate(double deg) { - double theta = deg / 180.0 * M_PI; - double c = cos(theta); - double s = sin(theta); - double tx = x * c - y * s; - double ty = x * s + y * c; - x = tx; - y = ty; - } - - Vector2& normalize() { - if (length() == 0) return *this; - *this *= (1.0 / length()); - return *this; - } - - float dist(Vector2 v) const { - Vector2 d(v.x - x, v.y - y); - return d.length(); - } - float length() const { - return sqrt(x * x + y * y); - } - - float mag() const { - return length(); - } - - float magSq() { - return (x * x + y * y); - } - - void truncate(double length) { - double angle = atan2f(y, x); - x = length * cos(angle); - y = length * sin(angle); - } - - Vector2 ortho() const { - return Vector2(y, -x); - } - - static float dot(Vector2 v1, Vector2 v2) { - return v1.x * v2.x + v1.y * v2.y; - } - static float cross(Vector2 v1, Vector2 v2) { - return (v1.x * v2.y) - (v1.y * v2.x); - } - - void limit(float max) { - if (magSq() > max*max) { - normalize(); - *this *= max; - } - } -}; - -typedef Vector2 PVector; - -#endif diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/ChainedPanelsScreenBuffer.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/ChainedPanelsScreenBuffer.ino deleted file mode 100644 index b5de3c3..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/ChainedPanelsScreenBuffer.ino +++ /dev/null @@ -1,146 +0,0 @@ -/************************************************************************* - * IMPORANT PLEASE READ THE INFORMATION BELOW! - * - * This example implements a 'pixel buffer' which is essentally an - * off-screen copy of what is intended to be sent to output (LED panels) - * - * This essentially means DOUBLE THE AMOUNT OF MEMORY is required to - * to store the off-screen image/pixel/display buffer WITH a similar - * amount of memory used for the DMA output buffer for the physical panels. - * - * This means the practical resolution you will be able to output with the - * ESP32 will be CUT IN HALF. Do not try to run huge chains of - * LED Matrix Panels using this buffer, you will run out of memory. - * - * Please DO NOT raise issues @ github about running out of memory, - * we can't do anything about it. It's an ESP32, not a Raspberry Pi! - * - *************************************************************************/ - -/* Use the FastLED_Pixel_Buffer class to handle panel chaining - * (it's based on the VirtualMatrixPanel class) AND also create an - * off-screen CRGB FastLED pixel buffer. - */ -#include "FastLED_Pixel_Buffer.h" - - // Panel configuration - #define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. - #define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. - - #define NUM_ROWS 1 // Number of rows of chained INDIVIDUAL PANELS - #define NUM_COLS 2 // Number of INDIVIDUAL PANELS per ROW - - // Change this to your needs, for details please read the PDF in - // the 'ChainedPanels'example folder! - #define SERPENT true - #define TOPDOWN false - - // placeholder for the matrix object - MatrixPanel_I2S_DMA *dma_display = nullptr; - - // placeholder for the virtual display object - VirtualMatrixPanel_FastLED_Pixel_Buffer *FastLED_Pixel_Buff = nullptr; - - /****************************************************************************** - * Setup! - ******************************************************************************/ - void setup() - { - delay(250); - - Serial.begin(115200); - Serial.println(""); Serial.println(""); Serial.println(""); - Serial.println("*****************************************************"); - Serial.println("* FastLED Pixel BufferDemonstration *"); - Serial.println("*****************************************************"); - -/* - // 62x32 1/8 Scan Panels don't have a D and E pin! - - HUB75_I2S_CFG::i2s_pins _pins = { - R1_PIN, G1_PIN, B1_PIN, R2_PIN, G2_PIN, B2_PIN, - A_PIN, B_PIN, C_PIN, D_PIN, E_PIN, - LAT_PIN, OE_PIN, CLK_PIN - }; -*/ - HUB75_I2S_CFG mxconfig( - PANEL_RES_X, // DO NOT CHANGE THIS - PANEL_RES_Y, // DO NOT CHANGE THIS - NUM_ROWS*NUM_COLS // DO NOT CHANGE THIS - //,_pins // Uncomment to enable custom pins - ); - - mxconfig.clkphase = false; // Change this if you see pixels showing up shifted wrongly by one column the left or right. - //mxconfig.driver = HUB75_I2S_CFG::FM6126A; // in case that we use panels based on FM6126A chip, we can set it here before creating MatrixPanel_I2S_DMA object - - // Do NOT use mxconfig.double_buffer when using this pixel buffer. - - // OK, now we can create our matrix object - dma_display = new MatrixPanel_I2S_DMA(mxconfig); - - // let's adjust default physical panel brightness to about 75% - dma_display->setBrightness8(96); // range is 0-255, 0 - 0%, 255 - 100% - - // Allocate memory and start DMA electrical output to physical panels - if( not dma_display->begin() ) - Serial.println("****** !KABOOM! I2S memory allocation failed ***********"); - - dma_display->clearScreen(); - delay(500); - - // NOW, create the 'Virtual Matrix Panel' class with a FastLED Pixel Buffer! Pass it a dma_display hardware library pointer to use. - FastLED_Pixel_Buff = new VirtualMatrixPanel_FastLED_Pixel_Buffer((*dma_display), NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, SERPENT, TOPDOWN); - - if( not FastLED_Pixel_Buff->allocateMemory() ) - Serial.println("****** !KABOOM! Unable to find enough memory for the FastLED pixel buffer! ***********"); - - } - - - // Borrowed from the SimpleTextShapes example. - uint16_t colorWheel(uint8_t pos) { - if(pos < 85) { - return dma_display->color565(pos * 3, 255 - pos * 3, 0); - } else if(pos < 170) { - pos -= 85; - return dma_display->color565(255 - pos * 3, 0, pos * 3); - } else { - pos -= 170; - return dma_display->color565(0, pos * 3, 255 - pos * 3); - } - } - - /* A crap demonstration of using the pixel buffer. - * 1) Draw text at an incrementing (going down) y coordinate - * 2) Move down a pixel row - * 3) Draw the text again, fade the 'old' pixels. Using the pixel buffer to update all pixels on screen. - * 4) 'show' (send) the pixel buffer to the DMA output. - * 5) LOOP - */ - - uint8_t y_coord = 0; - uint8_t wheel = 0; - - void loop() - { - // draw text with a rotating colour - FastLED_Pixel_Buff->dimAll(200); // Dim all pixels by 250/255 - - FastLED_Pixel_Buff->setTextSize(1); // size 1 == 8 pixels high - FastLED_Pixel_Buff->setTextWrap(false); // Don't wrap at end of line - will do ourselves - - FastLED_Pixel_Buff->setCursor(FastLED_Pixel_Buff->width()/4, y_coord); // start at top left, with 8 pixel of spacing - FastLED_Pixel_Buff->setTextColor(colorWheel(wheel++)); - - FastLED_Pixel_Buff->print("MythicalForce"); - - FastLED_Pixel_Buff->show(); // IMPORTANT -> SEND Pixel Buffer to DMA / Panel Output! - - y_coord++; - - if ( y_coord >= FastLED_Pixel_Buff->height()) - y_coord = 0; - - delay(35); - - } // end loop diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/FastLED_Pixel_Buffer.cpp b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/FastLED_Pixel_Buffer.cpp deleted file mode 100644 index 79e19c9..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/FastLED_Pixel_Buffer.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Experimental layer class to do play with pixel in an off-screen buffer before painting to the DMA - * - * Requires FastLED - * - * Faptastic 2020-2021 - **/ - -#include "FastLED_Pixel_Buffer.h" - -/** - * The one for 256+ matrices - * otherwise this: - * for (uint8_t i = 0; i < MATRIX_WIDTH; i++) {} - * turns into an infinite loop - */ -inline uint16_t VirtualMatrixPanel_FastLED_Pixel_Buffer::XY16( uint16_t x, uint16_t y) { - - if (x >= virtualResX) return 0; - if (y >= virtualResY) return 0; - - return (y * virtualResX) + x + 1; // everything offset by one to compute out of bounds stuff - never displayed by ShowFrame() -} - -// For adafruit -void VirtualMatrixPanel_FastLED_Pixel_Buffer::drawPixel(int16_t x, int16_t y, uint16_t color) { - - //Serial.println("calling our drawpixel!"); - - // 565 color conversion - uint8_t r = ((((color >> 11) & 0x1F) * 527) + 23) >> 6; - uint8_t g = ((((color >> 5) & 0x3F) * 259) + 33) >> 6; - uint8_t b = (((color & 0x1F) * 527) + 23) >> 6; - - this->drawPixel(x, y, CRGB(r,g,b)); -} - -void VirtualMatrixPanel_FastLED_Pixel_Buffer::drawPixel(int16_t x, int16_t y, int r, int g, int b) { - this->drawPixel(x, y, CRGB(r,g,b)); -} - -// We actually just draw to ourselves... to our buffer -void VirtualMatrixPanel_FastLED_Pixel_Buffer::drawPixel(int16_t x, int16_t y, CRGB color) -{ - //Serial.printf("updated x y : %d %d", x, y); - buffer[XY16(x,y)] = color; -} - -CRGB VirtualMatrixPanel_FastLED_Pixel_Buffer::getPixel(int16_t x, int16_t y) -{ - return buffer[XY16(x,y)]; -} - -/** - * Dim all the pixels on the layer. - */ -void VirtualMatrixPanel_FastLED_Pixel_Buffer::dimAll(byte value) { - - //Serial.println("performing dimall"); - // nscale8 max value is 255, or it'll flip back to 0 - // (documentation is wrong when it says x/256), it's actually x/255 - /* - for (int y = 0; y < LAYER_HEIGHT; y++) { - for (int x = 0; x < LAYER_WIDTH; x++) { - pixels->data[y][x].nscale8(value); - }} - */ - dimRect(0,0, virtualResX, virtualResY, value); -} - -/** - * Dim all the pixels in a rectangular option of the layer the layer. - */ -void VirtualMatrixPanel_FastLED_Pixel_Buffer::dimRect(int16_t x, int16_t y, int16_t w, int16_t h, byte value) { - for (int16_t i = x; i < x + w; i++) - { - for (int16_t j = y; j < y + h; j++) - { - buffer[XY16(i,j)].nscale8(value); - } - } -} - -void VirtualMatrixPanel_FastLED_Pixel_Buffer::clear() { - memset(buffer, CRGB(0,0,0), (virtualResX * virtualResY) ); -} - -/** - * Actually Send the CRGB FastLED buffer to the DMA engine / Physical Panels! - * Do this via the underlying 'VirtualMatrixPanel' that does all the pixel-remapping for - * all sorts of chained panels, and panel scan types. - */ -void VirtualMatrixPanel_FastLED_Pixel_Buffer::show() { - - //Serial.println("Doing Show"); - - CRGB _pixel = 0; - for (int16_t y = 0; y < virtualResY; y++) { - for (int16_t x = 0; x < virtualResX; x++) - { - //VirtualMatrixPanel::getCoords(x, y); // call to base to update coords for chaining approach - _pixel = buffer[XY16(x,y)]; - drawPixelRGB888( x, y, _pixel.r, _pixel.g, _pixel.b); // call VirtualMatrixPanel::drawPixelRGB888(...) - //drawPixelRGB888( x, y, 0, 0, 128); // call VirtualMatrixPanel::drawPixelRGB888(...) - } // end loop to copy fast led to the dma matrix - } - -} // show - -/** - * Cleanup should we delete this buffer class. Unlikely during runtime. - */ -VirtualMatrixPanel_FastLED_Pixel_Buffer::~VirtualMatrixPanel_FastLED_Pixel_Buffer(void) -{ - delete(buffer); -} \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/FastLED_Pixel_Buffer.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/FastLED_Pixel_Buffer.h deleted file mode 100644 index 28db7d5..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/ChainedPanelsScreenBuffer/FastLED_Pixel_Buffer.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef VIRTUAL_MATRIX_PANEL_FASTLED_LAYER -#define VIRTUAL_MATRIX_PANEL_FASTLED_LAYER - -#include -#include - -class VirtualMatrixPanel_FastLED_Pixel_Buffer : public VirtualMatrixPanel -{ - public: - using VirtualMatrixPanel::VirtualMatrixPanel; // perform VirtualMatrixPanel class constructor - - bool allocateMemory() // allocate memory - { - // https://www.geeksforgeeks.org/how-to-declare-a-2d-array-dynamically-in-c-using-new-operator/ - buffer = new CRGB[virtualResX * virtualResY]; // These are defined in the underliny - - if (!buffer) { return false; } - - Serial.printf("Allocated %d bytes of memory for pixel buffer.\r\n", sizeof(CRGB)*((virtualResX * virtualResY)+1)); - this->clear(); - - return true; - - } // end Buffer - - virtual void drawPixel(int16_t x, int16_t y, uint16_t color); // overwrite adafruit implementation - void drawPixel(int16_t x, int16_t y, int r, int g, int b); // Buffer implementation - void drawPixel(int16_t x, int16_t y, CRGB color); // Buffer implementation - CRGB getPixel(int16_t x, int16_t y); // Returns a pixel value from the buffer. - - - void dimAll(byte value); - void dimRect(int16_t x, int16_t y, int16_t w, int16_t h, byte value); - - void clear(); - - void show(); // Send buffer to physical hardware / DMA engine. - - // Release Memory - ~VirtualMatrixPanel_FastLED_Pixel_Buffer(void); - - protected: - uint16_t XY16( uint16_t x, uint16_t y); - - private: - CRGB* buffer = nullptr; -}; - - - -#endif \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Eight_1_8_ScanPanel/One_Eight_1_8_ScanPanel.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Eight_1_8_ScanPanel/One_Eight_1_8_ScanPanel.ino deleted file mode 100644 index d44bb76..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Eight_1_8_ScanPanel/One_Eight_1_8_ScanPanel.ino +++ /dev/null @@ -1,151 +0,0 @@ -/************************************************************************* - * Description: - * - * The underlying implementation of the ESP32-HUB75-MatrixPanel-I2S-DMA only - * supports output to 1/16 or 1/32 scan panels - which means outputting - * two lines at the same time, 16 or 32 rows apart. This cannot be changed - * at the DMA layer as it would require a messy and complex rebuild of the - * library's DMA internals. - * - * However, it is possible to connect 1/8 scan panels to this same library and - * 'trick' the output to work correctly on these panels by way of adjusting the - * pixel co-ordinates that are 'sent' to the ESP32-HUB75-MatrixPanel-I2S-DMA - * library. - * - **************************************************************************/ -#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h" - -/* Use the Virtual Display class to re-map co-ordinates such that they draw - * correctly on a 32x16 1/8 Scan panel (or chain of such panels). - */ -#include "ESP32-VirtualMatrixPanel-I2S-DMA.h" - - - // Panel configuration - #define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. - #define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. - - - #define NUM_ROWS 1 // Number of rows of chained INDIVIDUAL PANELS - #define NUM_COLS 2 // Number of INDIVIDUAL PANELS per ROW - - // ^^^ NOTE: DEFAULT EXAMPLE SETUP IS FOR A CHAIN OF TWO x 1/8 SCAN PANELS - - // Change this to your needs, for details on VirtualPanel pls read the PDF! - #define SERPENT true - #define TOPDOWN false - - // placeholder for the matrix object - MatrixPanel_I2S_DMA *dma_display = nullptr; - - // placeholder for the virtual display object - VirtualMatrixPanel *OneEightMatrixDisplay = nullptr; - - /****************************************************************************** - * Setup! - ******************************************************************************/ - void setup() - { - delay(250); - - Serial.begin(115200); - Serial.println(""); Serial.println(""); Serial.println(""); - Serial.println("*****************************************************"); - Serial.println("* 1/8 Scan Panel Demonstration *"); - Serial.println("*****************************************************"); - -/* - // 62x32 1/8 Scan Panels don't have a D and E pin! - - HUB75_I2S_CFG::i2s_pins _pins = { - R1_PIN, G1_PIN, B1_PIN, R2_PIN, G2_PIN, B2_PIN, - A_PIN, B_PIN, C_PIN, D_PIN, E_PIN, - LAT_PIN, OE_PIN, CLK_PIN - }; -*/ - HUB75_I2S_CFG mxconfig( - PANEL_RES_X*2, // DO NOT CHANGE THIS - PANEL_RES_Y/2, // DO NOT CHANGE THIS - NUM_ROWS*NUM_COLS // DO NOT CHANGE THIS - //,_pins // Uncomment to enable custom pins - ); - - mxconfig.clkphase = false; // Change this if you see pixels showing up shifted wrongly by one column the left or right. - - //mxconfig.driver = HUB75_I2S_CFG::FM6126A; // in case that we use panels based on FM6126A chip, we can set it here before creating MatrixPanel_I2S_DMA object - - // OK, now we can create our matrix object - dma_display = new MatrixPanel_I2S_DMA(mxconfig); - - // let's adjust default brightness to about 75% - dma_display->setBrightness8(96); // range is 0-255, 0 - 0%, 255 - 100% - - // Allocate memory and start DMA display - if( not dma_display->begin() ) - Serial.println("****** !KABOOM! I2S memory allocation failed ***********"); - - - dma_display->clearScreen(); - delay(500); - - // create OneEightMatrixDisplaylay object based on our newly created dma_display object - OneEightMatrixDisplay = new VirtualMatrixPanel((*dma_display), NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, SERPENT, TOPDOWN); - - // THE IMPORTANT BIT BELOW! - OneEightMatrixDisplay->setPhysicalPanelScanRate(ONE_EIGHT_32); - } - - - void loop() { - - // What the panel sees from the DMA engine! - for (int i=PANEL_RES_X*2+10; i< PANEL_RES_X*(NUM_ROWS*NUM_COLS)*2; i++) - { - dma_display->drawLine(i, 0, i, 7, dma_display->color565(255, 0, 0)); // red - delay(10); - } - - dma_display->clearScreen(); - delay(1000); -/* - // Try again using the pixel / dma memory remapper - for (int i=PANEL_RES_X+5; i< (PANEL_RES_X*2)-1; i++) - { - OneEightMatrixDisplay->drawLine(i, 0, i, 7, dma_display->color565(0, 0, 255)); // blue - delay(10); - } -*/ - - // Try again using the pixel / dma memory remapper - int offset = PANEL_RES_X*((NUM_ROWS*NUM_COLS)-1); - for (int i=0; i< PANEL_RES_X; i++) - { - OneEightMatrixDisplay->drawLine(i+offset, 0, i+offset, 7, dma_display->color565(0, 0, 255)); // blue - OneEightMatrixDisplay->drawLine(i+offset, 8, i+offset, 15, dma_display->color565(0, 128,0)); // g - OneEightMatrixDisplay->drawLine(i+offset, 16, i+offset, 23, dma_display->color565(128, 0,0)); // red - OneEightMatrixDisplay->drawLine(i+offset, 24, i+offset, 31, dma_display->color565(0, 128, 128)); // blue - delay(10); - } - - delay(1000); - - - // Print on each chained panel 1/8 module! - // This only really works for a single horizontal chain - for (int i = 0; i < NUM_ROWS*NUM_COLS; i++) - { - OneEightMatrixDisplay->setTextColor(OneEightMatrixDisplay->color565(255, 255, 255)); - OneEightMatrixDisplay->setCursor(i*PANEL_RES_X+7, OneEightMatrixDisplay->height()/3); - - // Red text inside red rect (2 pix in from edge) - OneEightMatrixDisplay->print("Panel " + String(i+1)); - OneEightMatrixDisplay->drawRect(1,1, OneEightMatrixDisplay->width()-2, OneEightMatrixDisplay->height()-2, OneEightMatrixDisplay->color565(255,0,0)); - - // White line from top left to bottom right - OneEightMatrixDisplay->drawLine(0,0, OneEightMatrixDisplay->width()-1, OneEightMatrixDisplay->height()-1, OneEightMatrixDisplay->color565(255,255,255)); - } - - delay(2000); - dma_display->clearScreen(); - - } // end loop diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Eight_1_8_ScanPanel/README.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Eight_1_8_ScanPanel/README.md deleted file mode 100644 index 2fd55b9..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Eight_1_8_ScanPanel/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Using this library with 32x16 1/8 Scan Panels - -## Problem -ESP32-HUB75-MatrixPanel-I2S-DMA library will not display output correctly with 1/8 scan panels such [as this](https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/154) by default. - -## Solution -It is possible to connect 1/8 scan panels to this library and 'trick' the output to work correctly on these panels by way of adjusting the pixel co-ordinates that are 'sent' to the underlying ESP32-HUB75-MatrixPanel-I2S-DMA library (in this example, it is the 'dmaOutput' class). diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/OneQuarterScanMatrixPanel.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/OneQuarterScanMatrixPanel.h deleted file mode 100644 index 885b937..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/OneQuarterScanMatrixPanel.h +++ /dev/null @@ -1,451 +0,0 @@ - -/* - Patch class for 32x16 RGB Matrix panels - - reimplement all functions which use x,y coordinates - -*/ - -#ifndef ESP_HUB75_32x16MatrixPanel -#define ESP_HUB75_32x16MatrixPanel - -#include "ESP32-HUB75-MatrixPanel-I2S-DMA.h" -#include -#include "glcdfont.c" - -struct VirtualCoords { - int16_t x; - int16_t y; -}; - -#define VP_WIDTH 32 -#define VP_HEIGHT 16 -#define DEFAULT_FONT_W 5 -#define DEFAULT_FONT_H 7 -#define PIXEL_SPACE 1 // space between chars in a string - - -/* --- PRINTF_BYTE_TO_BINARY macro's --- */ -#define PRINTF_BINARY_PATTERN_INT8 "%c%c%c%c%c%c%c%c" -#define PRINTF_BYTE_TO_BINARY_INT8(i) \ - (((i) & 0x80ll) ? '1' : '0'), \ - (((i) & 0x40ll) ? '1' : '0'), \ - (((i) & 0x20ll) ? '1' : '0'), \ - (((i) & 0x10ll) ? '1' : '0'), \ - (((i) & 0x08ll) ? '1' : '0'), \ - (((i) & 0x04ll) ? '1' : '0'), \ - (((i) & 0x02ll) ? '1' : '0'), \ - (((i) & 0x01ll) ? '1' : '0') - -#define PRINTF_BINARY_PATTERN_INT16 \ - PRINTF_BINARY_PATTERN_INT8 PRINTF_BINARY_PATTERN_INT8 -#define PRINTF_BYTE_TO_BINARY_INT16(i) \ - PRINTF_BYTE_TO_BINARY_INT8((i) >> 8), PRINTF_BYTE_TO_BINARY_INT8(i) - - -/* --- end macros --- */ - - -class QuarterScanMatrixPanel : public Adafruit_GFX -{ - - public: - - MatrixPanel_I2S_DMA *display; - - QuarterScanMatrixPanel(MatrixPanel_I2S_DMA &disp) : Adafruit_GFX(64, 32) - { - this->display = &disp; - size_x = size_y = 1 ; - wrap = false; - cursor_x = cursor_y = 0; - dir = 1; - loop = true; - - } - - VirtualCoords getCoords(int16_t x, int16_t y); - int16_t getVirtualX(int16_t x) { - VirtualCoords coords = getCoords(x, 0); - return coords.x; - } - int16_t getVirtualY(int16_t y) { - VirtualCoords coords = getCoords(0,y); - return coords.y; - } -// int16_t getVirtualY(int16_t y) {return getCoords(0,y).y;} - /** extended function to draw lines/rects/... **/ - virtual uint8_t width() {return VP_WIDTH;}; - virtual uint8_t height() {return VP_HEIGHT;}; - - virtual void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color); - virtual void drawHLine(int16_t x0, int16_t y0, int16_t w, uint16_t color); - virtual void drawVLine(int16_t x0, int16_t y0, int16_t h, uint16_t color); - virtual void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); - - virtual void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size); - virtual void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size_x, uint8_t size_y); - virtual void scrollChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint16_t dir, uint16_t speed); - virtual void drawString(int16_t x, int16_t y, unsigned char* c, uint16_t color, uint16_t bg); - virtual size_t write(unsigned char c); // write a character on current cursor position - virtual size_t write(const char *str); // write a character array (string) on current cursor position - - virtual void setTextWrap(bool w); - virtual void setCursor (int16_t x, int16_t y); - void setTextFGColor(uint16_t color) {textFGColor = color;}; - void setTextBGColor(uint16_t color) {textBGColor = color;}; - void setTextSize(uint8_t x, uint8_t y) {size_x = x; size_y = y;}; // magnification, default = 1 - - void setScrollDir(uint8_t d = 1) { dir = (d != 1) ? 0 : 1;}; // set scroll dir default = 1 - void setScroolLoop (bool b = true) { loop = b;} ; // scroll text in a loop, default true - void scrollText(const char *str, uint16_t speed, uint16_t pixels); - /**------------------------------------------**/ - - // equivalent methods of the matrix library so it can be just swapped out. - virtual void drawPixel(int16_t x, int16_t y, uint16_t color); - virtual void fillScreen(uint16_t color); // overwrite adafruit implementation - void clearScreen() { fillScreen(0); } - //void drawPixelRGB565(int16_t x, int16_t y, uint16_t color); - void drawPixelRGB888(int16_t x, int16_t y, uint8_t r, uint8_t g, uint8_t b); - //void drawPixelRGB24(int16_t x, int16_t y, RGB24 color); - void drawIcon (int *ico, int16_t x, int16_t y, int16_t module_cols, int16_t module_rows); - - uint16_t color444(uint8_t r, uint8_t g, uint8_t b) { - return display->color444(r, g, b); - } - uint16_t color565(uint8_t r, uint8_t g, uint8_t b) { - return display->color565(r, g, b); - } - uint16_t color333(uint8_t r, uint8_t g, uint8_t b) { - return display->color333(r, g, b); - } - - void flipDMABuffer() { display->flipDMABuffer(); } - void showDMABuffer() { display->showDMABuffer(); } - - void drawDisplayTest(); - - protected: - int16_t cursor_x, cursor_y; // Cursor position - uint8_t size_x, size_y; // Font size Multiplier default = 1 => 5x7 Font (5width,7Height) - uint16_t textFGColor, textBGColor; - bool wrap ; // < If set, 'wrap' text at right edge of display - uint8_t dir ; // used for scrolling text direction - bool loop ; // used for scrolling text in a loop - - private: - VirtualCoords coords; - -}; // end Class header - - -/*************************************************************************************** - - @brief scroll text from right to left or vice versa on current cursor position - please note, this function is not interruptable. - - @param *c pointer to \0 terminated string - @param pixels number of pixels to scroll, if 0, than scroll complete text - @param speed velocity of scrolling in ms -***************************************************************************************/ -void QuarterScanMatrixPanel::scrollText(const char *str,uint16_t speed, uint16_t pixels = 0) { - // first we put all columns of every char inside str into a big array of lines - // than we move through this array and draw line per line and move this line - // one position to dir - const uint8_t xSize = 6; - uint16_t len = strlen(str); - uint8_t array[len * xSize]; // size of array number of chars * width of char - //uint16_t lenArray = sizeof(array)/sizeof(array[0]); - uint16_t aPtr = 0; - // - // generate array - char c = *str; - // Serial.printf("size *str (%d), size array: (%d) \n", len, lenArray); - - while (c) { - // Serial.printf("** %c ** \n", c); - // read font line per line. A line is a column inside a char - for (int8_t i = 0; i < 5; i++) { - uint8_t line = pgm_read_byte(&font[c * 5 + i]); - array[aPtr++] = line; - // Serial.printf("%d - Line " PRINTF_BINARY_PATTERN_INT8 "\n", i, PRINTF_BYTE_TO_BINARY_INT8(line) ); - } - str++; - c = *str; - array[aPtr++] = 0x00; // line with 0 (space between chars) - - } - array[aPtr++] = 0x00; // line with 0 (space between chars) -/* - Serial.printf("---------------------------- \n"); - for (aPtr=0; aPtr < (len*xSize); aPtr++) { - Serial.printf("%d - Line " PRINTF_BINARY_PATTERN_INT8 "\n", aPtr, PRINTF_BYTE_TO_BINARY_INT8(array[aPtr]) ); - } -*/ - - int16_t x,y,lastX, p; - lastX = (dir) ? VP_WIDTH : 0; - x = cursor_x; - y = cursor_y; - Serial.printf("X: %d, Y: %d \n", x,y); - p=0; - pixels = (pixels) ? pixels : len * xSize; - - while (p <= pixels) { - // remove last pixel positions - fillRect(x,y,5,7,textBGColor); - // set new pixel position - x = (dir) ? lastX - p : lastX + p - pixels; - // iterator through our array - for (uint8_t i=0; i < (len*xSize); i++) { - uint8_t line = array[i]; - //Serial.printf("%d:%d : " PRINTF_BINARY_PATTERN_INT8 "\n", x, i, PRINTF_BYTE_TO_BINARY_INT8(line) ); - // read line and shift from right to left - // start with bit 0 (top of char) to 7(bottom) - for (uint8_t j=0; j < 8; j++, line>>=1) { - if (line & 1) { - // got 1, if x + i outside panel ignore pixel - if (x + i >= 0 && x + i < VP_WIDTH) { - drawPixel(x + i, y + j, textFGColor); - } - } - else { - // got 0 - if (x + i >= 0 && x + i < VP_WIDTH) { - drawPixel(x + i, y + j, textBGColor); - } - } // if - } // for j - } // for i - p++; - delay(speed); - - } // while -} - -inline size_t QuarterScanMatrixPanel::write(const char *str) { - uint8_t x, y; - x=cursor_x; - y=cursor_y; - char c = *str; - while (c) { - //Serial.printf("%c ", c); - write(c); - str++; - c = *str; - x = x + ((DEFAULT_FONT_W + PIXEL_SPACE) * size_x); - setCursor(x,y); - } - Serial.printf("\n"); - return 1; -} - -inline size_t QuarterScanMatrixPanel::write(unsigned char c) { - Serial.printf("\twrite(%d, %d, %c)\n", cursor_x, cursor_y, c); - drawChar(cursor_x, cursor_y, c, textFGColor, textBGColor, size_x, size_y); - return 1; -} - -void QuarterScanMatrixPanel::setTextWrap(bool w) {this->display->setTextWrap(w);} -void QuarterScanMatrixPanel::setCursor(int16_t x, int16_t y) { - cursor_x = x; - cursor_y = y; -} - - -/* - new for 16x32 panels - */ -inline void QuarterScanMatrixPanel::drawLine(int16_t x, int16_t y, int16_t x1, int16_t y1, uint16_t color) -{ - int16_t a,b; - for (a=x; a <= x1; a++) { - for (b=y; b <= y1; b++) { - drawPixel(a,b,color); - } - } -} - -inline void QuarterScanMatrixPanel::drawHLine(int16_t x, int16_t y, int16_t w, uint16_t color) -{ - drawLine(x,y,x+w,y, color); -} - -inline void QuarterScanMatrixPanel::drawVLine(int16_t x, int16_t y, int16_t h, uint16_t color) -{ - drawLine(x,y,x,y+h, color); -} - -inline void QuarterScanMatrixPanel::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) -{ - for (int16_t i = x; i < x + w; i++) { - drawVLine(i, y, h, color); - } -} - -void QuarterScanMatrixPanel::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size) -{ - drawChar(x,y,c,color, bg, size, size); -} - -inline void QuarterScanMatrixPanel::scrollChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint16_t dir, uint16_t speed){ - - if ((x >= VP_WIDTH) || - (y >= VP_HEIGHT) || - ((x + 6 * size_x-1) < 0) || - ((y + 8 * size_y-1) <0)) - return; - setTextWrap(true); - // text wrap is only for the right end of the panel, to scroll soft out of the left of panel - // algorithm should wrap the character from left to right - - - // loop s = scroll-loop, scrolls char 5 pixels into dir - uint8_t lastX = x; - for (int8_t s = 0; s < 6; s++) { - // loop i : width of a character - Serial.printf("X:%d ", x); - - // clear current position - fillRect(x,y,5,7,0); - x = lastX - s; - for (int8_t i = 0; i < 5; i++) { - // first line is the first vertical part of a character and 8bits long - // last bit is everytime 0 - // we read 5 lines with 8 bit (5x7 char + 8bit with zeros) - // Example : char A (90deg cw) - // 01111100 - // 00010010 - // 00010001 - // 00010010 - // 01111100 - uint8_t line = pgm_read_byte(&font[c * 5 + i]); - // shift from right to left bit per bit - // loop j = height of a character - // loop through a column of current character - Serial.printf("i:%d ", i); - // ignore all pixels outside panel - if (x+i >= VP_WIDTH) continue; - - for (int8_t j=0; j < 8; j++, line >>= 1) { - if (line & 1) { - Serial.printf - (" ON %d", x+i); - // we read 1 - if (x >= 0) { - drawPixel(x+i, y+j, color); - } - else if (x+i >= 0) { - drawPixel(x+i, y+j, color); - } - } - else if (bg != color) { - // we read 0 - Serial.printf(" OFF %d", x+i); - - if (x >= 0) { - drawPixel(x+i, y+j, bg); - } - else if (x+i >= 0) { - drawPixel(x+i, y+j, bg); - } - } - } - } - Serial.printf("\n"); - delay(speed); - } -} - - -inline void QuarterScanMatrixPanel::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size_x, uint8_t size_y) -{ - //Serial.printf("unmapped : drawChar(%d, %d, %c) \n",x, y, c); - - // note: remapping to 16x32 coordinates is done inside drawPixel() or fillRect - - if ((x >= VP_WIDTH) || - (y >= VP_HEIGHT) || - ((x + 6 * size_x-1) < 0) || - ((y + 8 * size_y-1) <0)) - return; - //Serial.printf("Font-Array : %d \n", sizeof(font)); - for (int8_t i = 0; i < 5; i++) { - uint8_t line = pgm_read_byte(&font[c * 5 + i]); - //Serial.printf("%d - Line " PRINTF_BINARY_PATTERN_INT8 "\n", i, PRINTF_BYTE_TO_BINARY_INT8(line) ); - for (int8_t j = 0; j < 8; j++, line >>= 1) { - if (line & 1) { - if (size_x == 1 && size_y == 1) - //Serial.printf(""); - drawPixel(x + i, y + j, color); - else - // remark: it's important to call function with original coordinates for x/y - fillRect(x + i * size_x, y + j * size_y, size_x, size_y, - color); - } else if (bg != color) { - if (size_x == 1 && size_y == 1) - drawPixel(x + i, y + j, bg); - else - // remark: it's important to call function with original coordinates for x/y - fillRect(x + i * size_x, y + j * size_y, size_x, size_y, bg); - } - } - } - -} - -inline void QuarterScanMatrixPanel::drawString(int16_t x, int16_t y, unsigned char* c, uint16_t color, uint16_t bg) { - -} - -inline VirtualCoords QuarterScanMatrixPanel::getCoords(int16_t x, int16_t y) -{ - const int y_remap[] = { 0,1,8,9,4,5,12,13,16,17,24,25,22,23,30,31 }; - if (y > VP_HEIGHT) - y = VP_HEIGHT; - if (x > VP_WIDTH) - x = VP_WIDTH; - coords.x = x + VP_WIDTH; - coords.y = y_remap[y]; - return coords; -} - - -/* -------------------------*/ - -inline void QuarterScanMatrixPanel::drawPixel(int16_t x, int16_t y, uint16_t color) -{ - VirtualCoords coords = getCoords(x, y); - this->display->drawPixel(coords.x, coords.y, color); -} - -inline void QuarterScanMatrixPanel::fillScreen(uint16_t color) // adafruit virtual void override -{ - // No need to map this. - this->display->fillScreen(color); -} -/* -inline void QuarterScanMatrixPanel::drawPixelRGB565(int16_t x, int16_t y, uint16_t color) -{ - VirtualCoords coords = getCoords(x, y); - this->display->drawPixelRGB565( coords.x, coords.y, color); -} -*/ - - -inline void QuarterScanMatrixPanel::drawPixelRGB888(int16_t x, int16_t y, uint8_t r, uint8_t g, uint8_t b) -{ - VirtualCoords coords = getCoords(x, y); - this->display->drawPixelRGB888( coords.x, coords.y, r, g, b); -} -/* -inline void QuarterScanMatrixPanel::drawPixelRGB24(int16_t x, int16_t y, RGB24 color) -{ - VirtualCoords coords = getCoords(x, y); - this->display->drawPixelRGB24(coords.x, coords.y, color); -} -*/ - - -// need to recreate this one, as it wouldn't work to just map where it starts. -inline void QuarterScanMatrixPanel::drawIcon (int *ico, int16_t x, int16_t y, int16_t module_cols, int16_t module_rows) { } - -#endif \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/One_Quarter_1_4_ScanPanel.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/One_Quarter_1_4_ScanPanel.ino deleted file mode 100644 index 16e47d8..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/One_Quarter_1_4_ScanPanel.ino +++ /dev/null @@ -1,226 +0,0 @@ -/************************************************************************* - * Contributor: https://github.com/mrRobot62 - * - * Description: - * - * The underlying implementation of the ESP32-HUB75-MatrixPanel-I2S-DMA only - * supports output to 1/16 or 1/32 scan panels (two scan parallel scan lines) - * this is fixed and cannot be changed. - * - * However, it is possible to connect 1/4 scan panels to this same library and - * 'trick' the output to work correctly on these panels by way of adjusting the - * pixel co-ordinates that are 'sent' to the ESP32-HUB75-MatrixPanel-I2S-DMA - * library (in this example, it is the 'dmaOutput' class). - * - * This is done by way of the 'QuarterScanMatrixPanel.h' class that sends - * adjusted x,y co-ordinates to the underlying ESP32-HUB75-MatrixPanel-I2S-DMA - * library's drawPixel routine. - * - * Refer to the 'getCoords' function within 'QuarterScanMatrixPanel.h' - * - **************************************************************************/ - - // PLEASE NOTE THIS EXAMPLE NO LONGER WORKS AS OF AUGUST 2021 - // IT NEEDS TO BE UPDATED TO THE NEW WAY OF USING THE LIBRARY - -// uncomment to use custom pins, then provide below -#define USE_CUSTOM_PINS - -/* Pin 1,3,5,7,9,11,13,15 */ -#define R1_PIN 25 -#define B1_PIN 27 -#define R2_PIN 14 -#define B2_PIN 13 -#define A_PIN 23 -#define C_PIN 5 -#define CLK_PIN 16 -#define OE_PIN 15 - -/* Pin 2,6,10,12,14 */ -#define G1_PIN 26 -#define G2_PIN 12 -#define B_PIN 19 -#define D_PIN 17 -#define LAT_PIN 4 -#define E_PIN -1 // required for 1/32 scan panels - -#include "OneQuarterScanMatrixPanel.h" // Virtual Display to re-map co-ordinates such that they draw correctly on a 32x16 1/4 Scan panel -#include - -/* - * Below is an is the 'legacy' way of initialising the MatrixPanel_I2S_DMA class. - * i.e. MATRIX_WIDTH and MATRIX_HEIGHT are modified by compile-time directives. - * By default the library assumes a single 64x32 pixel panel is connected. - * - * Refer to the example '2_PatternPlasma' on the new / correct way to setup this library - * for different resolutions / panel chain lengths within the sketch 'setup()'. - * - */ -MatrixPanel_I2S_DMA dmaOutput; - -// Create virtual 1/2 to 1/4 scan pixel co-ordinate mapping class. -QuarterScanMatrixPanel display(dmaOutput); - -#include - -int time_counter = 0; -int cycles = 0; - -CRGBPalette16 currentPalette; -CRGB currentColor; - - -CRGB ColorFromCurrentPalette(uint8_t index = 0, uint8_t brightness = 255, TBlendType blendType = LINEARBLEND) { - return ColorFromPalette(currentPalette, index, brightness, blendType); -} - -typedef struct Matrix { - uint8_t x; - uint8_t y; -} Matrix; - -Matrix matrix; - - -void testSimpleChars(uint16_t timeout) { - - /** drawChar() **/ - Serial.println("draw chars with drawChar()"); - display.fillScreen(display.color444(0,0,0)); - - uint16_t myFGColor = display.color565(180,0,0); - uint16_t myBGColor = display.color565(0,50,0); - display.fillScreen(display.color444(0,0,0)); - display.drawChar(0,0,'X',myFGColor, myFGColor,1); - display.drawChar(16,1,'Y',myFGColor, myBGColor,1); - display.drawChar(3,9,'Z',myFGColor, myFGColor,1); - display.drawChar(16,9,'4',display.color565(0,220,0), myBGColor,1); - delay(timeout); - -} - -void testSimpleCharString(uint16_t timeout) { - uint8_t x,y,w,h; - w = 6; h=8; - x = 0; y=0; - display.fillScreen(display.color444(0,0,0)); - display.setTextFGColor(display.color565(0,60,180)); - display.setCursor(x,y); display.write('L'); - display.setCursor(x+w,y); display.write('u'); - display.setCursor(x+(2*w),y); display.write('n'); - display.setCursor(x+(3*w),y); display.write('a'); - display.setTextFGColor(display.color565(180,60,140)); - display.setCursor(x+(4*w),y); display.write('X'); - - delay(timeout); - -} - -void testTextString(uint16_t timeout) { - display.fillScreen(display.color444(0,0,0)); - display.setTextFGColor(display.color565(0,60,255)); - - display.setCursor(0,5); - display.write("HURRA"); - delay(timeout); -} - -void testWrapChar(const char c, uint16_t speed, uint16_t timeout) { - display.setTextWrap(true); - for (uint8_t i = 32; i > 0; i--) { - display.fillScreen(display.color444(0,0,0)); - display.setCursor(i, 5); - display.write(c); - delay(speed); - } - delay(timeout); -} - -void testScrollingChar(const char c, uint16_t speed, uint16_t timeout) { - Serial.println("Scrolling Char"); - uint16_t myFGColor = display.color565(180,0,0); - uint16_t myBGColor = display.color565(60,120,0); - display.fillScreen(display.color444(0,0,0)); - display.setTextWrap(true); - // from right to left with wrap - display.scrollChar(31,5,c, myFGColor, myFGColor, 1, speed); - // left out with wrap - delay(500); - display.scrollChar(0,5,c, myBGColor, myBGColor, 1, speed); - - delay(timeout); -} - -void testScrollingText(const char *str, uint16_t speed, uint16_t timeout) { - Serial.println("Scrolling Text as loop"); - // pre config - uint16_t red = display.color565(255,0,100); - uint16_t blue100 = display.color565(0,0,100); - uint16_t black = display.color565(0,0,0); - uint16_t green = display.color565(0,255,0); - uint16_t green150 = display.color565(0,150,0); - - display.fillScreen(display.color565(0,0,0)); - display.setCursor(31,5); - display.setScrollDir(1); - - /** black background **/ - display.setTextFGColor(green150); - display.scrollText("** Welcome **", speed); - display.fillScreen(black); - delay(timeout / 2) ; - - /** scrolling with colored background */ - display.fillRect(0,4,VP_WIDTH,8,blue100); - // scrolling, using default pixels size = length of string (not used parameter pixels) - display.setTextFGColor(red); - display.setTextBGColor(blue100); - display.scrollText(str, speed); - delay(timeout / 2) ; - - // same as above but now from left to right - display.setScrollDir(0); - display.setTextFGColor(blue100); - display.setTextBGColor(red); - display.fillRect(0,4,VP_WIDTH,8,red); - display.scrollText(str, speed, 0); - - delay(timeout); - display.fillScreen(black); - display.setTextFGColor(red); - - -} - -void setup() { - - Serial.begin(115200); - delay(500); - Serial.println("*****************************************************"); - Serial.println(" dmaOutput 32x16 !"); - Serial.println("*****************************************************"); - -#ifdef USE_CUSTOM_PINS - dmaOutput.begin(R1_PIN, G1_PIN, B1_PIN, R2_PIN, G2_PIN, B2_PIN, A_PIN, B_PIN, C_PIN, D_PIN, E_PIN, LAT_PIN, OE_PIN, CLK_PIN ); // setup the LED matrix -#else - display.begin(true); // init buffers -#endif - - // fill the screen with 'black' - display.fillScreen(display.color444(0, 0, 0)); - - // Set current FastLED palette - currentPalette = RainbowColors_p; - // display.fillScreen(display.color565(0, 0, 0)); -} - -void loop() { - display.fillScreen(display.color444(0, 0, 0)); - //testSimpleChars(1500); - //testSimpleCharString (1500); - testTextString(2000); - // length = 16 bytes without \0 - //testWrapChar('A', 250, 1500); - //testScrollingChar('X', 250, 2000); - testScrollingText("Scrolling 16x32", 100, 2000); -} // end loop \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/README.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/README.md deleted file mode 100644 index 817ef5e..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/One_Quarter_1_4_ScanPanel/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# Using this library with 32x16 1/4 Scan Panels - -## Problem -ESP32-HUB75-MatrixPanel-I2S-DMA library will not display output correctly with 1/4 scan panels such [as this](https://de.aliexpress.com/item/33017477904.html?spm=a2g0o.detail.1000023.16.1fedd556Yw52Zi&algo_pvid=4329f1c0-04d2-43d9-bdfd-7d4ee95e6b40&algo_expid=4329f1c0-04d2-43d9-bdfd-7d4ee95e6b40-52&btsid=9a8bf2b5-334b-45ea-a849-063d7461362e&ws_ab_test=searchweb0_0,searchweb201602_10,searchweb201603_60%5BAliExpress%2016x32%5D). - -## Solution -It is possible to connect 1/4 scan panels to this library and 'trick' the output to work correctly on these panels by way of adjusting the pixel co-ordinates that are 'sent' to the ESP32-HUB75-MatrixPanel-I2S-DMA library (in this example, it is the 'dmaOutput' class). - -Creation of a 'QuarterScanMatrixPanel.h' class which sends an adjusted x,y co-ordinates to the underlying ESP32-HUB75-MatrixPanel-I2S-DMA library's drawPixel routine, to trick the output to look pixel perfect. Refer to the 'getCoords' function within 'QuarterScanMatrixPanel.h' - -## Limitations - -* Only one font (glcd - standard font) is implemented. This font can't be resized. - -## New functions (and adapted function) in this QuarterScanMatrixPanel class -### drawLine -`void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color)` - -Parameters should be self explained. x0/y0 upper left corner, x1/y1 lower right corner - -### drawHLine -`void drawHLine(int16_t x0, int16_t y0, int16_t w, uint16_t color)` - -Draw a fast horizontal line with length `w`. Starting at `x0/y0` - -### drawVLine -`void drawVLine(int16_t x0, int16_t y0, int16_t h, uint16_t color)` - -Draw a fast vertical line with length `h` Starting at `x0/y0` - -### fillRect -`void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)` - -Draw a rectangle starting at `x/y` with width `w` and height `h`in `color` - -### drawChar (5x7) Standard font -`drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size)` - -Draw a char at position x/y in `color` with a background color `bg` -`size` is ignored. - -### writeChar (5x7) -`size_t write(unsigned char c)` - -Write a char at current cursor position with current foreground and background color. - -### writeString (5x7) -`size_t write(const char *c)` - -Write a string at current cursor position with current foreground and background color. -You have to use `setCursor(x,y)` and `setTextFGColor() / setTextBGColor()` - -### drawString (5x7) -`void drawString(int16_t x, int16_t y, unsigned char* c, uint16_t color, uint16_t bg)` - -Draw String at position x/y wit foreground `color` and background `bg` -Example: `display.drawString(0,5,"**Welcome**",display.color565(0,60,255));` - -### void setScrollDir(uint8_t d = 1) -Set scrolling direction 0=left to right, 1= right to left (default) - -### scrollText -`void scrollText(const char *str, uint16_t speed, uint16_t pixels)` - -Scroll text `str` into `setScrollDir`. Speed indicates how fast in ms per pixel, pixels are the number pixes which should be scrolled, if not set or 0, than pixels is calculates by size of `*str` - -### drawPixel(int16_t x, int16_t y, uint16_t color) -Draw a pixel at x/y in `color`. This function is the atomic function for all above drawing functions - -### clearScreen() (all pixels off (black)) -Same as `fillScreen(0)` - - -## Example videos: -https://user-images.githubusercontent.com/949032/104838449-4aae5600-58bb-11eb-802f-a358b49a9315.mp4 - -https://user-images.githubusercontent.com/949032/104366906-5647f880-551a-11eb-9792-a6f8276629e6.mp4 - diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/README.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/README.md deleted file mode 100644 index ac988f6..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Test Patterns - -Simple solid colors, gradients and test line patterns, could be used to test matrices for proper operation, flickering and estimate fillrate timings. - -It is also used in CI test builds to check different build flags scenarios. - -Should be build and uploaded as a [platformio](https://platformio.org/) project - - -To build with Arduino's framework use -``` -pio run -t upload -``` - -To build using ESP32 IDF with arduino's component use -``` -pio run -t upload -e idfarduino -``` diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/platformio.ini b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/platformio.ini deleted file mode 100644 index 3505b2d..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/platformio.ini +++ /dev/null @@ -1,90 +0,0 @@ -[platformio] -;default_envs = esp32 -description = HUB75 ESP32 I2S DMA test patterns example -;src_dir = src - -[env] -framework = arduino -platform = espressif32 -board = wemos_d1_mini32 -lib_deps = - fastled/FastLED - https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA.git -build_flags = -upload_speed = 460800 -monitor_speed = 115200 -monitor_filters = esp32_exception_decoder - -[env:esp32] -build_flags = - ${env.build_flags} - -DTEST_FASTLINES -lib_deps = - ${env.lib_deps} - Wire - adafruit/Adafruit BusIO - adafruit/Adafruit GFX Library - -[env:debug] -build_flags = - ${env.build_flags} - -DTEST_FASTLINES - -DSERIAL_DEBUG -lib_deps = - ${env.lib_deps} - Wire - adafruit/Adafruit BusIO - adafruit/Adafruit GFX Library - -; build without GFX functions -[env:minimal] -build_flags = - ${env.build_flags} - -DNO_GFX - -DNO_FAST_FUNCTIONS - -DNO_CIE1931 -lib_deps = - ${env.lib_deps} - -; Virtual Panel test -[env:vpane] -build_flags = - ${env.build_flags} - -DNO_FAST_FUNCTIONS - -DVIRTUAL_PANE -lib_deps = - ${env.lib_deps} - Wire - adafruit/Adafruit BusIO - adafruit/Adafruit GFX Library - -; Virtual Panel test -[env:vpane_minimal] -build_flags = - ${env.build_flags} - -DVIRTUAL_PANE - -DNO_GFX - -DNO_FAST_FUNCTIONS - -DNO_CIE1931 -lib_deps = - ${env.lib_deps} - Wire - adafruit/Adafruit BusIO - adafruit/Adafruit GFX Library - -; PIO CI can't handle IDF git modules properly (yet) -;[env:idfarduino] -;platform = espressif32 -;platform_packages = -; ; use a special branch -; framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#idf-release/v4.4 -;framework = arduino, espidf -;build_flags = -; ${env.build_flags} -; -DARDUINO=200 -; -DESP32 -; ;-DUSE_FASTLINES -; -DNO_GFX -;lib_deps = -; ${env.lib_deps} -; https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA.git diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/sdkconfig.defaults b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/sdkconfig.defaults deleted file mode 100644 index 909461e..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/sdkconfig.defaults +++ /dev/null @@ -1,18 +0,0 @@ -# Override some defaults to enable Arduino framework -CONFIG_ENABLE_ARDUINO_DEPENDS=y -CONFIG_AUTOSTART_ARDUINO=y -CONFIG_ARDUINO_RUN_CORE1=y -CONFIG_ARDUINO_RUNNING_CORE=1 -CONFIG_ARDUINO_EVENT_RUN_CORE1=y -CONFIG_ARDUINO_EVENT_RUNNING_CORE=1 -CONFIG_ARDUINO_UDP_RUN_CORE1=y -CONFIG_ARDUINO_UDP_RUNNING_CORE=1 -CONFIG_DISABLE_HAL_LOCKS=y -CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_ERROR=y -CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL=1 -CONFIG_ARDUHAL_PARTITION_SCHEME_DEFAULT=y -CONFIG_ARDUHAL_PARTITION_SCHEME="default" -CONFIG_AUTOCONNECT_WIFI=y -CONFIG_ARDUINO_SELECTIVE_WiFi=y -CONFIG_MBEDTLS_PSK_MODES=y -CONFIG_MBEDTLS_KEY_EXCHANGE_PSK=y \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/CMakeLists.txt b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/CMakeLists.txt deleted file mode 100644 index 483bc0c..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -# This file was automatically generated for projects -# without default 'CMakeLists.txt' file. - -FILE(GLOB_RECURSE app_sources ${CMAKE_SOURCE_DIR}/src/*.*) - -idf_component_register(SRCS ${app_sources}) diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/main.cpp b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/main.cpp deleted file mode 100644 index 6325b63..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/main.cpp +++ /dev/null @@ -1,455 +0,0 @@ -// How to use this library with a FM6126 panel, thanks goes to: -// https://github.com/hzeller/rpi-rgb-led-matrix/issues/746 - -/* -// IDF -#include -#include -#include -#include -#include "sdkconfig.h" -*/ -#include -#include "xtensa/core-macros.h" -#ifdef VIRTUAL_PANE -#include -#else -#include -#endif -#include "main.h" - -// HUB75E pinout -// R1 | G1 -// B1 | GND -// R2 | G2 -// B2 | E -// A | B -// C | D -// CLK| LAT -// OE | GND - -/* Default library pin configuration for the reference - you can redefine only ones you need later on object creation -#define R1 25 -#define G1 26 -#define BL1 27 -#define R2 14 -#define G2 12 -#define BL2 13 -#define CH_A 23 -#define CH_B 19 -#define CH_C 5 -#define CH_D 17 -#define CH_E -1 // assign to any available pin if using panels with 1/32 scan -#define CLK 16 -#define LAT 4 -#define OE 15 -*/ - -// Configure for your panel(s) as appropriate! -#define PIN_E 32 -#define PANEL_WIDTH 64 -#define PANEL_HEIGHT 64 // Panel height of 64 will required PIN_E to be defined. - -#ifdef VIRTUAL_PANE - #define PANELS_NUMBER 4 // Number of chained panels, if just a single panel, obviously set to 1 -#else - #define PANELS_NUMBER 2 // Number of chained panels, if just a single panel, obviously set to 1 -#endif - -#define PANE_WIDTH PANEL_WIDTH * PANELS_NUMBER -#define PANE_HEIGHT PANEL_HEIGHT -#define NUM_LEDS PANE_WIDTH*PANE_HEIGHT - -#ifdef VIRTUAL_PANE - #define NUM_ROWS 2 // Number of rows of chained INDIVIDUAL PANELS - #define NUM_COLS 2 // Number of INDIVIDUAL PANELS per ROW - #define PANEL_CHAIN NUM_ROWS*NUM_COLS // total number of panels chained one to another - // Change this to your needs, for details on VirtualPanel pls read the PDF! - #define SERPENT true - #define TOPDOWN false -#endif - - -#ifdef VIRTUAL_PANE -VirtualMatrixPanel *matrix = nullptr; -MatrixPanel_I2S_DMA *chain = nullptr; -#else -MatrixPanel_I2S_DMA *matrix = nullptr; -#endif -// patten change delay -#define PATTERN_DELAY 2000 - -uint16_t time_counter = 0, cycles = 0, fps = 0; -unsigned long fps_timer; - -// gradient buffer -CRGB *ledbuff; -// - -unsigned long t1, t2, s1=0, s2=0, s3=0; -uint32_t ccount1, ccount2; - -uint8_t color1 = 0, color2 = 0, color3 = 0; -uint16_t x,y; - -const char *str = "* ESP32 I2S DMA *"; - -void setup(){ - - Serial.begin(BAUD_RATE); - Serial.println("Starting pattern test..."); - - // redefine pins if required - //HUB75_I2S_CFG::i2s_pins _pins={R1, G1, BL1, R2, G2, BL2, CH_A, CH_B, CH_C, CH_D, CH_E, LAT, OE, CLK}; - HUB75_I2S_CFG mxconfig(PANEL_WIDTH, PANEL_HEIGHT, PANELS_NUMBER); - - mxconfig.gpio.e = PIN_E; - mxconfig.driver = HUB75_I2S_CFG::FM6126A; // for panels using FM6126A chips - -#ifndef VIRTUAL_PANE - matrix = new MatrixPanel_I2S_DMA(mxconfig); - matrix->begin(); - matrix->setBrightness8(255); -#else - chain = new MatrixPanel_I2S_DMA(mxconfig); - chain->begin(); - chain->setBrightness8(255); - // create VirtualDisplay object based on our newly created dma_display object - matrix = new VirtualMatrixPanel((*chain), NUM_ROWS, NUM_COLS, PANEL_WIDTH, PANEL_HEIGHT, SERPENT, TOPDOWN); -#endif - - ledbuff = (CRGB *)malloc(NUM_LEDS * sizeof(CRGB)); // allocate buffer for some tests - buffclear(ledbuff); -} - -uint8_t wheelval = 0; -void loop(){ - - Serial.printf("Cycle: %d\n", ++cycles); - -#ifndef NO_GFX - drawText(wheelval++); -#endif - - Serial.print("Estimating clearScreen() - "); - ccount1 = XTHAL_GET_CCOUNT(); - matrix->clearScreen(); - ccount1 = XTHAL_GET_CCOUNT() - ccount1; - Serial.printf("%d ticks\n", ccount1); - delay(PATTERN_DELAY); - -/* -// Power supply tester -// slowly fills matrix with white, stressing PSU - for (int y=0; y!=PANE_HEIGHT; ++y){ - for (int x=0; x!=PANE_WIDTH; ++x){ - matrix->drawPixelRGB888(x, y, 255,255,255); - //matrix->drawPixelRGB888(x, y-1, 255,0,0); // pls, be gentle :) - delay(10); - } - } - delay(5000); -*/ - -#ifndef VIRTUAL_PANE - // simple solid colors - Serial.println("Fill screen: RED"); - matrix->fillScreenRGB888(255, 0, 0); - delay(PATTERN_DELAY); - Serial.println("Fill screen: GREEN"); - matrix->fillScreenRGB888(0, 255, 0); - delay(PATTERN_DELAY); - Serial.println("Fill screen: BLUE"); - matrix->fillScreenRGB888(0, 0, 255); - delay(PATTERN_DELAY); -#endif - - for (uint8_t i=5; i; --i){ - Serial.print("Estimating single drawPixelRGB888(r, g, b) ticks: "); - color1 = random8(); - ccount1 = XTHAL_GET_CCOUNT(); - matrix->drawPixelRGB888(i,i, color1, color1, color1); - ccount1 = XTHAL_GET_CCOUNT() - ccount1; - Serial.printf("%d ticks\n", ccount1); - } - -// Clearing CRGB ledbuff - Serial.print("Estimating ledbuff clear time: "); - t1 = micros(); - ccount1 = XTHAL_GET_CCOUNT(); - buffclear(ledbuff); - ccount1 = XTHAL_GET_CCOUNT() - ccount1; - t2 = micros()-t1; - Serial.printf("%lu us, %u ticks\n\n", t2, ccount1); - -#ifndef VIRTUAL_PANE - // Bare fillscreen(r, g, b) - Serial.print("Estimating fillscreenRGB888(r, g, b) time: "); - t1 = micros(); - ccount1 = XTHAL_GET_CCOUNT(); - matrix->fillScreenRGB888(64, 64, 64); // white - ccount2 = XTHAL_GET_CCOUNT() - ccount1; - t2 = micros()-t1; - s1+=t2; - Serial.printf("%lu us, avg: %lu, ccnt: %d\n", t2, s1/cycles, ccount2); - delay(PATTERN_DELAY); -#endif - - Serial.print("Estimating full-screen fillrate with looped drawPixelRGB888(): "); - y = PANE_HEIGHT; - t1 = micros(); - ccount1 = XTHAL_GET_CCOUNT(); - do { - --y; - uint16_t x = PANE_WIDTH; - do { - --x; - matrix->drawPixelRGB888( x, y, 0, 0, 0); - } while(x); - } while(y); - ccount1 = XTHAL_GET_CCOUNT() - ccount1; - t2 = micros()-t1; - Serial.printf("%lu us, %u ticks\n", t2, ccount1); - - - -// created random color gradient in ledbuff - uint8_t color1 = 0; - uint8_t color2 = random8(); - uint8_t color3 = 0; - - for (uint16_t i = 0; ifillRect(0, 0, PANE_WIDTH, PANE_HEIGHT, 0, 224, 0); - t2 = micros()-t1; - Serial.printf("%lu us\n", t2); - delay(PATTERN_DELAY); - - - Serial.print("Chessboard with fillRect(): "); // шахматка - matrix->fillScreen(0); - x =0, y = 0; - color1 = random8(); - color2 = random8(); - color3 = random8(); - bool toggle=0; - t1 = micros(); - do { - do{ - matrix->fillRect(x, y, 8, 8, color1, color2, color3); - x+=16; - }while(x < PANE_WIDTH); - y+=8; - toggle = !toggle; - x = toggle ? 8 : 0; - }while(y < PANE_HEIGHT); - t2 = micros()-t1; - Serial.printf("%lu us\n", t2); - delay(PATTERN_DELAY); -#endif - -// ======== V-Lines ========== - Serial.println("Estimating V-lines with drawPixelRGB888(): "); // - matrix->fillScreen(0); - color1 = random8(); - color2 = random8(); - x = y = 0; - t1 = micros(); - ccount1 = XTHAL_GET_CCOUNT(); - do { - y=0; - do{ - matrix->drawPixelRGB888(x, y, color1, color2, color3); - } while(++y != PANE_HEIGHT); - x+=2; - } while(x != PANE_WIDTH); - ccount1 = XTHAL_GET_CCOUNT() - ccount1; - t2 = micros()-t1; - Serial.printf("%lu us, %u ticks\n", t2, ccount1); - delay(PATTERN_DELAY); - -#ifdef TEST_FASTLINES - Serial.println("Estimating V-lines with vlineDMA(): "); // - matrix->fillScreen(0); - color2 = random8(); - x = y = 0; - t1 = micros(); - ccount1 = XTHAL_GET_CCOUNT(); - do { - matrix->drawFastVLine(x, y, PANE_HEIGHT, color1, color2, color3); - x+=2; - } while(x != PANE_WIDTH); - ccount1 = XTHAL_GET_CCOUNT() - ccount1; - t2 = micros()-t1; - Serial.printf("%lu us, %u ticks\n", t2, ccount1); - delay(PATTERN_DELAY); - - Serial.println("Estimating V-lines with fillRect(): "); // - matrix->fillScreen(0); - color1 = random8(); - color2 = random8(); - x = y = 0; - t1 = micros(); - ccount1 = XTHAL_GET_CCOUNT(); - do { - matrix->fillRect(x, y, 1, PANE_HEIGHT, color1, color2, color3); - x+=2; - } while(x != PANE_WIDTH); - ccount1 = XTHAL_GET_CCOUNT() - ccount1; - t2 = micros()-t1; - Serial.printf("%lu us, %u ticks\n", t2, ccount1); - delay(PATTERN_DELAY); -#endif - - - -// ======== H-Lines ========== - Serial.println("Estimating H-lines with drawPixelRGB888(): "); // - matrix->fillScreen(0); - color2 = random8(); - x = y = 0; - t1 = micros(); - ccount1 = XTHAL_GET_CCOUNT(); - do { - x=0; - do{ - matrix->drawPixelRGB888(x, y, color1, color2, color3); - } while(++x != PANE_WIDTH); - y+=2; - } while(y != PANE_HEIGHT); - ccount1 = XTHAL_GET_CCOUNT() - ccount1; - t2 = micros()-t1; - Serial.printf("%lu us, %u ticks\n", t2, ccount1); - delay(PATTERN_DELAY); - -#ifdef TEST_FASTLINES - Serial.println("Estimating H-lines with hlineDMA(): "); - matrix->fillScreen(0); - color2 = random8(); - color3 = random8(); - x = y = 0; - t1 = micros(); - ccount1 = XTHAL_GET_CCOUNT(); - do { - matrix->drawFastHLine(x, y, PANE_WIDTH, color1, color2, color3); - y+=2; - } while(y != PANE_HEIGHT); - ccount1 = XTHAL_GET_CCOUNT() - ccount1; - t2 = micros()-t1; - Serial.printf("%lu us, %u ticks\n", t2, ccount1); - delay(PATTERN_DELAY); - - Serial.println("Estimating H-lines with fillRect(): "); // - matrix->fillScreen(0); - color2 = random8(); - color3 = random8(); - x = y = 0; - t1 = micros(); - ccount1 = XTHAL_GET_CCOUNT(); - do { - matrix->fillRect(x, y, PANE_WIDTH, 1, color1, color2, color3); - y+=2; - } while(y != PANE_HEIGHT); - ccount1 = XTHAL_GET_CCOUNT() - ccount1; - t2 = micros()-t1; - Serial.printf("%lu us, %u ticks\n", t2, ccount1); - delay(PATTERN_DELAY); -#endif - - - - - Serial.println("\n====\n"); - - // take a rest for a while - delay(10000); -} - - -void buffclear(CRGB *buf){ - memset(buf, 0x00, NUM_LEDS * sizeof(CRGB)); // flush buffer to black -} - -void IRAM_ATTR mxfill(CRGB *leds){ - uint16_t y = PANE_HEIGHT; - do { - --y; - uint16_t x = PANE_WIDTH; - do { - --x; - uint16_t _pixel = y * PANE_WIDTH + x; - matrix->drawPixelRGB888( x, y, leds[_pixel].r, leds[_pixel].g, leds[_pixel].b); - } while(x); - } while(y); -} -// - -/** - * The one for 256+ matrices - * otherwise this: - * for (uint8_t i = 0; i < MATRIX_WIDTH; i++) {} - * turns into an infinite loop - */ -uint16_t XY16( uint16_t x, uint16_t y) -{ - if (xsetTextSize(1); // size 1 == 8 pixels high - matrix->setTextWrap(false); // Don't wrap at end of line - will do ourselves - - matrix->setCursor(5, 5); // start at top left, with 5,5 pixel of spacing - uint8_t w = 0; - - for (w=0; wsetTextColor(colorWheel((w*32)+colorWheelOffset)); - matrix->print(str[w]); - } -} -#endif - -uint16_t colorWheel(uint8_t pos) { - if(pos < 85) { - return matrix->color565(pos * 3, 255 - pos * 3, 0); - } else if(pos < 170) { - pos -= 85; - return matrix->color565(255 - pos * 3, 0, pos * 3); - } else { - pos -= 170; - return matrix->color565(0, pos * 3, 255 - pos * 3); - } -} diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/main.h b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/main.h deleted file mode 100644 index a1310f4..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/PIO_TestPatterns/src/main.h +++ /dev/null @@ -1,10 +0,0 @@ - -#include - -#define BAUD_RATE 115200 // serial debug port baud rate - -void buffclear(CRGB *buf); -uint16_t XY16( uint16_t x, uint16_t y); -void mxfill(CRGB *leds); -uint16_t colorWheel(uint8_t pos); -void drawText(int colorWheelOffset); \ No newline at end of file diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/README.md b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/README.md deleted file mode 100644 index 5197413..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/README.md +++ /dev/null @@ -1,14 +0,0 @@ -| Example Name |Description | -|--|--| -|1_SimpleTestShapes |Example for new starters - how to display basic shapes. | -|2_PatternPlasma |Example for new starters - how to display a cool plasma pattern. | -|3_FM6126Panel |Example for new starters - how to initialise FM6126/FM6126A panels with this library. -|AnimatedGIFPanel |Using Larry Bank's GIF Decoder to display animated GIFs. | -|AuroraDemo |Simple example demonstrating various animated effects. | -|BitmapIcons |Simple example of how to display a bitmap image to the display. | -|ChainedPanels |Popular example on how to use the 'VirtualMatrixPanel' class to chain multiple LED Matrix Panels to form a much bigger display! Refer to the README within this example's folder! | -|ChainedPanelsAuroraDemo |As above, but showing a large trippy plasma animation. | -|ChainedPanelsScreenBuffer |Using the same 'VirtualMatrixPanel' class but also implementing a FastLED off-screen pixel buffer to do cool stuff. | -|One_Quarter_1_4_ScanPanel |Using this library with a 32w x 16h 1/4 Scan LED Matrix Panel. Custom co-ordinate remapping logic required. NOT WORKING. | -|One_Eighth_1_8_ScanPanel |Using this library with a 64w x 32h 1/8 Scan LED Matrix Panel. Custom co-ordinate remapping logic required. -|PIO_TestPatterns |Non-Arduino example of how to display basic shapes. | diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/SmoothDoubleBuffer/SmoothDoubleBuffer.ino b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/SmoothDoubleBuffer/SmoothDoubleBuffer.ino deleted file mode 100644 index 6e40c36..0000000 --- a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/examples/SmoothDoubleBuffer/SmoothDoubleBuffer.ino +++ /dev/null @@ -1,71 +0,0 @@ -#include - -MatrixPanel_I2S_DMA *display = nullptr; - -const byte row0 = 2+0*11; -const byte row1 = 2+1*11; -const byte row2 = 2+2*11; - -int start_x = 0; -int buffer_id = 0; - - -void setup() -{ - // put your setup code here, to run once: - delay(1000); - Serial.begin(115200); - delay(200); - - Serial.println("...Starting Display"); - HUB75_I2S_CFG mxconfig; - mxconfig.double_buff = true; // Turn of double buffer - mxconfig.clkphase = true; - - // OK, now we can create our matrix object - display = new MatrixPanel_I2S_DMA(mxconfig); - - display->begin(); // setup display with pins as pre-defined in the library - - start_x = display->width(); -} -/* - This example draws a red square on one buffer only, and a green square on another buffer only. - It then flips between buffers as fast as possible whilst moving them as well - to give the impression they're both on screen at the same time! - - The only thing that's painted to both buffers is a blue square. - */ -const int square_size = 16; -void loop() -{ - display->flipDMABuffer(); - //if ( !display->backbuffready() ) return; - //display->showDMABuffer(); - display->clearScreen(); - - buffer_id ^= 1; - - // Blue square on the left is printed to BOTH buffers. - display->fillRect(0, 0, square_size/2, square_size/2, display->color565(0,0,200)); - - start_x--; - - if (buffer_id) - { - display->setCursor(3, row1); - display->setTextColor(display->color565(200, 0, 0)); - display->fillRect(start_x, 6, square_size, square_size, display->color565(200,0,0)); - //delay(40); // simulate slow drawing operation - } - else - { - display->setCursor(3, row2); - display->setTextColor(display->color565(0, 200, 0)); - display->fillRect(10, start_x, square_size, square_size, display->color565(0,200,0)); - } - - display->printf("Buffer %d", buffer_id); - - if (start_x < (-1*square_size)) start_x = display->width()+square_size; - -} diff --git a/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/image.jpg b/lib/HUB75/ESP32-HUB75-MatrixPanel-I2S-DMA/image.jpg deleted file mode 100644 index f0c9cbebb3bdb5c206b3a330e0d3e6066c091ccf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139703 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 Z#r`yE", - "+" - ] - } -} \ No newline at end of file diff --git a/lib/assets/assets.h b/lib/assets/assets.h index 0cec96d..46021d7 100644 --- a/lib/assets/assets.h +++ b/lib/assets/assets.h @@ -5,3 +5,6 @@ extern const uint8_t ASSET_NOAPPS_WEBP[]; extern size_t ASSET_NOAPPS_WEBP_LEN; + +extern const uint8_t ASSET_LAZY_DADDY_MP3[]; +extern size_t ASSET_LAZY_DADDY_MP3_LEN; diff --git a/lib/assets/lazy_daddy_jukebox_29617.c b/lib/assets/lazy_daddy_jukebox_29617.c new file mode 100644 index 0000000..6423510 --- /dev/null +++ b/lib/assets/lazy_daddy_jukebox_29617.c @@ -0,0 +1,851 @@ +// Public domain sample from: +// https://www.loc.gov/item/jukebox-29617/ + +#include +#include +const size_t ASSET_LAZY_DADDY_MP3_LEN = 14889; +const uint8_t ASSET_LAZY_DADDY_MP3[] = + "\x49\x44\x33\x03\x00\x00\x00\x00\x01\x27\x54\x41\x4c\x42\x00\x00\x00" + "\x1b\x00\x00\x00\x54\x68\x65\x20\x4e\x61\x74\x69\x6f\x6e\x61\x6c\x20" + "\x4a\x75\x6b\x65\x62\x6f\x78\x3a\x20\x4a\x61\x7a\x7a\x54\x50\x45\x31" + "\x00\x00\x00\x18\x00\x00\x00\x4c\x61\x72\x72\x79\x20\x53\x68\x69\x65" + "\x6c\x64\x73\x3a\x20\x63\x6f\x6d\x70\x6f\x73\x65\x72\x54\x58\x58\x58" + "\x00\x00\x00\x17\x00\x00\x00\x53\x6f\x66\x74\x77\x61\x72\x65\x00\x4c" + "\x61\x76\x66\x35\x38\x2e\x32\x36\x2e\x31\x30\x31\x54\x59\x45\x52\x00" + "\x00\x00\x05\x00\x00\x00\x31\x39\x31\x38\x54\x44\x52\x43\x00\x00\x00" + "\x05\x00\x00\x00\x31\x39\x31\x38\x54\x49\x54\x32\x00\x00\x00\x17\x00" + "\x00\x00\x4c\x61\x7a\x79\x20\x64\x61\x64\x64\x79\x20\x30\x30\x31\x20" + "\x28\x30\x30\x3a\x32\x35\x29\xff\xfb\x94\xc4\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x69\x6e\x67\x00\x00" + "\x00\x0f\x00\x00\x00\x31\x00\x00\x39\x78\x00\x0d\x0d\x12\x12\x18\x18" + "\x1d\x1d\x21\x21\x26\x26\x2b\x2b\x31\x31\x36\x36\x3c\x3c\x41\x41\x46" + "\x46\x4b\x4b\x50\x50\x55\x55\x5a\x5a\x60\x60\x65\x65\x6a\x6a\x6e\x6e" + "\x73\x73\x78\x78\x7e\x7e\x83\x83\x88\x88\x88\x8c\x8c\x91\x91\x96\x96" + "\x9b\x9b\xa0\xa0\xa5\xa5\xab\xab\xb1\xb1\xb8\xb8\xbe\xbe\xc3\xc3\xc7" + "\xc7\xcc\xcc\xd1\xd1\xd6\xd6\xda\xda\xdf\xdf\xe4\xe4\xe9\xe9\xed\xed" + "\xf2\xf2\xf7\xf7\xfc\xfc\xff\xff\x00\x00\x00\x50\x4c\x41\x4d\x45\x33" + "\x2e\x31\x30\x30\x04\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x15\x20\x24" + "\x03\x2e\x81\x00\x01\xe0\x00\x00\x39\x78\x5d\xe5\x2b\x41\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xff\xfb\xd4\xc4\x00\x00\x08\x58\x11\x5d\xb4\x30\x00\x23\x76\x40\x6a" + "\xbf\x33\x40\x00\x00\x00\xa2\x20\xd9\x23\x91\xce\xef\xc0\x80\x00\x02" + "\x1c\xe0\x7e\x50\x1f\x07\xc1\xf0\x7f\x04\x01\x00\x40\x1f\x07\xc1\xf0" + "\x7c\x1c\x04\x01\x00\x43\x89\xc1\xf0\x70\xe6\x50\x1f\xff\x07\xf9\x40" + "\x40\x10\x04\x1d\xe5\x01\x07\x7f\x82\x07\x3e\x5d\xff\xca\x02\x01\x8f" + "\x50\x62\x50\x41\x88\x45\x50\x89\xd0\xa8\x56\x16\x5c\xe5\x8a\xda\xda" + "\x2c\x26\xf8\xc1\x8a\x52\x0c\x48\x04\x89\xde\x58\x2d\x54\xb0\x26\xe8" + "\xb8\x46\xe1\x43\x81\x8b\xae\x38\x90\x21\x87\x6c\x30\x04\x70\x14\x51" + "\x25\x01\x84\x00\x3c\x21\x68\x40\x41\x4b\x0d\xb6\x03\x6c\x2c\x0c\xa1" + "\xb0\x02\x08\x5e\x16\x13\x62\x78\x9d\x1d\x63\x32\x1e\xf8\xe4\x12\x03" + "\x20\x33\x84\x1d\x22\xe1\x68\x88\x0e\xd6\x25\x0a\x23\x8c\x73\xc4\xf0" + "\x88\xf4\x4b\x11\xa7\x0c\xd0\x4c\xbc\x6c\x64\x4e\x9b\x0f\x52\x2c\x66" + "\x4e\x90\x33\x41\xc4\x37\xc9\xc2\xb9\x36\x5b\x30\x2b\x1c\x3e\x64\xc6" + "\xd2\xa9\x3c\x5c\x3e\x6c\x2d\x65\xc2\x80\xf0\x6f\x23\xcd\x0d\x88\x89" + "\xa9\x1a\x5c\x28\x90\xf2\x2a\x29\x42\x26\x48\x13\x66\x26\xc5\xc4\x4c" + "\x92\x3c\xb3\xa6\x67\xd6\x83\x9e\x1e\xf6\x30\x2e\x2c\xdc\xdd\xd0\xeb" + "\x3a\x5f\x42\x75\x73\x04\x93\xfb\x2e\x52\x3c\xb4\x7d\x76\xd0\x2c\x93" + "\x87\xcd\x79\xd3\x53\xd9\xa1\xc3\x7b\x7f\xff\xff\xfe\xb5\x37\xff\xff" + "\xff\xe6\xa7\x15\xb3\x11\x54\x42\x52\x09\x24\x28\x00\x4f\x01\x93\x08" + "\x66\x42\x55\x02\xa8\x91\xbd\xe8\x1e\x02\x9a\xad\x79\x1d\x97\x63\x94" + "\xf4\x40\xb2\x07\x4a\xa8\xa1\x60\xdc\xf3\xcb\x10\xc3\xfb\x2a\x64\x23" + "\x14\x14\x20\x94\x5e\x4b\x79\xee\x19\xe4\x96\xbb\xdc\x6c\x40\xcd\x2f" + "\xe1\xab\xee\x27\x84\xb8\xb4\xab\x5e\xb6\x66\xbb\x6b\xe3\xbe\xbf\xe9" + "\x66\xb8\xee\xa6\xa2\x74\xeb\xff\xfa\x79\x5f\xb8\x95\xd7\x5f\xe2\xf8" + "\xbf\xd1\xd7\xab\x8f\x8f\xff\xf4\xe9\x39\xae\xb9\x44\x4c\xff\x02\x10" + "\xb2\x21\x53\x32\x42\x0f\x22\x24\x80\x00\x64\x18\x7d\xe2\x13\x60\x63" + "\x00\xa0\x03\x20\x86\x80\x82\x81\xd2\x3a\x2b\x34\xe5\x56\x0b\x7a\xa4" + "\xaf\x80\xba\x7c\x2c\xa7\x93\xc7\xc0\x93\x35\xfe\x18\xcd\x00\xde\x25" + "\x68\x81\x49\x70\x4f\xbf\x67\x8e\xf1\xe2\x2a\x1b\x95\x1c\x30\xc3\x88" + "\xd2\x61\xd3\x9d\x4a\xca\x56\x9c\xcd\x38\xa1\x4e\xe4\x69\xa2\x8e\x30" + "\xae\x91\xac\xb6\xba\x08\xc6\x16\x2b\xd0\x30\x58\x38\x1e\x23\x4a\x7d" + "\x09\x3b\xea\xef\x61\x33\x8f\x42\x64\x6f\xff\x18\xfd\x05\x86\x08\x96" + "\x3a\xc3\x1f\xf4\x42\x56\xb2\xaa\x14\xac\x43\xb3\xc6\x20\xf8\xc0\x05" + "\xb6\x03\x76\x64\x54\x2f\x6c\x71\x20\x8d\xf9\x1c\x33\x23\x11\x44\xa0" + "\x2f\x71\x00\x12\x68\x40\x4c\x97\x13\x52\x50\x28\x2d\xda\x82\x54\xc6" + "\xec\xcd\x34\x71\xf3\xbb\x58\x80\x31\xaf\xd4\xa9\x8a\xba\x94\xf7\x56" + "\x35\x2c\xdd\x34\xe4\xfe\xbb\x7b\xb9\x1c\x56\x98\x91\xc3\x55\x79\x10" + "\x19\x07\xc5\x89\xb2\xd0\xa5\x04\x27\xe8\x74\x63\x0c\x20\x18\x88\x2c" + "\xfe\x10\x40\xc9\x4f\xda\x57\xd0\xc3\x0b\x33\x7e\xa8\x82\xdd\x83\x6c" + "\x8d\xba\x55\x8a\x5f\xff\xff\xfc\xaf\x2b\x7f\x56\x76\xd5\xec\x7a\x74" + "\x78\x26\xb7\xa1\x0e\x3a\xe2\xea\x32\x80\x04\x8c\xf0\xa7\xfc\x81\x01" + "\x01\x2d\x8b\x74\x4b\x32\x00\xca\x58\xab\x7c\xb0\x31\x38\xc3\x3a\x0a" + "\x31\x97\xdb\xa5\x63\x4a\xd7\x1f\x99\x2a\x0d\x12\x2c\xd3\x3f\xc8\x8e" + "\xe1\x43\x71\xf4\xe5\xa1\xa6\xa0\x91\x21\x6f\xa3\xc5\x90\x54\x1b\x08" + "\x22\xc7\x63\x4c\x2c\xba\x2c\x74\x74\x2c\x4d\xb2\x2a\xbd\xa2\x54\x9a" + "\xb7\x0e\x61\xff\xfb\x74\xc4\xe5\x00\x0e\x61\x73\x5f\xfd\xa4\x00\x22" + "\x1e\x2f\xeb\x3d\xa7\x95\x7d\x3a\xb4\xab\x1f\x43\x1c\xa8\x74\x3e\xf4" + "\x53\xbd\x48\xbe\x60\x8e\x71\x85\xb3\xa3\x31\x1a\xcb\x32\x17\xff\x6f" + "\xff\x46\xe8\x4c\x8c\x8d\xe7\x7c\xda\xb4\x8d\xd8\x01\x61\x0a\xec\x15" + "\xe3\x8c\xdd\x5b\x4e\x28\x3f\x29\x7d\x82\xf3\x0b\x1d\x10\x9b\x28\xb3" + "\x82\x1d\x68\x14\xb4\x36\x45\xe8\xf3\xf1\x10\x19\x03\xb9\x52\xf2\xa9" + "\x39\xf8\x6e\x5a\xa4\x6e\x7e\x6c\x01\xdd\xce\xb3\xa1\x9d\x5c\xa5\x4d" + "\x9a\x55\x35\x49\x72\xb0\x09\xd2\x53\x08\x00\x16\x13\x12\xe1\x12\xe1" + "\xb5\x21\x6a\xce\xe8\x88\x2e\xb4\x9b\x19\x7b\xbb\x39\x6f\x67\x90\xee" + "\x18\x82\x3e\x62\xf7\x59\x41\xcc\x38\x49\xc0\xe6\x61\x70\xfb\x4c\x62" + "\x30\x97\x41\x7f\x8d\xff\xfb\xb4\xef\x1d\xb8\x90\x90\xef\x0b\x4a\x86" + "\x62\x03\xa2\x6d\xc2\x60\x66\x30\x67\xa9\x29\xbb\xa3\x18\xeb\x63\x45" + "\x36\x71\xc4\x62\x03\x0c\x12\x8e\x34\x53\x4b\x10\x82\x84\x64\xc4\x66" + "\xbf\x53\xe1\x4c\xda\x83\x87\x38\xf5\x33\x47\xc2\xdb\x46\x19\xfc\x16" + "\x27\xdb\x9e\x0e\xce\x4c\xdf\x15\x38\x6d\x75\xe3\x06\xb2\x56\xd7\x19" + "\x02\xcb\x76\x86\xbd\xb4\xdb\x70\x36\x12\xe6\xa0\xf1\xcf\xab\x2a\x89" + "\xf9\x9a\xfa\x8a\x9a\xa9\xa5\xb6\x6a\xe1\xab\x98\xbe\x62\x1a\x06\x5f" + "\xec\x3d\xff\xfb\x74\xc4\xed\x00\x0f\x3d\x77\x61\xec\x0c\x59\x69\xfa" + "\x2f\xab\x35\x84\x16\xed\x24\xcb\x85\x19\x5f\x03\x7c\xa9\x76\x33\xfa" + "\xff\xff\xff\xf9\x09\x6b\x0e\x07\xad\x72\xa1\xec\xc2\x2b\xd7\xf3\x5c" + "\x59\x9f\xff\xaf\x47\xc5\xd7\x23\x66\x97\x82\x09\x7c\x6d\x13\x40\xea" + "\x23\x6a\xa6\x19\x4c\xbd\x10\x73\x19\x53\x03\x04\x7d\x3d\x2d\xa9\x84" + "\x4b\xee\xc4\xda\xe4\x34\xa6\xab\xba\x17\x17\x09\x5d\x9d\x2d\xf2\x81" + "\x04\x9c\xc0\xdb\x12\x92\xe1\xc5\x10\xa5\x2b\x7f\x7c\x04\x8d\x9e\x60" + "\x82\x32\xf0\xf1\xaf\x38\xe3\x37\x4c\x5a\x7b\xbe\xe6\xea\xf5\x1d\xdb" + "\x75\xa7\xb8\xec\x6f\xca\x7f\x90\x3a\x71\x61\xb4\xf1\xe5\xaa\x39\xf9" + "\x5a\xb2\xd0\xdb\x69\x79\xa5\x66\x2e\x9d\x1a\xf2\xb9\xb9\x0b\x34\xef" + "\xa0\xd9\xca\x0a\xe0\xe0\xdd\xd3\x95\x12\xf6\x02\x13\xd2\xc0\x66\xa8" + "\x88\xa1\x9e\x6d\x24\x59\x3f\x5a\x0b\x45\x03\x10\x6a\x32\x44\xd5\x0e" + "\x29\x8c\x96\x0b\xcc\xa6\xe4\x82\xa5\x87\xef\x20\xdc\x09\x7a\xb3\x55" + "\x4a\x28\x8c\x5d\xe0\x53\x8c\x79\xd5\x37\x0a\x01\xad\x01\x43\xe4\x5d" + "\x19\xea\xc7\xa5\x6a\xb1\x8d\x5b\x28\xc9\x58\x89\x83\x21\xcd\x43\xbd" + "\x0a\xe1\x45\xc4\x26\x35\x35\x75\xb2\xfe\x52\x70\x46\x71\x88\xe4\x22" + "\x22\x3a\xea\x28\xc8\xdf\xcf\xe9\xb9\x2b\x95\xf5\xac\xe7\x93\x11\x42" + "\x36\xff\xfb\x74\xc4\xf6\x00\x10\x35\x81\x59\xac\x0c\xb9\x02\x04\x30" + "\x6c\x3d\x96\x22\x1c\x5e\x54\xdb\x3e\x3e\x47\x3f\xff\x85\xf1\xb1\x7f" + "\x90\xbf\xf6\xff\x15\x82\xba\x52\xb3\x13\x25\x23\x41\x06\xab\x48\x92" + "\x81\x61\x58\x6b\xb2\x48\x50\xb9\x76\x95\xd9\x31\x40\xe0\xb3\xca\x5a" + "\x9d\x4b\x4e\x53\x22\xaa\x84\xde\xe1\x4e\xb4\x60\x7a\xf6\x94\x31\xf5" + "\xdd\x34\x95\x72\x1e\xbb\x42\xf1\xa2\xab\x10\x79\x1d\x6a\xdb\x0f\x0c" + "\x8c\x4b\x85\x15\x10\xaf\x44\x8c\xac\x72\x74\x77\xcb\x96\xa1\x47\x09" + "\xa7\x5a\x0b\x2c\x0a\xe0\x6a\xfa\x04\x88\xd0\x5a\x64\x4a\x78\x01\x22" + "\xc5\xa6\x34\x73\xbd\x11\xdb\xbc\x38\xd2\xb4\x89\x47\xa4\xa4\x8b\x6f" + "\x35\x7e\x52\x2e\x35\x51\xdd\x49\x11\x28\x9c\x54\xba\x14\x6d\x4a\x0d" + "\x32\xcb\x40\xc9\x6a\xfe\x77\xff\xff\xff\x7f\xff\xff\xf9\xc9\x36\x7c" + "\x78\xd0\xe8\xae\x9c\x62\x45\x63\x46\x20\x35\xc4\x80\x04\xd4\x36\x5f" + "\xb3\x2a\xcb\x25\x0e\x27\x22\x66\x87\x4d\x4e\x25\xe9\x80\xa3\xea\x0f" + "\x2a\x13\xc3\x23\x01\xcc\x44\x1c\x4f\x28\x4f\x01\x4f\xbc\x9d\x7e\x8e" + "\xbf\x3d\x35\x42\xb0\xd2\x3c\x53\xde\x6f\xaa\xc7\x5b\x51\xfc\xbc\xfb" + "\xb6\x66\xaa\x6b\x55\x54\xf9\x75\x80\xa6\x7c\xa6\x0e\x50\xb3\x67\x1c" + "\xe3\x34\xc6\x5c\xd6\x33\x51\x79\xd2\x2e\x9d\xda\x53\x33\xb6\x3a\xc0" + "\xff\xfb\x64\xc4\xfa\x00\x0f\xcd\x6b\x61\xec\xa4\xf1\xe1\xfa\x2f\x6b" + "\x3d\x84\x8e\x90\x4b\x4e\x11\x50\xbb\x79\xb7\xcf\x1c\xb2\x41\xc0\x27" + "\xf9\x5a\xab\x59\x09\xc3\xe7\x2a\xb7\x46\x87\x46\x80\x49\xb6\x91\x23" + "\x8f\x84\x8f\xd1\x93\x14\x6b\x04\x2d\x0c\x54\x21\x3b\x83\x8c\x38\x25" + "\xbb\x4d\x1f\x58\x58\xcb\x01\x40\xf6\x26\xc3\xea\x54\x29\x30\x20\x4c" + "\x01\xc0\xd1\xe4\x46\xaf\xfa\x94\xc4\x65\xf2\x59\x24\xae\xb1\x36\x1e" + "\xcb\x70\xee\x5c\xff\xc4\xcd\xce\x5b\x95\xab\xe4\x66\x92\x5b\x5f\x75" + "\x48\xde\x5c\xe1\xe6\xb5\x5e\x7d\xc3\xaa\xee\x7b\xb3\xf3\x99\xae\xaf" + "\x47\xab\xcc\x47\x30\xe5\x36\xc7\x36\x77\xbf\xab\xd5\xff\xea\xf9\x9f" + "\x6d\x06\xcf\x84\xa7\x6a\x44\x74\xc2\x48\x2c\x76\x1e\x38\x95\x20\x3a" + "\xa5\x15\x28\x49\x6b\x44\x90\x26\xaa\x51\x4a\x04\x21\x38\x24\x86\x01" + "\x16\x26\x79\x09\x3e\x81\x07\x34\xc6\x44\xbb\x82\x22\x66\x04\x4e\x4b" + "\x00\x40\x22\x4a\xc3\x3b\xc5\xbf\xd4\xdd\xab\x08\xcf\xbb\xeb\xa1\x2f" + "\x00\xd7\x16\xa5\x88\x4d\x17\x75\x31\x8a\x1c\x32\xb5\x08\xec\xf2\x0f" + "\x79\xc2\xff\xfb\x74\xc4\xe9\x00\x12\xb1\x63\x57\xed\x30\xd4\xc1\xd7" + "\x24\xeb\xfd\x86\x0d\xbc\xf4\x7d\x42\x93\x64\xc6\x97\xf5\xe2\xdb\x4e" + "\xd2\x1e\x8d\xeb\xd9\xd0\xa6\x28\x99\xc6\x35\xdc\x5f\x28\xb9\xe8\x2c" + "\xf7\x1c\x65\x39\xca\xa1\xcd\xc7\x7a\xa5\xda\x3d\xf5\x74\x5f\xd8\xde" + "\x8f\x54\xff\x90\x29\xa2\x4f\xe4\x25\xbc\xe7\xb2\xc6\x07\x85\xb1\x73" + "\x29\xdc\x68\x03\x4d\x21\x5a\xd4\x7c\x42\x83\x17\x0b\x92\xb0\x84\x63" + "\x1b\x23\x46\x09\x0a\x52\xf1\xd0\x0c\x91\xd4\xa2\x52\x02\x0d\xb3\x30" + "\x04\x25\x3e\x0f\xba\x71\x4a\xe2\x94\x33\x60\xc2\x55\xaf\x19\xec\x25" + "\xc9\xe7\x72\x96\x5f\x7d\xd9\x56\xaa\xba\x81\x65\xf5\xb5\xbb\xd9\xc4" + "\xe7\x30\xbc\xba\x64\x47\x23\x49\x80\x56\xd4\xad\xb8\xbf\x03\xa5\x5b" + "\x74\xf4\xe5\xee\xb2\x1e\x0c\xcb\xd3\x8f\xe9\x53\x50\x8e\x8c\x4e\xa8" + "\xca\xdc\x8c\x74\xef\x42\x31\xa7\x75\x75\x72\x11\x05\x0e\x2f\x23\x44" + "\x19\x04\x18\xe8\x42\x11\xa2\x6d\xfe\x91\x20\x2a\x52\x4b\xd9\xa1\x00" + "\x3e\x5e\x56\x60\x1a\x8e\x85\x54\x77\x6e\x32\x15\x0d\x2d\xd6\x77\x07" + "\x5d\x6f\x8b\x99\x1c\x26\x0c\xb5\xae\x8b\x46\x62\xe0\xc0\xd8\xbb\x81" + "\x9a\x14\xcf\xc3\xef\x1d\x02\x7f\xc3\xd2\x5e\xe1\x54\x80\x6a\x6c\x65" + "\x11\xa5\x96\x9c\x52\x28\xcd\x3c\x51\x27\xa0\xdb\xd7\xe3\x34\x9e\xfc" + "\x58\xff\xfb\x74\xc4\xe8\x80\x0f\xb5\x81\x67\xec\x24\xf1\xe2\x04\xa8" + "\xeb\xfd\x96\x16\xa4\x19\x4e\x8e\xb1\x29\xce\x47\x66\x24\xe3\xc6\x92" + "\x3e\x81\x91\x58\x62\x46\xc6\xc8\x10\xe4\x84\xa9\x29\xc5\xe5\x52\x77" + "\x0c\x89\xce\x84\xd5\xa3\x57\x2c\x5b\x82\xd6\x3e\xfc\x79\x4e\xa7\x7e" + "\x6f\x0c\xf0\xcb\x5a\xcd\x32\xc3\x04\x2d\x25\x8e\xce\x20\x3a\x2f\x38" + "\x60\xbd\x07\xd5\xff\xfe\xd5\xfa\xfc\x87\x1a\x97\x52\xde\xb3\xb5\x43" + "\x17\x94\x80\xa3\x29\x1b\x69\x27\x0a\xcb\xaf\x48\x58\x16\x78\xdf\x8c" + "\x22\x10\xcd\x81\x57\x17\x81\x47\x8a\x47\x33\xc1\x60\x14\x16\x68\x43" + "\x48\x70\xc5\x03\xe0\x84\x8c\xc2\x45\xa1\x52\xfb\xa0\xef\x09\x2c\xa2" + "\x16\xae\xda\x88\xa4\x84\xa7\x42\xd8\x0e\x06\x3e\x6c\x6e\x32\xa0\x90" + "\xd9\x25\x8d\x6a\x17\x2e\xdc\x54\xca\xcd\x86\x41\xde\x30\xaa\x78\x4b" + "\xba\x7a\x4a\xaa\xba\xe5\xed\xd2\x5d\xd2\xdb\x83\x25\x7d\xd7\xf1\x97" + "\x1d\xb8\xf2\x2b\x8a\x8f\x44\x10\xcb\xa7\xfe\x7e\x44\x83\x7a\x2e\x78" + "\x46\x71\xfb\x73\x5f\xff\x22\xff\xff\x91\x45\x82\x3f\xc1\x12\x2f\x78" + "\x2b\x1e\x96\xa1\x9a\x6b\x2b\x60\xba\x44\xc9\x31\x0b\xb8\xc3\x8c\x07" + "\x59\xa0\x72\x00\xb4\xc7\x86\x1e\x22\x05\x46\x71\xeb\x97\xba\xc4\x2c" + "\xfc\xb4\x42\x3b\xda\x40\x10\x34\x65\xa2\xcc\x03\x0d\x9d\xd7\x70\x4e" + "\xff\xfb\x84\xc4\xee\x80\x11\xf9\x75\x5f\xec\x98\xba\xa2\x44\xac\x2c" + "\x7d\x93\x23\x25\xf9\x6e\xa9\x77\x71\x98\xff\xa8\xa3\x01\x11\x7a\x2c" + "\x5e\x12\x2c\x92\x4b\x5b\x44\x19\x6c\x70\xc9\x13\x70\xce\xbd\x43\xcd" + "\x3c\x4a\x34\x32\x9e\x7b\x2a\x54\xdd\x62\xd4\xea\xcf\xdf\x4b\x0f\x36" + "\x77\x44\x9a\xce\x28\xf2\xfa\x95\x1e\x21\x27\xd8\xd3\x94\x8c\x3d\xaa" + "\x3d\x06\xac\x7f\xf2\xbf\xe1\x25\x08\x82\xf8\x16\x28\xe2\x62\xc2\xca" + "\xda\x15\x84\xb3\x93\x08\xe3\x48\x83\x4e\xc2\x5e\xc8\xa4\x21\xe2\xe1" + "\x01\x88\x79\x30\x79\x00\x5f\xe4\xed\x72\x81\x81\x50\xb5\x16\x9b\x00" + "\x4d\x20\xc0\xab\x41\x96\x51\x2a\x4e\x3b\xf5\x3f\x89\x3a\xf7\xfd\x2f" + "\x2c\x2e\x6a\xba\xb9\xf9\xd1\x77\xf2\xc6\xbe\x3f\x76\xf4\x76\x29\x6e" + "\x9f\xba\x11\x22\x0b\x5d\x82\x29\xa5\xbb\x8a\x27\x2d\xae\xb8\x95\x9d" + "\xc9\xac\x5e\xbc\x55\xaa\x71\x08\x23\xdd\xde\x5f\x48\xd0\xf8\x3b\x9f" + "\xff\x2c\x7f\x9f\x13\x24\x0a\x08\xd5\xe9\xb9\xd6\xff\xff\x63\xbf\x8b" + "\xe1\xae\x1b\xc5\xf6\x66\x14\x06\x71\x80\xd0\x7a\x47\x60\x39\x29\x17" + "\x20\x6a\x9a\xa2\xbf\x9c\x94\x97\x20\x59\x30\xcd\x4c\x40\x21\xa9\x80" + "\x1b\x20\x13\x6c\xf4\x78\xc4\xab\x4c\x13\x18\x57\xa8\x29\x22\x4d\x29" + "\xb9\x72\x59\xf3\x65\x4d\x29\x9b\xf2\x5b\x2a\x62\x50\x3f\xc2\xb8\x0a" + "\xcd\xd5\xb9\x3d\xa0\xbf\xef\x30\x26\xa2\x17\x1a\x69\x34\x8e\x50\xdb" + "\x91\x02\xb8\x6b\xf8\x21\x79\xa9\xab\x7b\xb8\x5a\x9a\xf9\x4c\xc7\xb1" + "\x1d\x14\x9c\xc4\x99\xe5\x87\xbf\xf1\x62\xf9\x18\xe9\xff\xfb\x74\xc4" + "\xfb\x80\x11\x71\x77\x59\xec\xe1\x0b\x42\x03\xae\xec\x7d\x94\x16\xe4" + "\x65\x92\x97\x1a\xc2\xe3\x85\xcc\xd8\x22\x0c\x1a\xc2\x93\xb2\x55\xfe" + "\x8a\x7a\x10\x8d\xfe\xa0\x66\xab\xb9\xb0\xfb\x24\x03\x08\x6a\x08\xc4" + "\xc3\x83\x09\x62\x4d\x12\xc8\xd0\x84\x80\x00\x04\x52\xa9\x84\x7a\x18" + "\xe2\x1a\xc2\x8e\x2e\x81\x26\x02\x45\x69\x94\x80\x10\xa3\x08\x47\x40" + "\xc9\xa8\x58\x80\x41\x45\x42\xa0\xbd\x0f\x13\x10\xb7\x33\x9b\x3c\x4d" + "\x9e\x5f\xc2\x99\x81\x65\x81\x25\x0a\x24\x64\x82\x90\x0a\x3c\x89\x90" + "\xb5\xd9\x0c\xb6\xa1\xdb\x8e\xed\xea\x6f\x97\xd1\x63\xdf\x3d\x4f\xab" + "\x98\x38\xea\xe7\x97\xbf\xf2\xa8\xa2\xa7\x46\x6c\xc3\x6d\xa9\x44\x3d" + "\xbe\x34\xa3\xa2\xf5\x71\x6e\x65\x29\x23\xe5\x76\x77\x4a\xd4\xa3\xb5" + "\x20\xfb\xab\x15\x4d\x40\xf8\x90\xeb\x7e\xa1\xd1\x42\x0d\x41\xd0\xb1" + "\xc4\x1c\xd6\x01\xd2\xf8\x0f\xf1\x69\x6c\x5a\x46\x49\x46\x07\x76\xe2" + "\xe9\x38\xe6\x94\x1b\x31\x78\xc0\x40\xa6\xa0\x3c\x63\x80\xa0\x82\x14" + "\x50\x85\x4f\x0c\x83\x65\x42\x10\x23\x85\xba\x2c\xab\x76\x0e\x0f\x2a" + "\x92\x9c\x94\x79\x18\xfb\x53\x99\xa1\xd6\x4f\x9e\x30\xe0\x24\xa6\x51" + "\xe3\xfd\x04\x2c\x1e\x7a\x93\x35\x4a\x99\x16\xbb\x93\x27\x98\x5a\x1a" + "\xaf\x71\xc4\xf6\xf7\x2d\xba\x53\xde\xf6\x65\xf7\xff\xfb\x74\xc4\xfa" + "\x80\x10\x71\x7d\x5f\xec\x0d\x1b\x6a\x16\x2f\x6a\xb9\x94\x16\xb0\x2e" + "\x6d\x7c\x6f\xf9\x7f\xe2\xdf\xa2\x3a\x8b\x8d\x41\xf8\xd3\xf4\xa1\xd3" + "\xe9\xc3\x4c\x55\x7f\xca\xc7\xff\x17\x2a\xd2\xa0\x7c\xc4\x8d\x3e\xbf" + "\xfe\x0a\x38\x4c\x28\xef\x83\x25\xc6\x04\x82\xb2\x96\x2b\x23\x64\x94" + "\x4e\xd5\xc2\x08\xb2\x23\x16\xf1\x94\x11\x40\x73\x89\xe0\xe7\x53\x34" + "\x32\x62\xd3\xee\x02\x86\xc4\x06\xb7\xe1\x70\x53\x56\x57\x00\xaa\x95" + "\x25\x24\xcd\xf2\x00\x12\x8b\xb6\x2c\xe0\x8c\xd5\x29\x09\xd1\x22\x26" + "\x82\xac\xab\x04\x09\xf9\xd8\xef\x9e\xc1\x14\xd6\xcc\xcf\x70\x9b\x68" + "\x98\x6b\x4a\xc9\x96\xf7\xe2\x62\x36\x5a\xa7\x48\x8a\xba\x38\xe3\xca" + "\x2e\xc8\xf1\xac\xac\xaf\xf5\x14\x7d\x00\xaa\x42\xb2\x1a\x36\xe3\x86" + "\x37\x0f\xf0\x80\x88\x81\x47\x7f\xff\xe8\xf8\xd4\xff\x95\xbf\xc6\x36" + "\xc8\x45\x35\x2d\x38\xdb\x6b\x6a\x5a\x12\xac\xd8\x9f\xd0\xb0\x9f\x0a" + "\x00\xc3\x09\x1c\xe3\x38\xda\x0b\x65\x22\x72\x72\xb6\x22\x61\xca\x81" + "\x90\x4e\x35\x15\x51\xda\x68\xe2\xc0\xbd\x53\x7f\x9a\x8d\x4f\x72\x9a" + "\xa5\x86\xb3\xdb\xea\x70\x4a\x26\xa5\x91\x69\xa1\x6a\x20\x40\x09\x48" + "\xab\x91\x97\xd2\x39\xe5\x9c\xcd\x5d\xb4\x54\x25\x72\x59\x30\xb2\xc6" + "\x98\x6a\x70\x4c\x22\x17\xb1\x49\x4c\x3a\xd6\xff\xfb\x74\xc4\xfb\x80" + "\x11\xfd\x7f\x57\xec\x98\xb7\x02\x1b\x2d\xab\xbd\x8c\xa1\xa5\xd7\x1b" + "\x30\xd0\x9e\x88\x35\x07\xe4\x35\x8d\x91\xd5\x0e\x24\x10\x89\x57\xae" + "\xf1\x97\xc3\x07\x48\x2a\x6c\xc2\x57\xc4\x53\x25\x5f\x35\x7f\x15\x8d" + "\x0f\x7f\xfe\xdd\xe6\xff\xff\xa1\xf4\x7c\x07\x74\x82\xa3\x16\x93\x68" + "\xa9\x4e\xf6\x02\x09\x2d\x40\x01\xfb\x06\xe2\x21\xd3\x82\x95\x0b\x84" + "\xb0\xe4\x80\xad\xa1\x20\x9c\x14\x73\x82\x84\x2d\x29\x60\x21\x61\x08" + "\x45\xd7\xa1\x28\x0b\x53\x57\x33\x21\x01\xd4\xd9\x24\xb0\x06\x6c\x5b" + "\x24\x4d\xde\x34\x55\xe5\x25\x8e\x1a\xf9\xef\xc9\x8a\xc6\xc2\xbf\x26" + "\xbe\xab\xf2\xc7\x8b\x2a\x5c\xf7\x36\xb4\x5c\xc6\x2b\x0f\x7f\xf5\x30" + "\xb3\x71\x7a\xc3\x44\xb3\x1c\x42\x23\x5c\x8b\x3c\xc5\x14\x69\x0d\xc8" + "\xfb\xab\x5d\x8f\xff\x91\x8f\xce\x59\x8f\xf9\x75\xda\xe4\x9f\xa6\x79" + "\x31\x5b\xd2\x16\x20\xf2\xdd\xfe\xb1\x73\x64\x83\x82\x0c\xcb\x04\xc5" + "\x6d\x9e\x2a\xc3\x58\x35\x04\x4a\x42\x53\x1e\x91\xb4\x89\x43\x62\x3c" + "\x89\xdc\x35\x63\x34\x30\xdc\x26\xf0\x48\xa0\x41\x71\x48\x2c\x4a\xc0" + "\x60\x6b\x39\x99\x47\x4c\x13\xc8\x95\x2a\x2c\x17\x11\x76\x46\x4d\x00" + "\x9d\xd8\x7f\x50\xf1\x20\x09\x61\xbb\x6d\xc9\xf5\x76\xe6\xe7\x4b\x6e" + "\x10\x0d\xf3\xb9\xfa\x5c\x6c\x7d\x4c\x8a\xff\xfb\x74\xc4\xf5\x80\x0f" + "\xf5\x81\x5b\xec\xa4\xb6\xe2\x35\x30\x2c\x3d\xbc\x20\xfc\x5f\x23\x73" + "\xa1\x3b\x76\x8e\xe9\x89\xac\x89\x3e\x8c\x20\xf5\x55\x2c\x72\xdb\x4f" + "\x55\xaf\x2f\x0f\xa4\xc7\x01\xaa\xa9\x4f\x36\x6f\xf5\xe6\x5e\xbe\x51" + "\xba\x57\xcc\xd7\xd7\x4f\xf7\x2e\xfe\x56\x1d\x25\xe1\xff\x02\xe2\xef" + "\xff\x90\x75\x60\xca\xa4\xd8\x08\xb2\xa1\xd5\x2f\x23\x24\x00\x00\xe4" + "\x9a\xa0\x41\x21\x79\x1f\x52\xaa\xa0\x52\xd1\x94\xb7\x49\x7c\xf0\x2b" + "\xd2\x41\x17\xf2\x46\x57\x2a\x07\x54\x69\x34\x1c\x0c\x16\x00\x52\xc0" + "\xd6\xe7\x23\x05\x66\x94\x90\x1d\x0f\x84\x7b\xfa\x61\xba\x55\x5d\x1e" + "\xef\x06\x60\xe6\x27\xb2\x89\x14\x29\x95\xc6\x25\x81\x0d\x50\x63\x98" + "\x36\x15\xaa\xc7\x44\x67\xc1\x99\x68\xbe\xf1\xe5\x75\x1c\x2b\xd8\x78" + "\x39\xc2\xc1\x1a\x53\xec\x28\x2b\xe0\x62\xef\xc5\x00\x15\xe0\xfc\x65" + "\x6d\xf1\x82\x7b\xb5\x1d\xff\x5e\x22\x1d\xec\x53\xd3\x92\x0f\x09\x84" + "\xec\x59\x44\xd2\x49\x92\x21\x0d\xe0\xf0\x20\x1b\x63\x04\x80\xf2\x64" + "\x89\x80\xa9\x53\x78\xbd\x6d\x26\x22\x19\x0a\xe8\xf2\x9c\x69\x56\xf5" + "\xf5\xc7\x00\x81\xfb\x97\x61\xa5\x12\x5c\x37\xda\x65\x60\x66\x45\x6b" + "\x36\xea\xf7\xf6\xf9\x89\xda\x86\x91\xba\xe9\x91\x26\xdc\x09\x70\x4c" + "\x48\xe8\xe4\xe0\xb3\x9b\x32\x15\x5f\xff\xfb\x74\xc4\xf4\x80\x12\xa5" + "\x81\x55\xec\xa1\x35\xca\x13\xaf\xea\xfd\x93\x0e\xd9\x5d\x4c\x17\x28" + "\x50\x9f\x83\x0a\x46\x25\x90\xb6\xd8\x3f\xd6\x53\x43\xb3\xac\xef\x2a" + "\xf0\x6c\x9c\xcb\xd7\xc1\x16\x06\xa1\xc9\xc8\xc1\xc5\x2f\xff\xfe\x84" + "\x2a\x87\x03\xc4\xb3\xa5\x29\xac\x69\x15\x04\xae\xd0\x9f\xd0\x4b\xe0" + "\x60\xef\x94\x06\xd0\x04\xaa\x16\xd9\x05\x9c\x91\xe9\xf0\x80\xfd\x95" + "\x1c\x81\x32\x57\xbe\xad\xbb\x65\x47\xdd\xcb\x32\xac\xfd\x29\xc6\x16" + "\x6c\x72\x13\xdd\x5a\xb7\x4b\x03\x4d\xc4\xe7\xe4\x44\x0e\x9b\x0b\x52" + "\xb0\xe2\xd8\x17\x53\x6d\x42\x59\xee\x50\x6c\xca\x9c\x6a\xfc\x6f\xfb" + "\xf7\xe2\xdc\xf3\x6b\x3b\x6e\x25\x9d\x8f\x78\x9c\x8a\x3c\xde\xfe\x77" + "\xc6\xaa\xf5\x9d\xf4\xa5\x58\xef\xf3\x0d\x59\x8f\x28\xe4\x8a\x1e\x62" + "\xbf\xf4\x01\xab\x8a\xc5\xe3\x8d\x44\x32\x9f\x98\x3e\x45\xe7\x0d\x35" + "\xe0\x99\x8f\xdb\x23\x4c\xc2\x70\xde\x86\x54\x00\x45\xb2\x9b\xc1\x99" + "\xc1\x25\x00\x8c\x30\x60\xc8\x60\xab\x12\x10\xba\x08\x08\x8a\x37\x08" + "\x7a\x46\xfd\xbf\xfa\x14\x18\x0c\x9b\x00\x96\x54\x86\x60\xbd\x50\xcd" + "\xcf\x49\x69\xe2\x09\x89\x5d\x96\x78\x2a\x4c\x4a\x34\x99\xec\xa3\x3a" + "\xbc\x23\x04\x28\xa6\x6d\x97\x2a\x95\x03\x2c\xbe\x62\x7f\x77\x1c\xfe" + "\x9c\xdd\xbe\xff\x7d\x3b\x7f\xe3\xff\xfb\x74\xc4\xed\x00\x0f\xbd\x3b" + "\x5b\xec\xbc\x70\xe1\xde\xaa\x6b\x3d\x86\x0e\x90\x1d\xf6\xbd\x34\x47" + "\xaf\xd9\x98\xd6\x1e\x43\xa6\xe8\xe8\x73\x9f\xff\xe9\x5f\xda\xa6\xa3" + "\xff\x38\xe7\xc7\x54\x27\x6c\x54\x5b\xf8\xa0\xf2\xa3\x68\x8f\x2d\x88" + "\x52\xc6\x77\x34\x37\x24\x20\x04\x88\xa5\xdc\x8f\x8e\x09\x1e\x18\x63" + "\xca\x12\x02\x0c\x80\x4b\x14\xd5\xa2\x21\x05\x5a\x20\x93\xc1\xc2\xdf" + "\x94\xb7\x2d\x6c\x35\x1a\x66\x69\xc5\x1a\x8b\x4b\x61\x98\x75\xf6\x60" + "\xf7\xc9\x52\x40\x22\x47\x51\x13\x1d\x8d\x4e\x8b\x94\x15\xf5\x70\x7e" + "\x33\x22\x4c\x7f\x39\x1f\x9f\xa5\x58\xb6\x92\xb7\x6a\xa6\x35\x7e\x76" + "\x3a\x55\x4b\xff\x26\x63\xa4\x23\xac\x45\x87\x55\x56\xe7\xf9\x15\x2d" + "\x53\xff\xe7\x94\x7e\x86\x7e\x8d\xa1\x87\xf9\xe7\xd0\xea\x19\x6f\x3d" + "\xea\x11\x13\x3e\xaa\x66\x62\xe6\x21\xdc\x45\x75\x71\x09\x53\x63\x10" + "\xad\x96\xca\x68\x48\x2a\x35\x1d\x1d\x59\xb5\x0b\x16\x58\x18\xa5\xc0" + "\xee\x0b\x48\x8b\xc8\x1f\x93\xbe\x1a\x3c\x3e\x30\x5c\x6f\xb1\x25\xa2" + "\x86\x94\xf6\x2a\x67\xce\x30\x0e\x4f\x53\xbd\xb1\x18\xb4\x33\xec\x12" + "\x02\x26\x52\x73\x75\x0b\x0f\x85\x21\xd5\x29\x16\x85\x14\x15\x98\x44" + "\x72\xc5\x85\xa3\x2b\x05\x85\x18\x23\x42\xd8\x30\xf9\xba\x8f\xa3\xda" + "\x6e\xb4\x15\x42\xa7\x18\x26\xff\xfb\x74\xc4\xf7\x80\x10\x89\x7f\x59" + "\xec\x18\xf9\x02\x16\xb0\x2b\x7d\x93\x1e\xe8\xdc\x39\xd4\xe2\x02\xdf" + "\x8c\x1c\x46\x15\x01\xc4\x59\x4f\x51\xfe\x81\xf1\x82\xbe\x57\x14\x11" + "\x15\x51\xf8\xf1\x99\x85\x5a\x30\x6a\x46\x0e\xbb\x84\xaa\x99\x0b\x17" + "\xa4\xf6\xcb\x28\x14\x50\x2d\x86\x56\x55\x21\xb7\x15\x28\x71\xe1\x73" + "\x43\x04\x67\x0d\xc8\x98\x39\x84\x3b\x87\x14\x83\xe9\x80\x50\x5c\xce" + "\x63\x01\x20\x36\xc5\xfd\x4d\xda\x6c\x09\x13\x61\xa4\xba\xd0\xd7\x24" + "\x6e\xbb\x52\x77\x92\x34\x4d\xd0\x7a\x30\x2a\xe4\x9f\x3b\xbf\xbe\xe7" + "\xfc\xba\x52\x65\xee\x4e\x4d\xde\x41\x86\xe9\x97\xa1\x36\x62\x58\xb9" + "\xd8\x4d\x31\xcf\x43\x25\x33\xca\x65\xa8\x99\xea\x87\xb7\x7f\x77\x6c" + "\xc9\xe3\x23\xd4\xac\xc4\xe4\x21\x38\xb7\xfe\xa2\x17\x7c\x8c\x2c\x4c" + "\x2c\x25\x89\xcc\x25\xa0\x82\x54\x1d\xc4\x2e\x6d\x92\xc0\x1f\x09\x2c" + "\x95\x87\x0b\x48\x21\x18\x32\x45\x48\xaa\x32\x59\x3e\x56\xb8\xf0\x2e" + "\xb4\x54\x68\x73\x56\x70\xd0\xf8\x2e\x28\x21\x08\x2c\x1f\xb5\x7b\x72" + "\xd4\xa9\x16\xba\xfe\xc8\xf9\x94\x41\x96\xcb\x71\xa5\x80\x21\x73\x73" + "\x31\x70\x48\x9c\x4c\x4b\x86\x61\x96\x98\xc4\x1c\x0c\xab\x86\x0c\xc5" + "\x1e\x02\x70\xc6\x19\x0a\x53\xbe\x00\x5a\xb1\xd3\xc8\xe6\x94\xcf\x5a" + "\x75\xbc\x46\xcc\x93\x1c\xff\xfb\x74\xc4\xf8\x00\x10\x71\x83\x5b\xed" + "\x18\xf5\x62\x16\xae\xea\xbd\x91\x96\xe1\x45\x72\x79\x8e\x23\xfc\x03" + "\xee\x58\x24\x0c\x9d\x41\xaf\x51\x97\x0a\x1c\x80\x65\x6e\xb9\xd3\x4b" + "\x86\xc1\x85\x09\xdc\x21\x68\x80\xb8\x39\x55\x1f\x2c\x44\x00\x8a\xe5" + "\x09\x7f\x09\x2e\x02\xd1\x66\x0a\xaa\x1a\x38\x74\xa1\x90\x68\xd0\xbb" + "\xe1\x82\x72\xa3\xe0\xc0\x14\x9d\x8d\x27\x78\x24\x14\xf3\x12\x1c\x77" + "\xb5\xe9\x7a\x77\x3e\xcd\xc6\x9c\x6b\x8d\x3d\xdc\x81\x04\x62\x78\x3a" + "\xa7\xe1\x60\x87\xc1\xec\x15\x68\x91\x97\xab\x3f\x1e\x67\x61\x02\xaf" + "\x28\xd5\x19\x60\x44\xbf\x53\x62\xcc\xf8\x27\xcd\x51\x9c\x8b\xeb\x08" + "\xe2\xcf\x12\x14\xe2\x42\xfc\x89\xbf\xe6\x43\x11\xd3\xe7\xc9\xae\x59" + "\x33\x63\x39\x8f\xc6\xf2\x37\x42\x05\x9f\xa9\x72\x8b\xd4\x4a\x10\x39" + "\x89\x09\x83\x9a\x33\xfa\xa4\xc8\x2c\xd1\x1d\xd3\x90\xc4\x5a\x88\x08" + "\x2c\x00\x8e\x65\xfa\x56\xf1\xd8\xb1\x2a\xa9\x48\xb9\x56\x20\x5d\x8e" + "\xe4\x10\xe5\x87\x04\x99\x98\xeb\x29\xe7\x33\x04\x5e\xca\x97\xd6\x59" + "\x64\x32\x03\xa5\x53\x8c\x0b\x49\x03\x94\x88\x30\x44\x33\x1d\x37\x56" + "\xef\x2b\xbc\x48\xd5\x85\x9a\x19\xc6\xb6\xc3\xc9\x97\x17\x51\xe2\x24" + "\xd5\x97\x3d\x8b\x5c\xaf\xf1\x73\x47\xfc\x20\xee\x20\x65\xfe\xb7\xb7" + "\x16\xdd\xd0\xfc\xba\xff\xfb\x74\xc4\xf8\x80\x0f\xd9\x77\x55\xac\xa4" + "\xb6\xc2\x15\x21\x2a\xbd\xa1\x9b\x20\x6f\xf8\x1e\x76\xa4\x6d\x53\xca" + "\xf3\x43\x6b\x8e\x76\x69\xff\xf8\x0c\x14\x0a\xc4\x41\x8d\xfd\xdf\x10" + "\x73\x90\x0d\x45\x55\x8c\xa0\x97\x17\x34\x2f\x2b\x4c\x00\x46\xe6\xca" + "\x15\xb4\xd8\xf5\x8a\x1c\x69\x59\x4e\x81\x21\x4a\xb2\x12\xb0\xcc\x60" + "\x24\xa3\x7c\xc5\x43\x4b\xab\xad\x51\x64\xcb\xb0\xb1\xcf\xea\x5d\x5b" + "\x88\x4a\xe4\x10\xec\x49\x97\xa0\xd0\x29\x84\x1c\xce\x40\xab\x2e\x0f" + "\xb2\x0a\x12\x38\x65\x2a\xc7\x8f\x12\x96\xdd\xcf\xf1\x66\x02\x41\xa0" + "\x42\x51\x42\x62\x87\xc7\x84\x7e\x9e\x4a\x13\xe9\x10\x2d\x5b\xf5\x75" + "\x3e\xa9\x03\xa5\xfa\xa7\xff\x0e\x1b\x3f\x4a\x9a\x7d\x07\x4b\x96\x8e" + "\x2e\xdc\xa8\xd0\x1b\xa7\x12\x34\x28\x1e\x7e\x60\xb7\x29\x90\x3f\x6c" + "\x68\x00\x84\xc6\x72\x40\x9a\xa0\x15\xd7\x10\x32\x42\x09\x35\xc7\x28" + "\xa5\xb3\x41\x0b\x1c\xe4\x06\x50\x52\xbe\x4d\x54\xf3\x7f\x5b\xaa\x99" + "\x31\xfd\x73\xf0\xb3\x1d\x44\x4b\x26\x58\x03\x42\x10\xd3\x4b\x32\x24" + "\x6e\x31\x9a\x71\x83\xdc\xa5\xe8\xba\x28\x96\x96\x58\x6c\xa2\xe8\xe3" + "\xac\xa0\xb0\x9e\x5a\x63\x61\xed\x8b\x57\x29\xe6\xf2\xad\x15\x6a\x6d" + "\xf7\x0e\xf9\x35\x72\xd7\xeb\x5d\x06\x74\x2f\xb2\x09\x4b\x6f\x8e\xc5" + "\x37\x7a\x27\x47\xff\xfb\x74\xc4\xfc\x00\x10\x31\x81\x5d\xec\x18\x76" + "\xe2\x22\xaf\x6b\xbd\x87\xa2\x4d\xec\x20\x52\x9b\x73\xf8\xcf\xdd\xbc" + "\x77\xd3\x33\xb2\x52\x5a\xff\x2c\x96\x7f\xff\xfc\x41\x1c\xff\xc8\xa4" + "\x54\x9b\xa3\xe7\x91\x9f\x20\x76\x28\x23\x1d\x2c\x4c\xb4\x81\x6d\x2d" + "\xd3\x11\xb0\x72\xf3\xe2\x20\x87\x57\x16\x98\xbf\xe9\xd6\xbb\x55\xa3" + "\x49\x4a\xba\x97\x69\x09\x4c\x5f\x7a\x67\xe8\xad\x33\x35\x7b\x2e\xca" + "\x14\xb7\x47\x6a\xc9\x87\x31\x86\x15\xea\xcb\xaa\xa3\xdf\xba\x0b\x94" + "\xf7\xa3\x67\x0b\x1c\x82\x2d\x26\x1e\xd3\x7b\xfc\x36\x66\x8c\x24\xe8" + "\x24\x1f\x75\x76\xaa\xbc\xe9\xff\x32\xed\xfb\xc3\x6d\xa9\x86\xcb\x0e" + "\x73\x57\x46\x7e\xc5\x52\xe3\x1f\xb1\x7a\x2f\xa7\x20\xdf\xea\xdf\x42" + "\x95\x3f\xf4\x62\xfc\x91\x48\x10\xff\xa0\x4b\x98\x80\x6c\x50\x84\x56" + "\x69\x5b\x69\x04\x8b\x53\x45\x4a\x63\x05\xc6\xc2\x03\x8e\x03\x7e\x04" + "\x81\xb8\x6c\xad\xb5\xc9\xd1\x42\x92\xc9\x30\x58\xae\xf7\x11\x60\xb2" + "\x18\x1d\x72\x0e\x13\x88\x89\x98\xc5\x88\x01\x86\xb7\xd4\x95\x2e\x9c" + "\x92\x36\x49\x8d\x0c\x9e\x42\x8d\x48\x7c\xb4\xd1\xb6\xc4\xa0\xee\xc5" + "\x92\x74\x4d\x31\x4d\xa9\x6a\x24\x8b\xff\x02\x26\x66\xcd\xff\x21\xa2" + "\x4e\x22\xc1\xcd\x46\x08\x67\x7b\xbc\x3a\xcc\x10\x60\xf4\x29\xdf\x9d" + "\x58\x61\x44\xff\xfb\x74\xc4\xfc\x00\x0f\x81\x45\x5d\xec\x18\x76\x62" + "\x3f\x2f\x2b\xbd\x94\x9a\x95\x97\xbe\x9c\x14\xc4\x2e\xad\x6a\xfd\x45" + "\x1a\x84\x78\x08\xf4\x8d\x36\x40\xed\x19\xc4\xae\x63\x61\x58\x1c\x48" + "\x11\xc7\xdc\x22\xb8\xe9\x03\x09\x8b\x5f\x74\x10\x71\xfe\x1d\x39\x6e" + "\x44\x25\xea\xa4\xb0\x70\xca\xaa\x9b\xd0\x84\x41\x7b\xb5\xb7\x6b\x52" + "\xe6\x7f\x6f\x83\xae\x18\x66\x76\x1d\x58\xfc\xc0\xfc\x20\x11\x49\xa3" + "\x4f\x47\x0f\x07\x96\x36\x96\x4e\x17\xb2\x4e\x87\x5b\x30\x3b\x82\x61" + "\xa8\x7f\xad\xb9\xd1\x72\x5b\xd8\xcb\xdb\xa9\xd9\xb9\x55\x6e\xd6\xe5" + "\xa0\xd1\x92\xe7\x96\x78\xc6\x74\x26\x37\xb1\x2c\xbd\x5f\xd4\x5f\xfa" + "\x0f\x83\x10\x02\x2b\xc2\xfc\xf1\x3f\x24\x4c\x45\x94\x86\x0f\x49\x64" + "\x17\x69\x22\x6d\x86\x20\xb2\x31\x92\xf3\xbc\xc2\x11\x24\xfa\x9a\x84" + "\x22\x9d\x88\xbb\x8c\xc5\x61\x1b\x96\x9b\xf4\xd8\x2f\x24\x38\xb0\x50" + "\x7e\x55\xc7\x04\x10\x5a\x4e\x5f\xca\xa7\x2b\x28\x64\xfd\x87\x52\x8f" + "\x44\x1f\x2c\x4c\x8d\xa5\x5c\xba\x3e\xba\x2f\xaa\xc1\x60\xf4\xe1\x0d" + "\xf6\x92\xac\x33\x7a\x92\x6c\xe2\x7b\x17\x42\xbb\x34\x1a\x39\x6a\x60" + "\xc8\x0f\xfd\x4a\x43\x32\xbe\xa5\x22\xba\x11\x95\xca\xe5\x2a\x28\x96" + "\x47\x29\x45\x06\xfa\xa7\xe4\xa7\xab\xff\xc1\xb5\x11\xba\xbd\x11\xbd" + "\x19\x47\xff\xfb\x64\xc4\xfb\x80\x0f\x9d\x7f\x59\xec\xb0\x74\x81\xda" + "\x1f\x6b\x7d\xa4\x8e\x68\x75\x75\xec\x57\x2a\xc6\xd4\x0f\x6c\x75\x41" + "\x0d\x84\x8a\x92\x01\x04\x7d\x45\xd1\x48\xa4\xb0\x14\xb8\x30\x25\x68" + "\x81\x98\x63\x1a\xa5\x21\x4a\xdd\x15\x12\x82\x17\xd6\xb7\xe2\xc0\x87" + "\x8f\x7f\x3f\xd5\x7a\x68\x71\x63\x3d\x95\xa3\x58\x85\x36\xcf\x23\x2f" + "\x8d\xb1\xcd\xc6\x35\x1f\xd3\xb0\xf6\x43\xf9\x3a\x58\x56\xe1\x39\x65" + "\x5c\x25\x8b\x5d\x1d\x94\x1e\xae\xd3\x71\x42\xc1\xa8\xa4\xe7\x53\xba" + "\x8e\xab\x94\xe6\xe8\x4b\x8a\x87\x02\x02\x66\x78\x40\x7b\x1b\xaf\xac" + "\x41\xad\x6f\xca\xaa\xcf\xd5\xfe\xbe\x5a\x07\x5b\xca\x2a\x82\x82\x21" + "\xd6\xd0\xe5\x38\xed\x96\x40\xaa\x3c\x11\x92\x68\xc9\x74\xf8\x14\xfc" + "\x87\xc6\x16\xe2\x08\x0c\xa2\x65\xcd\x41\x8b\xea\x68\xb5\x5e\x07\x81" + "\x99\xf1\x27\x73\x69\xab\xd1\x3d\x67\x31\xc1\x4e\xc9\x41\xbc\x68\xb9" + "\xdc\x2f\x29\xdd\x9d\xa1\x39\x24\xe9\xe2\xc5\x99\x34\xea\x9c\x94\x7c" + "\x4e\x26\x7f\x66\x1e\x1e\x6d\x26\x0b\xcb\xca\xab\xa7\xb0\xa9\xa4\xdc" + "\xe1\x91\x4e\x7e\xff\xfb\x74\xc4\xef\x00\x10\x9d\x49\x5b\xec\xa0\x57" + "\x81\xfe\x2f\xab\xbd\x84\x8a\xd8\x49\x6d\x76\xd8\xc7\xd6\xa9\xd1\xc8" + "\x51\x77\x28\x86\xeb\xa1\xf6\x43\x09\xf4\x71\x2f\x8e\x93\x89\xb1\xc5" + "\xaa\x7f\x99\xca\xdd\x03\xa3\xf3\x9f\x20\xa2\x08\x31\xdc\x51\xbe\x67" + "\x0f\x83\x9e\xf4\x1d\x32\x7d\x54\x09\x73\x94\x07\x1b\x69\x04\xc5\xf1" + "\x00\x82\xf0\x65\x52\x9e\x31\xcc\x60\xa0\xf6\x15\x37\x79\x0f\x9b\x1c" + "\xa1\xfa\x42\xbe\x92\x15\x6f\xa3\x2a\x2c\x92\x12\x0b\xe5\x45\x2c\x3b" + "\x2e\x93\x4f\x7e\x79\x76\xb3\x49\x75\xee\xf4\x23\x8b\x18\x27\x2c\xe1" + "\x9b\x6a\x36\x21\x91\x62\xac\x78\x32\x96\x63\xc1\xe2\xaf\x2e\x8b\xc8" + "\xb1\xc7\x1b\x95\x6a\xaf\x2d\xc9\x4e\x89\x49\xd4\xac\x39\x1f\x56\x41" + "\x45\xee\xec\xd3\x1b\xf4\xd3\xb7\x68\x87\x1f\xc6\x7c\x6f\x1f\xc6\xbc" + "\x72\x0a\xc3\x47\x8b\x45\xc5\x08\x4c\x8c\xc1\xe1\x6e\x2b\x41\x00\xf6" + "\xb9\x66\x27\xea\x02\xed\x39\x87\xed\xae\xc9\x42\x33\x5d\x65\x46\x38" + "\xec\x60\xe4\x59\x86\x0f\x5a\x93\xdd\x69\x4a\x8e\x0f\x5d\xaa\xad\x9a" + "\xb3\xb5\x74\x12\x8d\x10\x90\x4e\xb6\x51\x86\xee\x24\x55\x7d\xd2\x7e" + "\x15\xf0\x7f\x5a\x15\x46\x4e\x85\xb8\x5c\x13\x2a\x0f\x32\x3e\xd2\x3a" + "\x91\x02\x28\x16\x11\x8d\xaf\x48\x8e\x3f\x61\x8c\xc4\xb2\xcc\x61\x46" + "\xf5\xa2\xb7\xff\xfb\x74\xc4\xf2\x00\x10\x91\x7f\x63\xec\x24\xb7\x22" + "\x14\xad\xeb\xfd\x84\x96\xe5\x39\x54\x8a\x69\x98\x4e\x7b\x68\x51\x1c" + "\x3b\x07\x84\x5b\xcc\x14\x9f\xe6\xea\x4d\x7f\xe7\xdb\xff\xd3\xf4\xbf" + "\x37\xff\xfc\x1a\x05\xe3\x7f\xc3\xa8\x2a\xaf\xaa\x3e\xa6\xd7\x0f\xae" + "\x91\xc7\x42\x45\x96\xa6\x59\xa6\x90\xf1\x61\x23\x0e\x28\x69\x04\x38" + "\x7e\x62\xc5\x20\x3a\x59\x00\x91\x11\x6d\x90\xa0\x4c\x70\x31\xe0\x1a" + "\xfd\x35\xeb\xe9\x7a\x9c\x17\xbf\x7e\x3e\xf5\x84\x01\xab\x44\x8d\x76" + "\x1a\xd4\x0e\x8a\xed\xe5\x37\xb2\xc6\x6b\x1b\x91\x41\x2a\x9e\x3d\x3a" + "\xb3\xd2\xca\xbd\xce\xb9\x25\xaf\xb5\xc8\xf2\x28\x65\x9e\x9f\x7b\x0e" + "\x21\xba\xd2\xae\x2c\x63\x9d\x7c\x5a\xc5\xb8\x28\x1c\x28\x1d\xcf\x68" + "\x3b\xbf\xbf\xf9\x7f\xe0\xff\xfd\x54\x91\x00\x42\x2c\x75\x7f\xe2\x9f" + "\xfe\x95\xc1\x45\x09\x07\xa1\x2b\xff\xff\xc2\x8a\xad\xc2\x30\x4b\x14" + "\x00\x49\x64\x49\x98\x6d\xce\x18\xd2\x9d\x85\x07\x6a\x45\xa9\x4d\x60" + "\x60\x81\x52\x2b\x3e\xe9\x7d\xb7\x81\x9a\xe4\xdc\x1a\xbb\x7e\xc8\xe1" + "\x18\xfd\x55\x3a\x11\x83\x53\x09\xeb\x53\x1b\xc1\x9f\x5c\xc5\x77\x5e" + "\xdc\x10\x14\x53\x54\x65\x23\x53\x4e\xea\x73\xeb\x88\xa2\xca\xe4\xb7" + "\xb8\xa9\x12\xb2\xa9\x2e\xcb\x67\x58\x9e\xa2\xce\x76\x2d\x8e\x71\x8f" + "\x3b\xd1\xff\xfb\x74\xc4\xf2\x80\x10\x89\x7b\x55\xec\x20\xb7\x09\xe9" + "\x2f\xec\x3d\x93\x0a\xe8\x48\x8a\xc6\xd0\xca\x45\xfb\xa1\x8c\x28\x64" + "\x51\xe5\x16\x51\x71\x0a\xa7\xc4\x3c\xde\x8a\x7e\xac\x5f\xf4\x67\x98" + "\x76\xa1\xa2\x4e\x2c\x2a\x1b\xf6\xfc\x6b\xcf\x92\xec\x9e\x4e\xa5\xca" + "\x0f\xbe\x95\x47\x87\xcf\xc2\x05\x9d\x10\xb8\xac\x48\x54\x50\xc3\x03" + "\x06\x4a\x8c\x00\x26\xec\x2d\x2c\x64\x2e\x93\x23\xc1\x4e\xa1\x4b\xdd" + "\xff\x5e\x58\xc3\x8d\x89\x95\xb0\x6f\xfe\x7d\xeb\x32\x7a\x79\x66\x51" + "\x27\x35\x20\x12\xc6\x90\x03\xa9\x68\x34\x53\x02\x64\x41\xc1\x7a\x1c" + "\x6d\x31\x36\x4f\xbf\xb5\x77\x12\x6b\xeb\xa0\x20\x61\x5e\xa2\xbb\x15" + "\x34\xdb\xcf\x6c\xff\xb7\x86\x6c\x99\xdf\xde\xd9\xa4\xa5\x0a\x52\x2b" + "\xaa\x2e\xfa\x98\x65\xf6\xbd\xed\xfe\x8e\x77\xa1\xdf\xe8\x0e\x9e\x35" + "\x23\xa9\x1a\x8d\x4c\x3b\xff\x78\xec\xd4\x39\x64\xb6\xa1\xd9\x62\x64" + "\xbc\x37\xd3\x2e\x69\x81\x62\x5d\x91\x09\x62\x01\x13\x50\x12\x24\xaa" + "\x01\x51\xd9\x3c\x10\x99\xf9\x21\xf2\x71\xa4\xfa\x7d\x24\x64\xf6\x7c" + "\x6c\xa0\x65\x64\x75\x6b\xe1\x63\x9d\x83\x60\x5d\xbc\x64\xb8\xd4\x98" + "\xda\xd5\x82\xb9\xb1\xdf\xd5\x9d\xa0\x45\xde\x46\xd4\xea\x6d\xca\xce" + "\xcf\x3f\x2a\x25\xba\x0c\x11\xbd\x74\x06\xb4\xd1\x74\x13\x63\xee\x2a" + "\x76\xff\xfb\x74\xc4\xf8\x80\x11\x55\x81\x63\xec\xa5\x15\x22\x0c\xb0" + "\x2a\xfd\x94\x96\xd9\x32\xa9\x5f\xc4\x5e\xac\xd7\x88\xb6\xad\x33\xd0" + "\xe8\x80\x95\x41\xa9\x80\x86\x88\x00\x7f\xff\xb3\x6a\xef\xd9\xbc\x8a" + "\x71\x33\x9d\x40\x20\x67\x68\x7e\x82\x08\x82\xb0\x0f\xe9\x5b\x27\x89" + "\x70\x03\x9f\x33\x0b\x60\x86\x50\x09\x48\x9d\xa0\x44\x62\xac\xc9\x7f" + "\x3f\x2c\xcd\x53\x61\x24\x22\x1c\xc2\x05\x26\x94\xb7\x9c\xf8\xf0\xe9" + "\x91\x8e\x6f\xac\x69\x27\x00\xb9\xc7\xf1\x98\x48\xf5\x5a\x99\x18\x27" + "\x74\x8e\xb3\xaf\xa5\x12\x5d\x5c\xcd\xf4\x59\x5d\x8b\xf4\x4b\x22\x25" + "\xd9\xa8\xe7\x2b\x3c\x86\x72\x9a\xad\x46\x31\xec\xca\x74\x9e\x6a\xbf" + "\xfe\x84\x26\xa7\x15\x95\x07\x0b\x8d\x1d\x13\x12\xa1\x05\xbc\x8f\x46" + "\xf4\x14\x29\xc4\xce\x81\xcf\x1a\xfd\x05\x5d\x64\x10\x01\x4f\xe5\xcb" + "\x0a\x98\x85\x09\x70\x83\x19\x00\x4c\x12\xc4\x67\x44\xa1\x59\x40\x08" + "\x31\x20\x80\x10\x02\x53\x4f\x7b\x9e\xa9\xa5\x0f\x2b\x1c\xd5\x0b\x16" + "\x96\xa9\xa4\x5e\x9f\xb5\xa2\xab\x3d\x18\x29\x2b\x7b\xcc\xc8\x27\x88" + "\x65\x9e\x12\x19\x06\x1a\xc5\x10\x8e\xe3\xae\x59\x16\xb5\x19\x73\x98" + "\xaf\x2a\x31\x11\x38\x74\x55\xd9\xcc\x49\x93\xde\x20\xf2\x34\xbe\xe6" + "\xa5\xdc\xb8\xb6\x8b\x9a\xc7\x98\x83\x6f\x66\xd5\xef\xce\xcc\xfd\x0a" + "\xff\xfb\x74\xc4\xf7\x00\x10\x95\x81\x65\xed\x98\xf7\xa2\x09\xaf\xab" + "\xfd\x93\x16\xe4\xa6\x21\x7c\xbc\xab\x52\xa2\x1d\xd7\xf5\x9b\x2b\xfa" + "\x37\x9b\x29\x5c\x21\xa7\x86\x82\x9a\x7c\x66\x09\xa2\xb1\x18\xdb\x69" + "\x92\x12\xa1\x8a\x12\x18\xc0\x58\xb1\x7d\x47\x4c\x05\x18\x86\x74\x0d" + "\xab\x16\x6d\x58\xc2\x42\xf1\xf1\x62\x08\x98\x34\x85\x8f\xff\x9d\xd4" + "\xff\x62\xb5\x2f\x63\xfa\x34\x87\x6d\x0f\x6b\x1f\x78\xc9\x9b\x5d\xea" + "\xb5\x8e\x66\x18\xc6\xb9\x0c\x9f\x0a\x75\x06\x6c\xd3\x01\x33\x67\xf5" + "\x0a\xac\x23\xaa\x13\xc9\x5c\x94\x28\x63\x2e\xf0\xdc\x58\xb9\x83\x67" + "\xd9\x4b\x5c\xaa\xfe\x7f\xc9\xb0\xd0\x70\x3a\x19\x77\x12\xac\x1d\x09" + "\xba\xb1\x8f\xff\x76\x61\xc5\xc3\xab\x0c\xa3\x74\x36\x80\xdc\x8d\xa2" + "\x50\x4e\x28\x96\x58\x30\x71\xa4\x1a\x76\x88\xcc\x62\xa4\x02\x91\x4d" + "\x25\x1b\x53\x48\x38\x7a\xbc\xa8\x51\x69\xb7\x4e\xf8\x17\x74\x33\xc5" + "\x40\xdb\xcf\xf5\xe7\x38\xf9\xbb\x28\x0c\xdc\x28\xf2\x68\xa9\x34\x0e" + "\x5c\x22\xdd\x27\xb8\x45\x98\x9a\x67\x53\x54\xa2\x9d\x46\xc8\xd8\x0c" + "\x4a\xab\x9d\xa1\x00\x45\xba\x0e\x62\x3a\x99\xb2\x98\xa3\x31\x47\x0e" + "\xff\x3f\xe1\x51\xfa\x10\xfa\x36\x82\x83\x67\xfa\x9f\x45\x3a\x36\xda" + "\x0a\x6c\x8c\x8a\xe4\xbe\xac\x7b\x2b\xf1\x40\x3b\x88\x55\x3a\x86\xff" + "\xfb\x64\xc4\xf9\x00\x90\x41\x7b\x55\xcc\x98\xb5\x09\xea\x2f\xaa\xb9" + "\xa4\x0a\xb1\x0a\x92\x81\x19\x5c\x85\x22\x89\xbb\x6d\x73\x85\x4f\x46" + "\x30\x94\x9f\x07\x18\x38\xef\xd2\x38\xc0\xb1\xf6\xcc\xd6\xb7\x06\x32" + "\xfb\x8a\xc4\xd3\x37\xbd\xd6\x63\x2c\x5e\x6f\xb9\x20\x83\xe2\x28\x4c" + "\x14\xd8\x7b\x0e\xd8\xb9\x22\x9a\x19\x47\x75\x5a\x01\x87\xee\xe9\x19" + "\x22\x89\x35\x23\x9d\xd3\x53\x9e\x9f\xc4\x2a\xc7\xd3\x73\xa7\xa8\x2d" + "\xd5\x44\x37\x76\x80\xd5\xc6\x73\xef\x80\x39\xf9\xfc\xff\x8c\x87\x93" + "\xc2\xe9\x44\x4f\x26\xff\xe3\xc3\x9a\xcf\xf0\xf4\xd4\x54\x6a\x14\x19" + "\xfe\x98\x65\xdc\x26\x2f\x95\x37\x54\x17\x60\xca\x1d\xf6\xc6\xe2\xa3" + "\xe5\xb4\x84\x80\x23\x46\x88\x42\x22\x03\x88\xd6\x5a\x17\x55\xa6\x28" + "\x63\xf8\xd8\xd7\x87\xd7\x7b\xa2\xb3\xcc\xb7\x3b\x5d\x92\x24\x42\xe2" + "\x9b\xc7\xdd\xa8\xf4\x7e\x9b\x65\x52\x02\x41\xed\x2c\x85\x6b\x91\xf6" + "\x09\x93\x6d\x6d\x6d\x29\xca\x2b\x63\x90\xa1\x1a\x75\xdc\x41\x8a\x83" + "\x15\x49\x91\x2a\x5e\xce\xe8\x54\x31\x50\xcb\x49\x0e\xe2\x6b\x22\x54" + "\x64\xff\xfb\x74\xc4\xe8\x00\x0e\xcd\x0b\x57\xec\x24\x74\xc1\xef\x2f" + "\xaa\xfd\x83\x0a\x98\x59\x1c\x46\x28\xa7\x49\x1b\xa1\x27\x1e\xed\xc5" + "\x9a\x7d\x1c\x6a\x91\xe2\x1f\xfa\x84\x4c\x72\x71\xc3\xe3\x45\xcc\xd0" + "\xf3\x5f\x01\x38\x3b\x6a\xab\xa6\x0b\xd4\xb4\x2d\x5d\x48\x20\x8e\xa3" + "\x54\x4b\x10\x19\x14\xf9\x67\xed\x85\x31\x15\x4a\xd2\xf3\xae\xe1\xad" + "\xd4\x15\xf6\x8f\x4c\xc4\x14\x62\x01\xb9\xbf\x86\x11\x9a\xc6\x18\x79" + "\xb0\x0a\xb3\x0b\xb2\xd0\xa1\x46\x10\x76\x8f\x73\xad\x9a\x5b\x18\x7b" + "\x4a\x6c\x61\x1e\x8a\xb5\xb2\x25\x91\xce\x56\x64\x67\xd6\x38\xc5\x56" + "\x54\x7a\x36\x44\x6a\xa7\x73\x1b\x0e\x8f\x1e\x30\x48\xa1\xe2\x87\x0a" + "\x1e\x61\xb8\xcc\x36\x1c\x1e\xbf\xc9\xdd\xe7\x7f\xfb\x7b\x32\x90\x93" + "\x0a\x54\x7e\xab\xe8\x2d\x8c\x9e\xf8\x2c\xb2\x73\x09\x6c\x68\x10\x83" + "\xd9\xaf\xf4\x05\x05\xc8\xb0\xd1\xa8\xa8\x11\x30\x84\x0b\x05\xe2\x89" + "\x72\xe4\x35\x66\x79\x67\x50\x4b\xc8\xb5\xe6\xe7\x39\x85\x6a\x46\xef" + "\x39\xde\xfd\x5f\x52\x1f\xba\xcd\xc2\x81\x33\x9f\x7a\x38\xe3\xcb\x94" + "\x59\x4a\xba\x94\xd9\x90\x8c\xc8\xc2\x00\x84\x76\x1f\x19\xea\xf2\x99" + "\xba\x11\x5a\x57\xeb\x22\x25\x4e\xee\x4d\x89\xe6\x44\x35\x08\xc4\x77" + "\xe3\x58\x88\xf2\x23\x29\x19\x7c\xd5\x5f\xc9\xec\x35\x9d\xa6\x65\x0e" + "\xff\xfb\x74\xc4\xf4\x00\x0f\xa5\x63\x57\xec\x18\x75\x0a\x09\x2e\x2b" + "\xbd\x84\x96\x99\x1e\x88\x1d\x93\x84\x25\x5e\x07\x7f\x96\x08\x93\x30" + "\x0a\xdc\x68\x94\xcf\xf0\x1e\xf0\xea\x81\x49\xb7\xc2\x49\xa6\xd8\x80" + "\x41\xc1\x94\x1c\x31\x28\x12\x28\xed\xbd\xd8\xbe\x30\x6d\xf7\xef\xf1" + "\xfc\xa2\x4e\x24\xf0\xb4\xc5\x71\xd2\x44\xe6\x4e\xd9\xa2\x52\x40\xfd" + "\xb7\xe4\xf4\xb4\x88\x24\xaa\xe6\x62\x24\x08\x3b\xe9\x6c\x9f\x71\xad" + "\xbd\x17\x36\xe3\xf8\x7f\xff\x29\xf7\xd9\xb7\x77\xac\xac\x8c\x68\x86" + "\xb7\xf5\xb3\xb9\x6c\xab\xb1\x6f\x59\x77\xd4\x74\x5e\x43\x91\xe3\xad" + "\x67\xfc\x5d\xa2\x3a\xa9\x4a\xda\xc4\x8a\x3e\x8a\x9a\x50\x73\xd0\x54" + "\x0b\x37\x4c\x13\x06\x48\x5d\x94\x00\x00\x19\xc4\x9a\xa0\x26\x99\x66" + "\xdb\x93\x25\x72\x84\x14\xb4\xe8\xf0\x1c\xaa\xec\x45\xfc\x5c\x0d\x85" + "\xe4\x8d\x08\xbd\x52\xe2\xf1\xc9\xd7\xb2\x01\x46\x40\x0a\x84\x57\x33" + "\x06\x40\x06\x99\x73\x5e\x6c\xd3\xff\x17\x93\x91\x1e\xcf\xb3\xe5\x90" + "\x5e\xfc\x5e\x24\xba\x32\xca\x4a\x67\x72\x42\x51\xf3\x95\x47\x37\x8b" + "\x31\x05\x4c\xc9\xb8\x69\x15\xa5\x5a\x85\x9f\x4e\x87\xb4\x44\x9c\x97" + "\xe0\x6b\x65\xbe\x38\x1c\x87\xd7\x71\xcd\x62\xf7\xf9\x47\xfb\x07\x0c" + "\x38\x99\x52\x58\xe6\x2b\x7a\x41\x1b\xfa\x2e\x16\x4b\xc2\x1b\xff\xff" + "\xfb\x64\xc4\xf9\x80\x0f\x01\x81\x61\xec\x18\xb4\xe1\xdf\xb0\x2b\xfd" + "\xa3\x0a\xa4\x83\x02\x3f\xaa\xfd\xd0\xff\x55\x33\xbd\x8e\x5a\x78\x99" + "\x07\x71\x54\x0e\x89\x00\x00\x03\xed\x65\x33\x80\xc5\x50\xd0\x39\x30" + "\x60\xcb\xfd\x3c\x56\xba\x3e\xb5\x2c\x59\x75\xfd\xc7\x61\xd6\x8f\x0c" + "\x59\xab\x2f\xab\x4f\xae\x69\x6c\x53\x3b\x4d\x2d\x86\xb5\xe8\x5c\x5a" + "\xd0\x18\x75\xc9\xcb\x54\x64\x3b\x73\x6a\x68\xd2\xcc\xd2\x9b\xb7\x63" + "\xd0\x9f\x06\x49\xce\x8d\xa1\x4f\x8a\xc3\x5d\xd4\xd7\x1d\x5a\xc5\x2b" + "\x2e\x90\xdb\x83\x2b\x58\xc8\xc7\x3a\x83\x36\x5c\x03\xca\x22\xa7\xff" + "\x24\x9a\xb8\xeb\xba\x73\xc9\xff\x3d\xee\x9e\x44\xa9\x2f\x8d\x17\x9e" + "\xd1\x0b\xf3\xa4\xeb\x41\x85\xcd\xb5\xff\xf2\x42\x7b\xde\xff\xd3\xdf" + "\xe3\x15\x1c\xfa\x94\x96\x82\x71\x10\xa2\x90\x84\x83\x92\x20\x00\x09" + "\xc8\x6a\x80\x28\xe0\xa8\x68\xf8\x2c\x84\x04\x3c\x51\x77\x80\xc4\xaa" + "\x2b\xcc\x7a\x51\x0d\x4a\xe0\x18\x1e\xca\xb4\x7c\x53\x29\x6c\x42\xdc" + "\x83\x48\x72\x6a\x17\xe1\x6f\x24\x13\x04\x53\xe5\x9c\x5a\x59\xcb\xb6" + "\xaa\xff\xfb\x74\xc4\xef\x00\x0f\x9d\x81\x57\xec\x98\xb3\xc2\x47\x30" + "\x2a\xbd\x86\x19\xac\x4d\xee\xcd\xbc\x2b\xdc\xbf\xc3\x35\xd0\x40\xb6" + "\x25\xce\x91\x9e\x57\x9a\x54\x76\x2a\x72\xf5\x8a\x99\xef\xb2\xd5\x3c" + "\xfa\x85\x63\x9a\xd2\x85\xc2\xe9\x30\xcf\xd7\xe0\x75\x65\xe2\x77\x9b" + "\xfd\x24\x51\x63\x35\x1e\x69\x53\xdc\x44\x14\xb8\xa3\xea\x6e\xac\x89" + "\x04\xda\xb5\x8a\xa8\x18\xa4\x66\x2e\xa3\x20\x00\x07\x15\x0d\xa4\xd0" + "\x80\x61\xd1\x1d\x52\x0d\xb2\x7a\x02\xdd\x25\x8c\xb1\x8a\xb4\xe5\xb5" + "\x84\x45\xbf\x56\x64\x21\xab\x27\x94\x46\x21\xa9\x5c\xee\xd3\x4d\xbd" + "\xd3\x8b\x38\xef\x34\x28\x56\x70\x88\x94\xd5\x08\xe2\xb4\xb3\x1d\x47" + "\x5b\x61\x4c\xc9\xb2\x16\x31\x05\xb2\x2f\x1f\xd5\xd7\xc2\xe4\x44\x53" + "\xa4\xe9\x57\x69\x4f\x16\x72\xbf\x2b\x39\x2a\xdd\x15\x04\x1b\xaa\x81" + "\x9e\x8f\x71\x82\xc6\x22\x0a\xa8\x98\xa8\xc5\xe2\x63\xf8\xc1\xd1\x25" + "\x67\x15\xff\xf2\x18\x76\x20\x24\xf9\x1f\xa6\xea\x26\x26\x99\xe1\xdc" + "\x19\x91\x18\x7d\x40\x03\xc5\xb1\x21\x2c\xd1\x33\x88\xf7\x05\x18\x20" + "\xa1\xf8\x89\x12\xe3\xe7\x17\x7c\x5a\xfc\x0e\xe5\xa7\xd0\xe0\x0c\xde" + "\x2e\xfc\xb0\xfb\xb2\xe6\x57\xfa\x06\x06\xdf\xa7\xac\xdc\x46\x95\x91" + "\x49\xe3\x6c\xc1\x65\xd9\x76\x63\x70\xdc\xe1\xc7\xe5\x3a\x34\x59\x0e" + "\xff\xfb\x74\xc4\xed\x00\x12\x2d\x81\x53\xec\x99\x37\x61\xfc\x2f\xaa" + "\x3d\x91\x97\x61\x42\xb6\xdd\x26\x3b\xda\x89\x08\x89\xc4\xbe\x18\x40" + "\x09\x04\x26\xf8\x89\xc5\xd0\xa0\xbb\x1f\x47\x65\x52\x8d\x93\xf2\x99" + "\xa9\xe1\x9f\xaf\x5f\x4b\xd1\x74\xeb\x0b\xe9\x2b\xd6\x34\x4d\xbd\x17" + "\xcc\xa7\x59\x55\x8b\x31\xba\x18\xa0\x9f\x89\x7f\xf7\x12\x6a\x24\xd7" + "\xe7\x4e\x5e\xd0\x3e\x60\x74\x3a\x76\xed\x47\x11\x12\xd3\x84\xce\x99" + "\xb9\xe4\xcc\xae\x5e\xec\xb0\xbb\x56\x4c\xb4\x71\x32\x4f\x31\xed\x31" + "\xac\x24\x47\x7a\xd5\xaa\xac\x07\xb7\x67\x0f\x1a\x00\x00\x4d\xa3\x48" + "\xf4\x57\x0a\x35\x40\x45\x04\x22\x5a\xd0\x4d\xa4\x38\x2a\x2c\x1c\x95" + "\xef\x01\x66\xf4\xa4\x19\x61\x04\x43\x95\x8f\xc6\xa4\x43\x0e\xe7\xc0" + "\xa7\x5c\x73\xb0\x8c\x53\xa0\xf5\x8b\x15\x4c\x6d\xb3\xc5\x6b\x58\x67" + "\xa8\x41\xa9\x04\xe8\xbe\x47\x0f\x65\xed\x18\xce\xfa\xd8\xcd\x58\x5c" + "\xf6\xa5\x44\xfb\x9c\xd8\xcd\x9d\xba\xf1\xe9\x6a\xde\x9d\x1c\x62\x30" + "\x87\xe0\x4f\x08\x24\x44\x5a\xe5\x04\x75\xe2\xc8\xca\xf9\xa4\xf9\x6b" + "\x33\x63\x3f\xf9\xe3\x1a\x1e\x87\x45\xa1\xf9\x86\x91\xce\xc9\xe7\xee" + "\x89\x8a\xfc\x97\xe7\x6d\x86\x3d\x6e\x45\x06\xad\xfc\x9d\xb9\xb7\x5d" + "\xde\x39\x3e\x42\xc0\xe7\x2b\x64\x02\x7e\x8c\xaf\x44\x64\x8e\x12\xff" + "\xfb\x84\xc4\xea\x00\x50\x59\x7f\x57\xec\x18\xb6\xea\xb2\x2f\xe9\xbd" + "\x93\x33\x14\x11\x3a\x9b\x37\x31\x80\x93\xfc\x54\x35\x17\x60\xe8\xac" + "\xd9\xd1\x52\x00\x80\x11\x6c\x48\x0b\x5a\xa1\x78\x84\x6b\x40\xb4\x02" + "\xa7\x26\xb2\x4d\xe3\x03\xf5\xcc\x28\x8e\x7a\xce\xf1\x12\x9d\x8d\xc6" + "\x3e\xad\x48\x2e\xda\xa2\x6a\x0c\x37\xcd\x91\x63\x4d\x02\x05\xb1\x35" + "\x31\x4b\xc7\xf9\x8f\xb9\x6f\x7d\x51\xb1\xee\xe0\x45\xac\x48\xaf\x73" + "\xff\xb6\x35\xe9\x9c\x5a\x94\xbf\xf0\xb3\x6c\xea\x0e\x37\xe5\x83\xac" + "\xe2\xd8\x8d\x4f\x9a\xfc\x5f\xf9\x3d\xef\x7b\x62\x78\xb1\xb7\x4f\xfe" + "\x75\xfe\x7e\x7f\xff\xff\xfd\xab\xff\xff\xfc\xcd\x9b\x6b\x75\xff\xe6" + "\xfa\x85\x58\x8f\x96\x6a\xc2\x65\xcd\xd3\x55\x32\x48\x76\x97\xa9\x4b" + "\xa0\xb0\x20\x24\xc6\x23\x77\xac\x04\x6b\x12\x22\x08\x47\xe0\xc2\x41" + "\x40\x84\x21\xfc\x60\xc3\x31\x83\x42\x00\xd3\x40\x61\x50\xe0\xe6\x33" + "\x11\x16\xcc\x50\x40\x32\xb8\xc8\xcb\x42\x50\xc5\xf9\x5b\x37\x68\xaa" + "\x11\xe7\x08\x1b\x01\x02\x80\x88\x2a\x25\xc5\x51\x80\x32\x96\x4a\x09" + "\x21\x03\x33\xa3\x4d\x50\xcf\x8d\x40\x61\x20\x70\x81\x11\x55\x0d\x7d" + "\xa1\xf0\x31\x3a\x89\x32\xa4\xd3\x79\x9d\x22\x73\x33\x53\x65\xb3\x61" + "\x6b\x39\xb3\x8b\xa1\x9c\xa6\xa5\x87\xb9\x88\xdf\x52\xd6\x96\xc9\x5e" + "\x85\xd3\x29\xca\x1f\x99\x6e\x0f\x82\xc3\xe9\x93\xc6\x9c\x47\xca\x21" + "\x00\x2e\xe7\x49\x95\x3b\x2e\x15\x3d\xd9\x24\xa5\xe7\xb3\x3d\x13\x94" + "\x3a\x93\x71\x38\x1e\x16\xf5\x38\xf4\xb1\x17\xe6\xff\xfb\x84\xc4\xef" + "\x80\x12\x75\x81\x55\xec\x3c\xd0\xe2\x69\xaf\xeb\x7e\xb2\xf0\x04\x25" + "\x11\x8e\x5a\x82\xa4\x94\xb4\xf7\x6d\x47\xa0\x88\x8c\x69\xd0\x95\x41" + "\x31\x76\x58\xcc\xda\xdb\xb7\xab\x54\x34\xd2\x9d\xc4\x67\x60\xa9\x4c" + "\xbb\x92\xfa\x48\x1a\x01\xdd\x06\x7f\x7e\x93\xac\x32\x10\xe8\x4e\xcb" + "\xe6\xdd\xfa\x68\x1e\x57\x45\x2b\x76\xb6\xf4\xd2\xc3\x35\x2a\xda\x81" + "\xa6\xa5\xf2\x5d\x55\xfa\xb5\xf9\x2a\xb9\x8e\xaa\x53\x4a\x1f\x8a\x4d" + "\xd8\xd6\x19\xd4\xe7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd" + "\xea\x1b\xdb\xef\xe5\xf8\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + "\xff\xfc\xc4\xf5\x75\x49\x35\xb9\xa8\x5a\xda\x45\x04\x6e\x48\x98\x4b" + "\x7c\xd3\x3c\xa0\x05\x86\x24\x19\x9d\x47\xd1\x9d\x88\xc5\x5f\xd7\xa1" + "\x69\xca\xe3\x2f\x78\x29\x12\xe4\x4c\x0a\x9d\x09\x07\x9a\x1d\x2f\x61" + "\x21\x79\xb0\x48\x1f\x8a\x97\x58\xf3\x65\x94\xd6\xcb\x98\xe9\x55\x37" + "\x55\xb7\xa8\x5a\x36\x52\x31\xb9\xab\xb2\x1f\x26\xee\xea\x1c\xc3\x78" + "\xfe\x1f\x48\xef\x6f\x51\x1c\x32\x99\xed\xbf\xde\x72\xcb\xe3\xe1\x95" + "\x2d\x5e\x90\x2f\xff\xff\x86\x57\x2f\xff\xff\xdf\x5f\xff\xeb\x5f\x2f" + "\x86\x7c\x42\x6d\x86\x7f\xe7\xab\x51\x5e\xcc\x98\xa5\xbd\x97\x47\x83" + "\x75\x0b\x23\x6d\xc4\xce\x60\x25\x94\x98\x40\x58\xe0\x18\xd0\x23\x65" + "\x49\xe2\x40\x95\x52\x05\x17\x0f\x03\xe9\xd5\xa1\x5a\x79\x71\x61\xdd" + "\x66\x6f\x95\x36\xe4\x8b\xe5\x73\xc9\xe8\x1d\x6e\xd5\xcf\x1e\x53\xca" + "\x3b\x12\xbf\xab\x97\xed\x5f\x02\xff\xfb\x94\xc4\xf6\x00\x25\x96\x05" + "\x55\xf9\xcd\x10\x01\xff\xaf\xeb\xbf\xb2\xb0\x04\xd4\x2a\xcd\xe2\xcc" + "\xa5\x77\xa8\x89\xb9\x15\x4d\x21\x82\x6a\x06\x6c\x5e\x27\x1b\xcd\x55" + "\xe2\x4a\xd0\xa1\x6c\x8c\xe4\x87\xfe\x14\x84\x6e\x7c\x33\x3a\x04\x07" + "\x57\xf9\xf5\x27\xf3\x4a\xdd\x5f\x93\x8c\x60\xa7\x70\x77\x40\x80\xdf" + "\xaa\xf3\x20\xb0\xc2\xec\x44\xe5\x48\x55\x03\x90\x48\xe3\x85\x14\x23" + "\x63\x61\x7f\x0c\xc5\x0e\x88\x20\x84\x24\x44\x70\xb1\x59\xa2\xce\x4c" + "\x34\x88\x68\x71\x5f\xae\xd5\xd6\x2a\xf8\xdf\xdc\xca\x24\x80\x09\x16" + "\xab\xdf\xb1\xba\xb4\x91\x7b\xb2\x88\xe3\xc8\x42\x8a\x85\x2f\xcc\x3a" + "\x43\x7a\x19\x93\x62\x13\xc5\xae\x26\x39\xe8\x95\xba\xda\xcd\x32\x51" + "\xf8\xc3\x0e\x83\x4d\x70\xb8\x81\x98\x67\xe7\xc9\xa2\x56\xd5\x6d\x5a" + "\xc6\x2a\x8e\x0a\x95\x37\xfd\x0b\xbf\xb3\x3b\x1d\xa4\x7d\x20\xb4\x47" + "\x06\xfd\x18\x23\xf8\xfc\xf4\x2e\x21\xbc\xda\x2e\xb3\x93\x37\x6b\x4d" + "\xa9\x49\xdb\x12\x82\x67\x44\xa2\x92\xbc\x44\x25\x2d\x0b\x3c\x15\x30" + "\xa8\xcb\x2a\xa5\xf2\xd6\x78\xcd\x30\x68\xea\x89\x72\xaa\xda\x5f\xee" + "\x31\xe0\x31\xe8\x3a\x69\xfc\x9f\x8f\x7c\x7e\xe6\x10\xa4\x81\x68\x4e" + "\x17\xb5\x40\x35\x10\xf3\x4a\x5e\x88\xd0\x2d\xfd\x54\x6e\x93\x6a\xc9" + "\x7d\x28\xa4\x24\x76\xd5\x09\x30\xb0\xf1\xcd\x3d\x5f\x3e\xf1\xcf\x7a" + "\x35\xef\x5b\x35\x4c\x7f\x3e\xdd\x57\x0a\x91\x03\x71\x94\x56\xd3\xba" + "\xac\xf2\xd7\xf7\xff\xf2\x1c\x5c\xa5\x43\x33\x87\x63\xb8\x04\xa5\xf7" + "\x7b\x52\x4e\xca\xc7\xf5\x0d\x61\x39\x06\xb5\xc8\x89\x60\xb4\xb6\x02" + "\x34\x1d\x82\x5e\x0a\xc0\x32\x71\xa6\x79\x55\x96\x2a\x34\xbb\x6c\xc1" + "\x9a\xf2\x91\xd2\xb3\xc2\x9b\x0a\x7c\x50\x67\x95\x69\xb1\x10\x32\xfc" + "\xe8\xff\xfb\x84\xc4\xd5\x00\x0f\xb5\x7f\x59\xed\x8c\x59\x01\xe5\xad" + "\xea\xfd\x83\x0a\xe0\xf9\x49\x43\x2c\x94\xdf\xcb\x0a\x1c\x22\x4a\x9c" + "\xd4\x55\x1d\x65\x8a\x21\x4b\x8d\x15\x15\x81\x9d\xf1\x39\x47\x8a\x8a" + "\x1b\xc9\x4d\x9d\xe3\x1d\x91\x25\x09\x18\x6e\xe9\x0e\xc4\x5b\x36\x94" + "\xe7\x6d\xcc\x64\x7f\xda\xa4\x6b\x37\xbb\x93\x45\x7d\xb5\x46\x91\x0b" + "\x7f\x93\xf6\x68\x2f\x06\x76\x96\xc2\xea\x6d\x46\xae\x87\xf4\x06\x90" + "\x60\x05\x10\x00\x6b\x03\x00\xe0\x51\xd2\xa7\x19\x29\x85\x1d\x2d\x30" + "\x66\x0c\x54\xe1\x61\x41\x02\xa0\x44\xf2\x6e\x2b\x22\xf1\x50\x1b\x88" + "\xa5\x83\xc4\x61\xac\x2f\x66\xe1\x05\x18\x3b\xd6\x5e\xde\x1b\xb4\x24" + "\x21\x98\xb2\x88\x90\x37\x99\xd0\xbb\x7a\x72\x50\x4a\xd6\xca\x24\x27" + "\x1d\x75\xb3\xae\x99\x79\xdb\x26\x0d\x53\x79\x40\x9f\x99\x74\x35\x74" + "\x1d\x04\x90\x4d\x15\xb7\xc9\x25\x2a\xc4\xde\xa4\x9b\x6a\xa6\x88\x8c" + "\xfa\x15\x07\xa0\xe2\x90\x6b\x68\x51\x85\x0f\x98\xc2\x95\x2e\xa5\x2e" + "\xd2\xbf\x8c\x0e\xf1\x62\x10\x1f\x33\xf2\xf0\xf3\x0d\x16\xab\x33\xc4" + "\x83\xa7\x7b\x76\x55\xb9\xb4\x79\xa7\x0a\x0e\xca\x88\x00\x18\xa5\x42" + "\xd5\x50\x42\x39\x31\xb0\x29\x54\x53\x15\x93\x4e\x58\xa8\x39\x17\xa5" + "\x2b\x26\x8b\x65\x93\x19\x56\x88\x21\x12\x39\x5f\x52\x48\xea\xef\xa2" + "\xd7\x75\xf3\xf1\x9c\x24\xe2\x90\x39\x1a\xc9\x3e\x76\x24\xc4\xa8\x0a" + "\xf3\xa4\x8c\xc4\x94\x5e\x4d\x57\xf9\x71\x82\x91\xab\x7c\x8e\xc6\x2f" + "\x8f\xcf\x24\xea\x13\xe7\x9b\x77\x2a\x0c\xcb\xf5\x8c\x5e\xff\xfb\x74" + "\xc4\xf7\x00\x10\x65\x81\x5b\xed\x19\x14\x81\xef\x30\x6b\x3d\x94\x0a" + "\xe1\x49\xc0\xc6\x09\x4b\xd3\xd9\x83\x42\x43\xc0\x84\x32\xcf\xf0\x90" + "\x0b\xeb\x5e\x5c\x47\xbc\xd8\x0c\xc3\xa5\x19\x75\x70\x92\x48\xa0\xd2" + "\xd4\x08\xbd\x63\x45\x2d\xd3\x09\x43\x82\x0e\x71\xa5\xb7\x16\x5e\x8f" + "\xad\x97\x93\x2a\xd2\xc4\x10\xb6\xc6\x38\x5a\xc9\x9a\xdb\xfd\xfd\x46" + "\x98\x37\x31\x10\x8c\x92\x5d\xd2\x62\x64\xb6\x86\x21\x70\x91\x91\xc4" + "\x0d\xd6\xa5\x83\xad\x34\xc3\x10\x53\x82\xc5\x91\x0e\xb5\x50\xa9\x9b" + "\x14\x3a\x15\x7a\x2f\x97\xc2\xd2\xbf\x79\x7f\xfa\xdb\x93\x77\xc1\x85" + "\x80\x07\x85\x8d\x4a\xc0\xa4\x8b\xb8\xa8\x6f\x16\xdc\xa2\xea\xef\x2e" + "\x92\xc1\x2b\xee\xb2\xbb\x1c\x40\xba\xd4\xc8\x0c\x4d\x88\xae\x24\x30" + "\xa1\x21\xa1\x15\xc6\x4a\x22\x90\x3b\xf1\xb2\x81\x34\xe6\x43\x3f\x00" + "\x7e\x0e\x68\x8d\x0c\x25\xe7\xfc\xf5\x1c\x60\x58\x6b\x5e\x59\x35\x82" + "\x4b\x24\x3b\xac\x86\x13\x3f\xa6\x7b\x81\xe4\x09\x59\xb3\xf1\x46\x02" + "\x51\x88\xa9\x99\x16\xd2\x7b\x2b\xda\x9f\xd0\x59\xde\x88\x54\x61\x47" + "\xbe\xa4\x20\x25\x74\x2b\x55\xef\x94\x2a\x19\xfd\x5a\x54\xfd\xf4\x33" + "\xab\x2b\x67\x7f\xea\xdd\x1f\x49\x0b\x81\xb5\x04\x02\x3b\x50\x54\x39" + "\xcf\x30\x1b\x76\x85\xbe\xed\x2b\xb2\xc4\x0b\x35\x8d\xff\xfb\x64\xc4" + "\xfd\x00\x12\x1d\x81\x4b\xcd\x18\xb5\x81\xcc\x23\x2b\xbd\x93\x0e\xa4" + "\x21\x40\xda\xbb\x4b\xe0\xc7\x25\x1a\x85\x52\x6c\xc0\x18\xc4\x94\x80" + "\x14\x32\x69\xba\xed\x9a\xfc\x71\xe5\x2f\xf2\x79\xad\x0e\x67\x52\x65" + "\xa3\xe3\xff\xc7\x36\x25\x3a\x82\x9a\xda\xb0\xa3\x20\x11\x03\xcd\x64" + "\x90\x6f\x36\x93\x9d\x57\x7c\x0b\x74\x29\x16\xc3\x72\xff\x7a\xaf\xf3" + "\xdc\xcb\xce\x57\x4e\xf5\xd4\xf9\xd4\x20\x38\xe8\x61\xce\xae\xfe\x9f" + "\xcd\x3d\xea\xea\x77\x43\x3e\x8c\xff\xff\xeb\x4c\x23\x1d\x23\x28\x57" + "\xe4\x8b\x0a\x54\x2c\xca\x35\x2d\xa9\x07\x66\x40\xce\x0d\x11\xd9\x2a" + "\x44\x04\x64\x71\x6b\x16\xc8\x30\x42\xde\x41\xb6\x7e\x8e\x01\xce\x6b" + "\xe8\x62\xd6\xda\x84\xca\xb8\xdc\x19\x4f\x19\x77\x9f\x4e\xfe\xb3\x4e" + "\x55\x47\x2b\xab\xa7\x23\xbb\x99\x00\x86\x49\x96\x70\x5a\x01\xa1\xac" + "\x42\x08\x22\x40\xa6\x1a\x49\x20\x47\xbc\xbd\x5e\x79\x28\xfd\x6f\xf2" + "\x6d\xcc\xc2\xb2\xba\xd5\xb2\x2e\xa8\xaf\x91\xc5\x09\x14\xa8\xa0\x27" + "\x9b\xc9\xee\xc8\x66\x5f\xce\x98\xc7\x27\xf4\x62\x75\x7f\xc4\xff\xfb" + "\x74\xc4\xe8\x80\x0e\x91\x05\x61\xec\x18\x74\xe1\xe4\x2e\x6b\xfd\x83" + "\x0a\xa5\x1f\xfe\x23\xcc\x57\x6e\x06\x60\xce\x2a\xbb\xca\x1c\x92\xb2" + "\x0d\x5c\x95\xd6\x42\x40\x91\x14\x5e\x42\x00\x31\x71\x90\xaf\x11\x60" + "\x18\x00\x1b\x68\x05\x52\x45\xf0\x82\xed\xc3\x5c\x26\x49\xc4\x9e\xfe" + "\x84\xc1\xa7\x39\xec\x2e\x7a\x8a\xff\x15\x66\x1a\xc4\x89\x5d\x63\x74" + "\xe6\x61\xc6\xc4\x8c\x46\x2f\xac\xda\x28\xdc\x73\xfe\x74\xf3\xa8\x8a" + "\xe5\x2a\x92\xa7\xcd\xbc\x7f\xc9\xb5\xfd\xd3\xeb\x17\x6b\xe9\x46\xfe" + "\xe7\xd4\xf8\x94\x25\x10\x1c\x70\xd3\x5f\xfc\x8b\x1d\xe5\x5d\xff\xfd" + "\xaa\xfc\x96\x3b\xff\x95\xe4\xaa\xe1\xc2\x28\x60\x82\x36\xca\x00\x10" + "\xdd\x4b\x8b\x0d\x8a\x09\x2b\x43\x93\x4b\x2a\x08\x32\x55\xf5\xd5\x09" + "\x51\xe6\xb8\xc4\xbe\x4a\xef\x4a\x5c\xdc\xb2\xc3\x72\x84\xca\xb1\x86" + "\xbd\xe8\x8a\x20\xc9\x96\x5d\x95\x54\x82\x4a\x7e\x4b\xf7\x23\x2e\x69" + "\xa4\xf1\x5d\x2d\x4a\xcb\x54\x44\x1d\x99\x7c\xc5\x7d\xa8\x28\x10\xa0" + "\x2e\x04\x2a\xc3\xfc\x48\x20\x8a\xd4\x24\x68\x90\xd4\x1b\xe1\xb0\x59" + "\xe5\xd6\xd0\x4c\x2f\x52\x38\x9d\x7a\x7f\x93\x9f\x11\x3b\xc4\xd5\x30" + "\xe2\xff\xe1\x57\xf0\x85\xa1\x13\xfe\xc1\x3a\x1d\xeb\x13\xe4\x2a\x89" + "\xa8\x1a\xa2\x74\x18\xe3\x69\xa4\xc4\x2b\x77\x11\x35\x69\xff\xfb\x64" + "\xc4\xf7\x00\x0e\xf5\x75\x61\xec\x98\xf5\x69\xd2\x2f\x2b\xbd\x83\x16" + "\xa5\x31\xd2\xfa\xd2\x97\x94\x43\x9e\x23\xe2\xc3\x18\x06\x71\x87\xd1" + "\x25\xa2\xd1\x6d\xfa\x7b\x36\x42\x1e\x81\x6e\x93\x32\x9c\x50\x69\x41" + "\xd9\x23\xb6\xae\x7a\xec\xd4\xed\xfc\x56\xce\xdd\x94\x4c\x43\xd6\xbf" + "\xba\x23\xc9\x6a\x93\xe4\x62\x0c\x3b\x33\xfb\xd7\xaa\xcf\xf5\xd9\x0e" + "\x49\x57\x3a\x5f\x5c\x9d\x90\x87\x33\x0e\xc7\x3b\xb3\x3b\x61\xaf\x36" + "\xf3\xfe\xa7\xfc\xd2\x67\x7b\x4b\xaf\xa6\x52\x4f\xbd\x8b\xd3\x55\xf3" + "\x7f\xe5\x27\x8e\x54\x3a\x45\xd9\xc5\x02\xd7\xf8\x44\xf3\x5f\x77\xfb" + "\x63\xa2\xa6\x23\x73\x87\x30\x9d\x0f\x79\x64\x68\xb2\x3a\xa5\xd6\x07" + "\x08\x5d\xa2\x01\x8b\xca\x92\x21\x60\xad\xa0\x19\x39\x21\x88\x65\x14" + "\xff\x8d\x41\xb2\x55\x8c\x67\x62\xa4\xad\x1e\x61\xfb\xbd\xc6\x5e\x4a" + "\x35\xcf\x46\x8c\x01\x98\x0c\x7f\xa8\xf7\x10\xa2\x14\xe7\x5e\xd9\x31" + "\xf3\x3d\x57\x97\xdf\xf7\x42\x59\xa1\xea\x22\xba\x4a\x5e\x1a\x9e\xbb" + "\x73\x58\x89\xa1\x4a\x87\x2b\x86\x56\xe7\x3b\x14\xa6\xa3\x37\xab\xff" + "\xfb\x74\xc4\xee\x00\x0e\x49\x3f\x5d\xed\x3d\x09\x81\xfc\x2e\xab\x3d" + "\x93\x0e\xa4\x5f\x5f\xb6\x9f\xd7\xa3\xf6\xf5\x68\x84\x6e\xf0\xba\xf8" + "\x3d\x89\x02\x34\x3e\x37\x6e\xa8\x29\xb2\xc0\x1b\x6b\x6d\x12\xc8\xc6" + "\x90\x18\x20\x19\xa5\x39\x02\x11\x54\x51\x04\x26\x59\xf2\xe5\x21\x0b" + "\x49\x9a\xce\xde\xa3\x8d\x45\x9f\x21\x1a\xb7\xeb\xfe\x61\x45\x32\xcf" + "\x9e\xe6\xbb\x0d\xb2\x7d\x1a\x36\x04\xee\x6d\x84\x16\x7d\x85\x93\x82" + "\x26\xe5\x77\xac\xe1\x51\x24\x04\x74\x78\xe8\x56\x54\x89\x8b\x47\x52" + "\xb1\x8c\xe4\x39\x9d\xdd\xae\xea\x73\xab\xbe\x5e\x9b\x5a\x5d\x17\xfb" + "\xb2\x95\x95\xfd\x13\xed\xfa\xcd\xed\x43\x30\x98\xc4\x42\x3c\x32\x9a" + "\xac\x6c\x1c\xc0\x82\xec\x6c\x5e\x98\x34\x23\x09\x46\xa1\x20\x82\x73" + "\xb2\x74\xb0\xc1\xe2\x0d\x38\xbc\xcc\xa0\x64\x27\x01\x60\x9f\x0d\x5e" + "\x06\x7f\x53\x01\xc0\x95\xd6\x82\x9c\xe9\x6f\xfb\xa6\xa8\xdd\x56\xf2" + "\xb5\x36\x07\x88\xd2\x46\xa5\x46\x16\x04\xea\x31\x2d\x2f\x3b\xe3\x77" + "\xa2\x46\xc1\xfb\xfc\x8f\xf7\xdc\xc1\x1d\xa5\x33\x32\xb2\x23\x9d\x15" + "\x5d\xae\x0d\xd9\x66\x49\x9e\x4d\x1e\xfb\x10\xf4\x3b\xcc\x63\x36\x8d" + "\xac\xa8\x65\xfd\xdb\x4b\x29\x1b\xbb\x37\xf9\x66\xdc\xc6\xd5\x4c\xe1" + "\xdb\xe1\x86\x0e\xda\x8c\xc1\x5c\xa6\xc2\x6b\x75\x6d\xa6\x80\xff\xfb" + "\x64\xc4\xfa\x80\x11\x09\x81\x57\xec\x3c\xcb\x01\xd6\xac\x2b\xbd\x93" + "\x0a\xa9\x64\x36\x67\x48\x2a\x23\x4b\x0a\x88\xd1\x10\x74\x08\x5b\xec" + "\x5e\x75\xc6\xfc\x35\xb0\x08\x11\xc6\x95\x79\xa9\x37\x48\xaf\x69\xc8" + "\xc4\x35\x24\x95\x9e\x44\xcd\x6f\x6b\x56\x06\x57\x52\x1b\x21\xc7\x9a" + "\xd4\x2e\x73\xcb\x98\xc1\x14\x05\x02\x84\x7f\x37\xa7\xa4\x35\x2c\xee" + "\xc9\xce\x14\x2c\xc1\x76\x31\x39\x64\x64\xf0\xb4\x6c\xfe\x4f\xcf\xa4" + "\x65\xe5\x97\xc3\x3b\xb6\xa6\x5a\x11\x96\xb8\xc8\x7f\x22\xf0\x85\x14" + "\x3c\x26\x7e\x57\xcc\x6e\x0e\x12\x42\xdd\x9a\xd2\xc4\xa2\x69\x5a\x70" + "\x94\x46\x1d\x97\x1d\x06\xd2\xb0\x19\x32\x58\x01\x9e\x0a\xed\x30\x28" + "\xe4\xd7\xa9\x24\x1e\x03\x34\x47\xa7\xf5\xeb\x87\xd6\x12\x63\x2a\xb0" + "\x3c\xab\xb4\xd1\x2e\xd2\x58\xa3\xbd\x37\x4c\x95\xea\x80\x0a\x09\x04" + "\x8a\x60\x0a\xd8\x53\x44\x3e\x44\x52\x45\xe9\x69\x2e\xa7\x78\x27\x20" + "\x9e\xac\x72\x02\x2a\x51\x85\xc5\xce\x0a\x63\x95\x06\xa0\xae\x6e\xda" + "\x9d\xfb\x6e\x6d\xe4\x74\xe6\xb4\xd2\xea\xff\x31\x3f\x43\x9f\x27\x7b" + "\xff\xfb\x74\xc4\xe9\x00\x0e\xf5\x7b\x5b\xec\xa4\x54\x89\xd4\x2e\xea" + "\xbd\x83\x0a\x99\xdc\x9d\x0b\x22\x44\xe4\x9a\x03\xbe\x4a\x39\xf0\x36" + "\x32\x60\x0d\x94\x01\x12\x46\x1e\x41\xb0\x40\x2d\x60\x59\xa5\x2a\x13" + "\xdc\x60\xe6\xc6\x05\x0d\x43\xa8\x56\x08\x2a\x1b\x01\x99\x1e\x32\xd0" + "\xb3\x27\x6d\x45\x80\x72\x68\x6b\x96\x60\xa1\xce\x3d\xe4\x5c\x61\x48" + "\x48\xd7\x11\x6c\x59\x86\x07\xee\x63\xb5\x0d\x86\xd2\xa9\x1d\xe5\xf6" + "\x4b\xa4\xad\xdf\x3e\x5a\x9f\x88\xb9\xca\xbe\x74\x17\x9a\xc6\x6a\x91" + "\x4d\x4f\x15\xfe\xaa\xf1\xf7\x8d\xad\x25\x75\xbf\xff\xba\x5a\xff\xbc" + "\xaa\xe6\x8b\xfc\x53\x1b\xae\x45\x2d\x17\x29\x0b\x34\xd9\x54\xbc\xc0" + "\x72\x7d\x0b\x4e\xab\xb3\x48\xf1\xbb\x9a\x15\x6a\xf4\x89\xa4\x85\xa2" + "\x11\xa8\x21\x1f\x10\x0d\x45\xd0\x1e\x51\x96\x7e\x34\x63\xf9\xc0\x28" + "\x06\x35\x09\x1c\x80\xc9\x9d\x0a\x6c\x4b\x7d\x9e\xb4\x88\xab\xcd\x67" + "\x57\x5e\xbb\x19\x4a\x33\x05\x07\x33\x87\x4a\x4a\x43\xca\x1b\x42\x53" + "\x28\x8b\x90\xad\x73\x7b\xec\x1d\x1e\x69\x0c\x66\xcc\x66\xf7\xbe\x33" + "\xd9\xcf\x49\xb2\x0d\x09\xeb\x25\xed\x7d\xf0\xbf\x11\xde\x8f\xc9\x75" + "\x27\x3f\x67\x53\x29\x27\x39\x9d\x02\xa4\xe6\x57\xff\xfe\x54\x65\x45" + "\xe5\xab\x66\xe6\x51\xf9\xf0\xad\xf3\x1f\xf0\xf5\x7b\x71\x58\x35\xff" + "\xfb\x64\xc4\xf8\x00\x0e\xd5\x4b\x5d\xec\xb0\x71\x01\xdf\xae\x6b\x3d" + "\x81\x96\xe1\x71\x3b\x1b\x48\xa0\x40\x59\xa6\x11\x20\x66\x82\xd1\xf2" + "\x41\x8a\xb1\x87\x14\x6a\x3a\x99\x28\x18\x44\xc5\x65\xb2\x83\x9d\x61" + "\x4a\x23\x33\xec\x91\xb3\x63\xdb\x51\x4b\x35\xe1\xfb\xb5\xbf\x1c\x24" + "\x96\x88\x83\xd6\x92\xa4\x0a\x48\xd5\x6d\x18\x5c\x9c\x8e\x8d\x3e\xb6" + "\xcd\x7b\x62\x37\x1b\xad\xaf\xf9\x59\xde\xa1\x50\x5c\x4e\xe9\x95\x7e" + "\x37\x3d\x0b\x44\xdc\xa5\x52\x5d\x45\x52\x5e\x5b\x98\xaf\x08\xd2\xa1" + "\xfc\x23\x7a\x37\xd1\x94\xa2\xbe\x7c\x93\xbe\xad\xc2\xb7\xea\xe0\x9f" + "\x38\x12\xd0\xfd\x60\xb0\xb6\xce\x9a\xe8\xd9\x05\x87\x8d\x83\x86\x5c" + "\x1c\x04\xbd\x1d\x02\x6d\xb1\x40\xb8\x98\x92\xc4\x5b\xb6\xe5\x04\xd8" + "\x42\xc4\x03\x17\x8b\xb4\xed\x91\xb2\xd0\x3e\xf2\xda\x6c\x39\x0e\x7d" + "\x6b\x74\x91\xd9\x8a\x85\x93\x1b\xb3\xce\xb2\xd0\x22\x42\xb4\xd8\xbd" + "\x9a\x83\xdf\x2a\x3a\xca\x5b\xe2\x6f\x8a\xc8\x27\xfa\x1b\x8e\x8d\x96" + "\xfb\xb3\x2f\xcd\xbb\xf4\x67\xbd\x1c\xaf\x62\xd4\x1e\x4f\xe5\xb4\xca" + "\xad\xff\xfb\x74\xc4\xee\x00\x10\x4d\x89\x4d\xcc\xbd\x0c\x81\xe8\x30" + "\x2b\xbd\x83\x0a\xb4\x37\x55\x6f\x85\x6c\x88\xad\xb1\xf0\x6c\x5c\xb6" + "\x7f\xf6\xfd\x1e\x2b\x26\xcf\xe0\x59\x5b\xc5\x4d\x6c\x6c\x91\x0c\xe4" + "\x47\xf4\xcc\x25\x31\xc4\xa0\x53\x42\x11\x54\x4a\xc4\x18\x21\x6d\xe8" + "\xa0\x44\xe1\x9b\x2a\x02\x2e\x28\x70\x89\x73\x27\x5c\x8b\x44\x48\x31" + "\x40\x6b\x76\x22\x77\xb0\xad\x05\xd6\xaf\x1f\x97\x5a\xb9\x88\x29\x84" + "\xca\x20\xaf\x27\x39\x13\x88\xa4\x24\x56\xc2\xda\xa9\x37\x48\xa8\x8a" + "\x83\x7a\x8b\x84\x55\xb7\xae\xef\xed\x93\x3a\xec\x85\xb1\x2b\x4b\x71" + "\x5d\x35\x7a\xfb\xab\xd8\x96\x72\xaa\x55\xd1\xa3\xc4\xc5\x10\x82\xb4" + "\x51\x8f\x27\x8b\x7f\x5a\x09\x15\x6d\x16\x8a\x7d\xdb\x91\xa2\x6f\x09" + "\x83\x87\x17\x9e\xc6\x14\xec\xed\x1a\x2e\xb3\xd6\x0f\x29\xd1\x07\xb5" + "\xad\xa2\x19\xd8\xef\x01\xa2\xad\x11\xa6\x17\x4e\xc9\x32\x41\x36\x77" + "\x88\x45\x11\xdb\xa4\x35\x32\x71\xc2\x53\xee\xc6\x0a\xa2\x08\x34\x66" + "\x6e\x06\x1b\x43\x40\x5a\x4c\x37\x14\x20\x51\x0c\x16\x7b\x34\x58\x69" + "\x3b\x15\x76\xcf\x12\x5c\x29\xf7\x0e\x9a\xec\xf4\xca\xd4\xab\xef\x55" + "\xd4\x2c\xa2\x46\x6e\xa7\xcb\xd6\x6d\x47\x28\x3d\x14\xdc\xbb\x69\x1d" + "\x09\xdd\xcb\x64\xde\xc8\xea\x9f\xf3\xfb\xa7\x5e\x7d\xab\x64\x47\x15" + "\xff\xfb\x64\xc4\xf5\x00\x0f\x5d\x73\x53\xec\x98\x57\x01\xd8\x2e\xab" + "\xbd\x83\x0a\xe4\x95\xc8\xe7\x13\xc3\x98\x13\x05\x47\x57\x05\x92\xbc" + "\x80\x89\x3c\xb3\x3f\x75\xb1\x23\x49\xc4\x69\x33\x40\x51\x63\xc4\xa1" + "\xa7\x60\xd2\xa0\x87\xe0\xa1\x18\x83\xc1\xd8\x61\x61\x03\x00\x8b\x5e" + "\xab\x42\x48\xad\xc8\x72\x4c\x1e\x5e\xd4\x4f\x98\x31\x1e\xd6\xed\x47" + "\x5a\x86\x6e\xcd\x9a\x28\xca\x33\xf6\x21\x08\x03\x61\x14\x25\x04\x90" + "\x2f\x34\xde\x14\x81\x54\xfe\xa8\x0f\x2e\xd1\xf9\x56\xd0\xf3\x9a\xde" + "\xbb\x11\xa7\xa6\x45\x4b\xf4\xd3\xb8\xe4\x2e\x65\x75\x2a\x16\x8c\x92" + "\x27\xd5\xb4\xe8\xf3\x69\xf6\xbf\x43\xca\xc8\x91\x22\x1e\x71\xe5\x09" + "\x2b\x87\x09\x30\x80\x6f\x10\x1c\xd3\xd2\x31\x05\x0e\x03\xe3\x69\x14" + "\x59\x01\x28\xfa\x2a\x20\x22\x36\xe0\x22\x54\xb0\xc3\x33\x25\x89\x1c" + "\x41\xc3\x13\x1f\xa6\xea\x34\x60\xf0\xb0\x3b\x40\xab\x26\x52\xa7\x5b" + "\xbb\xfb\x19\x7b\x5e\xf7\x9e\x23\x45\x45\x0c\xc5\x6f\x50\x29\x07\x23" + "\x9a\x5d\x53\x2f\xaa\x30\x08\xe8\xbb\x79\x22\xaf\x26\xff\xb2\xaf\x71" + "\x57\x5e\xff\xfb\x74\xc4\xea\x00\x11\x8d\x83\x59\xed\x18\xb7\x61\xe2" + "\xaf\x2b\x7d\x84\x0a\x7c\xf3\xf6\xbc\xa6\x6b\xff\x26\xa5\x9d\xad\xea" + "\x77\xc6\xee\x57\xef\x0f\xd4\xb5\x2a\x79\x1f\x41\xb1\x63\xcc\x4f\xfe" + "\x5b\xff\xd5\x3d\x5f\xf0\xe7\x8e\x12\x30\x49\x1b\x49\x16\xab\xbf\x15" + "\x72\x35\x5f\x90\x68\x18\xc3\x3f\x19\x40\x00\xc9\x85\xd0\x70\x8c\x28" + "\x96\x82\x02\x42\x82\x93\x06\x2e\x03\x58\x34\x72\xce\x38\xb0\xac\x91" + "\xfb\x79\x18\x12\x55\x23\xdb\x05\xd4\xaa\xdd\x37\x25\x2a\x97\x72\x38" + "\xcd\x2b\xe9\x8b\xbc\x10\x28\x92\x0f\xc5\x5a\x17\x84\x93\xc2\xe5\xb3" + "\x66\x9d\xe1\xf2\xe9\x0d\xcd\x1b\x2d\xb7\x29\x20\x61\xce\xb3\x6b\xdc" + "\xac\xac\x55\x47\xb3\xeb\x23\x72\xa8\xe9\xa8\x5d\xcd\xec\x58\x55\x71" + "\x8e\x68\x96\xbf\xf8\x69\xa2\xff\xe4\xcb\xc6\xa4\x57\xf9\x5b\xd3\xd7" + "\xc9\xb5\xfb\x5f\xf5\xc8\x84\x3e\xc4\x2b\x07\x8d\x25\x05\x47\x46\x0c" + "\x5f\xc8\xa2\x69\xac\xa0\xa7\x17\xb2\x2e\xd2\x48\x00\x0e\x19\x07\xb6" + "\x01\x32\x03\x52\xdc\xc5\x20\x49\x60\x53\x62\xc1\xc4\xeb\x03\x09\x98" + "\xc6\x0a\x4a\xe5\xbc\xe4\xce\xa4\x32\xee\x69\x40\x1b\x33\x77\xa0\x15" + "\x1b\x8f\x4a\x89\xc9\x48\x51\x51\xa8\xdd\xaf\x2e\x7a\x9d\x52\xbd\x12" + "\xc4\xc0\x42\xb0\x46\xca\xb1\xa8\x08\x41\x4f\x4c\xae\x8c\x19\x8c\x08" + "\xd8\xff\xfb\x74\xc4\xed\x00\x10\x0d\x81\x53\xec\x98\xb7\x01\xf4\x2f" + "\xe9\xbd\x93\x1e\xe8\x2a\x84\x01\xf8\xdf\xed\x05\x78\x5d\x8d\x4b\xc1" + "\x90\x98\xe1\x73\x82\x83\x0a\xa1\x42\x18\x30\x6c\x5d\xc3\x03\x93\xcf" + "\xc2\x8d\x6d\x13\xad\x20\x62\x29\x30\xdc\x5c\x05\xdd\x5a\x4f\x04\x4b" + "\x15\x19\x85\x0b\x8f\x65\x6a\x7b\x42\x35\x53\x40\x1d\xae\xd1\x34\x4b" + "\xca\xa7\x09\x34\x23\x63\x65\x41\x80\x11\x90\xea\x18\x9b\x45\xcd\x5b" + "\xb0\xd4\x5c\xb9\xad\x37\xf1\xeb\x01\xe1\x53\x32\x96\xfe\x44\x26\x37" + "\x53\x42\xc8\x89\x01\xa5\x59\x59\x13\x5e\xfa\xa8\x61\xaa\x92\xe7\x59" + "\xad\x8a\x16\x7a\xa9\x42\x91\xac\x60\xa0\x2c\xce\x02\x27\xcd\x5d\x4b" + "\x01\x18\x08\xe1\x2e\x6d\x56\x7c\x3f\x3f\xfa\xb1\x9b\xf6\x6d\x54\x29" + "\x61\x52\xab\x16\x13\x6e\xff\x37\x1c\x8a\x82\x8b\x8b\xbf\xff\xff\x2a" + "\x69\x23\x8d\x84\xef"; diff --git a/platformio.ini b/platformio.ini index 03f1d73..77a36a0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,8 +9,8 @@ ; https://docs.platformio.org/page/projectconf.html [env] -platform = espressif32 @ 6.1.0 -framework = espidf, arduino +platform = espressif32 @ 6.8.1 +framework = espidf monitor_speed = 115200 monitor_rts = 0 monitor_dtr = 0 diff --git a/sdkconfig b/sdkconfig index 2aee0ed..ef352c1 100644 --- a/sdkconfig +++ b/sdkconfig @@ -1,43 +1,273 @@ # # Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) Project Configuration -# +# Espressif IoT Development Framework (ESP-IDF) 5.3.0 Project Configuration +# +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" +CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" +CONFIG_SOC_DPORT_WORKAROUND="Not determined" +CONFIG_SOC_CAPS_ECO_VER_MAX=301 +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_DAC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_EMAC_SUPPORTED=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_MPU_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 +CONFIG_SOC_XTAL_SUPPORT_26M=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT=y +CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 +CONFIG_SOC_ADC_PATT_LEN_MAX=16 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=0 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_IDCACHE_PER_CORE=y +CONFIG_SOC_CPU_CORES_NUM=2 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=64 +CONFIG_SOC_DAC_CHAN_NUM=2 +CONFIG_SOC_DAC_RESOLUTION=8 +CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=40 +CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF +CONFIG_SOC_GPIO_IN_RANGE_MAX=39 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=33 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA +CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=2 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=16 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_APB=y +CONFIG_SOC_I2C_STOP_INDEPENDENT=y +CONFIG_SOC_I2S_NUM=2 +CONFIG_SOC_I2S_HW_VERSION_1=y +CONFIG_SOC_I2S_SUPPORTS_APLL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 +CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y +CONFIG_SOC_I2S_SUPPORTS_ADC=y +CONFIG_SOC_I2S_SUPPORTS_DAC=y +CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA=y +CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD=y +CONFIG_SOC_I2S_LCD_I80_VARIANT=y +CONFIG_SOC_LCD_I80_SUPPORTED=y +CONFIG_SOC_LCD_I80_BUSES=2 +CONFIG_SOC_LCD_I80_BUS_WIDTH=24 +CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y +CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y +CONFIG_SOC_LEDC_CHANNEL_NUM=8 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 +CONFIG_SOC_MCPWM_GROUPS=2 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MMU_PERIPH_NUM=2 +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3 +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=8 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=8 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=64 +CONFIG_SOC_RMT_SUPPORT_REF_TICK=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT=y +CONFIG_SOC_RTCIO_PIN_COUNT=18 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y +CONFIG_SOC_SPI_AS_CS_SUPPORTED=y +CONFIG_SOC_SPI_PERIPH_NUM=3 +CONFIG_SOC_SPI_DMA_CHAN_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=3 +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=64 +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_TOUCH_SENSOR_VERSION=1 +CONFIG_SOC_TOUCH_SENSOR_NUM=10 +CONFIG_SOC_TOUCH_SAMPLER_NUM=1 +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=3 +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_REF_TICK=y +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y +CONFIG_SOC_SHA_ENDIANNESS_BE=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=y +CONFIG_SOC_RSA_MAX_BIT_LEN=4096 +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_192=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_SECURE_BOOT_V1=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_CLK_APLL_SUPPORTED=y +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_SDMMC_USE_IOMUX=y +CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_NAN_SUPPORT=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BT_CLASSIC_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED=y +CONFIG_SOC_ULP_HAS_ADC=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK=y CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" CONFIG_IDF_TARGET="esp32" +CONFIG_IDF_INIT_VERSION="5.3.0" CONFIG_IDF_TARGET_ESP32=y CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 -# -# SDK tool configuration -# -CONFIG_SDK_TOOLPREFIX="xtensa-esp32-elf-" -# CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS is not set -# end of SDK tool configuration - # # Build type # CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y -# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_APP_BUILD_TYPE_RAM is not set CONFIG_APP_BUILD_GENERATE_BINARIES=y CONFIG_APP_BUILD_BOOTLOADER=y CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set # end of Build type # -# Application manager +# Bootloader config # -CONFIG_APP_COMPILE_TIME_DATE=y -# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set -# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set -# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set -CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 -# end of Application manager # -# Bootloader config +# Bootloader manager # +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000 CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y # CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set @@ -50,6 +280,14 @@ CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y # CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set # CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + # CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y # CONFIG_BOOTLOADER_FACTORY_RESET is not set @@ -58,27 +296,53 @@ CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y CONFIG_BOOTLOADER_WDT_ENABLE=y # CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set CONFIG_BOOTLOADER_WDT_TIME_MS=9000 -# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y +# CONFIG_BOOTLOADER_APP_ANTI_ROLLBACK is not set # CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set # CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set # CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 # CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set -CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y # end of Bootloader config # # Security features # +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V1_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y # CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set # CONFIG_SECURE_BOOT is not set # CONFIG_SECURE_FLASH_ENC_ENABLED is not set # end of Security features +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_USB_OTG_NUM=-1 +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=-1 +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y + # # Serial flasher config # -CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 # CONFIG_ESPTOOLPY_NO_STUB is not set # CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set # CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set @@ -100,22 +364,13 @@ CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y # CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set CONFIG_ESPTOOLPY_FLASHSIZE="2MB" -CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set CONFIG_ESPTOOLPY_BEFORE_RESET=y # CONFIG_ESPTOOLPY_BEFORE_NORESET is not set CONFIG_ESPTOOLPY_BEFORE="default_reset" CONFIG_ESPTOOLPY_AFTER_RESET=y # CONFIG_ESPTOOLPY_AFTER_NORESET is not set CONFIG_ESPTOOLPY_AFTER="hard_reset" -# CONFIG_ESPTOOLPY_MONITOR_BAUD_CONSOLE is not set -# CONFIG_ESPTOOLPY_MONITOR_BAUD_9600B is not set -# CONFIG_ESPTOOLPY_MONITOR_BAUD_57600B is not set -CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y -# CONFIG_ESPTOOLPY_MONITOR_BAUD_230400B is not set -# CONFIG_ESPTOOLPY_MONITOR_BAUD_921600B is not set -# CONFIG_ESPTOOLPY_MONITOR_BAUD_2MB is not set -# CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER is not set -CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 # end of Serial flasher config @@ -132,69 +387,18 @@ CONFIG_PARTITION_TABLE_OFFSET=0x8000 CONFIG_PARTITION_TABLE_MD5=y # end of Partition Table -# -# Arduino Configuration -# -CONFIG_ARDUINO_VARIANT="esp32" -CONFIG_ENABLE_ARDUINO_DEPENDS=y -# CONFIG_AUTOSTART_ARDUINO is not set -# CONFIG_ARDUINO_RUN_CORE0 is not set -CONFIG_ARDUINO_RUN_CORE1=y -# CONFIG_ARDUINO_RUN_NO_AFFINITY is not set -CONFIG_ARDUINO_RUNNING_CORE=1 -CONFIG_ARDUINO_LOOP_STACK_SIZE=8192 -# CONFIG_ARDUINO_EVENT_RUN_CORE0 is not set -CONFIG_ARDUINO_EVENT_RUN_CORE1=y -# CONFIG_ARDUINO_EVENT_RUN_NO_AFFINITY is not set -CONFIG_ARDUINO_EVENT_RUNNING_CORE=1 -# CONFIG_ARDUINO_SERIAL_EVENT_RUN_CORE0 is not set -# CONFIG_ARDUINO_SERIAL_EVENT_RUN_CORE1 is not set -CONFIG_ARDUINO_SERIAL_EVENT_RUN_NO_AFFINITY=y -CONFIG_ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE=-1 -CONFIG_ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE=2048 -CONFIG_ARDUINO_SERIAL_EVENT_TASK_PRIORITY=24 -CONFIG_ARDUINO_UDP_RUN_CORE0=y -# CONFIG_ARDUINO_UDP_RUN_CORE1 is not set -# CONFIG_ARDUINO_UDP_RUN_NO_AFFINITY is not set -CONFIG_ARDUINO_UDP_RUNNING_CORE=0 -CONFIG_ARDUINO_UDP_TASK_PRIORITY=3 -# CONFIG_ARDUINO_ISR_IRAM is not set -# CONFIG_DISABLE_HAL_LOCKS is not set - -# -# Debug Log Configuration -# -# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_NONE is not set -CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_ERROR=y -# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_WARN is not set -# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_INFO is not set -# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_DEBUG is not set -# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_VERBOSE is not set -CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL=1 -# CONFIG_ARDUHAL_LOG_COLORS is not set -# CONFIG_ARDUHAL_ESP_LOG is not set -# end of Debug Log Configuration - -CONFIG_ARDUHAL_PARTITION_SCHEME_DEFAULT=y -# CONFIG_ARDUHAL_PARTITION_SCHEME_MINIMAL is not set -# CONFIG_ARDUHAL_PARTITION_SCHEME_NO_OTA is not set -# CONFIG_ARDUHAL_PARTITION_SCHEME_HUGE_APP is not set -# CONFIG_ARDUHAL_PARTITION_SCHEME_MIN_SPIFFS is not set -CONFIG_ARDUHAL_PARTITION_SCHEME="default" -# CONFIG_ARDUINO_SELECTIVE_COMPILATION is not set -# end of Arduino Configuration - # # Compiler options # -CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_COMPILER_OPTIMIZATION_DEBUG is not set # CONFIG_COMPILER_OPTIMIZATION_SIZE is not set -# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +CONFIG_COMPILER_OPTIMIZATION_PERF=y # CONFIG_COMPILER_OPTIMIZATION_NONE is not set -CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y -# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set -CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=1 # CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set CONFIG_COMPILER_HIDE_PATHS_MACROS=y # CONFIG_COMPILER_CXX_EXCEPTIONS is not set @@ -204,8 +408,13 @@ CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set # CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set # CONFIG_COMPILER_WARN_WRITE_STRINGS is not set -# CONFIG_COMPILER_DISABLE_GCC8_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set # CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +# CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING is not set +CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE=y # end of Compiler options # @@ -217,91 +426,374 @@ CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # # CONFIG_APPTRACE_DEST_JTAG is not set CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_UART2 is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 CONFIG_APPTRACE_LOCK_ENABLE=y # end of Application Level Tracing # -# ESP-ASIO +# Bluetooth # -# CONFIG_ASIO_SSL_SUPPORT is not set -# end of ESP-ASIO +CONFIG_BT_ENABLED=y +CONFIG_BT_BLUEDROID_ENABLED=y +# CONFIG_BT_NIMBLE_ENABLED is not set +# CONFIG_BT_CONTROLLER_ONLY is not set +CONFIG_BT_CONTROLLER_ENABLED=y +# CONFIG_BT_CONTROLLER_DISABLED is not set + +# +# Bluedroid Options +# +CONFIG_BT_BTC_TASK_STACK_SIZE=3072 +CONFIG_BT_BLUEDROID_PINNED_TO_CORE_0=y +# CONFIG_BT_BLUEDROID_PINNED_TO_CORE_1 is not set +CONFIG_BT_BLUEDROID_PINNED_TO_CORE=0 +CONFIG_BT_BTU_TASK_STACK_SIZE=4096 +# CONFIG_BT_BLUEDROID_MEM_DEBUG is not set +CONFIG_BT_BLUEDROID_ESP_COEX_VSC=y +# CONFIG_BT_CLASSIC_ENABLED is not set +CONFIG_BT_BLE_ENABLED=y +CONFIG_BT_GATTS_ENABLE=y +# CONFIG_BT_GATTS_PPCP_CHAR_GAP is not set +# CONFIG_BT_BLE_BLUFI_ENABLE is not set +CONFIG_BT_GATT_MAX_SR_PROFILES=8 +CONFIG_BT_GATT_MAX_SR_ATTRIBUTES=100 +# CONFIG_BT_GATTS_SEND_SERVICE_CHANGE_MANUAL is not set +CONFIG_BT_GATTS_SEND_SERVICE_CHANGE_AUTO=y +CONFIG_BT_GATTS_SEND_SERVICE_CHANGE_MODE=0 +# CONFIG_BT_GATTS_ROBUST_CACHING_ENABLED is not set +# CONFIG_BT_GATTS_DEVICE_NAME_WRITABLE is not set +# CONFIG_BT_GATTS_APPEARANCE_WRITABLE is not set +# CONFIG_BT_GATTC_ENABLE is not set +# CONFIG_BT_BLE_SMP_ENABLE is not set +# CONFIG_BT_STACK_NO_LOG is not set + +# +# BT DEBUG LOG LEVEL +# +# CONFIG_BT_LOG_HCI_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_HCI_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_HCI_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_HCI_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_HCI_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_HCI_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_HCI_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_HCI_TRACE_LEVEL=2 +# CONFIG_BT_LOG_BTM_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_BTM_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_BTM_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_BTM_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_BTM_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_BTM_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_BTM_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_BTM_TRACE_LEVEL=2 +# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_L2CAP_TRACE_LEVEL=2 +# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL=2 +# CONFIG_BT_LOG_SDP_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_SDP_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_SDP_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_SDP_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_SDP_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_SDP_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_SDP_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_SDP_TRACE_LEVEL=2 +# CONFIG_BT_LOG_GAP_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_GAP_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_GAP_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_GAP_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_GAP_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_GAP_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_GAP_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_GAP_TRACE_LEVEL=2 +# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_BNEP_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_BNEP_TRACE_LEVEL=2 +# CONFIG_BT_LOG_PAN_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_PAN_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_PAN_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_PAN_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_PAN_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_PAN_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_PAN_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_PAN_TRACE_LEVEL=2 +# CONFIG_BT_LOG_A2D_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_A2D_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_A2D_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_A2D_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_A2D_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_A2D_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_A2D_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_A2D_TRACE_LEVEL=2 +# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_AVDT_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_AVDT_TRACE_LEVEL=2 +# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_AVCT_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_AVCT_TRACE_LEVEL=2 +# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_AVRC_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_AVRC_TRACE_LEVEL=2 +# CONFIG_BT_LOG_MCA_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_MCA_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_MCA_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_MCA_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_MCA_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_MCA_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_MCA_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_MCA_TRACE_LEVEL=2 +# CONFIG_BT_LOG_HID_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_HID_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_HID_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_HID_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_HID_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_HID_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_HID_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_HID_TRACE_LEVEL=2 +# CONFIG_BT_LOG_APPL_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_APPL_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_APPL_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_APPL_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_APPL_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_APPL_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_APPL_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_APPL_TRACE_LEVEL=2 +# CONFIG_BT_LOG_GATT_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_GATT_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_GATT_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_GATT_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_GATT_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_GATT_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_GATT_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_GATT_TRACE_LEVEL=2 +# CONFIG_BT_LOG_SMP_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_SMP_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_SMP_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_SMP_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_SMP_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_SMP_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_SMP_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_SMP_TRACE_LEVEL=2 +# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_BTIF_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_BTIF_TRACE_LEVEL=2 +# CONFIG_BT_LOG_BTC_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_BTC_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_BTC_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_BTC_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_BTC_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_BTC_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_BTC_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_BTC_TRACE_LEVEL=2 +# CONFIG_BT_LOG_OSI_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_OSI_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_OSI_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_OSI_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_OSI_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_OSI_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_OSI_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_OSI_TRACE_LEVEL=2 +# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_NONE is not set +# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_ERROR is not set +CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_WARNING=y +# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_API is not set +# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_EVENT is not set +# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_DEBUG is not set +# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_VERBOSE is not set +CONFIG_BT_LOG_BLUFI_TRACE_LEVEL=2 +# end of BT DEBUG LOG LEVEL + +CONFIG_BT_ACL_CONNECTIONS=4 +CONFIG_BT_MULTI_CONNECTION_ENBALE=y +CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y +CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY=y +# CONFIG_BT_BLE_HOST_QUEUE_CONG_CHECK is not set +# CONFIG_BT_BLE_ACT_SCAN_REP_ADV_SCAN is not set +CONFIG_BT_BLE_ESTAB_LINK_CONN_TOUT=30 +CONFIG_BT_MAX_DEVICE_NAME_LEN=32 +# CONFIG_BT_BLE_RPA_SUPPORTED is not set +CONFIG_BT_BLE_RPA_TIMEOUT=900 +# CONFIG_BT_BLE_42_FEATURES_SUPPORTED is not set +# CONFIG_BT_BLE_HIGH_DUTY_ADV_INTERVAL is not set +# end of Bluedroid Options + +# +# Controller Options +# +CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y +# CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY is not set +# CONFIG_BTDM_CTRL_MODE_BTDM is not set +CONFIG_BTDM_CTRL_BLE_MAX_CONN=3 +CONFIG_BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF=0 +CONFIG_BTDM_CTRL_PCM_ROLE_EFF=0 +CONFIG_BTDM_CTRL_PCM_POLAR_EFF=0 +CONFIG_BTDM_CTRL_BLE_MAX_CONN_EFF=3 +CONFIG_BTDM_CTRL_BR_EDR_MAX_ACL_CONN_EFF=0 +CONFIG_BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF=0 +CONFIG_BTDM_CTRL_PINNED_TO_CORE_0=y +# CONFIG_BTDM_CTRL_PINNED_TO_CORE_1 is not set +CONFIG_BTDM_CTRL_PINNED_TO_CORE=0 +CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y +# CONFIG_BTDM_CTRL_HCI_MODE_UART_H4 is not set + +# +# MODEM SLEEP Options +# +CONFIG_BTDM_CTRL_MODEM_SLEEP=y +CONFIG_BTDM_CTRL_MODEM_SLEEP_MODE_ORIG=y +# CONFIG_BTDM_CTRL_MODEM_SLEEP_MODE_EVED is not set +CONFIG_BTDM_CTRL_LPCLK_SEL_MAIN_XTAL=y +# end of MODEM SLEEP Options + +CONFIG_BTDM_BLE_DEFAULT_SCA_250PPM=y +CONFIG_BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF=1 +CONFIG_BTDM_BLE_SCAN_DUPL=y +CONFIG_BTDM_SCAN_DUPL_TYPE_DEVICE=y +# CONFIG_BTDM_SCAN_DUPL_TYPE_DATA is not set +# CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE is not set +CONFIG_BTDM_SCAN_DUPL_TYPE=0 +CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE=200 +CONFIG_BTDM_SCAN_DUPL_CACHE_REFRESH_PERIOD=0 +# CONFIG_BTDM_BLE_MESH_SCAN_DUPL_EN is not set +CONFIG_BTDM_CTRL_FULL_SCAN_SUPPORTED=y +# CONFIG_BTDM_CTRL_SCAN_BACKOFF_UPPERLIMITMAX is not set +CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_SUPP=y +CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM=100 +CONFIG_BTDM_BLE_ADV_REPORT_DISCARD_THRSHOLD=20 +CONFIG_BTDM_RESERVE_DRAM=0xdb5c +CONFIG_BTDM_CTRL_HLI=y +# end of Controller Options + +# +# Common Options +# +CONFIG_BT_ALARM_MAX_NUM=50 +# end of Common Options + +# CONFIG_BT_HCI_LOG_DEBUG_EN is not set +# end of Bluetooth + +# CONFIG_BLE_MESH is not set # -# Bluetooth +# Console Library # -# CONFIG_BT_ENABLED is not set -# end of Bluetooth +# CONFIG_CONSOLE_SORTED_HELP is not set +# end of Console Library # -# CoAP Configuration +# Driver Configurations # -CONFIG_COAP_MBEDTLS_PSK=y -# CONFIG_COAP_MBEDTLS_PKI is not set -# CONFIG_COAP_MBEDTLS_DEBUG is not set -CONFIG_COAP_LOG_DEFAULT_LEVEL=0 -# end of CoAP Configuration # -# Driver configurations +# TWAI Configuration # +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC is not set +# CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST is not set +# CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID is not set +# CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT is not set +# CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM is not set +# end of TWAI Configuration # -# ADC configuration +# Legacy ADC Driver Configuration # -# CONFIG_ADC_FORCE_XPD_FSM is not set CONFIG_ADC_DISABLE_DAC=y -# end of ADC configuration +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set # -# MCPWM configuration +# Legacy ADC Calibration Configuration # -# CONFIG_MCPWM_ISR_IN_IRAM is not set -# end of MCPWM configuration +CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y +CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CAL_LUT_ENABLE=y +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration # -# SPI configuration +# Legacy DAC Driver Configurations # -# CONFIG_SPI_MASTER_IN_IRAM is not set -CONFIG_SPI_MASTER_ISR_IN_IRAM=y -# CONFIG_SPI_SLAVE_IN_IRAM is not set -CONFIG_SPI_SLAVE_ISR_IN_IRAM=y -# end of SPI configuration +# CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy DAC Driver Configurations # -# TWAI configuration +# Legacy MCPWM Driver Configurations # -# CONFIG_TWAI_ISR_IN_IRAM is not set -CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC=y -CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST=y -CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID=y -CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT=y -# end of TWAI configuration +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy MCPWM Driver Configurations # -# UART configuration +# Legacy Timer Group Driver Configurations # -# CONFIG_UART_ISR_IN_IRAM is not set -# end of UART configuration +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy Timer Group Driver Configurations # -# RTCIO configuration +# Legacy RMT Driver Configurations # -# CONFIG_RTCIO_SUPPORT_RTC_GPIO_DESC is not set -# end of RTCIO configuration +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy RMT Driver Configurations # -# GPIO Configuration +# Legacy I2S Driver Configurations # -# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set -# end of GPIO Configuration +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy PCNT Driver Configurations # -# GDMA Configuration +# Legacy SDM Driver Configurations # -# CONFIG_GDMA_CTRL_FUNC_IN_IRAM is not set -# CONFIG_GDMA_ISR_IRAM_SAFE is not set -# end of GDMA Configuration -# end of Driver configurations +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy SDM Driver Configurations +# end of Driver Configurations # # eFuse Bit Manager @@ -320,154 +812,133 @@ CONFIG_EFUSE_MAX_BLK_LEN=192 CONFIG_ESP_TLS_USING_MBEDTLS=y # CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set # CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set -# CONFIG_ESP_TLS_SERVER is not set +# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set +# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set # CONFIG_ESP_TLS_PSK_VERIFICATION is not set # CONFIG_ESP_TLS_INSECURE is not set # end of ESP-TLS # -# ESP32-specific +# ADC and ADC Calibration # -CONFIG_ESP32_ECO3_CACHE_LOCK_FIX=y -CONFIG_ESP32_REV_MIN_0=y -# CONFIG_ESP32_REV_MIN_1 is not set -# CONFIG_ESP32_REV_MIN_2 is not set -# CONFIG_ESP32_REV_MIN_3 is not set -CONFIG_ESP32_REV_MIN=0 -CONFIG_ESP32_DPORT_WORKAROUND=y -# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set -CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y -# CONFIG_ESP32_DEFAULT_CPU_FREQ_240 is not set -CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160 -CONFIG_ESP32_SPIRAM_SUPPORT=y +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set # -# SPI RAM config +# ADC Calibration Configurations # -CONFIG_SPIRAM_TYPE_AUTO=y -# CONFIG_SPIRAM_TYPE_ESPPSRAM16 is not set -# CONFIG_SPIRAM_TYPE_ESPPSRAM32 is not set -# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set -CONFIG_SPIRAM_SIZE=-1 -CONFIG_SPIRAM_SPEED_40M=y -CONFIG_SPIRAM=y -CONFIG_SPIRAM_BOOT_INIT=y -# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set -# CONFIG_SPIRAM_USE_MEMMAP is not set -# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set -CONFIG_SPIRAM_USE_MALLOC=y -CONFIG_SPIRAM_MEMTEST=y -CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384 -# CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is not set -CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768 -# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set -# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set -CONFIG_SPIRAM_CACHE_WORKAROUND=y +CONFIG_ADC_CALI_EFUSE_TP_ENABLE=y +CONFIG_ADC_CALI_EFUSE_VREF_ENABLE=y +CONFIG_ADC_CALI_LUT_ENABLE=y +# end of ADC Calibration Configurations + +CONFIG_ADC_DISABLE_DAC_OUTPUT=y +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration # -# SPIRAM cache workaround debugging +# Wireless Coexistence # -CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_MEMW=y -# CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_DUPLDST is not set -# CONFIG_SPIRAM_CACHE_WORKAROUND_STRATEGY_NOPS is not set -# end of SPIRAM cache workaround debugging +CONFIG_ESP_COEX_ENABLED=y +# CONFIG_ESP_COEX_SW_COEXIST_ENABLE is not set +# end of Wireless Coexistence # -# SPIRAM workaround libraries placement +# Common ESP-related # -CONFIG_SPIRAM_CACHE_LIBJMP_IN_IRAM=y -CONFIG_SPIRAM_CACHE_LIBMATH_IN_IRAM=y -CONFIG_SPIRAM_CACHE_LIBNUMPARSER_IN_IRAM=y -CONFIG_SPIRAM_CACHE_LIBIO_IN_IRAM=y -CONFIG_SPIRAM_CACHE_LIBTIME_IN_IRAM=y -CONFIG_SPIRAM_CACHE_LIBCHAR_IN_IRAM=y -CONFIG_SPIRAM_CACHE_LIBMEM_IN_IRAM=y -CONFIG_SPIRAM_CACHE_LIBSTR_IN_IRAM=y -CONFIG_SPIRAM_CACHE_LIBRAND_IN_IRAM=y -CONFIG_SPIRAM_CACHE_LIBENV_IN_IRAM=y -CONFIG_SPIRAM_CACHE_LIBFILE_IN_IRAM=y -CONFIG_SPIRAM_CACHE_LIBMISC_IN_IRAM=y -# end of SPIRAM workaround libraries placement +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related -CONFIG_SPIRAM_BANKSWITCH_ENABLE=y -CONFIG_SPIRAM_BANKSWITCH_RESERVE=8 -# CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY is not set +# +# ESP-Driver:DAC Configurations +# +# CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set +# CONFIG_DAC_ISR_IRAM_SAFE is not set +# CONFIG_DAC_ENABLE_DEBUG_LOG is not set +CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y +# end of ESP-Driver:DAC Configurations # -# PSRAM clock and cs IO for ESP32-DOWD +# ESP-Driver:GPIO Configurations # -CONFIG_D0WD_PSRAM_CLK_IO=17 -CONFIG_D0WD_PSRAM_CS_IO=16 -# end of PSRAM clock and cs IO for ESP32-DOWD +# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations # -# PSRAM clock and cs IO for ESP32-D2WD +# ESP-Driver:GPTimer Configurations # -CONFIG_D2WD_PSRAM_CLK_IO=9 -CONFIG_D2WD_PSRAM_CS_IO=10 -# end of PSRAM clock and cs IO for ESP32-D2WD +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations # -# PSRAM clock and cs IO for ESP32-PICO +# ESP-Driver:I2C Configurations # -CONFIG_PICO_PSRAM_CS_IO=10 -# end of PSRAM clock and cs IO for ESP32-PICO +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2C Configurations -# CONFIG_SPIRAM_CUSTOM_SPIWP_SD3_PIN is not set -CONFIG_SPIRAM_SPIWP_SD3_PIN=7 -# CONFIG_SPIRAM_2T_MODE is not set -# end of SPI RAM config +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations -# CONFIG_ESP32_TRAX is not set -CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 -# CONFIG_ESP32_ULP_COPROC_ENABLED is not set -CONFIG_ESP32_ULP_COPROC_RESERVE_MEM=0 -CONFIG_ESP32_DEBUG_OCDAWARE=y -CONFIG_ESP32_BROWNOUT_DET=y -CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set -CONFIG_ESP32_BROWNOUT_DET_LVL=0 -CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y -# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set -CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y -# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set -# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set -# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set -CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 -CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 -CONFIG_ESP32_XTAL_FREQ_40=y -# CONFIG_ESP32_XTAL_FREQ_26 is not set -# CONFIG_ESP32_XTAL_FREQ_AUTO is not set -CONFIG_ESP32_XTAL_FREQ=40 -# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set -# CONFIG_ESP32_NO_BLOBS is not set -# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set -# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set -# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set -CONFIG_ESP32_DPORT_DIS_INTERRUPT_LVL=5 -# end of ESP32-specific +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations # -# ADC-Calibration +# ESP-Driver:MCPWM Configurations # -CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y -CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y -CONFIG_ADC_CAL_LUT_ENABLE=y -# end of ADC-Calibration +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations # -# Common ESP-related +# ESP-Driver:PCNT Configurations # -CONFIG_ESP_ERR_TO_NAME_LOOKUP=y -# end of Common ESP-related +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations # # Ethernet @@ -481,11 +952,12 @@ CONFIG_ETH_RMII_CLK_IN_GPIO=0 CONFIG_ETH_DMA_BUFFER_SIZE=512 CONFIG_ETH_DMA_RX_BUFFER_NUM=10 CONFIG_ETH_DMA_TX_BUFFER_NUM=10 -CONFIG_ETH_USE_SPI_ETHERNET=y -# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set -# CONFIG_ETH_SPI_ETHERNET_W5500 is not set -# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set -# CONFIG_ETH_USE_OPENETH is not set +# CONFIG_ETH_IRAM_OPTIMIZATION is not set +# CONFIG_ETH_USE_SPI_ETHERNET is not set +CONFIG_ETH_USE_OPENETH=y +CONFIG_ETH_OPENETH_DMA_RX_BUFFER_NUM=4 +CONFIG_ETH_OPENETH_DMA_TX_BUFFER_NUM=1 +# CONFIG_ETH_TRANSMIT_MUTEX is not set # end of Ethernet # @@ -499,6 +971,10 @@ CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y # # GDB Stub # +CONFIG_ESP_GDBSTUB_ENABLED=y +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 # end of GDB Stub # @@ -506,7 +982,8 @@ CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y # CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y # CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set -# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set +CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set # end of ESP HTTP client # @@ -518,24 +995,45 @@ CONFIG_HTTPD_ERR_RESP_NO_DELAY=y CONFIG_HTTPD_PURGE_BUF_LEN=32 # CONFIG_HTTPD_LOG_PURGE_DATA is not set # CONFIG_HTTPD_WS_SUPPORT is not set +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set # end of HTTP Server # # ESP HTTPS OTA # -# CONFIG_OTA_ALLOW_HTTP is not set +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP=y # end of ESP HTTPS OTA # # ESP HTTPS server # -# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set # end of ESP HTTPS server # # Hardware Settings # +# +# Chip revision +# +# CONFIG_ESP32_REV_MIN_0 is not set +# CONFIG_ESP32_REV_MIN_1 is not set +# CONFIG_ESP32_REV_MIN_1_1 is not set +# CONFIG_ESP32_REV_MIN_2 is not set +CONFIG_ESP32_REV_MIN_3=y +# CONFIG_ESP32_REV_MIN_3_1 is not set +CONFIG_ESP32_REV_MIN=3 +CONFIG_ESP32_REV_MIN_FULL=300 +CONFIG_ESP_REV_MIN_FULL=300 + +# +# Maximum Supported ESP32 Revision (Rev v3.99) +# +CONFIG_ESP32_REV_MAX_FULL=399 +CONFIG_ESP_REV_MAX_FULL=399 +# end of Chip revision + # # MAC Config # @@ -543,43 +1041,69 @@ CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 # CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set # end of MAC Config # # Sleep Config # +# CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND is not set +# CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND is not set CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y # CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set -CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND=y -CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y -# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y # end of Sleep Config # # RTC Clock Config # +# CONFIG_RTC_CLK_SRC_INT_RC is not set +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +CONFIG_RTC_CLK_SRC_INT_8MD256=y +CONFIG_RTC_CLK_CAL_CYCLES=1024 # end of RTC Clock Config -# end of Hardware Settings # -# IPC (Inter-Processor Call) +# Peripheral Control # -CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 -CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y -CONFIG_ESP_IPC_ISR_ENABLE=y -# end of IPC (Inter-Processor Call) +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# Main XTAL Config +# +# CONFIG_XTAL_FREQ_26 is not set +CONFIG_XTAL_FREQ_40=y +# CONFIG_XTAL_FREQ_AUTO is not set +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +# end of Hardware Settings # # LCD and Touch Panel # +# +# LCD Touch Drivers are maintained in the IDF Component Registry +# + # # LCD Peripheral Configuration # CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set # end of LCD Peripheral Configuration # end of LCD and Touch Panel @@ -589,17 +1113,31 @@ CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 CONFIG_ESP_NETIF_TCPIP_LWIP=y # CONFIG_ESP_NETIF_LOOPBACK is not set -CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER=y +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set # end of ESP NETIF Adapter +# +# Partition API Configuration +# +# end of Partition API Configuration + # # PHY # +CONFIG_ESP_PHY_ENABLED=y CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y # CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 CONFIG_ESP_PHY_MAX_TX_POWER=20 CONFIG_ESP_PHY_REDUCE_TX_POWER=y +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set # end of PHY # @@ -608,21 +1146,106 @@ CONFIG_ESP_PHY_REDUCE_TX_POWER=y # CONFIG_PM_ENABLE is not set # end of Power Management +# +# ESP PSRAM +# +CONFIG_SPIRAM=y + +# +# SPI RAM config +# +CONFIG_SPIRAM_MODE_QUAD=y +CONFIG_SPIRAM_TYPE_AUTO=y +# CONFIG_SPIRAM_TYPE_ESPPSRAM16 is not set +# CONFIG_SPIRAM_TYPE_ESPPSRAM32 is not set +# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set +CONFIG_SPIRAM_SPEED_40M=y +CONFIG_SPIRAM_SPEED=40 +CONFIG_SPIRAM_BOOT_INIT=y +# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set +# CONFIG_SPIRAM_USE_MEMMAP is not set +# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set +CONFIG_SPIRAM_USE_MALLOC=y +# CONFIG_SPIRAM_MEMTEST is not set +CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=0 +CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y +CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536 +# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set +# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set + +# +# SPIRAM cache workaround debugging +# +# end of SPIRAM cache workaround debugging + +CONFIG_SPIRAM_BANKSWITCH_ENABLE=y +CONFIG_SPIRAM_BANKSWITCH_RESERVE=25 +# CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY is not set + +# +# PSRAM clock and cs IO for ESP32-DOWD +# +CONFIG_D0WD_PSRAM_CLK_IO=17 +CONFIG_D0WD_PSRAM_CS_IO=16 +# end of PSRAM clock and cs IO for ESP32-DOWD + +# +# PSRAM clock and cs IO for ESP32-D2WD +# +CONFIG_D2WD_PSRAM_CLK_IO=9 +CONFIG_D2WD_PSRAM_CS_IO=10 +# end of PSRAM clock and cs IO for ESP32-D2WD + +# +# PSRAM clock and cs IO for ESP32-PICO-D4 +# +CONFIG_PICO_PSRAM_CS_IO=10 +# end of PSRAM clock and cs IO for ESP32-PICO-D4 + +# CONFIG_SPIRAM_CUSTOM_SPIWP_SD3_PIN is not set +CONFIG_SPIRAM_SPIWP_SD3_PIN=7 +# CONFIG_SPIRAM_2T_MODE is not set +# end of SPI RAM config +# end of ESP PSRAM + # # ESP Ringbuf # # CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set -# CONFIG_RINGBUF_PLACE_ISR_FUNCTIONS_INTO_FLASH is not set # end of ESP Ringbuf # # ESP System Settings # +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 + +# +# Memory +# +# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set + +# +# Non-backward compatible options +# +# CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set +# end of Non-backward compatible options +# end of Memory + +# +# Trace memory +# +# CONFIG_ESP32_TRAX is not set +CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 +# end of Trace memory + # CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set # CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set -# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 # # Memory protection @@ -641,66 +1264,125 @@ CONFIG_ESP_CONSOLE_UART_DEFAULT=y # CONFIG_ESP_CONSOLE_UART_CUSTOM is not set # CONFIG_ESP_CONSOLE_NONE is not set CONFIG_ESP_CONSOLE_UART=y -CONFIG_ESP_CONSOLE_MULTIPLE_UART=y CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 CONFIG_ESP_INT_WDT=y CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 CONFIG_ESP_INT_WDT_CHECK_CPU1=y -CONFIG_ESP_TASK_WDT=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y # CONFIG_ESP_TASK_WDT_PANIC is not set CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y # CONFIG_ESP_PANIC_HANDLER_IRAM is not set # CONFIG_ESP_DEBUG_STUBS_ENABLE is not set -# CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set -CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5=y + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=0 +# end of Brownout Detector + +# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set +CONFIG_ESP32_ECO3_CACHE_LOCK_FIX=y +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y # end of ESP System Settings # -# High resolution timer (esp_timer) +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) # # CONFIG_ESP_TIMER_PROFILING is not set CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y # CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set -# CONFIG_ESP_TIMER_IMPL_FRC2 is not set CONFIG_ESP_TIMER_IMPL_TG0_LAC=y -# end of High resolution timer (esp_timer) +# end of ESP Timer (High Resolution Timer) # # Wi-Fi # -CONFIG_ESP32_WIFI_ENABLED=y -CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 -CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y -CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0 -CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16 -CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=32 -# CONFIG_ESP32_WIFI_CSI_ENABLED is not set -CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y -CONFIG_ESP32_WIFI_TX_BA_WIN=6 -CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP32_WIFI_RX_BA_WIN=6 -# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set -CONFIG_ESP32_WIFI_NVS_ENABLED=y -CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y -# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set -CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 -CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 -CONFIG_ESP32_WIFI_IRAM_OPT=y -CONFIG_ESP32_WIFI_RX_IRAM_OPT=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=8 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=0 +CONFIG_ESP_WIFI_STATIC_TX_BUFFER_NUM=16 +CONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +# CONFIG_ESP_WIFI_AMPDU_TX_ENABLED is not set +# CONFIG_ESP_WIFI_AMPDU_RX_ENABLED is not set +# CONFIG_ESP_WIFI_AMSDU_TX_ENABLED is not set +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +# CONFIG_ESP_WIFI_IRAM_OPT is not set +# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set +# CONFIG_ESP_WIFI_RX_IRAM_OPT is not set +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y # CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set -CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 +CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 +CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 +# CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE is not set # CONFIG_ESP_WIFI_GMAC_SUPPORT is not set -CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SOFTAP_SUPPORT is not set # CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +# CONFIG_ESP_WIFI_NAN_ENABLE is not set +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set # end of Wi-Fi # @@ -714,6 +1396,12 @@ CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y # # FAT Filesystem support # +CONFIG_FATFS_VOLUME_COUNT=2 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y # CONFIG_FATFS_CODEPAGE_DYNAMIC is not set CONFIG_FATFS_CODEPAGE_437=y # CONFIG_FATFS_CODEPAGE_720 is not set @@ -737,87 +1425,78 @@ CONFIG_FATFS_CODEPAGE_437=y # CONFIG_FATFS_CODEPAGE_949 is not set # CONFIG_FATFS_CODEPAGE_950 is not set CONFIG_FATFS_CODEPAGE=437 -CONFIG_FATFS_LFN_NONE=y -# CONFIG_FATFS_LFN_HEAP is not set -# CONFIG_FATFS_LFN_STACK is not set CONFIG_FATFS_FS_LOCK=0 CONFIG_FATFS_TIMEOUT_MS=10000 CONFIG_FATFS_PER_FILE_CACHE=y CONFIG_FATFS_ALLOC_PREFER_EXTRAM=y # CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set +# CONFIG_FATFS_USE_LABEL is not set +CONFIG_FATFS_LINK_LOCK=y # end of FAT Filesystem support # -# Modbus configuration -# -CONFIG_FMB_COMM_MODE_TCP_EN=y -CONFIG_FMB_TCP_PORT_DEFAULT=502 -CONFIG_FMB_TCP_PORT_MAX_CONN=5 -CONFIG_FMB_TCP_CONNECTION_TOUT_SEC=20 -CONFIG_FMB_COMM_MODE_RTU_EN=y -CONFIG_FMB_COMM_MODE_ASCII_EN=y -CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150 -CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200 -CONFIG_FMB_QUEUE_LENGTH=20 -CONFIG_FMB_PORT_TASK_STACK_SIZE=4096 -CONFIG_FMB_SERIAL_BUF_SIZE=256 -CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB=8 -CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS=1000 -CONFIG_FMB_PORT_TASK_PRIO=10 -# CONFIG_FMB_PORT_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_FMB_PORT_TASK_AFFINITY_CPU0=y -# CONFIG_FMB_PORT_TASK_AFFINITY_CPU1 is not set -CONFIG_FMB_PORT_TASK_AFFINITY=0x0 -CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT=y -CONFIG_FMB_CONTROLLER_SLAVE_ID=0x00112233 -CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20 -CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 -CONFIG_FMB_CONTROLLER_STACK_SIZE=4096 -CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20 -# CONFIG_FMB_TIMER_PORT_ENABLED is not set -# CONFIG_FMB_TIMER_USE_ISR_DISPATCH_METHOD is not set -# end of Modbus configuration +# FreeRTOS +# # -# FreeRTOS +# Kernel # +# CONFIG_FREERTOS_SMP is not set # CONFIG_FREERTOS_UNICORE is not set -CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF -CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y -CONFIG_FREERTOS_CORETIMER_0=y -# CONFIG_FREERTOS_CORETIMER_1 is not set -CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y CONFIG_FREERTOS_HZ=1000 -CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y -# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set -CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 -CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y -# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set -# CONFIG_FREERTOS_ASSERT_DISABLE is not set CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 -CONFIG_FREERTOS_ISR_STACKSIZE=1536 -# CONFIG_FREERTOS_LEGACY_HOOKS is not set +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 -CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y -# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 # CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set # CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set -CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +# CONFIG_FREERTOS_FPU_IN_ISR is not set +CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y +CONFIG_FREERTOS_CORETIMER_0=y +# CONFIG_FREERTOS_CORETIMER_1 is not set +CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y +CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set -# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of Port + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y CONFIG_FREERTOS_DEBUG_OCDAWARE=y -# CONFIG_FREERTOS_FPU_IN_ISR is not set CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y -# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=2 # end of FreeRTOS # @@ -825,9 +1504,10 @@ CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y # CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y # CONFIG_HAL_ASSERTION_DISABLE is not set -# CONFIG_HAL_ASSERTION_SILIENT is not set -# CONFIG_HAL_ASSERTION_ENABLE is not set -CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +# CONFIG_HAL_ASSERTION_SILENT is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=1 +CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y +CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y # end of Hardware Abstraction Layer (HAL) and Low Level (LL) # @@ -839,21 +1519,12 @@ CONFIG_HEAP_POISONING_DISABLED=y CONFIG_HEAP_TRACING_OFF=y # CONFIG_HEAP_TRACING_STANDALONE is not set # CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set # CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set # end of Heap memory debugging -# -# jsmn -# -# CONFIG_JSMN_PARENT_LINKS is not set -# CONFIG_JSMN_STRICT is not set -# end of jsmn - -# -# libsodium -# -# end of libsodium - # # Log output # @@ -868,6 +1539,7 @@ CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y # CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set # CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set CONFIG_LOG_MAXIMUM_LEVEL=3 +# CONFIG_LOG_MASTER_LEVEL is not set CONFIG_LOG_COLORS=y CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y # CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set @@ -876,13 +1548,19 @@ CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y # # LWIP # -CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="Tidbyt" # CONFIG_LWIP_NETIF_API is not set +CONFIG_LWIP_TCPIP_TASK_PRIO=18 # CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y # CONFIG_LWIP_L2_TO_L3_COPY is not set # CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y +# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set CONFIG_LWIP_MAX_SOCKETS=10 # CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set # CONFIG_LWIP_SO_LINGER is not set @@ -890,31 +1568,35 @@ CONFIG_LWIP_SO_REUSE=y CONFIG_LWIP_SO_REUSE_RXTOALL=y CONFIG_LWIP_SO_RCVBUF=y # CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP_DEFAULT_TTL=64 CONFIG_LWIP_IP4_FRAG=y CONFIG_LWIP_IP6_FRAG=y # CONFIG_LWIP_IP4_REASSEMBLY is not set # CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 # CONFIG_LWIP_IP_FORWARD is not set # CONFIG_LWIP_STATS is not set -# CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set CONFIG_LWIP_ESP_GRATUITOUS_ARP=y CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 -CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DOES_ARP_CHECK is not set # CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y -# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_RESTORE_LAST_IP=y CONFIG_LWIP_DHCP_OPTIONS_LEN=68 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 # # DHCP server # -CONFIG_LWIP_DHCPS=y -CONFIG_LWIP_DHCPS_LEASE_UNIT=60 -CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +# CONFIG_LWIP_DHCPS is not set # end of DHCP server # CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV4=y CONFIG_LWIP_IPV6=y # CONFIG_LWIP_IPV6_AUTOCONFIG is not set CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 @@ -930,7 +1612,7 @@ CONFIG_LWIP_MAX_ACTIVE_TCP=16 CONFIG_LWIP_MAX_LISTENING_TCP=16 CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y CONFIG_LWIP_TCP_MAXRTX=12 -CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=6 CONFIG_LWIP_TCP_MSS=1440 CONFIG_LWIP_TCP_TMR_INTERVAL=250 CONFIG_LWIP_TCP_MSL=60000 @@ -938,12 +1620,15 @@ CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744 CONFIG_LWIP_TCP_WND_DEFAULT=5744 CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=0 # CONFIG_LWIP_TCP_SACK_OUT is not set -# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set CONFIG_LWIP_TCP_OVERSIZE_MSS=y # CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set # CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +# CONFIG_LWIP_WND_SCALE is not set CONFIG_LWIP_TCP_RTO_TIME=1500 # end of TCP @@ -992,8 +1677,18 @@ CONFIG_LWIP_MAX_RAW_PCBS=16 CONFIG_LWIP_SNTP_MAX_SERVERS=1 # CONFIG_LWIP_DHCP_GET_NTP_SRV is not set CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +CONFIG_LWIP_SNTP_STARTUP_DELAY=y +CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 # end of SNTP +# +# DNS +# +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# end of DNS + +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 CONFIG_LWIP_ESP_LWIP_ASSERT=y # @@ -1008,9 +1703,15 @@ CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y # CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set # CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set # CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y +# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set # end of Hooks # CONFIG_LWIP_DEBUG is not set @@ -1019,8 +1720,8 @@ CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y # # mbedTLS # -CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y -# CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC is not set +# CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC is not set +CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y # CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set # CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y @@ -1030,13 +1731,14 @@ CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 # CONFIG_MBEDTLS_DEBUG is not set # -# mbedTLS v2.28.x related +# mbedTLS v3.x related # +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set # CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set # CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set # CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y -# end of mbedTLS v2.28.x related +# end of mbedTLS v3.x related # # Certificate Bundle @@ -1046,35 +1748,39 @@ CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y # CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set # CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set # CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 # end of Certificate Bundle # CONFIG_MBEDTLS_ECP_RESTARTABLE is not set -# CONFIG_MBEDTLS_CMAC_C is not set +CONFIG_MBEDTLS_CMAC_C=y CONFIG_MBEDTLS_HARDWARE_AES=y -CONFIG_MBEDTLS_HARDWARE_MPI=y +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +# CONFIG_MBEDTLS_HARDWARE_MPI is not set CONFIG_MBEDTLS_HARDWARE_SHA=y CONFIG_MBEDTLS_ROM_MD5=y # CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set # CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set # CONFIG_MBEDTLS_HAVE_TIME_DATE is not set CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y CONFIG_MBEDTLS_SHA512_C=y -CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT is not set # CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set -# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +CONFIG_MBEDTLS_TLS_CLIENT_ONLY=y # CONFIG_MBEDTLS_TLS_DISABLED is not set -CONFIG_MBEDTLS_TLS_SERVER=y CONFIG_MBEDTLS_TLS_CLIENT=y CONFIG_MBEDTLS_TLS_ENABLED=y # # TLS Key Exchange Methods # -# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_PSK_MODES=y +# CONFIG_MBEDTLS_KEY_EXCHANGE_PSK is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_PSK=y +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA_PSK=y CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y @@ -1083,16 +1789,11 @@ CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y # end of TLS Key Exchange Methods CONFIG_MBEDTLS_SSL_RENEGOTIATION=y -# CONFIG_MBEDTLS_SSL_PROTO_SSL3 is not set -CONFIG_MBEDTLS_SSL_PROTO_TLS1=y -CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y # CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set # CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set CONFIG_MBEDTLS_SSL_ALPN=y CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y -CONFIG_MBEDTLS_X509_CHECK_KEY_USAGE=y -CONFIG_MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE=y CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y # @@ -1101,9 +1802,6 @@ CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y CONFIG_MBEDTLS_AES_C=y # CONFIG_MBEDTLS_CAMELLIA_C is not set # CONFIG_MBEDTLS_DES_C is not set -CONFIG_MBEDTLS_RC4_DISABLED=y -# CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT is not set -# CONFIG_MBEDTLS_RC4_ENABLED is not set # CONFIG_MBEDTLS_BLOWFISH_C is not set # CONFIG_MBEDTLS_XTEA_C is not set CONFIG_MBEDTLS_CCM_C=y @@ -1118,11 +1816,12 @@ CONFIG_MBEDTLS_GCM_C=y # CONFIG_MBEDTLS_PEM_PARSE_C=y CONFIG_MBEDTLS_PEM_WRITE_C=y -CONFIG_MBEDTLS_X509_CRL_PARSE_C=y -CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# CONFIG_MBEDTLS_X509_CRL_PARSE_C is not set +# CONFIG_MBEDTLS_X509_CSR_PARSE_C is not set # end of Certificates CONFIG_MBEDTLS_ECP_C=y +# CONFIG_MBEDTLS_DHM_C is not set CONFIG_MBEDTLS_ECDH_C=y CONFIG_MBEDTLS_ECDSA_C=y # CONFIG_MBEDTLS_ECJPAKE_C is not set @@ -1139,43 +1838,29 @@ CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM=y # CONFIG_MBEDTLS_POLY1305_C is not set # CONFIG_MBEDTLS_CHACHA20_C is not set # CONFIG_MBEDTLS_HKDF_C is not set # CONFIG_MBEDTLS_THREADING_C is not set -# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set -# CONFIG_MBEDTLS_SECURITY_RISKS is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y # end of mbedTLS -# -# mDNS -# -CONFIG_MDNS_MAX_SERVICES=10 -CONFIG_MDNS_TASK_PRIORITY=1 -CONFIG_MDNS_TASK_STACK_SIZE=4096 -# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_MDNS_TASK_AFFINITY_CPU0=y -# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set -CONFIG_MDNS_TASK_AFFINITY=0x0 -CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 -# CONFIG_MDNS_STRICT_MODE is not set -CONFIG_MDNS_TIMER_PERIOD_MS=100 -# CONFIG_MDNS_NETWORKING_SOCKET is not set -CONFIG_MDNS_MULTIPLE_INSTANCE=y -# end of mDNS - # # ESP-MQTT Configurations # CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_5 is not set CONFIG_MQTT_TRANSPORT_SSL=y CONFIG_MQTT_TRANSPORT_WEBSOCKET=y CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y # CONFIG_MQTT_MSG_ID_INCREMENTAL is not set -# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED=y # CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set # CONFIG_MQTT_USE_CUSTOM_CONFIG is not set -# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED=y +# CONFIG_MQTT_USE_CORE_0 is not set +CONFIG_MQTT_USE_CORE_1=y # CONFIG_MQTT_CUSTOM_OUTBOX is not set # end of ESP-MQTT Configurations @@ -1189,29 +1874,56 @@ CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y # CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y # CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set # end of Newlib +CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND=y + # # NVS # # CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set # end of NVS # -# OpenSSL +# OpenThread # -# CONFIG_OPENSSL_DEBUG is not set -CONFIG_OPENSSL_ERROR_STACK=y -# CONFIG_OPENSSL_ASSERT_DO_NOTHING is not set -CONFIG_OPENSSL_ASSERT_EXIT=y -# end of OpenSSL +# CONFIG_OPENTHREAD_ENABLED is not set # -# OpenThread +# Thread Operational Dataset # -# CONFIG_OPENTHREAD_ENABLED is not set +CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP" +CONFIG_OPENTHREAD_MESH_LOCAL_PREFIX="fd00:db8:a0:0::/64" +CONFIG_OPENTHREAD_NETWORK_CHANNEL=15 +CONFIG_OPENTHREAD_NETWORK_PANID=0x1234 +CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe" +CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff" +CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" +# end of Thread Operational Dataset + +CONFIG_OPENTHREAD_XTAL_ACCURACY=130 +# CONFIG_OPENTHREAD_SPINEL_ONLY is not set +CONFIG_OPENTHREAD_RX_ON_WHEN_IDLE=y + +# +# Thread Address Query Config +# +# end of Thread Address Query Config # end of OpenThread +# +# Protocomm +# +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +# end of Protocomm + # # PThreads # @@ -1225,6 +1937,36 @@ CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" # end of PThreads +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + # # SPI Flash driver # @@ -1234,7 +1976,6 @@ CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y # CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set # CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set -# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set # CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set # CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y @@ -1248,6 +1989,11 @@ CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 # # Auto-detect flash chips # +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y @@ -1304,9 +2050,21 @@ CONFIG_SPIFFS_USE_MTIME=y # CONFIG_WS_TRANSPORT=y CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_DYNAMIC_BUFFER is not set # end of Websocket # end of TCP Transport +# +# Ultra Low Power (ULP) Co-processor +# +# CONFIG_ULP_COPROC_ENABLED is not set + +# +# ULP Debugging Options +# +# end of ULP Debugging Options +# end of Ultra Low Power (ULP) Co-processor + # # Unity unit testing library # @@ -1326,7 +2084,9 @@ CONFIG_VFS_SUPPORT_IO=y CONFIG_VFS_SUPPORT_DIR=y CONFIG_VFS_SUPPORT_SELECT=y CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +# CONFIG_VFS_SELECT_IN_RAM is not set CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=8 # # Host File System I/O (Semihosting) @@ -1348,32 +2108,30 @@ CONFIG_WL_SECTOR_SIZE=4096 # CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +# CONFIG_WIFI_PROV_BLE_BONDING is not set # CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION is not set +# CONFIG_WIFI_PROV_KEEP_BLE_ON_AFTER_PROV is not set +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set # end of Wi-Fi Provisioning Manager # -# Supplicant +# Audio playback # -CONFIG_WPA_MBEDTLS_CRYPTO=y -# CONFIG_WPA_WAPI_PSK is not set -# CONFIG_WPA_SUITE_B_192 is not set -# CONFIG_WPA_DEBUG_PRINT is not set -# CONFIG_WPA_TESTING_OPTIONS is not set -# CONFIG_WPA_WPS_STRICT is not set -# CONFIG_WPA_11KV_SUPPORT is not set -# CONFIG_WPA_MBO_SUPPORT is not set -# CONFIG_WPA_DPP_SUPPORT is not set -# end of Supplicant +CONFIG_AUDIO_PLAYER_ENABLE_MP3=y +CONFIG_AUDIO_PLAYER_ENABLE_WAV=y +CONFIG_AUDIO_PLAYER_LOG_LEVEL=0 +# end of Audio playback # end of Component config -# -# Compatibility options -# -# CONFIG_LEGACY_INCLUDE_COMMON_HEADERS is not set -# end of Compatibility options +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set # Deprecated options for backward compatibility -CONFIG_TOOLPREFIX="xtensa-esp32-elf-" +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_ESP32_NO_BLOBS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set # CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set # CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set # CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set @@ -1381,82 +2139,286 @@ CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y # CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set # CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set CONFIG_LOG_BOOTLOADER_LEVEL=3 -# CONFIG_APP_ROLLBACK_ENABLE is not set +CONFIG_APP_ROLLBACK_ENABLE=y +# CONFIG_APP_ANTI_ROLLBACK is not set # CONFIG_FLASH_ENCRYPTION_ENABLED is not set # CONFIG_FLASHMODE_QIO is not set # CONFIG_FLASHMODE_QOUT is not set CONFIG_FLASHMODE_DIO=y # CONFIG_FLASHMODE_DOUT is not set -# CONFIG_MONITOR_BAUD_9600B is not set -# CONFIG_MONITOR_BAUD_57600B is not set -CONFIG_MONITOR_BAUD_115200B=y -# CONFIG_MONITOR_BAUD_230400B is not set -# CONFIG_MONITOR_BAUD_921600B is not set -# CONFIG_MONITOR_BAUD_2MB is not set -# CONFIG_MONITOR_BAUD_OTHER is not set -CONFIG_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_MONITOR_BAUD=115200 -CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +# CONFIG_OPTIMIZATION_LEVEL_DEBUG is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set +# CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set # CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set -CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y -# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED is not set +CONFIG_OPTIMIZATION_ASSERTIONS_SILENT=y # CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set -CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=1 # CONFIG_CXX_EXCEPTIONS is not set CONFIG_STACK_CHECK_NONE=y # CONFIG_STACK_CHECK_NORM is not set # CONFIG_STACK_CHECK_STRONG is not set # CONFIG_STACK_CHECK_ALL is not set # CONFIG_WARN_WRITE_STRINGS is not set -# CONFIG_DISABLE_GCC8_WARNINGS is not set # CONFIG_ESP32_APPTRACE_DEST_TRAX is not set CONFIG_ESP32_APPTRACE_DEST_NONE=y CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +CONFIG_BLUEDROID_ENABLED=y +# CONFIG_NIMBLE_ENABLED is not set +CONFIG_BTC_TASK_STACK_SIZE=3072 +CONFIG_BLUEDROID_PINNED_TO_CORE_0=y +# CONFIG_BLUEDROID_PINNED_TO_CORE_1 is not set +CONFIG_BLUEDROID_PINNED_TO_CORE=0 +CONFIG_BTU_TASK_STACK_SIZE=4096 +# CONFIG_BLUEDROID_MEM_DEBUG is not set +# CONFIG_CLASSIC_BT_ENABLED is not set +CONFIG_GATTS_ENABLE=y +# CONFIG_GATTS_SEND_SERVICE_CHANGE_MANUAL is not set +CONFIG_GATTS_SEND_SERVICE_CHANGE_AUTO=y +CONFIG_GATTS_SEND_SERVICE_CHANGE_MODE=0 +# CONFIG_GATTC_ENABLE is not set +# CONFIG_BLE_SMP_ENABLE is not set +# CONFIG_HCI_TRACE_LEVEL_NONE is not set +# CONFIG_HCI_TRACE_LEVEL_ERROR is not set +CONFIG_HCI_TRACE_LEVEL_WARNING=y +# CONFIG_HCI_TRACE_LEVEL_API is not set +# CONFIG_HCI_TRACE_LEVEL_EVENT is not set +# CONFIG_HCI_TRACE_LEVEL_DEBUG is not set +# CONFIG_HCI_TRACE_LEVEL_VERBOSE is not set +CONFIG_HCI_INITIAL_TRACE_LEVEL=2 +# CONFIG_BTM_TRACE_LEVEL_NONE is not set +# CONFIG_BTM_TRACE_LEVEL_ERROR is not set +CONFIG_BTM_TRACE_LEVEL_WARNING=y +# CONFIG_BTM_TRACE_LEVEL_API is not set +# CONFIG_BTM_TRACE_LEVEL_EVENT is not set +# CONFIG_BTM_TRACE_LEVEL_DEBUG is not set +# CONFIG_BTM_TRACE_LEVEL_VERBOSE is not set +CONFIG_BTM_INITIAL_TRACE_LEVEL=2 +# CONFIG_L2CAP_TRACE_LEVEL_NONE is not set +# CONFIG_L2CAP_TRACE_LEVEL_ERROR is not set +CONFIG_L2CAP_TRACE_LEVEL_WARNING=y +# CONFIG_L2CAP_TRACE_LEVEL_API is not set +# CONFIG_L2CAP_TRACE_LEVEL_EVENT is not set +# CONFIG_L2CAP_TRACE_LEVEL_DEBUG is not set +# CONFIG_L2CAP_TRACE_LEVEL_VERBOSE is not set +CONFIG_L2CAP_INITIAL_TRACE_LEVEL=2 +# CONFIG_RFCOMM_TRACE_LEVEL_NONE is not set +# CONFIG_RFCOMM_TRACE_LEVEL_ERROR is not set +CONFIG_RFCOMM_TRACE_LEVEL_WARNING=y +# CONFIG_RFCOMM_TRACE_LEVEL_API is not set +# CONFIG_RFCOMM_TRACE_LEVEL_EVENT is not set +# CONFIG_RFCOMM_TRACE_LEVEL_DEBUG is not set +# CONFIG_RFCOMM_TRACE_LEVEL_VERBOSE is not set +CONFIG_RFCOMM_INITIAL_TRACE_LEVEL=2 +# CONFIG_SDP_TRACE_LEVEL_NONE is not set +# CONFIG_SDP_TRACE_LEVEL_ERROR is not set +CONFIG_SDP_TRACE_LEVEL_WARNING=y +# CONFIG_SDP_TRACE_LEVEL_API is not set +# CONFIG_SDP_TRACE_LEVEL_EVENT is not set +# CONFIG_SDP_TRACE_LEVEL_DEBUG is not set +# CONFIG_SDP_TRACE_LEVEL_VERBOSE is not set +CONFIG_BTH_LOG_SDP_INITIAL_TRACE_LEVEL=2 +# CONFIG_GAP_TRACE_LEVEL_NONE is not set +# CONFIG_GAP_TRACE_LEVEL_ERROR is not set +CONFIG_GAP_TRACE_LEVEL_WARNING=y +# CONFIG_GAP_TRACE_LEVEL_API is not set +# CONFIG_GAP_TRACE_LEVEL_EVENT is not set +# CONFIG_GAP_TRACE_LEVEL_DEBUG is not set +# CONFIG_GAP_TRACE_LEVEL_VERBOSE is not set +CONFIG_GAP_INITIAL_TRACE_LEVEL=2 +CONFIG_BNEP_INITIAL_TRACE_LEVEL=2 +# CONFIG_PAN_TRACE_LEVEL_NONE is not set +# CONFIG_PAN_TRACE_LEVEL_ERROR is not set +CONFIG_PAN_TRACE_LEVEL_WARNING=y +# CONFIG_PAN_TRACE_LEVEL_API is not set +# CONFIG_PAN_TRACE_LEVEL_EVENT is not set +# CONFIG_PAN_TRACE_LEVEL_DEBUG is not set +# CONFIG_PAN_TRACE_LEVEL_VERBOSE is not set +CONFIG_PAN_INITIAL_TRACE_LEVEL=2 +# CONFIG_A2D_TRACE_LEVEL_NONE is not set +# CONFIG_A2D_TRACE_LEVEL_ERROR is not set +CONFIG_A2D_TRACE_LEVEL_WARNING=y +# CONFIG_A2D_TRACE_LEVEL_API is not set +# CONFIG_A2D_TRACE_LEVEL_EVENT is not set +# CONFIG_A2D_TRACE_LEVEL_DEBUG is not set +# CONFIG_A2D_TRACE_LEVEL_VERBOSE is not set +CONFIG_A2D_INITIAL_TRACE_LEVEL=2 +# CONFIG_AVDT_TRACE_LEVEL_NONE is not set +# CONFIG_AVDT_TRACE_LEVEL_ERROR is not set +CONFIG_AVDT_TRACE_LEVEL_WARNING=y +# CONFIG_AVDT_TRACE_LEVEL_API is not set +# CONFIG_AVDT_TRACE_LEVEL_EVENT is not set +# CONFIG_AVDT_TRACE_LEVEL_DEBUG is not set +# CONFIG_AVDT_TRACE_LEVEL_VERBOSE is not set +CONFIG_AVDT_INITIAL_TRACE_LEVEL=2 +# CONFIG_AVCT_TRACE_LEVEL_NONE is not set +# CONFIG_AVCT_TRACE_LEVEL_ERROR is not set +CONFIG_AVCT_TRACE_LEVEL_WARNING=y +# CONFIG_AVCT_TRACE_LEVEL_API is not set +# CONFIG_AVCT_TRACE_LEVEL_EVENT is not set +# CONFIG_AVCT_TRACE_LEVEL_DEBUG is not set +# CONFIG_AVCT_TRACE_LEVEL_VERBOSE is not set +CONFIG_AVCT_INITIAL_TRACE_LEVEL=2 +# CONFIG_AVRC_TRACE_LEVEL_NONE is not set +# CONFIG_AVRC_TRACE_LEVEL_ERROR is not set +CONFIG_AVRC_TRACE_LEVEL_WARNING=y +# CONFIG_AVRC_TRACE_LEVEL_API is not set +# CONFIG_AVRC_TRACE_LEVEL_EVENT is not set +# CONFIG_AVRC_TRACE_LEVEL_DEBUG is not set +# CONFIG_AVRC_TRACE_LEVEL_VERBOSE is not set +CONFIG_AVRC_INITIAL_TRACE_LEVEL=2 +# CONFIG_MCA_TRACE_LEVEL_NONE is not set +# CONFIG_MCA_TRACE_LEVEL_ERROR is not set +CONFIG_MCA_TRACE_LEVEL_WARNING=y +# CONFIG_MCA_TRACE_LEVEL_API is not set +# CONFIG_MCA_TRACE_LEVEL_EVENT is not set +# CONFIG_MCA_TRACE_LEVEL_DEBUG is not set +# CONFIG_MCA_TRACE_LEVEL_VERBOSE is not set +CONFIG_MCA_INITIAL_TRACE_LEVEL=2 +# CONFIG_HID_TRACE_LEVEL_NONE is not set +# CONFIG_HID_TRACE_LEVEL_ERROR is not set +CONFIG_HID_TRACE_LEVEL_WARNING=y +# CONFIG_HID_TRACE_LEVEL_API is not set +# CONFIG_HID_TRACE_LEVEL_EVENT is not set +# CONFIG_HID_TRACE_LEVEL_DEBUG is not set +# CONFIG_HID_TRACE_LEVEL_VERBOSE is not set +CONFIG_HID_INITIAL_TRACE_LEVEL=2 +# CONFIG_APPL_TRACE_LEVEL_NONE is not set +# CONFIG_APPL_TRACE_LEVEL_ERROR is not set +CONFIG_APPL_TRACE_LEVEL_WARNING=y +# CONFIG_APPL_TRACE_LEVEL_API is not set +# CONFIG_APPL_TRACE_LEVEL_EVENT is not set +# CONFIG_APPL_TRACE_LEVEL_DEBUG is not set +# CONFIG_APPL_TRACE_LEVEL_VERBOSE is not set +CONFIG_APPL_INITIAL_TRACE_LEVEL=2 +# CONFIG_GATT_TRACE_LEVEL_NONE is not set +# CONFIG_GATT_TRACE_LEVEL_ERROR is not set +CONFIG_GATT_TRACE_LEVEL_WARNING=y +# CONFIG_GATT_TRACE_LEVEL_API is not set +# CONFIG_GATT_TRACE_LEVEL_EVENT is not set +# CONFIG_GATT_TRACE_LEVEL_DEBUG is not set +# CONFIG_GATT_TRACE_LEVEL_VERBOSE is not set +CONFIG_GATT_INITIAL_TRACE_LEVEL=2 +# CONFIG_SMP_TRACE_LEVEL_NONE is not set +# CONFIG_SMP_TRACE_LEVEL_ERROR is not set +CONFIG_SMP_TRACE_LEVEL_WARNING=y +# CONFIG_SMP_TRACE_LEVEL_API is not set +# CONFIG_SMP_TRACE_LEVEL_EVENT is not set +# CONFIG_SMP_TRACE_LEVEL_DEBUG is not set +# CONFIG_SMP_TRACE_LEVEL_VERBOSE is not set +CONFIG_SMP_INITIAL_TRACE_LEVEL=2 +# CONFIG_BTIF_TRACE_LEVEL_NONE is not set +# CONFIG_BTIF_TRACE_LEVEL_ERROR is not set +CONFIG_BTIF_TRACE_LEVEL_WARNING=y +# CONFIG_BTIF_TRACE_LEVEL_API is not set +# CONFIG_BTIF_TRACE_LEVEL_EVENT is not set +# CONFIG_BTIF_TRACE_LEVEL_DEBUG is not set +# CONFIG_BTIF_TRACE_LEVEL_VERBOSE is not set +CONFIG_BTIF_INITIAL_TRACE_LEVEL=2 +# CONFIG_BTC_TRACE_LEVEL_NONE is not set +# CONFIG_BTC_TRACE_LEVEL_ERROR is not set +CONFIG_BTC_TRACE_LEVEL_WARNING=y +# CONFIG_BTC_TRACE_LEVEL_API is not set +# CONFIG_BTC_TRACE_LEVEL_EVENT is not set +# CONFIG_BTC_TRACE_LEVEL_DEBUG is not set +# CONFIG_BTC_TRACE_LEVEL_VERBOSE is not set +CONFIG_BTC_INITIAL_TRACE_LEVEL=2 +# CONFIG_OSI_TRACE_LEVEL_NONE is not set +# CONFIG_OSI_TRACE_LEVEL_ERROR is not set +CONFIG_OSI_TRACE_LEVEL_WARNING=y +# CONFIG_OSI_TRACE_LEVEL_API is not set +# CONFIG_OSI_TRACE_LEVEL_EVENT is not set +# CONFIG_OSI_TRACE_LEVEL_DEBUG is not set +# CONFIG_OSI_TRACE_LEVEL_VERBOSE is not set +CONFIG_OSI_INITIAL_TRACE_LEVEL=2 +# CONFIG_BLUFI_TRACE_LEVEL_NONE is not set +# CONFIG_BLUFI_TRACE_LEVEL_ERROR is not set +CONFIG_BLUFI_TRACE_LEVEL_WARNING=y +# CONFIG_BLUFI_TRACE_LEVEL_API is not set +# CONFIG_BLUFI_TRACE_LEVEL_EVENT is not set +# CONFIG_BLUFI_TRACE_LEVEL_DEBUG is not set +# CONFIG_BLUFI_TRACE_LEVEL_VERBOSE is not set +CONFIG_BLUFI_INITIAL_TRACE_LEVEL=2 +# CONFIG_BLE_HOST_QUEUE_CONGESTION_CHECK is not set +# CONFIG_BLE_ACTIVE_SCAN_REPORT_ADV_SCAN_RSP_INDIVIDUALLY is not set +CONFIG_BLE_ESTABLISH_LINK_CONNECTION_TIMEOUT=30 +CONFIG_BTDM_CONTROLLER_MODE_BLE_ONLY=y +# CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY is not set +# CONFIG_BTDM_CONTROLLER_MODE_BTDM is not set +CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN=3 +CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN_EFF=3 +CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_ACL_CONN_EFF=0 +CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN_EFF=0 +CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0 +CONFIG_BTDM_CONTROLLER_HCI_MODE_VHCI=y +# CONFIG_BTDM_CONTROLLER_HCI_MODE_UART_H4 is not set +CONFIG_BTDM_CONTROLLER_MODEM_SLEEP=y +CONFIG_BLE_SCAN_DUPLICATE=y +CONFIG_SCAN_DUPLICATE_BY_DEVICE_ADDR=y +# CONFIG_SCAN_DUPLICATE_BY_ADV_DATA is not set +# CONFIG_SCAN_DUPLICATE_BY_ADV_DATA_AND_DEVICE_ADDR is not set +CONFIG_SCAN_DUPLICATE_TYPE=0 +CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200 +# CONFIG_BLE_MESH_SCAN_DUPLICATE_EN is not set +CONFIG_BTDM_CONTROLLER_FULL_SCAN_SUPPORTED=y +CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_SUPPORTED=y +CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_NUM=100 +CONFIG_BLE_ADV_REPORT_DISCARD_THRSHOLD=20 CONFIG_ADC2_DISABLE_DAC=y -CONFIG_SPIRAM_SUPPORT=y -# CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST is not set -CONFIG_TRACEMEM_RESERVE_DRAM=0x0 -# CONFIG_ULP_COPROC_ENABLED is not set -CONFIG_ULP_COPROC_RESERVE_MEM=0 -CONFIG_BROWNOUT_DET=y -CONFIG_BROWNOUT_DET_LVL_SEL_0=y -# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set -CONFIG_BROWNOUT_DET_LVL=0 -CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y -# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set -# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set -# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set -# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set -# CONFIG_NO_BLOBS is not set -# CONFIG_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set +# CONFIG_SW_COEXIST_ENABLE is not set +# CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE is not set +# CONFIG_ESP_WIFI_SW_COEXIST_ENABLE is not set +# CONFIG_MCPWM_ISR_IN_IRAM is not set # CONFIG_EVENT_LOOP_PROFILING is not set CONFIG_POST_EVENTS_FROM_ISR=y CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_GDBSTUB_SUPPORT_TASKS=y +CONFIG_GDBSTUB_MAX_TASKS=32 +CONFIG_OTA_ALLOW_HTTP=y # CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 -# CONFIG_ESP32C3_LIGHTSLEEP_GPIO_RESET_WORKAROUND is not set -CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 +# CONFIG_ESP32_RTC_CLK_SRC_INT_RC is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC is not set +# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set +# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set +CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256=y +CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256=y +CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 +# CONFIG_ESP32_XTAL_FREQ_26 is not set +CONFIG_ESP32_XTAL_FREQ_40=y +# CONFIG_ESP32_XTAL_FREQ_AUTO is not set +CONFIG_ESP32_XTAL_FREQ=40 CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y # CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 CONFIG_ESP32_PHY_MAX_TX_POWER=20 +CONFIG_REDUCE_PHY_TX_POWER=y CONFIG_ESP32_REDUCE_PHY_TX_POWER=y -# CONFIG_ESP32S2_PANIC_PRINT_HALT is not set -CONFIG_ESP32S2_PANIC_PRINT_REBOOT=y -# CONFIG_ESP32S2_PANIC_SILENT_REBOOT is not set -# CONFIG_ESP32S2_PANIC_GDBSTUB is not set +CONFIG_SPIRAM_SUPPORT=y +CONFIG_ESP32_SPIRAM_SUPPORT=y +CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST=y +# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set +# CONFIG_ESP32_DEFAULT_CPU_FREQ_160 is not set +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240 +CONFIG_TRACEMEM_RESERVE_DRAM=0x0 +# CONFIG_ESP32_PANIC_PRINT_HALT is not set +CONFIG_ESP32_PANIC_PRINT_REBOOT=y +# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP32_PANIC_GDBSTUB is not set CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 CONFIG_MAIN_TASK_STACK_SIZE=3584 CONFIG_CONSOLE_UART_DEFAULT=y # CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set # CONFIG_ESP_CONSOLE_UART_NONE is not set CONFIG_CONSOLE_UART=y CONFIG_CONSOLE_UART_NUM=0 @@ -1465,46 +2427,87 @@ CONFIG_INT_WDT=y CONFIG_INT_WDT_TIMEOUT_MS=300 CONFIG_INT_WDT_CHECK_CPU1=y CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y # CONFIG_TASK_WDT_PANIC is not set CONFIG_TASK_WDT_TIMEOUT_S=5 CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y # CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP32_DEBUG_OCDAWARE=y +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_0=y +CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set +# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set +CONFIG_BROWNOUT_DET_LVL=0 +CONFIG_ESP32_BROWNOUT_DET_LVL=0 +# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set +CONFIG_IPC_TASK_STACK_SIZE=1024 CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=8 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16 +CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +# CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED is not set +# CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED is not set +# CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED is not set +# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +# CONFIG_ESP32_WIFI_IRAM_OPT is not set +# CONFIG_ESP32_WIFI_RX_IRAM_OPT is not set +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_WPA_TESTING_OPTIONS is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y -CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150 -CONFIG_MB_MASTER_DELAY_MS_CONVERT=200 -CONFIG_MB_QUEUE_LENGTH=20 -CONFIG_MB_SERIAL_TASK_STACK_SIZE=4096 -CONFIG_MB_SERIAL_BUF_SIZE=256 -CONFIG_MB_SERIAL_TASK_PRIO=10 -CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT=y -CONFIG_MB_CONTROLLER_SLAVE_ID=0x00112233 -CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20 -CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 -CONFIG_MB_CONTROLLER_STACK_SIZE=4096 -CONFIG_MB_EVENT_QUEUE_TIMEOUT=20 -# CONFIG_MB_TIMER_PORT_ENABLED is not set -# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set CONFIG_TIMER_TASK_PRIORITY=1 CONFIG_TIMER_TASK_STACK_DEPTH=2048 CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set # CONFIG_L2_TO_L3_COPY is not set -# CONFIG_USE_ONLY_LWIP_SELECT is not set CONFIG_ESP_GRATUITOUS_ARP=y CONFIG_GARP_TMR_INTERVAL=60 CONFIG_TCPIP_RECVMBOX_SIZE=32 CONFIG_TCP_MAXRTX=12 -CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_SYNMAXRTX=6 CONFIG_TCP_MSS=1440 CONFIG_TCP_MSL=60000 CONFIG_TCP_SND_BUF_DEFAULT=5744 CONFIG_TCP_WND_DEFAULT=5744 CONFIG_TCP_RECVMBOX_SIZE=6 CONFIG_TCP_QUEUE_OOSEQ=y -# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set CONFIG_TCP_OVERSIZE_MSS=y # CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set # CONFIG_TCP_OVERSIZE_DISABLE is not set @@ -1515,6 +2518,12 @@ CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y # CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF # CONFIG_PPP_SUPPORT is not set +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 CONFIG_ESP32_PTHREAD_STACK_MIN=768 @@ -1526,6 +2535,7 @@ CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y # CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set # CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +# CONFIG_ESP32_ULP_COPROC_ENABLED is not set CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y CONFIG_SUPPORT_TERMIOS=y CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 diff --git a/sdkconfig.gen2 b/sdkconfig.gen2 deleted file mode 100644 index cb65490..0000000 --- a/sdkconfig.gen2 +++ /dev/null @@ -1,2398 +0,0 @@ -# -# Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) 5.1.2 Project Configuration -# -CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" -CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" -CONFIG_SOC_DPORT_WORKAROUND="Not determined" -CONFIG_SOC_CAPS_ECO_VER_MAX=301 -CONFIG_SOC_ADC_SUPPORTED=y -CONFIG_SOC_DAC_SUPPORTED=y -CONFIG_SOC_UART_SUPPORTED=y -CONFIG_SOC_MCPWM_SUPPORTED=y -CONFIG_SOC_GPTIMER_SUPPORTED=y -CONFIG_SOC_SDMMC_HOST_SUPPORTED=y -CONFIG_SOC_BT_SUPPORTED=y -CONFIG_SOC_PCNT_SUPPORTED=y -CONFIG_SOC_WIFI_SUPPORTED=y -CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y -CONFIG_SOC_TWAI_SUPPORTED=y -CONFIG_SOC_EMAC_SUPPORTED=y -CONFIG_SOC_ULP_SUPPORTED=y -CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y -CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y -CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y -CONFIG_SOC_RTC_MEM_SUPPORTED=y -CONFIG_SOC_I2S_SUPPORTED=y -CONFIG_SOC_RMT_SUPPORTED=y -CONFIG_SOC_SDM_SUPPORTED=y -CONFIG_SOC_GPSPI_SUPPORTED=y -CONFIG_SOC_LEDC_SUPPORTED=y -CONFIG_SOC_I2C_SUPPORTED=y -CONFIG_SOC_SUPPORT_COEXISTENCE=y -CONFIG_SOC_AES_SUPPORTED=y -CONFIG_SOC_MPI_SUPPORTED=y -CONFIG_SOC_SHA_SUPPORTED=y -CONFIG_SOC_FLASH_ENC_SUPPORTED=y -CONFIG_SOC_SECURE_BOOT_SUPPORTED=y -CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y -CONFIG_SOC_BOD_SUPPORTED=y -CONFIG_SOC_ULP_FSM_SUPPORTED=y -CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 -CONFIG_SOC_XTAL_SUPPORT_26M=y -CONFIG_SOC_XTAL_SUPPORT_40M=y -CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT=y -CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y -CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y -CONFIG_SOC_ADC_DMA_SUPPORTED=y -CONFIG_SOC_ADC_PERIPH_NUM=2 -CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 -CONFIG_SOC_ADC_ATTEN_NUM=4 -CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 -CONFIG_SOC_ADC_PATT_LEN_MAX=16 -CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9 -CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 -CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2 -CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 -CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 -CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 -CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 -CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 -CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y -CONFIG_SOC_IDCACHE_PER_CORE=y -CONFIG_SOC_CPU_CORES_NUM=2 -CONFIG_SOC_CPU_INTR_NUM=32 -CONFIG_SOC_CPU_HAS_FPU=y -CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 -CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 -CONFIG_SOC_CPU_WATCHPOINT_SIZE=64 -CONFIG_SOC_DAC_CHAN_NUM=2 -CONFIG_SOC_DAC_RESOLUTION=8 -CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y -CONFIG_SOC_GPIO_PORT=1 -CONFIG_SOC_GPIO_PIN_COUNT=40 -CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF -CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA -CONFIG_SOC_I2C_NUM=2 -CONFIG_SOC_I2C_FIFO_LEN=32 -CONFIG_SOC_I2C_CMD_REG_NUM=16 -CONFIG_SOC_I2C_SUPPORT_SLAVE=y -CONFIG_SOC_I2C_SUPPORT_APB=y -CONFIG_SOC_I2S_NUM=2 -CONFIG_SOC_I2S_HW_VERSION_1=y -CONFIG_SOC_I2S_SUPPORTS_APLL=y -CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y -CONFIG_SOC_I2S_SUPPORTS_PDM=y -CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y -CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1 -CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y -CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1 -CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y -CONFIG_SOC_I2S_SUPPORTS_ADC=y -CONFIG_SOC_I2S_SUPPORTS_DAC=y -CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA=y -CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD=y -CONFIG_SOC_I2S_LCD_I80_VARIANT=y -CONFIG_SOC_LCD_I80_SUPPORTED=y -CONFIG_SOC_LCD_I80_BUSES=2 -CONFIG_SOC_LCD_I80_BUS_WIDTH=24 -CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX=y -CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y -CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y -CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y -CONFIG_SOC_LEDC_CHANNEL_NUM=8 -CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20 -CONFIG_SOC_MCPWM_GROUPS=2 -CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 -CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 -CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 -CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y -CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 -CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 -CONFIG_SOC_MMU_PERIPH_NUM=2 -CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3 -CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 -CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 -CONFIG_SOC_PCNT_GROUPS=1 -CONFIG_SOC_PCNT_UNITS_PER_GROUP=8 -CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 -CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 -CONFIG_SOC_RMT_GROUPS=1 -CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=8 -CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=8 -CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 -CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=64 -CONFIG_SOC_RMT_SUPPORT_REF_TICK=y -CONFIG_SOC_RMT_SUPPORT_APB=y -CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT=y -CONFIG_SOC_RTCIO_PIN_COUNT=18 -CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y -CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y -CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y -CONFIG_SOC_SDM_GROUPS=1 -CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 -CONFIG_SOC_SDM_CLK_SUPPORT_APB=y -CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y -CONFIG_SOC_SPI_AS_CS_SUPPORTED=y -CONFIG_SOC_SPI_PERIPH_NUM=3 -CONFIG_SOC_SPI_DMA_CHAN_NUM=2 -CONFIG_SOC_SPI_MAX_CS_NUM=3 -CONFIG_SOC_SPI_SUPPORT_CLK_APB=y -CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 -CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192 -CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y -CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y -CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y -CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y -CONFIG_SOC_TIMER_GROUPS=2 -CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 -CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=64 -CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 -CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y -CONFIG_SOC_TOUCH_VERSION_1=y -CONFIG_SOC_TOUCH_SENSOR_NUM=10 -CONFIG_SOC_TOUCH_PAD_MEASURE_WAIT_MAX=0xFF -CONFIG_SOC_TWAI_CONTROLLER_NUM=1 -CONFIG_SOC_TWAI_BRP_MIN=2 -CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y -CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y -CONFIG_SOC_UART_NUM=3 -CONFIG_SOC_UART_SUPPORT_APB_CLK=y -CONFIG_SOC_UART_SUPPORT_REF_TICK=y -CONFIG_SOC_UART_FIFO_LEN=128 -CONFIG_SOC_UART_BITRATE_MAX=5000000 -CONFIG_SOC_SPIRAM_SUPPORTED=y -CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y -CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y -CONFIG_SOC_SHA_SUPPORT_SHA1=y -CONFIG_SOC_SHA_SUPPORT_SHA256=y -CONFIG_SOC_SHA_SUPPORT_SHA384=y -CONFIG_SOC_SHA_SUPPORT_SHA512=y -CONFIG_SOC_RSA_MAX_BIT_LEN=4096 -CONFIG_SOC_AES_SUPPORT_AES_128=y -CONFIG_SOC_AES_SUPPORT_AES_192=y -CONFIG_SOC_AES_SUPPORT_AES_256=y -CONFIG_SOC_SECURE_BOOT_V1=y -CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=y -CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 -CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 -CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y -CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y -CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y -CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y -CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y -CONFIG_SOC_PM_SUPPORT_MODEM_PD=y -CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y -CONFIG_SOC_CLK_APLL_SUPPORTED=y -CONFIG_SOC_APLL_MULTIPLIER_OUT_MIN_HZ=350000000 -CONFIG_SOC_APLL_MULTIPLIER_OUT_MAX_HZ=500000000 -CONFIG_SOC_APLL_MIN_HZ=5303031 -CONFIG_SOC_APLL_MAX_HZ=125000000 -CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y -CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y -CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y -CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y -CONFIG_SOC_SDMMC_USE_IOMUX=y -CONFIG_SOC_SDMMC_NUM_SLOTS=2 -CONFIG_SOC_WIFI_WAPI_SUPPORT=y -CONFIG_SOC_WIFI_CSI_SUPPORT=y -CONFIG_SOC_WIFI_MESH_SUPPORT=y -CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y -CONFIG_SOC_WIFI_NAN_SUPPORT=y -CONFIG_SOC_BLE_SUPPORTED=y -CONFIG_SOC_BLE_MESH_SUPPORTED=y -CONFIG_SOC_BT_CLASSIC_SUPPORTED=y -CONFIG_SOC_BLUFI_SUPPORTED=y -CONFIG_SOC_ULP_HAS_ADC=y -CONFIG_SOC_PHY_COMBO_MODULE=y -CONFIG_IDF_CMAKE=y -CONFIG_IDF_TARGET_ARCH_XTENSA=y -CONFIG_IDF_TARGET_ARCH="xtensa" -CONFIG_IDF_TARGET="esp32" -CONFIG_IDF_TARGET_ESP32=y -CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 - -# -# Build type -# -CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y -# CONFIG_APP_BUILD_TYPE_RAM is not set -CONFIG_APP_BUILD_GENERATE_BINARIES=y -CONFIG_APP_BUILD_BOOTLOADER=y -CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y -# CONFIG_APP_REPRODUCIBLE_BUILD is not set -# CONFIG_APP_NO_BLOBS is not set -# CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set -# CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set -# end of Build type - -# -# Bootloader config -# -CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000 -CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y -# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set -# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set -# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set -CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y -# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set -CONFIG_BOOTLOADER_LOG_LEVEL=3 -# CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set -CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y -# CONFIG_BOOTLOADER_FACTORY_RESET is not set -# CONFIG_BOOTLOADER_APP_TEST is not set -CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y -CONFIG_BOOTLOADER_WDT_ENABLE=y -# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set -CONFIG_BOOTLOADER_WDT_TIME_MS=9000 -CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y -# CONFIG_BOOTLOADER_APP_ANTI_ROLLBACK is not set -# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set -# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set -# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set -CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 -# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set -CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y -# end of Bootloader config - -# -# Security features -# -CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y -CONFIG_SECURE_BOOT_V1_SUPPORTED=y -CONFIG_SECURE_BOOT_V2_PREFERRED=y -# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set -# CONFIG_SECURE_BOOT is not set -# CONFIG_SECURE_FLASH_ENC_ENABLED is not set -# end of Security features - -# -# Application manager -# -CONFIG_APP_COMPILE_TIME_DATE=y -# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set -# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set -# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set -CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 -# end of Application manager - -CONFIG_ESP_ROM_HAS_CRC_LE=y -CONFIG_ESP_ROM_HAS_CRC_BE=y -CONFIG_ESP_ROM_HAS_MZ_CRC32=y -CONFIG_ESP_ROM_HAS_JPEG_DECODE=y -CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y -CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y -CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y - -# -# Serial flasher config -# -# CONFIG_ESPTOOLPY_NO_STUB is not set -# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set -# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set -CONFIG_ESPTOOLPY_FLASHMODE_DIO=y -# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set -CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y -CONFIG_ESPTOOLPY_FLASHMODE="dio" -# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set -CONFIG_ESPTOOLPY_FLASHFREQ_40M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -CONFIG_ESPTOOLPY_FLASHFREQ="40m" -# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set -CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y -# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set -CONFIG_ESPTOOLPY_FLASHSIZE="2MB" -# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set -CONFIG_ESPTOOLPY_BEFORE_RESET=y -# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set -CONFIG_ESPTOOLPY_BEFORE="default_reset" -CONFIG_ESPTOOLPY_AFTER_RESET=y -# CONFIG_ESPTOOLPY_AFTER_NORESET is not set -CONFIG_ESPTOOLPY_AFTER="hard_reset" -CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 -# end of Serial flasher config - -# -# Partition Table -# -CONFIG_PARTITION_TABLE_SINGLE_APP=y -# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set -# CONFIG_PARTITION_TABLE_TWO_OTA is not set -# CONFIG_PARTITION_TABLE_CUSTOM is not set -CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" -CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" -CONFIG_PARTITION_TABLE_OFFSET=0x8000 -CONFIG_PARTITION_TABLE_MD5=y -# end of Partition Table - -# -# Compiler options -# -# CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set -# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set -CONFIG_COMPILER_OPTIMIZATION_PERF=y -# CONFIG_COMPILER_OPTIMIZATION_NONE is not set -# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE is not set -CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y -# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set -CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y -CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=1 -# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set -CONFIG_COMPILER_HIDE_PATHS_MACROS=y -# CONFIG_COMPILER_CXX_EXCEPTIONS is not set -# CONFIG_COMPILER_CXX_RTTI is not set -CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y -# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set -# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set -# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set -# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set -# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set -# CONFIG_COMPILER_DUMP_RTL_FILES is not set -# end of Compiler options - -# -# Component config -# - -# -# Application Level Tracing -# -# CONFIG_APPTRACE_DEST_JTAG is not set -CONFIG_APPTRACE_DEST_NONE=y -# CONFIG_APPTRACE_DEST_UART1 is not set -# CONFIG_APPTRACE_DEST_UART2 is not set -CONFIG_APPTRACE_DEST_UART_NONE=y -CONFIG_APPTRACE_UART_TASK_PRIO=1 -CONFIG_APPTRACE_LOCK_ENABLE=y -# end of Application Level Tracing - -# -# Bluetooth -# -CONFIG_BT_ENABLED=y -CONFIG_BT_BLUEDROID_ENABLED=y -# CONFIG_BT_NIMBLE_ENABLED is not set -# CONFIG_BT_CONTROLLER_ONLY is not set -CONFIG_BT_CONTROLLER_ENABLED=y -# CONFIG_BT_CONTROLLER_DISABLED is not set - -# -# Bluedroid Options -# -CONFIG_BT_BTC_TASK_STACK_SIZE=3072 -CONFIG_BT_BLUEDROID_PINNED_TO_CORE_0=y -# CONFIG_BT_BLUEDROID_PINNED_TO_CORE_1 is not set -CONFIG_BT_BLUEDROID_PINNED_TO_CORE=0 -CONFIG_BT_BTU_TASK_STACK_SIZE=4096 -# CONFIG_BT_BLUEDROID_MEM_DEBUG is not set -# CONFIG_BT_CLASSIC_ENABLED is not set -CONFIG_BT_BLE_ENABLED=y -CONFIG_BT_GATTS_ENABLE=y -# CONFIG_BT_GATTS_PPCP_CHAR_GAP is not set -# CONFIG_BT_BLE_BLUFI_ENABLE is not set -CONFIG_BT_GATT_MAX_SR_PROFILES=8 -CONFIG_BT_GATT_MAX_SR_ATTRIBUTES=100 -# CONFIG_BT_GATTS_SEND_SERVICE_CHANGE_MANUAL is not set -CONFIG_BT_GATTS_SEND_SERVICE_CHANGE_AUTO=y -CONFIG_BT_GATTS_SEND_SERVICE_CHANGE_MODE=0 -# CONFIG_BT_GATTS_ROBUST_CACHING_ENABLED is not set -# CONFIG_BT_GATTS_DEVICE_NAME_WRITABLE is not set -# CONFIG_BT_GATTS_APPEARANCE_WRITABLE is not set -# CONFIG_BT_GATTC_ENABLE is not set -# CONFIG_BT_BLE_SMP_ENABLE is not set -# CONFIG_BT_STACK_NO_LOG is not set - -# -# BT DEBUG LOG LEVEL -# -# CONFIG_BT_LOG_HCI_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_HCI_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_HCI_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_HCI_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_HCI_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_HCI_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_HCI_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_HCI_TRACE_LEVEL=2 -# CONFIG_BT_LOG_BTM_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_BTM_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_BTM_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_BTM_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_BTM_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_BTM_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_BTM_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_BTM_TRACE_LEVEL=2 -# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_L2CAP_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_L2CAP_TRACE_LEVEL=2 -# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL=2 -# CONFIG_BT_LOG_SDP_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_SDP_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_SDP_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_SDP_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_SDP_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_SDP_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_SDP_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_SDP_TRACE_LEVEL=2 -# CONFIG_BT_LOG_GAP_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_GAP_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_GAP_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_GAP_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_GAP_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_GAP_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_GAP_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_GAP_TRACE_LEVEL=2 -# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_BNEP_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_BNEP_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_BNEP_TRACE_LEVEL=2 -# CONFIG_BT_LOG_PAN_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_PAN_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_PAN_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_PAN_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_PAN_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_PAN_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_PAN_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_PAN_TRACE_LEVEL=2 -# CONFIG_BT_LOG_A2D_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_A2D_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_A2D_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_A2D_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_A2D_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_A2D_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_A2D_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_A2D_TRACE_LEVEL=2 -# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_AVDT_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_AVDT_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_AVDT_TRACE_LEVEL=2 -# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_AVCT_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_AVCT_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_AVCT_TRACE_LEVEL=2 -# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_AVRC_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_AVRC_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_AVRC_TRACE_LEVEL=2 -# CONFIG_BT_LOG_MCA_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_MCA_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_MCA_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_MCA_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_MCA_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_MCA_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_MCA_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_MCA_TRACE_LEVEL=2 -# CONFIG_BT_LOG_HID_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_HID_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_HID_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_HID_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_HID_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_HID_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_HID_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_HID_TRACE_LEVEL=2 -# CONFIG_BT_LOG_APPL_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_APPL_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_APPL_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_APPL_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_APPL_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_APPL_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_APPL_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_APPL_TRACE_LEVEL=2 -# CONFIG_BT_LOG_GATT_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_GATT_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_GATT_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_GATT_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_GATT_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_GATT_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_GATT_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_GATT_TRACE_LEVEL=2 -# CONFIG_BT_LOG_SMP_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_SMP_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_SMP_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_SMP_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_SMP_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_SMP_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_SMP_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_SMP_TRACE_LEVEL=2 -# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_BTIF_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_BTIF_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_BTIF_TRACE_LEVEL=2 -# CONFIG_BT_LOG_BTC_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_BTC_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_BTC_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_BTC_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_BTC_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_BTC_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_BTC_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_BTC_TRACE_LEVEL=2 -# CONFIG_BT_LOG_OSI_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_OSI_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_OSI_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_OSI_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_OSI_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_OSI_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_OSI_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_OSI_TRACE_LEVEL=2 -# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_NONE is not set -# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_ERROR is not set -CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_WARNING=y -# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_API is not set -# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_EVENT is not set -# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_DEBUG is not set -# CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_VERBOSE is not set -CONFIG_BT_LOG_BLUFI_TRACE_LEVEL=2 -# end of BT DEBUG LOG LEVEL - -CONFIG_BT_ACL_CONNECTIONS=4 -CONFIG_BT_MULTI_CONNECTION_ENBALE=y -CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y -CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY=y -# CONFIG_BT_BLE_HOST_QUEUE_CONG_CHECK is not set -# CONFIG_BT_BLE_ACT_SCAN_REP_ADV_SCAN is not set -CONFIG_BT_BLE_ESTAB_LINK_CONN_TOUT=30 -CONFIG_BT_MAX_DEVICE_NAME_LEN=32 -# CONFIG_BT_BLE_RPA_SUPPORTED is not set -CONFIG_BT_BLE_RPA_TIMEOUT=900 -# CONFIG_BT_BLE_HIGH_DUTY_ADV_INTERVAL is not set -# end of Bluedroid Options - -# -# Controller Options -# -CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y -# CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY is not set -# CONFIG_BTDM_CTRL_MODE_BTDM is not set -CONFIG_BTDM_CTRL_BLE_MAX_CONN=3 -CONFIG_BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF=0 -CONFIG_BTDM_CTRL_PCM_ROLE_EFF=0 -CONFIG_BTDM_CTRL_PCM_POLAR_EFF=0 -CONFIG_BTDM_CTRL_BLE_MAX_CONN_EFF=3 -CONFIG_BTDM_CTRL_BR_EDR_MAX_ACL_CONN_EFF=0 -CONFIG_BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF=0 -CONFIG_BTDM_CTRL_PINNED_TO_CORE_0=y -# CONFIG_BTDM_CTRL_PINNED_TO_CORE_1 is not set -CONFIG_BTDM_CTRL_PINNED_TO_CORE=0 -CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y -# CONFIG_BTDM_CTRL_HCI_MODE_UART_H4 is not set - -# -# MODEM SLEEP Options -# -CONFIG_BTDM_CTRL_MODEM_SLEEP=y -CONFIG_BTDM_CTRL_MODEM_SLEEP_MODE_ORIG=y -# CONFIG_BTDM_CTRL_MODEM_SLEEP_MODE_EVED is not set -CONFIG_BTDM_CTRL_LPCLK_SEL_MAIN_XTAL=y -# end of MODEM SLEEP Options - -CONFIG_BTDM_BLE_DEFAULT_SCA_250PPM=y -CONFIG_BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF=1 -CONFIG_BTDM_BLE_SCAN_DUPL=y -CONFIG_BTDM_SCAN_DUPL_TYPE_DEVICE=y -# CONFIG_BTDM_SCAN_DUPL_TYPE_DATA is not set -# CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE is not set -CONFIG_BTDM_SCAN_DUPL_TYPE=0 -CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE=200 -CONFIG_BTDM_SCAN_DUPL_CACHE_REFRESH_PERIOD=0 -# CONFIG_BTDM_BLE_MESH_SCAN_DUPL_EN is not set -CONFIG_BTDM_CTRL_FULL_SCAN_SUPPORTED=y -CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_SUPP=y -CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM=100 -CONFIG_BTDM_BLE_ADV_REPORT_DISCARD_THRSHOLD=20 -CONFIG_BTDM_RESERVE_DRAM=0xdb5c -CONFIG_BTDM_CTRL_HLI=y -# end of Controller Options -# end of Bluetooth - -# CONFIG_BLE_MESH is not set - -# -# Driver Configurations -# - -# -# Legacy ADC Configuration -# -CONFIG_ADC_DISABLE_DAC=y -# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set - -# -# Legacy ADC Calibration Configuration -# -CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y -CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y -CONFIG_ADC_CAL_LUT_ENABLE=y -# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set -# end of Legacy ADC Calibration Configuration -# end of Legacy ADC Configuration - -# -# SPI Configuration -# -CONFIG_SPI_MASTER_ISR_IN_IRAM=y -# CONFIG_SPI_SLAVE_IN_IRAM is not set -CONFIG_SPI_SLAVE_ISR_IN_IRAM=y -# end of SPI Configuration - -# -# TWAI Configuration -# -# CONFIG_TWAI_ISR_IN_IRAM is not set -# CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC is not set -# CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST is not set -# CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID is not set -# CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT is not set -# CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM is not set -# end of TWAI Configuration - -# -# UART Configuration -# -# CONFIG_UART_ISR_IN_IRAM is not set -# end of UART Configuration - -# -# GPIO Configuration -# -# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set -# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set -# end of GPIO Configuration - -# -# Sigma Delta Modulator Configuration -# -# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set -# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_SDM_ENABLE_DEBUG_LOG is not set -# end of Sigma Delta Modulator Configuration - -# -# GPTimer Configuration -# -CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y -# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set -# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set -# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set -# end of GPTimer Configuration - -# -# PCNT Configuration -# -# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set -# CONFIG_PCNT_ISR_IRAM_SAFE is not set -# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set -# end of PCNT Configuration - -# -# RMT Configuration -# -# CONFIG_RMT_ISR_IRAM_SAFE is not set -# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_RMT_ENABLE_DEBUG_LOG is not set -# end of RMT Configuration - -# -# MCPWM Configuration -# -# CONFIG_MCPWM_ISR_IRAM_SAFE is not set -# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set -# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set -# end of MCPWM Configuration - -# -# I2S Configuration -# -# CONFIG_I2S_ISR_IRAM_SAFE is not set -# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_I2S_ENABLE_DEBUG_LOG is not set -# end of I2S Configuration - -# -# DAC Configuration -# -# CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set -# CONFIG_DAC_ISR_IRAM_SAFE is not set -# CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set -# CONFIG_DAC_ENABLE_DEBUG_LOG is not set -CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y -# end of DAC Configuration -# end of Driver Configurations - -# -# eFuse Bit Manager -# -# CONFIG_EFUSE_CUSTOM_TABLE is not set -# CONFIG_EFUSE_VIRTUAL is not set -# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set -CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y -# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set -CONFIG_EFUSE_MAX_BLK_LEN=192 -# end of eFuse Bit Manager - -# -# ESP-TLS -# -CONFIG_ESP_TLS_USING_MBEDTLS=y -# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set -# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set -# CONFIG_ESP_TLS_PSK_VERIFICATION is not set -# CONFIG_ESP_TLS_INSECURE is not set -# end of ESP-TLS - -# -# ADC and ADC Calibration -# -# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set -# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set - -# -# ADC Calibration Configurations -# -CONFIG_ADC_CALI_EFUSE_TP_ENABLE=y -CONFIG_ADC_CALI_EFUSE_VREF_ENABLE=y -CONFIG_ADC_CALI_LUT_ENABLE=y -# end of ADC Calibration Configurations - -CONFIG_ADC_DISABLE_DAC_OUTPUT=y -# end of ADC and ADC Calibration - -# -# Wireless Coexistence -# -# CONFIG_ESP_COEX_SW_COEXIST_ENABLE is not set -# end of Wireless Coexistence - -# -# Common ESP-related -# -CONFIG_ESP_ERR_TO_NAME_LOOKUP=y -# end of Common ESP-related - -# -# Ethernet -# -CONFIG_ETH_ENABLED=y -CONFIG_ETH_USE_ESP32_EMAC=y -CONFIG_ETH_PHY_INTERFACE_RMII=y -CONFIG_ETH_RMII_CLK_INPUT=y -# CONFIG_ETH_RMII_CLK_OUTPUT is not set -CONFIG_ETH_RMII_CLK_IN_GPIO=0 -CONFIG_ETH_DMA_BUFFER_SIZE=512 -CONFIG_ETH_DMA_RX_BUFFER_NUM=10 -CONFIG_ETH_DMA_TX_BUFFER_NUM=10 -# CONFIG_ETH_IRAM_OPTIMIZATION is not set -# CONFIG_ETH_USE_SPI_ETHERNET is not set -CONFIG_ETH_USE_OPENETH=y -CONFIG_ETH_OPENETH_DMA_RX_BUFFER_NUM=4 -CONFIG_ETH_OPENETH_DMA_TX_BUFFER_NUM=1 -# CONFIG_ETH_TRANSMIT_MUTEX is not set -# end of Ethernet - -# -# Event Loop Library -# -# CONFIG_ESP_EVENT_LOOP_PROFILING is not set -CONFIG_ESP_EVENT_POST_FROM_ISR=y -CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y -# end of Event Loop Library - -# -# GDB Stub -# -# end of GDB Stub - -# -# ESP HTTP client -# -CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y -# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set -CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y -# end of ESP HTTP client - -# -# HTTP Server -# -CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 -CONFIG_HTTPD_MAX_URI_LEN=512 -CONFIG_HTTPD_ERR_RESP_NO_DELAY=y -CONFIG_HTTPD_PURGE_BUF_LEN=32 -# CONFIG_HTTPD_LOG_PURGE_DATA is not set -# CONFIG_HTTPD_WS_SUPPORT is not set -# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set -# end of HTTP Server - -# -# ESP HTTPS OTA -# -# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set -CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP=y -# end of ESP HTTPS OTA - -# -# ESP HTTPS server -# -# end of ESP HTTPS server - -# -# Hardware Settings -# - -# -# Chip revision -# -# CONFIG_ESP32_REV_MIN_0 is not set -# CONFIG_ESP32_REV_MIN_1 is not set -# CONFIG_ESP32_REV_MIN_1_1 is not set -# CONFIG_ESP32_REV_MIN_2 is not set -CONFIG_ESP32_REV_MIN_3=y -# CONFIG_ESP32_REV_MIN_3_1 is not set -CONFIG_ESP32_REV_MIN=3 -CONFIG_ESP32_REV_MIN_FULL=300 -CONFIG_ESP_REV_MIN_FULL=300 - -# -# Maximum Supported ESP32 Revision (Rev v3.99) -# -CONFIG_ESP32_REV_MAX_FULL=399 -CONFIG_ESP_REV_MAX_FULL=399 -# end of Chip revision - -# -# MAC Config -# -CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y -CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y -CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y -CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y -CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y -# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set -CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y -CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4 -# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set -# end of MAC Config - -# -# Sleep Config -# -# CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND is not set -# CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND is not set -CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y -# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set -CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 -CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y -# end of Sleep Config - -# -# RTC Clock Config -# -# CONFIG_RTC_CLK_SRC_INT_RC is not set -# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set -# CONFIG_RTC_CLK_SRC_EXT_OSC is not set -CONFIG_RTC_CLK_SRC_INT_8MD256=y -CONFIG_RTC_CLK_CAL_CYCLES=1024 -# end of RTC Clock Config - -# -# Peripheral Control -# -CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y -# end of Peripheral Control - -# -# Main XTAL Config -# -# CONFIG_XTAL_FREQ_26 is not set -CONFIG_XTAL_FREQ_40=y -# CONFIG_XTAL_FREQ_AUTO is not set -CONFIG_XTAL_FREQ=40 -# end of Main XTAL Config -# end of Hardware Settings - -# -# LCD and Touch Panel -# - -# -# LCD Touch Drivers are maintained in the IDF Component Registry -# - -# -# LCD Peripheral Configuration -# -CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 -# CONFIG_LCD_ENABLE_DEBUG_LOG is not set -# end of LCD Peripheral Configuration -# end of LCD and Touch Panel - -# -# ESP NETIF Adapter -# -CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 -CONFIG_ESP_NETIF_TCPIP_LWIP=y -# CONFIG_ESP_NETIF_LOOPBACK is not set -CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y -# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set -# CONFIG_ESP_NETIF_L2_TAP is not set -# CONFIG_ESP_NETIF_BRIDGE_EN is not set -# end of ESP NETIF Adapter - -# -# Partition API Configuration -# -# end of Partition API Configuration - -# -# PHY -# -CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y -# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set -CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 -CONFIG_ESP_PHY_MAX_TX_POWER=20 -CONFIG_ESP_PHY_REDUCE_TX_POWER=y -CONFIG_ESP_PHY_RF_CAL_PARTIAL=y -# CONFIG_ESP_PHY_RF_CAL_NONE is not set -# CONFIG_ESP_PHY_RF_CAL_FULL is not set -CONFIG_ESP_PHY_CALIBRATION_MODE=0 -# end of PHY - -# -# Power Management -# -# CONFIG_PM_ENABLE is not set -# end of Power Management - -# -# ESP PSRAM -# -CONFIG_SPIRAM=y - -# -# SPI RAM config -# -CONFIG_SPIRAM_MODE_QUAD=y -CONFIG_SPIRAM_TYPE_AUTO=y -# CONFIG_SPIRAM_TYPE_ESPPSRAM16 is not set -# CONFIG_SPIRAM_TYPE_ESPPSRAM32 is not set -# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set -CONFIG_SPIRAM_SPEED_40M=y -CONFIG_SPIRAM_SPEED=40 -CONFIG_SPIRAM_BOOT_INIT=y -# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set -# CONFIG_SPIRAM_USE_MEMMAP is not set -# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set -CONFIG_SPIRAM_USE_MALLOC=y -# CONFIG_SPIRAM_MEMTEST is not set -CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=0 -CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y -CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536 -# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set -# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set - -# -# SPIRAM cache workaround debugging -# -# end of SPIRAM cache workaround debugging - -CONFIG_SPIRAM_BANKSWITCH_ENABLE=y -CONFIG_SPIRAM_BANKSWITCH_RESERVE=25 -# CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY is not set - -# -# PSRAM clock and cs IO for ESP32-DOWD -# -CONFIG_D0WD_PSRAM_CLK_IO=17 -CONFIG_D0WD_PSRAM_CS_IO=16 -# end of PSRAM clock and cs IO for ESP32-DOWD - -# -# PSRAM clock and cs IO for ESP32-D2WD -# -CONFIG_D2WD_PSRAM_CLK_IO=9 -CONFIG_D2WD_PSRAM_CS_IO=10 -# end of PSRAM clock and cs IO for ESP32-D2WD - -# -# PSRAM clock and cs IO for ESP32-PICO-D4 -# -CONFIG_PICO_PSRAM_CS_IO=10 -# end of PSRAM clock and cs IO for ESP32-PICO-D4 - -# CONFIG_SPIRAM_CUSTOM_SPIWP_SD3_PIN is not set -CONFIG_SPIRAM_SPIWP_SD3_PIN=7 -# CONFIG_SPIRAM_2T_MODE is not set -# end of SPI RAM config -# end of ESP PSRAM - -# -# ESP Ringbuf -# -# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set -# end of ESP Ringbuf - -# -# ESP System Settings -# -# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set -# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set -CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y -CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 - -# -# Memory -# -# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set - -# -# Non-backward compatible options -# -CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM=y -# end of Non-backward compatible options -# end of Memory - -# -# Trace memory -# -# CONFIG_ESP32_TRAX is not set -CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 -# end of Trace memory - -# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set -CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y -# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set -# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set -# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set -CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 - -# -# Memory protection -# -# end of Memory protection - -CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 -CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 -CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 -CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y -# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set -# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 -CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 -CONFIG_ESP_CONSOLE_UART_DEFAULT=y -# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set -# CONFIG_ESP_CONSOLE_NONE is not set -CONFIG_ESP_CONSOLE_UART=y -CONFIG_ESP_CONSOLE_MULTIPLE_UART=y -CONFIG_ESP_CONSOLE_UART_NUM=0 -CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 -CONFIG_ESP_INT_WDT=y -CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 -CONFIG_ESP_INT_WDT_CHECK_CPU1=y -CONFIG_ESP_TASK_WDT_EN=y -CONFIG_ESP_TASK_WDT_INIT=y -# CONFIG_ESP_TASK_WDT_PANIC is not set -CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 -CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y -CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y -# CONFIG_ESP_PANIC_HANDLER_IRAM is not set -# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set -CONFIG_ESP_DEBUG_OCDAWARE=y -CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5=y - -# -# Brownout Detector -# -CONFIG_ESP_BROWNOUT_DET=y -CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0=y -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 is not set -CONFIG_ESP_BROWNOUT_DET_LVL=0 -# end of Brownout Detector - -# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set -CONFIG_ESP32_ECO3_CACHE_LOCK_FIX=y -CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y -# end of ESP System Settings - -# -# IPC (Inter-Processor Call) -# -CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 -CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y -CONFIG_ESP_IPC_ISR_ENABLE=y -# end of IPC (Inter-Processor Call) - -# -# High resolution timer (esp_timer) -# -# CONFIG_ESP_TIMER_PROFILING is not set -CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y -CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y -CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 -CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 -# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set -CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 -CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y -CONFIG_ESP_TIMER_ISR_AFFINITY=0x1 -CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y -# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set -CONFIG_ESP_TIMER_IMPL_TG0_LAC=y -# end of High resolution timer (esp_timer) - -# -# Wi-Fi -# -CONFIG_ESP_WIFI_ENABLED=y -CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=8 -CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 -CONFIG_ESP_WIFI_STATIC_TX_BUFFER=y -CONFIG_ESP_WIFI_TX_BUFFER_TYPE=0 -CONFIG_ESP_WIFI_STATIC_TX_BUFFER_NUM=16 -CONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=32 -CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y -# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set -CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 -CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 -# CONFIG_ESP_WIFI_CSI_ENABLED is not set -# CONFIG_ESP_WIFI_AMPDU_TX_ENABLED is not set -# CONFIG_ESP_WIFI_AMPDU_RX_ENABLED is not set -# CONFIG_ESP_WIFI_AMSDU_TX_ENABLED is not set -CONFIG_ESP_WIFI_NVS_ENABLED=y -CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y -# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set -CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 -CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 -CONFIG_ESP_WIFI_IRAM_OPT=y -CONFIG_ESP_WIFI_EXTRA_IRAM_OPT=y -CONFIG_ESP_WIFI_RX_IRAM_OPT=y -CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y -CONFIG_ESP_WIFI_ENABLE_SAE_PK=y -CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y -# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set -# CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE is not set -# CONFIG_ESP_WIFI_GMAC_SUPPORT is not set -# CONFIG_ESP_WIFI_SOFTAP_SUPPORT is not set -# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set -CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 -# CONFIG_ESP_WIFI_NAN_ENABLE is not set -CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y -CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y -# CONFIG_ESP_WIFI_WAPI_PSK is not set -# CONFIG_ESP_WIFI_11KV_SUPPORT is not set -# CONFIG_ESP_WIFI_MBO_SUPPORT is not set -# CONFIG_ESP_WIFI_DPP_SUPPORT is not set -# CONFIG_ESP_WIFI_11R_SUPPORT is not set - -# -# WPS Configuration Options -# -# CONFIG_ESP_WIFI_WPS_STRICT is not set -# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set -# end of WPS Configuration Options - -# CONFIG_ESP_WIFI_DEBUG_PRINT is not set -# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set -# CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT is not set -# end of Wi-Fi - -# -# Core dump -# -# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set -# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set -CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y -# end of Core dump - -# -# FAT Filesystem support -# -CONFIG_FATFS_VOLUME_COUNT=2 -CONFIG_FATFS_LFN_NONE=y -# CONFIG_FATFS_LFN_HEAP is not set -# CONFIG_FATFS_LFN_STACK is not set -# CONFIG_FATFS_SECTOR_512 is not set -CONFIG_FATFS_SECTOR_4096=y -# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set -CONFIG_FATFS_CODEPAGE_437=y -# CONFIG_FATFS_CODEPAGE_720 is not set -# CONFIG_FATFS_CODEPAGE_737 is not set -# CONFIG_FATFS_CODEPAGE_771 is not set -# CONFIG_FATFS_CODEPAGE_775 is not set -# CONFIG_FATFS_CODEPAGE_850 is not set -# CONFIG_FATFS_CODEPAGE_852 is not set -# CONFIG_FATFS_CODEPAGE_855 is not set -# CONFIG_FATFS_CODEPAGE_857 is not set -# CONFIG_FATFS_CODEPAGE_860 is not set -# CONFIG_FATFS_CODEPAGE_861 is not set -# CONFIG_FATFS_CODEPAGE_862 is not set -# CONFIG_FATFS_CODEPAGE_863 is not set -# CONFIG_FATFS_CODEPAGE_864 is not set -# CONFIG_FATFS_CODEPAGE_865 is not set -# CONFIG_FATFS_CODEPAGE_866 is not set -# CONFIG_FATFS_CODEPAGE_869 is not set -# CONFIG_FATFS_CODEPAGE_932 is not set -# CONFIG_FATFS_CODEPAGE_936 is not set -# CONFIG_FATFS_CODEPAGE_949 is not set -# CONFIG_FATFS_CODEPAGE_950 is not set -CONFIG_FATFS_CODEPAGE=437 -CONFIG_FATFS_FS_LOCK=0 -CONFIG_FATFS_TIMEOUT_MS=10000 -CONFIG_FATFS_PER_FILE_CACHE=y -CONFIG_FATFS_ALLOC_PREFER_EXTRAM=y -# CONFIG_FATFS_USE_FASTSEEK is not set -CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 -# end of FAT Filesystem support - -# -# FreeRTOS -# - -# -# Kernel -# -# CONFIG_FREERTOS_SMP is not set -# CONFIG_FREERTOS_UNICORE is not set -CONFIG_FREERTOS_HZ=1000 -# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set -# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set -CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y -CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 -CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 -# CONFIG_FREERTOS_USE_IDLE_HOOK is not set -# CONFIG_FREERTOS_USE_TICK_HOOK is not set -CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 -CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY=y -CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 -CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 -CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 -CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 -CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 -# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set -# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set -# end of Kernel - -# -# Port -# -# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set -CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y -# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set -CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y -CONFIG_FREERTOS_ISR_STACKSIZE=1536 -CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y -# CONFIG_FREERTOS_FPU_IN_ISR is not set -CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y -CONFIG_FREERTOS_CORETIMER_0=y -# CONFIG_FREERTOS_CORETIMER_1 is not set -CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y -CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y -# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set -# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set -CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y -# end of Port - -CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF -CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y -CONFIG_FREERTOS_DEBUG_OCDAWARE=y -# end of FreeRTOS - -# -# Hardware Abstraction Layer (HAL) and Low Level (LL) -# -CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y -# CONFIG_HAL_ASSERTION_DISABLE is not set -# CONFIG_HAL_ASSERTION_SILENT is not set -CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=1 -CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y -CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y -# end of Hardware Abstraction Layer (HAL) and Low Level (LL) - -# -# Heap memory debugging -# -CONFIG_HEAP_POISONING_DISABLED=y -# CONFIG_HEAP_POISONING_LIGHT is not set -# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set -CONFIG_HEAP_TRACING_OFF=y -# CONFIG_HEAP_TRACING_STANDALONE is not set -# CONFIG_HEAP_TRACING_TOHOST is not set -# CONFIG_HEAP_USE_HOOKS is not set -# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set -# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set -# end of Heap memory debugging - -CONFIG_IEEE802154_CCA_THRESHOLD=-60 -CONFIG_IEEE802154_PENDING_TABLE_SIZE=20 - -# -# Log output -# -# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set -# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set -# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set -CONFIG_LOG_DEFAULT_LEVEL_INFO=y -# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set -# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set -CONFIG_LOG_DEFAULT_LEVEL=3 -CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y -# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set -# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set -CONFIG_LOG_MAXIMUM_LEVEL=3 -CONFIG_LOG_COLORS=y -CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y -# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set -# end of Log output - -# -# LWIP -# -CONFIG_LWIP_LOCAL_HOSTNAME="Tidbyt" -# CONFIG_LWIP_NETIF_API is not set -CONFIG_LWIP_TCPIP_TASK_PRIO=18 -# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set -# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set -CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y -# CONFIG_LWIP_L2_TO_L3_COPY is not set -# CONFIG_LWIP_IRAM_OPTIMIZATION is not set -# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set -CONFIG_LWIP_TIMERS_ONDEMAND=y -CONFIG_LWIP_ND6=y -CONFIG_LWIP_MAX_SOCKETS=10 -# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set -# CONFIG_LWIP_SO_LINGER is not set -CONFIG_LWIP_SO_REUSE=y -CONFIG_LWIP_SO_REUSE_RXTOALL=y -CONFIG_LWIP_SO_RCVBUF=y -# CONFIG_LWIP_NETBUF_RECVINFO is not set -CONFIG_LWIP_IP4_FRAG=y -CONFIG_LWIP_IP6_FRAG=y -# CONFIG_LWIP_IP4_REASSEMBLY is not set -# CONFIG_LWIP_IP6_REASSEMBLY is not set -CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 -# CONFIG_LWIP_IP_FORWARD is not set -# CONFIG_LWIP_STATS is not set -CONFIG_LWIP_ESP_GRATUITOUS_ARP=y -CONFIG_LWIP_GARP_TMR_INTERVAL=60 -CONFIG_LWIP_ESP_MLDV6_REPORT=y -CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 -CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 -# CONFIG_LWIP_DHCP_DOES_ARP_CHECK is not set -# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set -CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y -CONFIG_LWIP_DHCP_RESTORE_LAST_IP=y -CONFIG_LWIP_DHCP_OPTIONS_LEN=68 -CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 -CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 - -# -# DHCP server -# -# CONFIG_LWIP_DHCPS is not set -# end of DHCP server - -# CONFIG_LWIP_AUTOIP is not set -CONFIG_LWIP_IPV4=y -CONFIG_LWIP_IPV6=y -# CONFIG_LWIP_IPV6_AUTOCONFIG is not set -CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 -# CONFIG_LWIP_IPV6_FORWARD is not set -# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set -CONFIG_LWIP_NETIF_LOOPBACK=y -CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 - -# -# TCP -# -CONFIG_LWIP_MAX_ACTIVE_TCP=16 -CONFIG_LWIP_MAX_LISTENING_TCP=16 -CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y -CONFIG_LWIP_TCP_MAXRTX=12 -CONFIG_LWIP_TCP_SYNMAXRTX=6 -CONFIG_LWIP_TCP_MSS=1440 -CONFIG_LWIP_TCP_TMR_INTERVAL=250 -CONFIG_LWIP_TCP_MSL=60000 -CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 -CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744 -CONFIG_LWIP_TCP_WND_DEFAULT=5744 -CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 -CONFIG_LWIP_TCP_QUEUE_OOSEQ=y -# CONFIG_LWIP_TCP_SACK_OUT is not set -CONFIG_LWIP_TCP_OVERSIZE_MSS=y -# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set -# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set -# CONFIG_LWIP_WND_SCALE is not set -CONFIG_LWIP_TCP_RTO_TIME=1500 -# end of TCP - -# -# UDP -# -CONFIG_LWIP_MAX_UDP_PCBS=16 -CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 -# end of UDP - -# -# Checksums -# -# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set -# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set -CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y -# end of Checksums - -CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 -CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y -# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set -# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF -# CONFIG_LWIP_PPP_SUPPORT is not set -CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 -CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 -# CONFIG_LWIP_SLIP_SUPPORT is not set - -# -# ICMP -# -CONFIG_LWIP_ICMP=y -# CONFIG_LWIP_MULTICAST_PING is not set -# CONFIG_LWIP_BROADCAST_PING is not set -# end of ICMP - -# -# LWIP RAW API -# -CONFIG_LWIP_MAX_RAW_PCBS=16 -# end of LWIP RAW API - -# -# SNTP -# -CONFIG_LWIP_SNTP_MAX_SERVERS=1 -# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set -CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 -# end of SNTP - -CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 -CONFIG_LWIP_ESP_LWIP_ASSERT=y - -# -# Hooks -# -# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set -CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y -# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y -# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set -CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y -# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set -# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y -# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set -CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y -# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set -# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y -# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set -# end of Hooks - -# CONFIG_LWIP_DEBUG is not set -# end of LWIP - -# -# mbedTLS -# -# CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC is not set -CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y -# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set -# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set -CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y -CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 -CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 -# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set -# CONFIG_MBEDTLS_DEBUG is not set - -# -# mbedTLS v3.x related -# -# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set -# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set -# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set -# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set -CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y -# end of mbedTLS v3.x related - -# -# Certificate Bundle -# -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y -# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL is not set -# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE=y -CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE=y -CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE_PATH="certs/" -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 -# end of Certificate Bundle - -# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set -CONFIG_MBEDTLS_CMAC_C=y -CONFIG_MBEDTLS_HARDWARE_AES=y -# CONFIG_MBEDTLS_HARDWARE_MPI is not set -CONFIG_MBEDTLS_HARDWARE_SHA=y -CONFIG_MBEDTLS_ROM_MD5=y -# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set -# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set -CONFIG_MBEDTLS_HAVE_TIME=y -# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set -# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set -CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y -CONFIG_MBEDTLS_SHA512_C=y -# CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT is not set -# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set -CONFIG_MBEDTLS_TLS_CLIENT_ONLY=y -# CONFIG_MBEDTLS_TLS_DISABLED is not set -CONFIG_MBEDTLS_TLS_CLIENT=y -CONFIG_MBEDTLS_TLS_ENABLED=y - -# -# TLS Key Exchange Methods -# -CONFIG_MBEDTLS_PSK_MODES=y -# CONFIG_MBEDTLS_KEY_EXCHANGE_PSK is not set -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_PSK=y -CONFIG_MBEDTLS_KEY_EXCHANGE_RSA_PSK=y -CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y -# end of TLS Key Exchange Methods - -CONFIG_MBEDTLS_SSL_RENEGOTIATION=y -CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y -# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set -# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set -CONFIG_MBEDTLS_SSL_ALPN=y -CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y -CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y - -# -# Symmetric Ciphers -# -CONFIG_MBEDTLS_AES_C=y -# CONFIG_MBEDTLS_CAMELLIA_C is not set -# CONFIG_MBEDTLS_DES_C is not set -# CONFIG_MBEDTLS_BLOWFISH_C is not set -# CONFIG_MBEDTLS_XTEA_C is not set -CONFIG_MBEDTLS_CCM_C=y -CONFIG_MBEDTLS_GCM_C=y -# CONFIG_MBEDTLS_NIST_KW_C is not set -# end of Symmetric Ciphers - -# CONFIG_MBEDTLS_RIPEMD160_C is not set - -# -# Certificates -# -CONFIG_MBEDTLS_PEM_PARSE_C=y -CONFIG_MBEDTLS_PEM_WRITE_C=y -# CONFIG_MBEDTLS_X509_CRL_PARSE_C is not set -# CONFIG_MBEDTLS_X509_CSR_PARSE_C is not set -# end of Certificates - -CONFIG_MBEDTLS_ECP_C=y -# CONFIG_MBEDTLS_DHM_C is not set -CONFIG_MBEDTLS_ECDH_C=y -CONFIG_MBEDTLS_ECDSA_C=y -# CONFIG_MBEDTLS_ECJPAKE_C is not set -CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y -CONFIG_MBEDTLS_ECP_NIST_OPTIM=y -CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM=y -# CONFIG_MBEDTLS_POLY1305_C is not set -# CONFIG_MBEDTLS_CHACHA20_C is not set -# CONFIG_MBEDTLS_HKDF_C is not set -# CONFIG_MBEDTLS_THREADING_C is not set -# end of mbedTLS - -# -# ESP-MQTT Configurations -# -CONFIG_MQTT_PROTOCOL_311=y -# CONFIG_MQTT_PROTOCOL_5 is not set -CONFIG_MQTT_TRANSPORT_SSL=y -CONFIG_MQTT_TRANSPORT_WEBSOCKET=y -CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y -# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set -CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED=y -# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set -# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set -CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED=y -# CONFIG_MQTT_USE_CORE_0 is not set -CONFIG_MQTT_USE_CORE_1=y -# CONFIG_MQTT_CUSTOM_OUTBOX is not set -# end of ESP-MQTT Configurations - -# -# Newlib -# -CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y -# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set -# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set -# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set -# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set -CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y -# CONFIG_NEWLIB_NANO_FORMAT is not set -CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y -# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set -# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set -# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set -# end of Newlib - -# -# NVS -# -# CONFIG_NVS_ASSERT_ERROR_CHECK is not set -# end of NVS - -# -# OpenThread -# -# CONFIG_OPENTHREAD_ENABLED is not set - -# -# Thread Operational Dataset -# -CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP" -CONFIG_OPENTHREAD_MESH_LOCAL_PREFIX="fd00:db8:a0:0::/64" -CONFIG_OPENTHREAD_NETWORK_CHANNEL=15 -CONFIG_OPENTHREAD_NETWORK_PANID=0x1234 -CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe" -CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff" -CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" -# end of Thread Operational Dataset - -CONFIG_OPENTHREAD_XTAL_ACCURACY=130 -# end of OpenThread - -# -# Protocomm -# -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y -# end of Protocomm - -# -# PThreads -# -CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 -CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 -CONFIG_PTHREAD_STACK_MIN=768 -CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y -# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set -# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set -CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 -CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" -# end of PThreads - -# -# MMU Config -# -CONFIG_MMU_PAGE_SIZE_64KB=y -CONFIG_MMU_PAGE_MODE="64KB" -CONFIG_MMU_PAGE_SIZE=0x10000 -# end of MMU Config - -# -# SPI Flash driver -# -# CONFIG_SPI_FLASH_VERIFY_WRITE is not set -# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set -CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y -CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y -# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set -# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set -# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set -# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set -CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y -CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 -CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 -CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 -# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set -# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set -# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set - -# -# SPI Flash behavior when brownout -# -CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y -CONFIG_SPI_FLASH_BROWNOUT_RESET=y -# end of SPI Flash behavior when brownout - -# -# Auto-detect flash chips -# -CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y -CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y -# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set -# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set -# end of Auto-detect flash chips - -CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y -# end of SPI Flash driver - -# -# SPIFFS Configuration -# -CONFIG_SPIFFS_MAX_PARTITIONS=3 - -# -# SPIFFS Cache Configuration -# -CONFIG_SPIFFS_CACHE=y -CONFIG_SPIFFS_CACHE_WR=y -# CONFIG_SPIFFS_CACHE_STATS is not set -# end of SPIFFS Cache Configuration - -CONFIG_SPIFFS_PAGE_CHECK=y -CONFIG_SPIFFS_GC_MAX_RUNS=10 -# CONFIG_SPIFFS_GC_STATS is not set -CONFIG_SPIFFS_PAGE_SIZE=256 -CONFIG_SPIFFS_OBJ_NAME_LEN=32 -# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set -CONFIG_SPIFFS_USE_MAGIC=y -CONFIG_SPIFFS_USE_MAGIC_LENGTH=y -CONFIG_SPIFFS_META_LENGTH=4 -CONFIG_SPIFFS_USE_MTIME=y - -# -# Debug Configuration -# -# CONFIG_SPIFFS_DBG is not set -# CONFIG_SPIFFS_API_DBG is not set -# CONFIG_SPIFFS_GC_DBG is not set -# CONFIG_SPIFFS_CACHE_DBG is not set -# CONFIG_SPIFFS_CHECK_DBG is not set -# CONFIG_SPIFFS_TEST_VISUALISATION is not set -# end of Debug Configuration -# end of SPIFFS Configuration - -# -# TCP Transport -# - -# -# Websocket -# -CONFIG_WS_TRANSPORT=y -CONFIG_WS_BUFFER_SIZE=1024 -# CONFIG_WS_DYNAMIC_BUFFER is not set -# end of Websocket -# end of TCP Transport - -# -# Ultra Low Power (ULP) Co-processor -# -# CONFIG_ULP_COPROC_ENABLED is not set -# end of Ultra Low Power (ULP) Co-processor - -# -# Unity unit testing library -# -CONFIG_UNITY_ENABLE_FLOAT=y -CONFIG_UNITY_ENABLE_DOUBLE=y -# CONFIG_UNITY_ENABLE_64BIT is not set -# CONFIG_UNITY_ENABLE_COLOR is not set -CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y -# CONFIG_UNITY_ENABLE_FIXTURE is not set -# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set -# end of Unity unit testing library - -# -# Root Hub configuration -# -# end of Root Hub configuration - -# -# Virtual file system -# -CONFIG_VFS_SUPPORT_IO=y -CONFIG_VFS_SUPPORT_DIR=y -CONFIG_VFS_SUPPORT_SELECT=y -CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y -CONFIG_VFS_SUPPORT_TERMIOS=y -CONFIG_VFS_MAX_COUNT=8 - -# -# Host File System I/O (Semihosting) -# -CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 -# end of Host File System I/O (Semihosting) -# end of Virtual file system - -# -# Wear Levelling -# -# CONFIG_WL_SECTOR_SIZE_512 is not set -CONFIG_WL_SECTOR_SIZE_4096=y -CONFIG_WL_SECTOR_SIZE=4096 -# end of Wear Levelling - -# -# Wi-Fi Provisioning Manager -# -CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 -CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 -# CONFIG_WIFI_PROV_BLE_BONDING is not set -# CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION is not set -# CONFIG_WIFI_PROV_KEEP_BLE_ON_AFTER_PROV is not set -CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y -# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set -# end of Wi-Fi Provisioning Manager - -# -# Audio playback -# -CONFIG_AUDIO_PLAYER_ENABLE_MP3=y -# CONFIG_AUDIO_PLAYER_ENABLE_WAV is not set -CONFIG_AUDIO_PLAYER_LOG_LEVEL=0 -# end of Audio playback - -# -# DSP Library -# -CONFIG_DSP_OPTIMIZATIONS_SUPPORTED=y -# CONFIG_DSP_ANSI is not set -CONFIG_DSP_OPTIMIZED=y -CONFIG_DSP_OPTIMIZATION=1 -# CONFIG_DSP_MAX_FFT_SIZE_512 is not set -# CONFIG_DSP_MAX_FFT_SIZE_1024 is not set -# CONFIG_DSP_MAX_FFT_SIZE_2048 is not set -CONFIG_DSP_MAX_FFT_SIZE_4096=y -# CONFIG_DSP_MAX_FFT_SIZE_8192 is not set -# CONFIG_DSP_MAX_FFT_SIZE_16384 is not set -# CONFIG_DSP_MAX_FFT_SIZE_32768 is not set -CONFIG_DSP_MAX_FFT_SIZE=4096 -# end of DSP Library - -# -# mDNS -# -CONFIG_MDNS_MAX_INTERFACES=3 -CONFIG_MDNS_MAX_SERVICES=10 -CONFIG_MDNS_TASK_PRIORITY=1 -CONFIG_MDNS_ACTION_QUEUE_LEN=16 -CONFIG_MDNS_TASK_STACK_SIZE=4096 -# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_MDNS_TASK_AFFINITY_CPU0=y -# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set -CONFIG_MDNS_TASK_AFFINITY=0x0 -CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 -CONFIG_MDNS_TIMER_PERIOD_MS=100 -# CONFIG_MDNS_NETWORKING_SOCKET is not set -# CONFIG_MDNS_SKIP_SUPPRESSING_OWN_QUERIES is not set -# CONFIG_MDNS_ENABLE_DEBUG_PRINTS is not set -# CONFIG_MDNS_RESPOND_REVERSE_QUERIES is not set -CONFIG_MDNS_MULTIPLE_INSTANCE=y - -# -# MDNS Predefined interfaces -# -CONFIG_MDNS_PREDEF_NETIF_STA=y -CONFIG_MDNS_PREDEF_NETIF_AP=y -CONFIG_MDNS_PREDEF_NETIF_ETH=y -# end of MDNS Predefined interfaces -# end of mDNS - -# -# libsodium -# -# end of libsodium -# end of Component config - -# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set - -# Deprecated options for backward compatibility -# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set -# CONFIG_NO_BLOBS is not set -# CONFIG_ESP32_NO_BLOBS is not set -# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set -# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set -CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y -# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set -CONFIG_LOG_BOOTLOADER_LEVEL=3 -CONFIG_APP_ROLLBACK_ENABLE=y -# CONFIG_APP_ANTI_ROLLBACK is not set -# CONFIG_FLASH_ENCRYPTION_ENABLED is not set -# CONFIG_FLASHMODE_QIO is not set -# CONFIG_FLASHMODE_QOUT is not set -CONFIG_FLASHMODE_DIO=y -# CONFIG_FLASHMODE_DOUT is not set -CONFIG_MONITOR_BAUD=115200 -# CONFIG_OPTIMIZATION_LEVEL_DEBUG is not set -# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set -# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set -# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set -# CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED is not set -CONFIG_OPTIMIZATION_ASSERTIONS_SILENT=y -# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set -CONFIG_OPTIMIZATION_ASSERTION_LEVEL=1 -# CONFIG_CXX_EXCEPTIONS is not set -CONFIG_STACK_CHECK_NONE=y -# CONFIG_STACK_CHECK_NORM is not set -# CONFIG_STACK_CHECK_STRONG is not set -# CONFIG_STACK_CHECK_ALL is not set -# CONFIG_WARN_WRITE_STRINGS is not set -# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set -CONFIG_ESP32_APPTRACE_DEST_NONE=y -CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y -CONFIG_BLUEDROID_ENABLED=y -# CONFIG_NIMBLE_ENABLED is not set -CONFIG_BTC_TASK_STACK_SIZE=3072 -CONFIG_BLUEDROID_PINNED_TO_CORE_0=y -# CONFIG_BLUEDROID_PINNED_TO_CORE_1 is not set -CONFIG_BLUEDROID_PINNED_TO_CORE=0 -CONFIG_BTU_TASK_STACK_SIZE=4096 -# CONFIG_BLUEDROID_MEM_DEBUG is not set -# CONFIG_CLASSIC_BT_ENABLED is not set -CONFIG_GATTS_ENABLE=y -# CONFIG_GATTS_SEND_SERVICE_CHANGE_MANUAL is not set -CONFIG_GATTS_SEND_SERVICE_CHANGE_AUTO=y -CONFIG_GATTS_SEND_SERVICE_CHANGE_MODE=0 -# CONFIG_GATTC_ENABLE is not set -# CONFIG_BLE_SMP_ENABLE is not set -# CONFIG_HCI_TRACE_LEVEL_NONE is not set -# CONFIG_HCI_TRACE_LEVEL_ERROR is not set -CONFIG_HCI_TRACE_LEVEL_WARNING=y -# CONFIG_HCI_TRACE_LEVEL_API is not set -# CONFIG_HCI_TRACE_LEVEL_EVENT is not set -# CONFIG_HCI_TRACE_LEVEL_DEBUG is not set -# CONFIG_HCI_TRACE_LEVEL_VERBOSE is not set -CONFIG_HCI_INITIAL_TRACE_LEVEL=2 -# CONFIG_BTM_TRACE_LEVEL_NONE is not set -# CONFIG_BTM_TRACE_LEVEL_ERROR is not set -CONFIG_BTM_TRACE_LEVEL_WARNING=y -# CONFIG_BTM_TRACE_LEVEL_API is not set -# CONFIG_BTM_TRACE_LEVEL_EVENT is not set -# CONFIG_BTM_TRACE_LEVEL_DEBUG is not set -# CONFIG_BTM_TRACE_LEVEL_VERBOSE is not set -CONFIG_BTM_INITIAL_TRACE_LEVEL=2 -# CONFIG_L2CAP_TRACE_LEVEL_NONE is not set -# CONFIG_L2CAP_TRACE_LEVEL_ERROR is not set -CONFIG_L2CAP_TRACE_LEVEL_WARNING=y -# CONFIG_L2CAP_TRACE_LEVEL_API is not set -# CONFIG_L2CAP_TRACE_LEVEL_EVENT is not set -# CONFIG_L2CAP_TRACE_LEVEL_DEBUG is not set -# CONFIG_L2CAP_TRACE_LEVEL_VERBOSE is not set -CONFIG_L2CAP_INITIAL_TRACE_LEVEL=2 -# CONFIG_RFCOMM_TRACE_LEVEL_NONE is not set -# CONFIG_RFCOMM_TRACE_LEVEL_ERROR is not set -CONFIG_RFCOMM_TRACE_LEVEL_WARNING=y -# CONFIG_RFCOMM_TRACE_LEVEL_API is not set -# CONFIG_RFCOMM_TRACE_LEVEL_EVENT is not set -# CONFIG_RFCOMM_TRACE_LEVEL_DEBUG is not set -# CONFIG_RFCOMM_TRACE_LEVEL_VERBOSE is not set -CONFIG_RFCOMM_INITIAL_TRACE_LEVEL=2 -# CONFIG_SDP_TRACE_LEVEL_NONE is not set -# CONFIG_SDP_TRACE_LEVEL_ERROR is not set -CONFIG_SDP_TRACE_LEVEL_WARNING=y -# CONFIG_SDP_TRACE_LEVEL_API is not set -# CONFIG_SDP_TRACE_LEVEL_EVENT is not set -# CONFIG_SDP_TRACE_LEVEL_DEBUG is not set -# CONFIG_SDP_TRACE_LEVEL_VERBOSE is not set -CONFIG_BTH_LOG_SDP_INITIAL_TRACE_LEVEL=2 -# CONFIG_GAP_TRACE_LEVEL_NONE is not set -# CONFIG_GAP_TRACE_LEVEL_ERROR is not set -CONFIG_GAP_TRACE_LEVEL_WARNING=y -# CONFIG_GAP_TRACE_LEVEL_API is not set -# CONFIG_GAP_TRACE_LEVEL_EVENT is not set -# CONFIG_GAP_TRACE_LEVEL_DEBUG is not set -# CONFIG_GAP_TRACE_LEVEL_VERBOSE is not set -CONFIG_GAP_INITIAL_TRACE_LEVEL=2 -CONFIG_BNEP_INITIAL_TRACE_LEVEL=2 -# CONFIG_PAN_TRACE_LEVEL_NONE is not set -# CONFIG_PAN_TRACE_LEVEL_ERROR is not set -CONFIG_PAN_TRACE_LEVEL_WARNING=y -# CONFIG_PAN_TRACE_LEVEL_API is not set -# CONFIG_PAN_TRACE_LEVEL_EVENT is not set -# CONFIG_PAN_TRACE_LEVEL_DEBUG is not set -# CONFIG_PAN_TRACE_LEVEL_VERBOSE is not set -CONFIG_PAN_INITIAL_TRACE_LEVEL=2 -# CONFIG_A2D_TRACE_LEVEL_NONE is not set -# CONFIG_A2D_TRACE_LEVEL_ERROR is not set -CONFIG_A2D_TRACE_LEVEL_WARNING=y -# CONFIG_A2D_TRACE_LEVEL_API is not set -# CONFIG_A2D_TRACE_LEVEL_EVENT is not set -# CONFIG_A2D_TRACE_LEVEL_DEBUG is not set -# CONFIG_A2D_TRACE_LEVEL_VERBOSE is not set -CONFIG_A2D_INITIAL_TRACE_LEVEL=2 -# CONFIG_AVDT_TRACE_LEVEL_NONE is not set -# CONFIG_AVDT_TRACE_LEVEL_ERROR is not set -CONFIG_AVDT_TRACE_LEVEL_WARNING=y -# CONFIG_AVDT_TRACE_LEVEL_API is not set -# CONFIG_AVDT_TRACE_LEVEL_EVENT is not set -# CONFIG_AVDT_TRACE_LEVEL_DEBUG is not set -# CONFIG_AVDT_TRACE_LEVEL_VERBOSE is not set -CONFIG_AVDT_INITIAL_TRACE_LEVEL=2 -# CONFIG_AVCT_TRACE_LEVEL_NONE is not set -# CONFIG_AVCT_TRACE_LEVEL_ERROR is not set -CONFIG_AVCT_TRACE_LEVEL_WARNING=y -# CONFIG_AVCT_TRACE_LEVEL_API is not set -# CONFIG_AVCT_TRACE_LEVEL_EVENT is not set -# CONFIG_AVCT_TRACE_LEVEL_DEBUG is not set -# CONFIG_AVCT_TRACE_LEVEL_VERBOSE is not set -CONFIG_AVCT_INITIAL_TRACE_LEVEL=2 -# CONFIG_AVRC_TRACE_LEVEL_NONE is not set -# CONFIG_AVRC_TRACE_LEVEL_ERROR is not set -CONFIG_AVRC_TRACE_LEVEL_WARNING=y -# CONFIG_AVRC_TRACE_LEVEL_API is not set -# CONFIG_AVRC_TRACE_LEVEL_EVENT is not set -# CONFIG_AVRC_TRACE_LEVEL_DEBUG is not set -# CONFIG_AVRC_TRACE_LEVEL_VERBOSE is not set -CONFIG_AVRC_INITIAL_TRACE_LEVEL=2 -# CONFIG_MCA_TRACE_LEVEL_NONE is not set -# CONFIG_MCA_TRACE_LEVEL_ERROR is not set -CONFIG_MCA_TRACE_LEVEL_WARNING=y -# CONFIG_MCA_TRACE_LEVEL_API is not set -# CONFIG_MCA_TRACE_LEVEL_EVENT is not set -# CONFIG_MCA_TRACE_LEVEL_DEBUG is not set -# CONFIG_MCA_TRACE_LEVEL_VERBOSE is not set -CONFIG_MCA_INITIAL_TRACE_LEVEL=2 -# CONFIG_HID_TRACE_LEVEL_NONE is not set -# CONFIG_HID_TRACE_LEVEL_ERROR is not set -CONFIG_HID_TRACE_LEVEL_WARNING=y -# CONFIG_HID_TRACE_LEVEL_API is not set -# CONFIG_HID_TRACE_LEVEL_EVENT is not set -# CONFIG_HID_TRACE_LEVEL_DEBUG is not set -# CONFIG_HID_TRACE_LEVEL_VERBOSE is not set -CONFIG_HID_INITIAL_TRACE_LEVEL=2 -# CONFIG_APPL_TRACE_LEVEL_NONE is not set -# CONFIG_APPL_TRACE_LEVEL_ERROR is not set -CONFIG_APPL_TRACE_LEVEL_WARNING=y -# CONFIG_APPL_TRACE_LEVEL_API is not set -# CONFIG_APPL_TRACE_LEVEL_EVENT is not set -# CONFIG_APPL_TRACE_LEVEL_DEBUG is not set -# CONFIG_APPL_TRACE_LEVEL_VERBOSE is not set -CONFIG_APPL_INITIAL_TRACE_LEVEL=2 -# CONFIG_GATT_TRACE_LEVEL_NONE is not set -# CONFIG_GATT_TRACE_LEVEL_ERROR is not set -CONFIG_GATT_TRACE_LEVEL_WARNING=y -# CONFIG_GATT_TRACE_LEVEL_API is not set -# CONFIG_GATT_TRACE_LEVEL_EVENT is not set -# CONFIG_GATT_TRACE_LEVEL_DEBUG is not set -# CONFIG_GATT_TRACE_LEVEL_VERBOSE is not set -CONFIG_GATT_INITIAL_TRACE_LEVEL=2 -# CONFIG_SMP_TRACE_LEVEL_NONE is not set -# CONFIG_SMP_TRACE_LEVEL_ERROR is not set -CONFIG_SMP_TRACE_LEVEL_WARNING=y -# CONFIG_SMP_TRACE_LEVEL_API is not set -# CONFIG_SMP_TRACE_LEVEL_EVENT is not set -# CONFIG_SMP_TRACE_LEVEL_DEBUG is not set -# CONFIG_SMP_TRACE_LEVEL_VERBOSE is not set -CONFIG_SMP_INITIAL_TRACE_LEVEL=2 -# CONFIG_BTIF_TRACE_LEVEL_NONE is not set -# CONFIG_BTIF_TRACE_LEVEL_ERROR is not set -CONFIG_BTIF_TRACE_LEVEL_WARNING=y -# CONFIG_BTIF_TRACE_LEVEL_API is not set -# CONFIG_BTIF_TRACE_LEVEL_EVENT is not set -# CONFIG_BTIF_TRACE_LEVEL_DEBUG is not set -# CONFIG_BTIF_TRACE_LEVEL_VERBOSE is not set -CONFIG_BTIF_INITIAL_TRACE_LEVEL=2 -# CONFIG_BTC_TRACE_LEVEL_NONE is not set -# CONFIG_BTC_TRACE_LEVEL_ERROR is not set -CONFIG_BTC_TRACE_LEVEL_WARNING=y -# CONFIG_BTC_TRACE_LEVEL_API is not set -# CONFIG_BTC_TRACE_LEVEL_EVENT is not set -# CONFIG_BTC_TRACE_LEVEL_DEBUG is not set -# CONFIG_BTC_TRACE_LEVEL_VERBOSE is not set -CONFIG_BTC_INITIAL_TRACE_LEVEL=2 -# CONFIG_OSI_TRACE_LEVEL_NONE is not set -# CONFIG_OSI_TRACE_LEVEL_ERROR is not set -CONFIG_OSI_TRACE_LEVEL_WARNING=y -# CONFIG_OSI_TRACE_LEVEL_API is not set -# CONFIG_OSI_TRACE_LEVEL_EVENT is not set -# CONFIG_OSI_TRACE_LEVEL_DEBUG is not set -# CONFIG_OSI_TRACE_LEVEL_VERBOSE is not set -CONFIG_OSI_INITIAL_TRACE_LEVEL=2 -# CONFIG_BLUFI_TRACE_LEVEL_NONE is not set -# CONFIG_BLUFI_TRACE_LEVEL_ERROR is not set -CONFIG_BLUFI_TRACE_LEVEL_WARNING=y -# CONFIG_BLUFI_TRACE_LEVEL_API is not set -# CONFIG_BLUFI_TRACE_LEVEL_EVENT is not set -# CONFIG_BLUFI_TRACE_LEVEL_DEBUG is not set -# CONFIG_BLUFI_TRACE_LEVEL_VERBOSE is not set -CONFIG_BLUFI_INITIAL_TRACE_LEVEL=2 -# CONFIG_BLE_HOST_QUEUE_CONGESTION_CHECK is not set -# CONFIG_BLE_ACTIVE_SCAN_REPORT_ADV_SCAN_RSP_INDIVIDUALLY is not set -CONFIG_BLE_ESTABLISH_LINK_CONNECTION_TIMEOUT=30 -CONFIG_BTDM_CONTROLLER_MODE_BLE_ONLY=y -# CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY is not set -# CONFIG_BTDM_CONTROLLER_MODE_BTDM is not set -CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN=3 -CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN_EFF=3 -CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_ACL_CONN_EFF=0 -CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN_EFF=0 -CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0 -CONFIG_BTDM_CONTROLLER_HCI_MODE_VHCI=y -# CONFIG_BTDM_CONTROLLER_HCI_MODE_UART_H4 is not set -CONFIG_BTDM_CONTROLLER_MODEM_SLEEP=y -CONFIG_BLE_SCAN_DUPLICATE=y -CONFIG_SCAN_DUPLICATE_BY_DEVICE_ADDR=y -# CONFIG_SCAN_DUPLICATE_BY_ADV_DATA is not set -# CONFIG_SCAN_DUPLICATE_BY_ADV_DATA_AND_DEVICE_ADDR is not set -CONFIG_SCAN_DUPLICATE_TYPE=0 -CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200 -# CONFIG_BLE_MESH_SCAN_DUPLICATE_EN is not set -CONFIG_BTDM_CONTROLLER_FULL_SCAN_SUPPORTED=y -CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_SUPPORTED=y -CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_NUM=100 -CONFIG_BLE_ADV_REPORT_DISCARD_THRSHOLD=20 -CONFIG_ADC2_DISABLE_DAC=y -# CONFIG_MCPWM_ISR_IN_IRAM is not set -# CONFIG_SW_COEXIST_ENABLE is not set -# CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE is not set -# CONFIG_ESP_WIFI_SW_COEXIST_ENABLE is not set -# CONFIG_EVENT_LOOP_PROFILING is not set -CONFIG_POST_EVENTS_FROM_ISR=y -CONFIG_POST_EVENTS_FROM_IRAM_ISR=y -CONFIG_OTA_ALLOW_HTTP=y -# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set -CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y -CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 -CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 -# CONFIG_ESP32_RTC_CLK_SRC_INT_RC is not set -# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC is not set -# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set -# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set -# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set -# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set -CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256=y -CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256=y -CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 -# CONFIG_ESP32_XTAL_FREQ_26 is not set -CONFIG_ESP32_XTAL_FREQ_40=y -# CONFIG_ESP32_XTAL_FREQ_AUTO is not set -CONFIG_ESP32_XTAL_FREQ=40 -CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y -# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set -CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 -CONFIG_ESP32_PHY_MAX_TX_POWER=20 -CONFIG_REDUCE_PHY_TX_POWER=y -CONFIG_ESP32_REDUCE_PHY_TX_POWER=y -CONFIG_SPIRAM_SUPPORT=y -CONFIG_ESP32_SPIRAM_SUPPORT=y -CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST=y -# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set -# CONFIG_ESP32_DEFAULT_CPU_FREQ_160 is not set -CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y -CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240 -CONFIG_TRACEMEM_RESERVE_DRAM=0x0 -# CONFIG_ESP32_PANIC_PRINT_HALT is not set -CONFIG_ESP32_PANIC_PRINT_REBOOT=y -# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set -# CONFIG_ESP32_PANIC_GDBSTUB is not set -CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 -CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 -CONFIG_MAIN_TASK_STACK_SIZE=3584 -CONFIG_CONSOLE_UART_DEFAULT=y -# CONFIG_CONSOLE_UART_CUSTOM is not set -# CONFIG_CONSOLE_UART_NONE is not set -# CONFIG_ESP_CONSOLE_UART_NONE is not set -CONFIG_CONSOLE_UART=y -CONFIG_CONSOLE_UART_NUM=0 -CONFIG_CONSOLE_UART_BAUDRATE=115200 -CONFIG_INT_WDT=y -CONFIG_INT_WDT_TIMEOUT_MS=300 -CONFIG_INT_WDT_CHECK_CPU1=y -CONFIG_TASK_WDT=y -CONFIG_ESP_TASK_WDT=y -# CONFIG_TASK_WDT_PANIC is not set -CONFIG_TASK_WDT_TIMEOUT_S=5 -CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y -CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y -# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set -CONFIG_ESP32_DEBUG_OCDAWARE=y -CONFIG_BROWNOUT_DET=y -CONFIG_ESP32_BROWNOUT_DET=y -CONFIG_BROWNOUT_DET_LVL_SEL_0=y -CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y -# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set -# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set -CONFIG_BROWNOUT_DET_LVL=0 -CONFIG_ESP32_BROWNOUT_DET_LVL=0 -# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set -CONFIG_IPC_TASK_STACK_SIZE=1024 -CONFIG_TIMER_TASK_STACK_SIZE=3584 -CONFIG_ESP32_WIFI_ENABLED=y -CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=8 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 -CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y -CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0 -CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16 -CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=32 -# CONFIG_ESP32_WIFI_CSI_ENABLED is not set -# CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED is not set -# CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED is not set -# CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED is not set -# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set -CONFIG_ESP32_WIFI_NVS_ENABLED=y -CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y -# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set -CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 -CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 -CONFIG_ESP32_WIFI_IRAM_OPT=y -CONFIG_ESP32_WIFI_RX_IRAM_OPT=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y -CONFIG_WPA_MBEDTLS_CRYPTO=y -CONFIG_WPA_MBEDTLS_TLS_CLIENT=y -# CONFIG_WPA_WAPI_PSK is not set -# CONFIG_WPA_11KV_SUPPORT is not set -# CONFIG_WPA_MBO_SUPPORT is not set -# CONFIG_WPA_DPP_SUPPORT is not set -# CONFIG_WPA_11R_SUPPORT is not set -# CONFIG_WPA_WPS_STRICT is not set -# CONFIG_WPA_DEBUG_PRINT is not set -# CONFIG_WPA_TESTING_OPTIONS is not set -# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set -# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set -CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y -CONFIG_TIMER_TASK_PRIORITY=1 -CONFIG_TIMER_TASK_STACK_DEPTH=2048 -CONFIG_TIMER_QUEUE_LENGTH=10 -# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set -# CONFIG_HAL_ASSERTION_SILIENT is not set -# CONFIG_L2_TO_L3_COPY is not set -CONFIG_ESP_GRATUITOUS_ARP=y -CONFIG_GARP_TMR_INTERVAL=60 -CONFIG_TCPIP_RECVMBOX_SIZE=32 -CONFIG_TCP_MAXRTX=12 -CONFIG_TCP_SYNMAXRTX=6 -CONFIG_TCP_MSS=1440 -CONFIG_TCP_MSL=60000 -CONFIG_TCP_SND_BUF_DEFAULT=5744 -CONFIG_TCP_WND_DEFAULT=5744 -CONFIG_TCP_RECVMBOX_SIZE=6 -CONFIG_TCP_QUEUE_OOSEQ=y -CONFIG_TCP_OVERSIZE_MSS=y -# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set -# CONFIG_TCP_OVERSIZE_DISABLE is not set -CONFIG_UDP_RECVMBOX_SIZE=6 -CONFIG_TCPIP_TASK_STACK_SIZE=3072 -CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y -# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set -# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF -# CONFIG_PPP_SUPPORT is not set -CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT=y -CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y -# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set -# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set -CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 -CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 -CONFIG_ESP32_PTHREAD_STACK_MIN=768 -CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y -# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set -# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set -CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 -CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" -CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y -# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set -# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set -# CONFIG_ESP32_ULP_COPROC_ENABLED is not set -CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y -CONFIG_SUPPORT_TERMIOS=y -CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 -# End of deprecated options diff --git a/src/audio.c b/src/audio.c new file mode 100644 index 0000000..b9e0e13 --- /dev/null +++ b/src/audio.c @@ -0,0 +1,134 @@ +#ifdef TIDBYT_GEN2 + +#include +#include +#include +#include +#include + +static const char *TAG = "audio"; + +#define I2S_NUM (I2S_NUM_0) +#define I2S_SAMPLE_RATE (44100) + +#define I2S_PINS \ + { \ + .mclk = (gpio_num_t)-1, .bclk = GPIO_NUM_12, .ws = GPIO_NUM_13, \ + .dout = GPIO_NUM_14, .din = (gpio_num_t)-1, \ + .invert_flags = { \ + .mclk_inv = false, \ + .bclk_inv = false, \ + .ws_inv = false, \ + }, \ + } + +static i2s_chan_handle_t _tx; + +static esp_err_t _setI2SClock(uint32_t rate, uint32_t bitWidth, + i2s_slot_mode_t mode) { + ESP_LOGI(TAG, "setI2SClock: rate=%lu, bitWidth=%lu, mode=%d", rate, bitWidth, + mode); + + esp_err_t ret = ESP_OK; + + i2s_std_config_t config = { + .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(rate), + .slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG( + (i2s_data_bit_width_t)bitWidth, mode), + .gpio_cfg = I2S_PINS, + }; + + ret |= i2s_channel_disable(_tx); + ret |= i2s_channel_reconfig_std_clock(_tx, &config.clk_cfg); + ret |= i2s_channel_reconfig_std_slot(_tx, &config.slot_cfg); + ret |= i2s_channel_enable(_tx); + + return ret; +} + +static esp_err_t _i2sWrite(void *buf, size_t len, size_t *bytesWritten, + uint32_t timeout) { + if (len % 2 != 0) { + return ESP_ERR_INVALID_SIZE; + } + + return i2s_channel_write(_tx, (uint8_t *)buf, len, bytesWritten, timeout); +} + +static esp_err_t _initI2S() { + esp_err_t ret = ESP_OK; + + i2s_std_config_t config = { + .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(I2S_SAMPLE_RATE), + .slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, + I2S_SLOT_MODE_STEREO), + .gpio_cfg = I2S_PINS}; + + i2s_chan_config_t channels = + I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM, I2S_ROLE_MASTER); + channels.dma_frame_num *= 2; + channels.auto_clear = true; + ret = i2s_new_channel(&channels, &_tx, NULL); + if (ret != ESP_OK) { + return ret; + } + + ret |= i2s_channel_init_std_mode(_tx, &config); + ret |= i2s_channel_enable(_tx); + + return ret; +} + +static esp_err_t _mute_cb(AUDIO_PLAYER_MUTE_SETTING setting) { + ESP_LOGI(TAG, "Mute setting: %d", setting); + return ESP_OK; +} + +static void _shutdown() { + audio_player_delete(); + i2s_channel_disable(_tx); + i2s_del_channel(_tx); +} + +esp_err_t audio_initialize() { + esp_err_t ret = _initI2S(); + if (ret != ESP_OK) { + return ret; + } + + audio_player_config_t config = { + .mute_fn = _mute_cb, + .clk_set_fn = _setI2SClock, + .write_fn = _i2sWrite, + .priority = configMAX_PRIORITIES - 1, + .coreID = tskNO_AFFINITY, + }; + ret = audio_player_new(config); + if (ret != ESP_OK) { + return ret; + } + + esp_register_shutdown_handler(&_shutdown); + + return ESP_OK; +} + +esp_err_t audio_play(const unsigned char *data, size_t length) { + FILE *fp = fmemopen((void *)data, length, "rb"); + assert(fp != NULL); + + return audio_player_play(fp); +} + +#else + +#include +#include + +esp_err_t audio_play(const unsigned char *data, size_t length) { + return ESP_OK; +} + +esp_err_t audio_initialize() { return ESP_OK; } + +#endif diff --git a/src/audio.h b/src/audio.h new file mode 100644 index 0000000..2b72de1 --- /dev/null +++ b/src/audio.h @@ -0,0 +1,4 @@ +#pragma once + +esp_err_t audio_initialize(); +esp_err_t audio_play(const unsigned char *data, size_t length); diff --git a/src/main.c b/src/main.c index 21acd1d..4c28304 100644 --- a/src/main.c +++ b/src/main.c @@ -5,6 +5,7 @@ #include #include +#include "audio.h" #include "display.h" #include "flash.h" #include "gfx.h" @@ -38,12 +39,21 @@ void app_main(void) { } esp_register_shutdown_handler(&wifi_shutdown); + // Setup audio. + if (audio_initialize() != ESP_OK) { + ESP_LOGE(TAG, "failed to initialize audio"); + return; + } + uint8_t mac[6]; if (!wifi_get_mac(mac)) { ESP_LOGI(TAG, "WiFi MAC: %02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); } + // Play a sample. This will only have an effect on Gen 2 devices. + audio_play(ASSET_LAZY_DADDY_MP3, ASSET_LAZY_DADDY_MP3_LEN); + for (;;) { uint8_t* webp; size_t len; diff --git a/src/remote.c b/src/remote.c index 6eb1da9..c0b8a40 100644 --- a/src/remote.c +++ b/src/remote.c @@ -42,6 +42,10 @@ static esp_err_t _httpCallback(esp_http_client_event_t* event) { event->header_value); break; + case HTTP_EVENT_REDIRECT: + ESP_LOGD(TAG, "HTTP_EVENT_REDIRECT"); + break; + case HTTP_EVENT_ON_DATA: ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", event->data_len); diff --git a/src/wifi.c b/src/wifi.c index b541c90..047be42 100644 --- a/src/wifi.c +++ b/src/wifi.c @@ -87,9 +87,9 @@ int wifi_initialize(const char* ssid, const char* password) { } wifi_config_t wifi_config = {0}; - strncpy((char*)wifi_config.sta.ssid, ssid, sizeof(wifi_config.sta.ssid)); + strncpy((char*)wifi_config.sta.ssid, ssid, sizeof(wifi_config.sta.ssid) - 1); strncpy((char*)wifi_config.sta.password, password, - sizeof(wifi_config.sta.password)); + sizeof(wifi_config.sta.password) - 1); err = esp_wifi_set_mode(WIFI_MODE_STA); if (err != ESP_OK) { ESP_LOGE(TAG, "Set mode failed: %s", esp_err_to_name(err));