From 6a288bb002c0c28f96168885445806eb1a7bbffa Mon Sep 17 00:00:00 2001 From: Ilya Belyakov Date: Wed, 14 Aug 2024 00:00:52 +0500 Subject: [PATCH 001/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=B0=D0=BB=D1=8C=D1=82=D0=B5=D1=80=D0=BD?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=B9=20=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../virtual/UpdateServer/UpdateServer.cpp | 23 +++++++++++ src/modules/virtual/UpdateServer/modinfo.json | 39 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/modules/virtual/UpdateServer/UpdateServer.cpp create mode 100644 src/modules/virtual/UpdateServer/modinfo.json diff --git a/src/modules/virtual/UpdateServer/UpdateServer.cpp b/src/modules/virtual/UpdateServer/UpdateServer.cpp new file mode 100644 index 00000000..b622e1b0 --- /dev/null +++ b/src/modules/virtual/UpdateServer/UpdateServer.cpp @@ -0,0 +1,23 @@ +#include "Global.h" +#include "classes/IoTItem.h" + +class UpdateServer : public IoTItem { + public: + UpdateServer(String parameters) : IoTItem(parameters) {} + + void onModuleOrder(String &key, String &value) { + if (key == "startUpdate") { + upgrade_firmware(3, value); + } + } + + ~UpdateServer() {}; +}; + +void* getAPI_UpdateServer(String subtype, String param) { + if (subtype == F("UpdateServer")) { + return new UpdateServer(param); + } else { + return nullptr; + } +} diff --git a/src/modules/virtual/UpdateServer/modinfo.json b/src/modules/virtual/UpdateServer/modinfo.json new file mode 100644 index 00000000..7249644c --- /dev/null +++ b/src/modules/virtual/UpdateServer/modinfo.json @@ -0,0 +1,39 @@ +{ + "menuSection": "virtual_elments", + "configItem": [ + { + "global": 0, + "name": "Свой сервер обновлений", + "type": "Reading", + "subtype": "UpdateServer", + "id": "UpdateServer", + "widget": "", + "page": "", + "descr": "", + "btn-startUpdate": "http://192.168.11.112/iotm" + } + ], + "about": { + "authorName": "Ilya Belyakov", + "authorContact": "https://t.me/Biveraxe", + "authorGit": "https://github.com/biveraxe", + "exampleURL": "https://iotmanager.org/", + "specialThanks": "", + "moduleName": "UpdateServer", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "Свой сервер обновлений", + "moduleDesc": "Модуль для получения прошивки из своего сервера обновлений.", + "propInfo": { + "btn-startUpdate": "Кнопка запуска процесса обновления из указанного URL" + } + }, + "defActive": true, + "usedLibs": { + "esp32*": [], + "esp82*": [] + } +} \ No newline at end of file From d3d01f1ae6ef0817fc59aa9c2100f2c6782144c8 Mon Sep 17 00:00:00 2001 From: Ilya Belyakov Date: Wed, 14 Aug 2024 00:33:21 +0500 Subject: [PATCH 002/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82?= =?UTF-8?q?=D1=8B=20=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=87=D0=BD=D0=BE=D0=B9?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=88=D0=B8=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/virtual/UpdateServer/UpdateServer.cpp | 6 +++++- src/modules/virtual/UpdateServer/modinfo.json | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/modules/virtual/UpdateServer/UpdateServer.cpp b/src/modules/virtual/UpdateServer/UpdateServer.cpp index b622e1b0..b9f6b75a 100644 --- a/src/modules/virtual/UpdateServer/UpdateServer.cpp +++ b/src/modules/virtual/UpdateServer/UpdateServer.cpp @@ -6,8 +6,12 @@ class UpdateServer : public IoTItem { UpdateServer(String parameters) : IoTItem(parameters) {} void onModuleOrder(String &key, String &value) { - if (key == "startUpdate") { + if (key == "startUpdateAll") { upgrade_firmware(3, value); + } else if (key == "startUpdateFS") { + upgrade_firmware(2, value); + } else if (key == "startUpdateFW") { + upgrade_firmware(1, value); } } diff --git a/src/modules/virtual/UpdateServer/modinfo.json b/src/modules/virtual/UpdateServer/modinfo.json index 7249644c..c4b8fc70 100644 --- a/src/modules/virtual/UpdateServer/modinfo.json +++ b/src/modules/virtual/UpdateServer/modinfo.json @@ -10,7 +10,9 @@ "widget": "", "page": "", "descr": "", - "btn-startUpdate": "http://192.168.11.112/iotm" + "btn-startUpdateAll": "http://192.168.11.112/iotm/esp8266_4mb/400", + "btn-startUpdateFS": "http://192.168.11.112/iotm/esp8266_4mb/400", + "btn-startUpdateFW": "http://192.168.11.112/iotm/esp8266_4mb/400" } ], "about": { From 3919e5a0ab5705e695a8edd114026d3d7eaf3298 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 20 Sep 2024 11:07:08 +0300 Subject: [PATCH 003/118] DebugTrace, Nextion, BrokerMQTT --- include/DebugTrace.h | 20 + platformio.ini | 29 +- src/DebugTrace.cpp | 287 ++++++++ src/EspFileSystem.cpp | 3 +- src/Main.cpp | 11 + src/PeriodicTasks.cpp | 34 +- src/modules/display/Nextion/ESPNexUpload.cpp | 678 ++++++++++++------- src/modules/display/Nextion/ESPNexUpload.h | 308 +++++---- src/modules/display/Nextion/Nextion.cpp | 23 +- src/modules/display/Nextion/modinfo.json | 15 +- src/modules/exec/BrokerMQTT/BrokerMQTT.cpp | 38 +- src/modules/exec/Telegram_v2/Telegram_v2.cpp | 2 +- 12 files changed, 1011 insertions(+), 437 deletions(-) create mode 100644 include/DebugTrace.h create mode 100644 src/DebugTrace.cpp diff --git a/include/DebugTrace.h b/include/DebugTrace.h new file mode 100644 index 00000000..c8aff58a --- /dev/null +++ b/include/DebugTrace.h @@ -0,0 +1,20 @@ +#pragma once +// +#include "Global.h" + +#define RESTART_DEBUG_INFO +#if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) +#define CONFIG_RESTART_DEBUG_STACK_DEPTH 15 +typedef struct { + size_t heap_total; + size_t heap_free; + size_t heap_free_min; + time_t heap_min_time; + uint32_t backtrace[CONFIG_RESTART_DEBUG_STACK_DEPTH]; +} re_restart_debug_t; + +#endif // RESTART_DEBUG_INFO +extern "C" void __real_esp_panic_handler(void*); +void printDebugTrace(); +void sendDebugTraceAndFreeMemory(bool); +void IRAM_ATTR debugUpdate(); diff --git a/platformio.ini b/platformio.ini index 82d089cd..db541216 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,5 +1,5 @@ [platformio] -default_envs = esp8266_4mb +default_envs = esp32_4mb3f data_dir = data_svelte [common_env_data] @@ -185,9 +185,10 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_4mb_fromitems.lib_deps} build_flags = -Desp32_4mb="esp32_4mb" + -Wl,--wrap=esp_panic_handler framework = arduino board = esp32dev -platform = espressif32 @5.1.1 +platform = espressif32 @6.6.0 monitor_filters = esp32_exception_decoder upload_speed = 921600 monitor_speed = 115200 @@ -206,9 +207,10 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_4mb3f_fromitems.lib_deps} build_flags = -Desp32_4mb="esp32_4mb" + -Wl,--wrap=esp_panic_handler framework = arduino board = esp32dev -platform = espressif32 @5.1.1 +platform = espressif32 @6.6.0 monitor_filters = esp32_exception_decoder upload_speed = 921600 monitor_speed = 115200 @@ -231,9 +233,10 @@ build_flags = -Desp32cam_4mb="esp32cam_4mb" -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue + -Wl,--wrap=esp_panic_handler framework = arduino board = esp32cam -platform = espressif32 @5.1.1 +platform = espressif32 @6.6.0 monitor_filters = esp32_exception_decoder upload_speed = 921600 monitor_speed = 115200 @@ -251,13 +254,13 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32s2_4mb_fromitems.lib_deps} -build_flags = - -Desp32s2_4mb="esp32s2_4mb" +build_flags = -Desp32s2_4mb="esp32s2_4mb" -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=0 + -Wl,--wrap=esp_panic_handler framework = arduino board = lolin_s2_mini -platform = espressif32 @6.3.1 +platform = espressif32 @6.6.0 monitor_filters = esp32_exception_decoder upload_speed = 921600 monitor_speed = 115200 @@ -275,11 +278,11 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32c3m_4mb_fromitems.lib_deps} -build_flags = - -Desp32c3m_4mb="esp32c3m_4mb" +build_flags = -Desp32c3m_4mb="esp32c3m_4mb" + -Wl,--wrap=esp_panic_handler framework = arduino board = lolin_c3_mini -platform = espressif32 @6.3.1 +platform = espressif32 @6.6.0 monitor_filters = esp32_exception_decoder upload_speed = 921600 monitor_speed = 115200 @@ -300,10 +303,11 @@ lib_deps = ${env:esp32s3_16mb_fromitems.lib_deps} build_flags = -Desp32s3_16mb="esp32s3_16mb" + -Wl,--wrap=esp_panic_handler framework = arduino board = esp32-s3-devkitc-1 board_build.mcu = esp32s3 -platform = espressif32 @6.3.1 +platform = espressif32 @6.6.0 monitor_filters = esp32_exception_decoder upload_speed = 921600 monitor_speed = 115200 @@ -324,9 +328,10 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_16mb_fromitems.lib_deps} build_flags = -Desp32_16mb="esp32_16mb" + -Wl,--wrap=esp_panic_handler framework = arduino board = esp32dev -platform = espressif32 @5.1.1 +platform = espressif32 @6.6.0 monitor_filters = esp32_exception_decoder upload_port = COM11 upload_speed = 921600 diff --git a/src/DebugTrace.cpp b/src/DebugTrace.cpp new file mode 100644 index 00000000..b2183023 --- /dev/null +++ b/src/DebugTrace.cpp @@ -0,0 +1,287 @@ +#include "DebugTrace.h" +#if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) +//#ifdef RESTART_DEBUG_INFO +__NOINIT_ATTR static re_restart_debug_t _debug_info; + +#include "esp_debug_helpers.h" +#include "esp_types.h" +#include "esp_attr.h" +#include "esp_err.h" +#include "soc/soc_memory_layout.h" +#include "soc/cpu.h" + +// RU: Размер буфера для конвертации даты и времeни в строку +#define CONFIG_FORMAT_STRFTIME_BUFFER_SIZE 32 +#define CONFIG_FORMAT_STRFTIME_DTS_BUFFER_SIZE 20 // YYYY.MM.DD HH:NN:SS + \n + +// RU: Форматы даты и времени +#define CONFIG_FORMAT_DTS "%d.%m.%Y %H:%M:%S" + +void IRAM_ATTR debugHeapUpdate() +{ + _debug_info.heap_total = heap_caps_get_total_size(MALLOC_CAP_DEFAULT); + _debug_info.heap_free = heap_caps_get_free_size(MALLOC_CAP_DEFAULT); + size_t _new_free_min = heap_caps_get_minimum_free_size(MALLOC_CAP_DEFAULT); + if ((_debug_info.heap_free_min == 0) || (_new_free_min < _debug_info.heap_free_min)) + { + _debug_info.heap_free_min = _new_free_min; + _debug_info.heap_min_time = time(nullptr); + }; +} + +void IRAM_ATTR debugBacktraceUpdate() +{ + esp_backtrace_frame_t stk_frame; + esp_backtrace_get_start(&(stk_frame.pc), &(stk_frame.sp), &(stk_frame.next_pc)); + _debug_info.backtrace[0] = esp_cpu_process_stack_pc(stk_frame.pc); + + bool corrupted = (esp_stack_ptr_is_sane(stk_frame.sp) && + esp_ptr_executable((void *)esp_cpu_process_stack_pc(stk_frame.pc))) + ? false + : true; + + uint8_t i = CONFIG_RESTART_DEBUG_STACK_DEPTH; + while (i-- > 0 && stk_frame.next_pc != 0 && !corrupted) + { + if (!esp_backtrace_get_next_frame(&stk_frame)) + { + corrupted = true; + }; + _debug_info.backtrace[CONFIG_RESTART_DEBUG_STACK_DEPTH - i] = esp_cpu_process_stack_pc(stk_frame.pc); + }; +} + +void IRAM_ATTR debugUpdate() +{ + debugHeapUpdate(); + debugBacktraceUpdate(); +} + +extern "C" void __wrap_esp_panic_handler(void *info) +{ + + debugHeapUpdate(); + debugBacktraceUpdate(); + // Call the original panic handler function to finish processing this error (creating a core dump for example...) + __real_esp_panic_handler(info); +} + +re_restart_debug_t debugGet() +{ + re_restart_debug_t ret; + memset(&ret, 0, sizeof(re_restart_debug_t)); + esp_reset_reason_t esp_reason = esp_reset_reason(); + if ((esp_reason != ESP_RST_UNKNOWN) && (esp_reason != ESP_RST_POWERON)) + { + uint8_t i = CONFIG_RESTART_DEBUG_STACK_DEPTH; + ret = _debug_info; + if (_debug_info.heap_total > heap_caps_get_total_size(MALLOC_CAP_DEFAULT)) + { + memset(&ret, 0, sizeof(re_restart_debug_t)); + }; + }; + memset(&_debug_info, 0, sizeof(re_restart_debug_t)); + return ret; +} + +#define CONFIG_MESSAGE_TG_VERSION_DEF "! Устройство запущено\n\nИмя устройства: %s\nПричина перезапуска: %s\nCPU0: %s\nCPU1: %s" +#define CONFIG_MESSAGE_TG_VERSION_HEAP "! Устройство аварийно перезапущено !\n\nИмя устройства: %s\nПричина перезапуска: %s\nCPU0: %s\nCPU1: %s\nHEAP: %s" +#define CONFIG_MESSAGE_TG_VERSION_TRACE "! Устройство аварийно перезапущено !\n\nИмя устройства: %s\nПричина перезапуска: %s\nCPU0: %s\nCPU1: %s\nHEAP: %s\nTRACE: %s" + +char *malloc_stringf(const char *format, ...) +{ + char *ret = nullptr; + if (format != nullptr) + { + // get the list of arguments + va_list args1, args2; + va_start(args1, format); + va_copy(args2, args1); + // calculate length of resulting string + int len = vsnprintf(nullptr, 0, format, args1); + va_end(args1); + // allocate memory for string + if (len > 0) + { +#if USE_ESP_MALLOC + ret = (char *)esp_malloc(len + 1); +#else + ret = (char *)malloc(len + 1); +#endif + if (ret != nullptr) + { + memset(ret, 0, len + 1); + vsnprintf(ret, len + 1, format, args2); + } + else + { + // rlog_e(tagHEAP, "Failed to format string: out of memory!"); + }; + }; + va_end(args2); + }; + return ret; +} + +static char *statesGetDebugHeap(re_restart_debug_t *debug) +{ + if ((debug->heap_total > 0) && (debug->heap_total > debug->heap_free)) + { + struct tm timeinfo; + localtime_r(&debug->heap_min_time, &timeinfo); + char time_buffer[CONFIG_FORMAT_STRFTIME_DTS_BUFFER_SIZE]; + memset(&time_buffer, 0, CONFIG_FORMAT_STRFTIME_DTS_BUFFER_SIZE); + strftime(time_buffer, CONFIG_FORMAT_STRFTIME_DTS_BUFFER_SIZE, CONFIG_FORMAT_DTS, &timeinfo); + + double heapTotal = (double)debug->heap_total / 1024; + double heapFree = (double)debug->heap_free / 1024; + double heapFreeMin = (double)debug->heap_free_min / 1024; + + return malloc_stringf("Total %.1fkB ; Free %.1fkB (%.1f%%) ; FreeMin %.1fkB (%.1f%%) %s", + heapTotal, + heapFree, 100.0 * (heapFree / heapTotal), + heapFreeMin, 100.0 * (heapFreeMin / heapTotal), time_buffer); + }; + return nullptr; +} + +static char *statesGetDebugTrace(re_restart_debug_t *debug) +{ + char *backtrace = nullptr; + char *item = nullptr; + char *temp = nullptr; + for (uint8_t i = 0; i < CONFIG_RESTART_DEBUG_STACK_DEPTH; i++) + { + if (debug->backtrace[i] != 0) + { + item = malloc_stringf("0x%08x", debug->backtrace[i]); + if (item) + { + if (backtrace) + { + temp = backtrace; + backtrace = malloc_stringf("%s %s", temp, item); + free(item); + free(temp); + } + else + { + backtrace = item; + }; + item = nullptr; + }; + } + else + { + break; + } + }; + return backtrace; +} + +void printDebugTrace() +{ + // esp_register_shutdown_handler(debugUpdate); + re_restart_debug_t debug = debugGet(); + char *debug_heap = statesGetDebugHeap(&debug); + char *debug_trace = nullptr; + if (debug_heap) + { + debug_trace = statesGetDebugTrace(&debug); + if (debug_trace) + { + Serial.printf(CONFIG_MESSAGE_TG_VERSION_TRACE, + jsonReadStr(settingsFlashJson, F("name")), ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str(), + debug_heap, debug_trace); + // free(debug_trace); + } + else + { + Serial.printf(CONFIG_MESSAGE_TG_VERSION_HEAP, + jsonReadStr(settingsFlashJson, F("name")), ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str(), + debug_heap); + }; + // free(debug_heap); + } + else + { + // Serial.println("DEVICE START"); + Serial.printf(CONFIG_MESSAGE_TG_VERSION_DEF, + jsonReadStr(settingsFlashJson, F("name")), ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str()); + } + +} + +void sendDebugTraceAndFreeMemory( bool postMsg) +{ + // esp_register_shutdown_handler(debugUpdate); + re_restart_debug_t debug = debugGet(); + char *debug_heap = statesGetDebugHeap(&debug); + char *debug_trace = nullptr; + + if (debug_heap) + { + if (isNetworkActive() && postMsg) + { + debug_trace = statesGetDebugTrace(&debug); + if (debug_trace) + { + if (tlgrmItem) + { + char *msg; + msg = malloc_stringf(CONFIG_MESSAGE_TG_VERSION_TRACE, + jsonReadStr(settingsFlashJson, F("name")).c_str(), ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str(), + debug_heap, debug_trace); + tlgrmItem->sendTelegramMsg(false, String(msg)); + tlgrmItem->sendTelegramMsg(false, String("Подробности /helpDebug в Telegram_v2")); + free(msg); + } + free(debug_trace); + } + else + { + /* + Serial.printf(CONFIG_MESSAGE_TG_VERSION_HEAP, + jsonReadStr(settingsFlashJson, F("name")), ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str(), + debug_heap); + */ + if (tlgrmItem) + { + char *msg; + msg = malloc_stringf(CONFIG_MESSAGE_TG_VERSION_HEAP, + jsonReadStr(settingsFlashJson, F("name")).c_str(), ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str(), + debug_heap); + tlgrmItem->sendTelegramMsg(false, String(msg)); + tlgrmItem->sendTelegramMsg(false, String("Подробности /helpDebug в Telegram_v2")); + free(msg); + } + } + } + free(debug_heap); + } +/* else + { + // Serial.println("DEVICE START"); + // Serial.printf(CONFIG_MESSAGE_TG_VERSION_DEF, + // FIRMWARE_VERSION, ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str()); + if (tlgrmItem && isNetworkActive()) + { + char *msg; + msg = malloc_stringf(CONFIG_MESSAGE_TG_VERSION_DEF, + WiFi.localIP().toString(), FIRMWARE_VERSION, ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str()); + tlgrmItem->sendTelegramMsg(false, String(msg)); + free(msg); + } + };*/ +} + +#else +void printDebugTrace() {} +void sendDebugTraceAndFreeMemory(bool) {} +void IRAM_ATTR debugUpdate() {} +extern "C" void __wrap_esp_panic_handler(void *info) +{ + // Call the original panic handler function to finish processing this error (creating a core dump for example...) + __real_esp_panic_handler(info); +} +#endif // RESTART_DEBUG_INFO diff --git a/src/EspFileSystem.cpp b/src/EspFileSystem.cpp index fc4892c5..5b9bbf2c 100644 --- a/src/EspFileSystem.cpp +++ b/src/EspFileSystem.cpp @@ -79,7 +79,7 @@ uint32_t ESP_getChipId(void) #endif } -// устарела используем новую функцию ниже +/*// устарела используем новую функцию ниже #if !defined(esp32s2_4mb) && !defined(esp32c3m_4mb) && !defined(esp32s3_16mb) //#ifndef esp32s2_4mb uint32_t ESP_getFlashChipId(void) @@ -93,6 +93,7 @@ uint32_t ESP_getFlashChipId(void) #endif } #endif +*/ // https://github.com/espressif/arduino-esp32/issues/6945#issuecomment-1199900892 // получение flash ch id из проекта esp easy diff --git a/src/Main.cpp b/src/Main.cpp index 7f338d53..c0e60c27 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -4,6 +4,7 @@ #include "utils/Statistic.h" #include "classes/IoTBench.h" #include +#include "DebugTrace.h" #if defined(esp32s2_4mb) || defined(esp32s3_16mb) #include #endif @@ -97,6 +98,12 @@ void setup() { Serial.begin(115200); Serial.flush(); + //----------- Отладка EXCEPTION (функции с заглушками для отключения) --------- + //Привязка коллбэк функции для вызова при перезагрузке + esp_register_shutdown_handler(debugUpdate); + // Печать или оправка отладочной информации + printDebugTrace(); + Serial.println(); Serial.println(F("--------------started----------------")); @@ -179,6 +186,10 @@ void setup() { stopErrorMarker(SETUPINET_ERRORMARKER); + bool postMsgTelegram; + if (!jsonRead(settingsFlashJson, "debugTrace", postMsgTelegram, false)) postMsgTelegram = 1; + sendDebugTraceAndFreeMemory(postMsgTelegram); + initErrorMarker(SETUPLAST_ERRORMARKER); elementsLoop(); diff --git a/src/PeriodicTasks.cpp b/src/PeriodicTasks.cpp index f9fa9c9d..c82d49ce 100644 --- a/src/PeriodicTasks.cpp +++ b/src/PeriodicTasks.cpp @@ -61,7 +61,22 @@ String ESP_getResetReason(void) { #endif #if defined(esp32s2_4mb) || defined(esp32s3_16mb) || defined(esp32c3m_4mb) String ESP_getResetReason(void) { - return ESP32GetResetReason(0); // CPU 0 + // return ESP32GetResetReason(0); // CPU 0 + esp_reset_reason_t esp_reason = esp_reset_reason(); + switch (esp_reason) { + case ESP_RST_UNKNOWN: return "UNKNOWN"; + case ESP_RST_POWERON: return "POWER ON"; + case ESP_RST_EXT: return "EXTERNAL PIN"; + case ESP_RST_SW: return "SOFTWARE RESET"; + case ESP_RST_PANIC: return "EXCEPTION / PANIC"; + case ESP_RST_INT_WDT: return "INTERRUPT WATCHDOG"; + case ESP_RST_TASK_WDT: return "TASK WATCHDOG"; + case ESP_RST_WDT: return "WATCHDOGS"; + case ESP_RST_DEEPSLEEP: return "EXITING DEEP SLLEP MODE"; + case ESP_RST_BROWNOUT: return "BROWNOUT"; + case ESP_RST_SDIO: return "SDIO"; + default : return "NO MEAN"; + }; } String ESP32GetResetReason(uint32_t cpu_no) { // tools\sdk\include\esp32\rom\rtc.h @@ -103,7 +118,22 @@ String ESP32GetResetReason(uint32_t cpu_no) { #endif #if defined(esp32_4mb) || defined(esp32_16mb) || defined(esp32cam_4mb) String ESP_getResetReason(void) { - return ESP32GetResetReason(0); // CPU 0 + // return ESP32GetResetReason(0); // CPU 0 + esp_reset_reason_t esp_reason = esp_reset_reason(); + switch (esp_reason) { + case ESP_RST_UNKNOWN: return "UNKNOWN"; + case ESP_RST_POWERON: return "POWER ON"; + case ESP_RST_EXT: return "EXTERNAL PIN"; + case ESP_RST_SW: return "SOFTWARE RESET"; + case ESP_RST_PANIC: return "EXCEPTION / PANIC"; + case ESP_RST_INT_WDT: return "INTERRUPT WATCHDOG"; + case ESP_RST_TASK_WDT: return "TASK WATCHDOG"; + case ESP_RST_WDT: return "WATCHDOGS"; + case ESP_RST_DEEPSLEEP: return "EXITING DEEP SLLEP MODE"; + case ESP_RST_BROWNOUT: return "BROWNOUT"; + case ESP_RST_SDIO: return "SDIO"; + default : return "NO MEAN"; + }; } String ESP32GetResetReason(uint32_t cpu_no) { // tools\sdk\include\esp32\rom\rtc.h diff --git a/src/modules/display/Nextion/ESPNexUpload.cpp b/src/modules/display/Nextion/ESPNexUpload.cpp index 1eaf5403..c0927713 100644 --- a/src/modules/display/Nextion/ESPNexUpload.cpp +++ b/src/modules/display/Nextion/ESPNexUpload.cpp @@ -22,66 +22,22 @@ * along with this program. If not, see . * */ - -#define DEBUG_SERIAL_ENABLE -#include "ESPNexUpload.h" - -#ifdef DEBUG_SERIAL_ENABLE -#define dbSerialPrint(a) Serial.print(a) -#define dbSerialPrintHex(a) Serial.print(a, HEX) -#define dbSerialPrintln(a) Serial.println(a) -#define dbSerialBegin(a) Serial.begin(a) -#else -#define dbSerialPrint(a) \ - do \ - { \ - } while (0) -#define dbSerialPrintHex(a) \ - do \ - { \ - } while (0) -#define dbSerialPrintln(a) \ - do \ - { \ - } while (0) -#define dbSerialBegin(a) \ - do \ - { \ - } while (0) +#ifdef CORE_DEBUG_LEVEL +#undef CORE_DEBUG_LEVEL #endif -ESPNexUpload::ESPNexUpload(uint32_t upload_baudrate, int line, int rx, int tx) -{ - _upload_baudrate = upload_baudrate; - _rx = rx; - _tx = tx; - _line = line; +#define CORE_DEBUG_LEVEL 3 +#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG -#if defined ESP8266 - nexSerial = new SoftwareSerial(_rx, _tx); -#else - if (line >= 0) { - nexSerial = new HardwareSerial(line); - // ((HardwareSerial*)nexSerial)->begin(_upload_baudrate, SERIAL_8N1, _rx, _tx); - } else { - nexSerial = new SoftwareSerial(_rx, _tx); - // ((SoftwareSerial*)nexSerial)->begin(_upload_baudrate); - } -#endif +#include "ESPNexUpload.h" -} +static const char *TAG = "nextion upload"; -void ESPNexUpload::nexSerialBegin(uint32_t _speed, int _line, int _rx, int _tx) +ESPNexUpload::ESPNexUpload(uart_port_t uart_num, uint32_t baud_rate, gpio_num_t tx_io_num, gpio_num_t rx_io_num) { -#if defined ESP8266 - nexSerial->begin(_speed); -#else - if (_line >= 0) { - ((HardwareSerial*)nexSerial)->begin(_speed, SERIAL_8N1, _rx, _tx); - } else { - ((SoftwareSerial*)nexSerial)->begin(_speed); - } -#endif + _upload_uart_lock = xSemaphoreCreateMutex(); + _uart_diver_installed = false; + setBaudrate(uart_num, baud_rate, tx_io_num, rx_io_num); } bool ESPNexUpload::connect() @@ -90,13 +46,11 @@ bool ESPNexUpload::connect() yield(); #endif - dbSerialBegin(115200); - _printInfoLine(F("serial tests & connect")); + ESP_LOGI(TAG, "serial tests & connect"); if (_getBaudrate() == 0) { - statusMessage = F("get baudrate error"); - _printInfoLine(statusMessage); + ESP_LOGE(TAG, "get baudrate error"); return false; } @@ -104,31 +58,31 @@ bool ESPNexUpload::connect() if (!_echoTest("mystop_yesABC")) { - statusMessage = F("echo test failed"); - _printInfoLine(statusMessage); + ESP_LOGE(TAG, "echo test failed"); return false; } if (!_handlingSleepAndDim()) { - statusMessage = F("handling sleep and dim settings failed"); - _printInfoLine(statusMessage); + ESP_LOGE(TAG, "handling sleep and dim settings failed"); return false; } if (!_setPrepareForFirmwareUpdate(_upload_baudrate)) { - statusMessage = F("modifybaudrate error"); - _printInfoLine(statusMessage); + ESP_LOGE(TAG, "modifybaudrate error"); return false; } return true; } -bool ESPNexUpload::prepareUpload(uint32_t file_size) +bool ESPNexUpload::prepareUpload(uint32_t file_size, bool prot) { + protv2 = prot; _undownloadByte = file_size; + ESP_LOGD(TAG, "prepareUpload: %" PRIu32, file_size); + vTaskDelay(5 / portTICK_PERIOD_MS); return this->connect(); } @@ -142,74 +96,73 @@ uint16_t ESPNexUpload::_getBaudrate(void) if (_searchBaudrate(baudrate_array[i])) { _baudrate = baudrate_array[i]; - _printInfoLine(F("baudrate determined")); + ESP_LOGI(TAG, "baudrate determined: %i", _baudrate); break; } - delay(1500); // wait for 1500 ms + vTaskDelay(1500 / portTICK_PERIOD_MS); // wait for 1500 ms } return _baudrate; } -bool ESPNexUpload::_searchBaudrate(uint32_t baudrate) +bool ESPNexUpload::_searchBaudrate(int baudrate) { #if defined ESP8266 yield(); #endif - String response = String(""); - _printInfoLine(); - dbSerialPrint(F("init nextion serial interface on baudrate: ")); - dbSerialPrintln(baudrate); + std::string response = ""; + ESP_LOGD(TAG, "init nextion serial interface on baudrate: %i", baudrate); - nexSerialBegin(baudrate, _line, _rx, _tx); - _printInfoLine(F("ESP baudrate established, try to connect to display")); - const char _nextion_FF_FF[3] = {0xFF, 0xFF, 0x00}; + setBaudrate(_upload_uart_num, + baudrate, + _upload_tx_io_num, + _upload_rx_io_num); - this->sendCommand("DRAKJHSUYDGBNCJHGJKSHBDN"); - this->sendCommand("", true, true); // 0x00 0xFF 0xFF 0xFF + ESP_LOGD(TAG, "ESP baudrate established, try to connect to display"); + const char _nextion_FF_FF[3] = {0xFF, 0xFF, 0x00}; + this->sendCommand("DRAKJHSUYDGBNCJHGJKSHBDN", true, true); // 0x00 0xFF 0xFF 0xFF this->recvRetString(response); if (response[0] != 0x1A) { - _printInfoLine(F("first indication that baudrate is wrong")); + ESP_LOGW(TAG, "first indication that baudrate is wrong"); } else { - _printInfoLine(F("first respone from display, first indication that baudrate is correct")); + ESP_LOGI(TAG, "first respone from display, first indication that baudrate is correct"); } this->sendCommand("connect"); // first connect attempt - this->recvRetString(response); - if (response.indexOf(F("comok")) == -1) + if (response.find("comok") == -1) { - _printInfoLine(F("display doesn't accept the first connect request")); + ESP_LOGW(TAG, "display doesn't accept the first connect request"); } else { - _printInfoLine(F("display accept the first connect request")); + ESP_LOGI(TAG, "display accept the first connect request"); } - response = String(""); - delay(110); // based on serial analyser from Nextion editor V0.58 to Nextion display NX4024T032_011R + vTaskDelay(110 / portTICK_PERIOD_MS); // based on serial analyser from Nextion editor V0.58 to Nextion display NX4024T032_011R this->sendCommand(_nextion_FF_FF, false); this->sendCommand("connect"); // second attempt this->recvRetString(response); - if (response.indexOf(F("comok")) == -1 && response[0] != 0x1A) + + if (response.find("comok") == -1 && response[0] != 0x1A) { - _printInfoLine(F("display doesn't accept the second connect request")); - _printInfoLine(F("conclusion, wrong baudrate")); - return 0; + ESP_LOGW(TAG, "display doesn't accept the second connect request"); + ESP_LOGW(TAG, "conclusion, wrong baudrate"); + return false; } else { - _printInfoLine(F("display accept the second connect request")); - _printInfoLine(F("conclusion, correct baudrate")); + ESP_LOGI(TAG, "display accept the second connect request"); + ESP_LOGI(TAG, "conclusion, correct baudrate"); } - return 1; + return true; } void ESPNexUpload::sendCommand(const char *cmd, bool tail, bool null_head) @@ -221,25 +174,25 @@ void ESPNexUpload::sendCommand(const char *cmd, bool tail, bool null_head) if (null_head) { - ((HardwareSerial*)nexSerial)->write(0x00); + uartWrite(0x00); } - while (nexSerial->available()) + while (uartAvailable()) { - nexSerial->read(); + uartRead(); } - nexSerial->print(cmd); + uartWriteBuf(cmd, strlen(cmd)); + if (tail) { - nexSerial->write(0xFF); - nexSerial->write(0xFF); - nexSerial->write(0xFF); + uartWrite(0xFF); + uartWrite(0xFF); + uartWrite(0xFF); } - _printSerialData(true, cmd); } -uint16_t ESPNexUpload::recvRetString(String &response, uint32_t timeout, bool recv_flag) +uint16_t ESPNexUpload::recvRetString(std::string &response, uint32_t timeout, bool recv_flag) { #if defined ESP8266 @@ -252,18 +205,19 @@ uint16_t ESPNexUpload::recvRetString(String &response, uint32_t timeout, bool re long start; bool exit_flag = false; bool ff_flag = false; + response = ""; if (timeout != 500) - _printInfoLine("timeout setting serial read: " + String(timeout)); + ESP_LOGD(TAG, "timeout setting serial read: %" PRIu32, timeout); - start = millis(); + start = (unsigned long)(esp_timer_get_time() / 1000ULL); - while (millis() - start <= timeout) + while ((unsigned long)(esp_timer_get_time() / 1000ULL) - start <= timeout) { - while (nexSerial->available()) + while (uartAvailable()) { - c = nexSerial->read(); + c = uartRead(); if (c == 0) { continue; @@ -284,7 +238,7 @@ uint16_t ESPNexUpload::recvRetString(String &response, uint32_t timeout, bool re if (recv_flag) { - if (response.indexOf(0x05) != -1) + if (response.find(0x05) != -1) { exit_flag = true; } @@ -295,16 +249,12 @@ uint16_t ESPNexUpload::recvRetString(String &response, uint32_t timeout, bool re break; } } - _printSerialData(false, response); - - // if the exit flag and the ff flag are both not found, than there is a timeout - // if(!exit_flag && !ff_flag) - // _printInfoLine(F("recvRetString: timeout")); if (ff_flag) - response = response.substring(0, response.length() - 3); // Remove last 3 0xFF + response = response.substr(0, response.length() - 3); // Remove last 3 0xFF ret = response.length(); + return ret; } @@ -315,18 +265,19 @@ bool ESPNexUpload::_setPrepareForFirmwareUpdate(uint32_t upload_baudrate) yield(); #endif - String response = String(""); - String cmd = String(""); + std::string response = ""; + std::string cmd = ""; - cmd = F("00"); + cmd = "00"; this->sendCommand(cmd.c_str()); - delay(0.1); - + vTaskDelay(10 / portTICK_PERIOD_MS); this->recvRetString(response, 800, true); // normal response time is 400ms - - String filesize_str = String(_undownloadByte, 10); - String baudrate_str = String(upload_baudrate); - cmd = "whmi-wri " + filesize_str + "," + baudrate_str + ",0"; + ESP_LOGD(TAG, "response (00): %s", response.c_str()); + if (protv2) + cmd = "whmi-wris " + std::to_string(_undownloadByte) + "," + std::to_string(upload_baudrate) + ",1"; + else + cmd = "whmi-wri " + std::to_string(_undownloadByte) + "," + std::to_string(upload_baudrate) + ",0"; + ESP_LOGI(TAG, "cmd: %s", cmd.c_str()); this->sendCommand(cmd.c_str()); @@ -334,136 +285,215 @@ bool ESPNexUpload::_setPrepareForFirmwareUpdate(uint32_t upload_baudrate) // because switching to another baudrate (nexSerialBegin command) has an higher prio. // The ESP will first jump to the new 'upload_baudrate' and than process the serial 'transmit buffer' // The flush command forced the ESP to wait until the 'transmit buffer' is empty - nexSerial->flush(); - - nexSerialBegin(upload_baudrate, _line, _rx, _tx); - _printInfoLine(F("changing upload baudrate...")); - _printInfoLine(String(upload_baudrate)); + // nexSerial.flush(); + uartFlushTxOnly(); this->recvRetString(response, 800, true); // normal response time is 400ms + ESP_LOGD(TAG, "response (01): %s", response.c_str()); + // The Nextion display will, if it's ready to accept data, send a 0x05 byte. - if (response.indexOf(0x05) != -1) + if (response.find(0x05) != -1) { - _printInfoLine(F("preparation for firmware update done")); - return 1; + ESP_LOGI(TAG, "preparation for firmware update done"); + return true; } else { - _printInfoLine(F("preparation for firmware update failed")); - return 0; + ESP_LOGE(TAG, "preparation for firmware update failed"); + return false; } } -void ESPNexUpload::setUpdateProgressCallback(THandlerFunction value) -{ - _updateProgressCallback = value; -} - -bool ESPNexUpload::upload(const uint8_t *file_buf, size_t buf_size) +bool ESPNexUpload::upload(const uint8_t *file_buf, size_t file_size) { #if defined ESP8266 yield(); #endif - uint8_t c; + // uint8_t c; uint8_t timeout = 0; - String string = String(""); - - for (uint16_t i = 0; i < buf_size; i++) + std::string response = ""; + uint8_t sent_bulk_counter = 0; + // uint8_t buff[4096] = {0}; + uint32_t offset = 0; + int remainingBlocks = ceil(file_size / 4096); + int blockSize = 4096; + + while (remainingBlocks > 0) { - - // Users must split the .tft file contents into 4096 byte sized packets with the final partial packet size equal to the last remaining bytes (<4096 bytes). - if (_sent_packets == 4096) + if (remainingBlocks == 1) { - - // wait for the Nextion to return its 0x05 byte confirming reception and readiness to receive the next packets - this->recvRetString(string, 500, true); - if (string.indexOf(0x05) != -1) + blockSize = file_size - offset; + } + uartWriteBuf((char*)file_buf[offset], blockSize); + // wait for the Nextion to return its 0x05 byte confirming reception and readiness to receive the next packets + this->recvRetString(response, 2000, true); + + if (response[0] == 0x08 && response.size() == 5) + { // handle partial upload request + remainingBlocks -= 1; + _sent_packets_total += blockSize; + sent_bulk_counter++; + if (sent_bulk_counter % 10 == 0) { + ESP_LOGI(TAG, "bulk: %i, total bytes %" PRIu32 ", response: %s", sent_bulk_counter, _sent_packets_total, response.c_str()); + } - // reset sent packets counter - _sent_packets = 0; + ESP_LOGE(TAG, "response [%s]", + format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); - // reset receive String - string = ""; + for (int j = 0; j < 4; ++j) + { + offset += static_cast(response[j + 1]) << (8 * j); + ESP_LOGI(TAG, "Offset : %" PRIu32, offset); } - else + if (offset) + remainingBlocks = ceil((file_size - offset) / blockSize); + } + else if (response[0] == 0x05) + { + remainingBlocks -= 1; + _sent_packets_total += blockSize; + sent_bulk_counter++; + if (sent_bulk_counter % 10 == 0) { - if (timeout >= 8) - { - statusMessage = F("serial connection lost"); - _printInfoLine(statusMessage); - return false; - } - - timeout++; + ESP_LOGI(TAG, "bulk: %i, total bytes %" PRIu32 ", response: %s", sent_bulk_counter, _sent_packets_total, response.c_str()); } - // delay current byte - i--; + ESP_LOGE(TAG, "response [%s]", + format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); + offset += 4096; } + else { - - // read buffer - c = file_buf[i]; - - // write byte to nextion over serial - nexSerial->write(c); - - // update sent packets counter - _sent_packets++; + if (timeout >= 2) + { + ESP_LOGE(TAG, "upload failed, no valid response from display, total bytes send : %" PRIu32, _sent_packets_total); + sent_bulk_counter = 0; + return false; + } + timeout++; } } - + ESP_LOGI(TAG, "upload send last bytes %" PRIu32 ", response: %s", _sent_packets_total, response.c_str()); + // ESP_LOGI(TAG,"upload finished, total bytes send : %"PRIu32, _sent_packets_total); + sent_bulk_counter = 0; return true; } bool ESPNexUpload::upload(Stream &myFile) { + #if defined ESP8266 yield(); #endif - - // create buffer for read - uint8_t buff[4096] = {0}; - - // read all data from server - while (_undownloadByte > 0 || _undownloadByte == -1) + // uint8_t c; + uint8_t timeout = 0; + std::string response = ""; + uint8_t sent_bulk_counter = 0; + uint8_t file_buf[4096] = {0}; + uint32_t offset = 0; + uint32_t _seekByte = 0; + uint32_t _packets_total_byte = 0; + // get available data size + size_t file_size = myFile.available(); + if (file_size) { + int remainingBlocks = ceil(file_size / 4096); + int blockSize = 4096; - // get available data size - size_t size = myFile.available(); - - if (size) + while (remainingBlocks > 0) { - // read up to 2048 byte into the buffer - int c = myFile.readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size)); - - // Write the buffered bytes to the nextion. If this fails, return false. - if (!this->upload(buff, c)) + file_size = myFile.available(); + // read up to 4096 byte into the buffer + if (_seekByte > 0) { - return false; + if (file_size > _seekByte) + { + blockSize = myFile.readBytes(file_buf, _seekByte); + file_size = myFile.available(); + ESP_LOGI(TAG, "Seek file: %" PRIu32 ", left bytes %" PRIu32, _seekByte, file_size); + } + else + { + ESP_LOGE(TAG, "File failed seek"); + return false; + } + blockSize = myFile.readBytes(file_buf, ((file_size > sizeof(file_buf)) ? sizeof(file_buf) : file_size)); } else + blockSize = myFile.readBytes(file_buf, ((file_size > sizeof(file_buf)) ? sizeof(file_buf) : file_size)); + + uartWriteBuf((char*)file_buf, blockSize); + // wait for the Nextion to return its 0x05 byte confirming reception and readiness to receive the next packets + this->recvRetString(response, 2000, true); + + if (response[0] == 0x08 && response.size() == 5) + { // handle partial upload request + remainingBlocks -= 1; + _sent_packets_total += blockSize; + _packets_total_byte += blockSize; + sent_bulk_counter++; + if (sent_bulk_counter % 10 == 0) + { + ESP_LOGI(TAG, "bulk: %i, total bytes %" PRIu32 ", response: %s", sent_bulk_counter, _sent_packets_total, response.c_str()); + } + + ESP_LOGE(TAG, "response [%s]", + format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); + + for (int j = 0; j < 4; ++j) + { + offset += static_cast(response[j + 1]) << (8 * j); + ESP_LOGI(TAG, "Offset : %" PRIu32, offset); + } + if (offset) + { + remainingBlocks = ceil((file_size - offset) / blockSize); + _seekByte = offset - _packets_total_byte; + _packets_total_byte += _seekByte; + } + } + else if (response[0] == 0x05) { - if (_updateProgressCallback) + remainingBlocks -= 1; + _sent_packets_total += blockSize; + _packets_total_byte += blockSize; + sent_bulk_counter++; + if (sent_bulk_counter % 10 == 0) { - _updateProgressCallback(); + ESP_LOGI(TAG, "bulk: %i, total bytes %" PRIu32 ", response: %s", sent_bulk_counter, _sent_packets_total, response.c_str()); } + + ESP_LOGE(TAG, "response [%s]", + format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); + offset += 4096; } - if (_undownloadByte > 0) + else { - _undownloadByte -= c; + if (timeout >= 2) + { + ESP_LOGE(TAG, "upload failed, no valid response from display, total bytes send : %" PRIu32, _sent_packets_total); + sent_bulk_counter = 0; + return false; + } + timeout++; } } - delay(1); + ESP_LOGI(TAG, "upload send last bytes %" PRIu32 ", response: %s", _sent_packets_total, response.c_str()); + // ESP_LOGI(TAG,"upload finished, total bytes send : %"PRIu32, _sent_packets_total); + sent_bulk_counter = 0; + return true; + } + else + { + ESP_LOGE(TAG, "File failed available"); + return false; } - - return true; } void ESPNexUpload::softReset(void) @@ -475,139 +505,129 @@ void ESPNexUpload::softReset(void) void ESPNexUpload::end() { + if (_upload_uart_num == NULL) + { + return; + } + // wait for the nextion to finish internal processes - delay(1600); + vTaskDelay(1600 / portTICK_PERIOD_MS); // soft reset the nextion this->softReset(); // end Serial connection - ((HardwareSerial*)nexSerial)->end(); + uart_mutex_lock(); + ESP_ERROR_CHECK(uart_driver_delete(_upload_uart_num)); + uart_mutex_unlock(); // reset sent packets counter - _sent_packets = 0; + //_sent_packets = 0; + _sent_packets_total = 0; - statusMessage = F("upload ok"); - _printInfoLine(statusMessage + F("\r\n")); + ESP_LOGI(TAG, "serial connection closed"); } void ESPNexUpload::_setRunningMode(void) { - String cmd = String(""); - delay(100); - cmd = F("runmod=2"); - this->sendCommand(cmd.c_str()); - delay(60); + vTaskDelay(100 / portTICK_PERIOD_MS); + this->sendCommand("runmod=2"); + vTaskDelay(60 / portTICK_PERIOD_MS); } -bool ESPNexUpload::_echoTest(String input) +bool ESPNexUpload::_echoTest(std::string input) { - String cmd = String(""); - String response = String(""); - cmd = "print \"" + input + "\""; - this->sendCommand(cmd.c_str()); + std::string response = ""; + std::string cmd = "print \"" + input + "\""; + this->sendCommand(cmd.c_str()); uint32_t duration_ms = calculateTransmissionTimeMs(cmd) * 2 + 10; // times 2 (send + receive) and 10 ms extra this->recvRetString(response, duration_ms); - return (response.indexOf(input) != -1); + return (response.find(input) != -1); } bool ESPNexUpload::_handlingSleepAndDim(void) { - String cmd = String(""); - String response = String(""); + + std::string response = ""; bool set_sleep = false; bool set_dim = false; - cmd = F("get sleep"); - this->sendCommand(cmd.c_str()); - + this->sendCommand("get sleep"); this->recvRetString(response); if (response[0] != 0x71) { - statusMessage = F("unknown response from 'get sleep' request"); - _printInfoLine(statusMessage); + ESP_LOGE(TAG, "unknown response from 'get sleep' request"); return false; } if (response[1] != 0x00) { - _printInfoLine(F("sleep enabled")); + ESP_LOGD(TAG, "sleep enabled"); set_sleep = true; } else { - _printInfoLine(F("sleep disabled")); + ESP_LOGD(TAG, "sleep disabled"); } - response = String(""); - cmd = F("get dim"); - this->sendCommand(cmd.c_str()); - + this->sendCommand("get dim"); this->recvRetString(response); if (response[0] != 0x71) { - statusMessage = F("unknown response from 'get dim' request"); - _printInfoLine(statusMessage); + ESP_LOGE(TAG, "unknown response from 'get dim' request"); return false; } if (response[1] == 0x00) { - _printInfoLine(F("dim is 0%, backlight from display is turned off")); + ESP_LOGD(TAG, "dim is 0%%, backlight from display is turned off"); set_dim = true; } else { - _printInfoLine(); - dbSerialPrint(F("dim ")); - dbSerialPrint((uint8_t)response[1]); - dbSerialPrintln(F("%")); + ESP_LOGD(TAG, "dim %i%%", (uint8_t)response[1]); } if (!_echoTest("ABC")) { - statusMessage = F("echo test in 'handling sleep and dim' failed"); - _printInfoLine(statusMessage); + ESP_LOGE(TAG, "echo test in 'handling sleep and dim' failed"); return false; } if (set_sleep) { - cmd = F("sleep=0"); - this->sendCommand(cmd.c_str()); + this->sendCommand("sleep=0"); // Unfortunately the display doesn't send any respone on the wake up request (sleep=0) // Let the ESP wait for one second, this is based on serial analyser from Nextion editor V0.58 to Nextion display NX4024T032_011R // This gives the Nextion display some time to wake up - delay(1000); + vTaskDelay(1000 / portTICK_PERIOD_MS); } if (set_dim) { - cmd = F("dim=100"); - this->sendCommand(cmd.c_str()); - delay(15); + this->sendCommand("dim=100"); + vTaskDelay(15 / portTICK_PERIOD_MS); } return true; } -void ESPNexUpload::_printSerialData(bool esp_request, String input) +void ESPNexUpload::_printSerialData(bool esp_request, std::string input) { - char c; if (esp_request) - dbSerialPrint(F("ESP request: ")); + ESP_LOGI(TAG, "ESP request: "); else - dbSerialPrint(F("Nextion respone: ")); + ESP_LOGI(TAG, "Nextion respone: "); if (input.length() == 0) { - dbSerialPrintln(F("none")); + ESP_LOGW(TAG, "none"); return; } @@ -616,18 +636,15 @@ void ESPNexUpload::_printSerialData(bool esp_request, String input) c = input[i]; if ((uint8_t)c >= 0x20 && (uint8_t)c <= 0x7E) - dbSerialPrint(c); + printf("%c", c); else { - dbSerialPrint(F("0x")); - dbSerialPrintHex(c); - dbSerialPrint(F(" ")); + printf("0x\\%02hhx", c); } } - dbSerialPrintln(); } -uint32_t ESPNexUpload::calculateTransmissionTimeMs(String message) +uint32_t ESPNexUpload::calculateTransmissionTimeMs(std::string message) { // In general, 1 second (s) = 1000 (10^-3) millisecond (ms) or // 1 second (s) = 1000 000 (10^-6) microsecond (us). @@ -645,13 +662,160 @@ uint32_t ESPNexUpload::calculateTransmissionTimeMs(String message) uint32_t duration_message_us = nr_of_bytes * duration_one_byte_us; uint32_t return_value_ms = duration_message_us / 1000; - _printInfoLine("calculated transmission time: " + String(return_value_ms) + " ms"); + ESP_LOGD(TAG, "calculated transmission time: %" PRIu32 " ms", return_value_ms); return return_value_ms; } -void ESPNexUpload::_printInfoLine(String line) +uint32_t ESPNexUpload::uartAvailable() { - dbSerialPrint(F("Status info: ")); - if (line.length() != 0) - dbSerialPrintln(line); + if (_upload_uart_num == NULL) + { + return 0; + } + + uart_mutex_lock(); + size_t available; + uart_get_buffered_data_len(_upload_uart_num, &available); + if (_upload_uart_has_peek) + available++; + uart_mutex_unlock(); + return available; +} + +uint8_t ESPNexUpload::uartRead() +{ + if (_upload_uart_num == NULL) + { + return 0; + } + uint8_t c = 0; + + uart_mutex_lock(); + if (_upload_uart_has_peek) + { + _upload_uart_has_peek = false; + c = _upload_uart_peek_byte; + } + else + { + + int len = uart_read_bytes(_upload_uart_num, &c, 1, 20 / portTICK_RATE_MS); + if (len == 0) + { + c = 0; + } + } + uart_mutex_unlock(); + return c; +} + +void ESPNexUpload::uartWrite(uint8_t c) +{ + if (_upload_uart_num == NULL) + { + return; + } + uart_mutex_lock(); + uart_write_bytes(_upload_uart_num, &c, 1); + uart_mutex_unlock(); +} + +void ESPNexUpload::uartWriteBuf(const char *data, size_t len) +{ + if (_upload_uart_num == NULL || data == NULL || !len) + { + return; + } + + uart_mutex_lock(); + uart_write_bytes(_upload_uart_num, data, len); + uart_mutex_unlock(); +} + +void ESPNexUpload::uartFlushTxOnly() +{ + + bool txOnly = true; + if (_upload_uart_num == NULL) + { + return; + } + + uart_mutex_lock(); + ESP_ERROR_CHECK(uart_wait_tx_done(_upload_uart_num, portMAX_DELAY)); + + if (!txOnly) + { + ESP_ERROR_CHECK(uart_flush_input(_upload_uart_num)); + } + uart_mutex_unlock(); +} + +void ESPNexUpload::setBaudrate(uart_port_t uart_num, uint32_t baud_rate, gpio_num_t tx_io_num, gpio_num_t rx_io_num) +{ + + ESP_LOGD(TAG, "installing driver on uart %d with baud rate %d", uart_num, baud_rate); + + _upload_uart_num = uart_num; + _upload_baudrate = baud_rate; + _upload_tx_io_num = tx_io_num; + _upload_rx_io_num = rx_io_num; + + const uart_config_t uart_config = { + .baud_rate = (int)baud_rate, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE}; + + // Do not change the UART initialization order. + // This order was gotten from: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/uart.html + + ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config)); + if (_uart_diver_installed == true) + { + ESP_LOGD(TAG, "baud rate changed"); + return; + } + + ESP_ERROR_CHECK(uart_set_pin(uart_num, tx_io_num, rx_io_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE)); + ESP_ERROR_CHECK(uart_driver_install(uart_num, + CONFIG_NEX_UART_RECV_BUFFER_SIZE, // Receive buffer size. + 0, // Transmit buffer size. + 10, // Queue size. + NULL, // Queue pointer. + 0)); // Allocation flags. + ESP_LOGD(TAG, "driver installed"); + _uart_diver_installed = true; +} + +std::string ESPNexUpload::str_snprintf(const char *fmt, size_t len, ...) { + std::string str; + va_list args; + + str.resize(len); + va_start(args, len); + size_t out_length = vsnprintf(&str[0], len + 1, fmt, args); + va_end(args); + + if (out_length < len) + str.resize(out_length); + + return str; +} +char ESPNexUpload::format_hex_pretty_char(uint8_t v) { return v >= 10 ? 'A' + (v - 10) : '0' + v; } +std::string ESPNexUpload::format_hex_pretty(const uint8_t *data, size_t length) { + if (length == 0) + return ""; + std::string ret; + ret.resize(3 * length - 1); + for (size_t i = 0; i < length; i++) { + ret[3 * i] = format_hex_pretty_char((data[i] & 0xF0) >> 4); + ret[3 * i + 1] = format_hex_pretty_char(data[i] & 0x0F); + if (i != length - 1) + ret[3 * i + 2] = '.'; + } + if (length > 4) + return ret + " (" + str_snprintf("%u", 32, length) + ")"; + return ret; } \ No newline at end of file diff --git a/src/modules/display/Nextion/ESPNexUpload.h b/src/modules/display/Nextion/ESPNexUpload.h index 3a22ac15..497f25c9 100644 --- a/src/modules/display/Nextion/ESPNexUpload.h +++ b/src/modules/display/Nextion/ESPNexUpload.h @@ -1,8 +1,17 @@ /** * @file NexUpload.h - * The definition of class NexUpload. - * - * + * The definition of class NexUpload. + * + * 1 - Removed all the Arduino code and replaced it by ESP-IDF + * 2 - Removed hard-coded UART configuration, see ESPNexUpload constructor + * 3 - Removed statusMessage and the function _printInfoLine + * 4 - Removed call-back functionality + * 5 - Removed one out of two upload functions + * 6 - BugFix in upload function + * @author Machiel Mastenbroek (machiel.mastenbroek@gmail.com) + * @date 2022/08/14 + * @version 0.6.0 + * * 1 - BugFix when display baudrate is diffrent from initial ESP baudrate * 2 - Improved debug information * 3 - Make delay commands dependent on the baudrate @@ -10,12 +19,12 @@ * @date 2019/11/04 * @version 0.5.5 * - * Stability improvement, Nextion display doesn’t freeze after the seconds 4096 trance of firmware bytes. - * Now the firmware upload process is stabled without the need of a hard Display power off-on intervention. - * Undocumented features (not mentioned in nextion-hmi-upload-protocol-v1-1 specification) are added. - * This implementation is based in on a reverse engineering with a UART logic analyser between + * Stability improvement, Nextion display doesn’t freeze after the seconds 4096 trance of firmware bytes. + * Now the firmware upload process is stabled without the need of a hard Display power off-on intervention. + * Undocumented features (not mentioned in nextion-hmi-upload-protocol-v1-1 specification) are added. + * This implementation is based in on a reverse engineering with a UART logic analyser between * the Nextion editor v0.58 and a NX4024T032_011R Display. - * + * * @author Machiel Mastenbroek (machiel.mastenbroek@gmail.com) * @date 2019/10/24 * @version 0.5.0 @@ -24,7 +33,7 @@ * @author Onno Dirkzwager (onno.dirkzwager@gmail.com) * @date 2018/12/26 * @version 0.3.0 - * + * * Modified to work with ESP8266 and SoftwareSerial * @author Ville Vilpas (psoden@gmail.com) * @date 2018/2/3 @@ -33,44 +42,46 @@ * Original version (a part of https://github.com/itead/ITEADLIB_Arduino_Nextion) * @author Chen Zengpeng (email:) * @date 2016/3/29 - * @copyright + * @copyright * Copyright (C) 2014-2015 ITEAD Intelligent Systems Co., Ltd. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License + * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef __ESPNEXUPLOAD_H__ #define __ESPNEXUPLOAD_H__ -#include +//#include +#include /* printf, scanf, NULL */ + +//#include +#include "esp_log.h" +//#include "freertos/FreeRTOS.h" +//#include "freertos/task.h" +//#include "driver/gpio.h" +#include "driver/uart.h" + +//#include "hal/uart_types.h" #include #include -#ifdef ESP8266 -#include -#else -#include -#include -#endif +#define CONFIG_NEX_UART_RECV_BUFFER_SIZE 256 /** - * @addtogroup CoreAPI - * @{ + * @addtogroup CoreAPI + * @{ */ -// callback template definition -typedef std::function THandlerFunction; - /** * * Provides the API for nextion to upload the ftf file. @@ -78,81 +89,68 @@ typedef std::function THandlerFunction; class ESPNexUpload { public: /* methods */ - // callback template definition - typedef std::function THandlerFunction; - + /** - * Constructor. - * - * @param uint32_t upload_baudrate - set upload baudrate. + * Constructor. + * */ - ESPNexUpload(uint32_t upload_baudrate, int line, int rx, int tx); - + ESPNexUpload(uart_port_t uart_num, uint32_t baud_rate, gpio_num_t tx_io_num, gpio_num_t rx_io_num); + /** - * destructor. - * + * destructor. + * */ - ~ESPNexUpload() {} - + ~ESPNexUpload(){} + /** * Connect to Nextion over serial * * @return true or false. */ bool connect(); - + /** * prepare upload. Set file size & Connect to Nextion over serial * * @return true if success, false for failure. */ - bool prepareUpload(uint32_t file_size); - - /** - * set Update Progress Callback. (What to do during update progress) - * - * @return none - */ - void setUpdateProgressCallback(THandlerFunction value); - + bool prepareUpload(uint32_t file_size, bool prot); + /** - * start update tft file to nextion. - * + * start update tft file to nextion. + * * @param const uint8_t *file_buf * @param size_t buf_size * @return true if success, false for failure. */ bool upload(const uint8_t *file_buf, size_t buf_size); - /** - * start update tft file to nextion. - * - * @param Stream &myFile - * @return true if success, false for failure. - */ bool upload(Stream &myFile); - /** * Send reset command to Nextion over serial * * @return none. */ - void softReset(void); + void softReset(void); /** * Send reset, end serial, reset _sent_packets & update status message * * @return none. */ - void end(void); - -public: /* data */ - String statusMessage = ""; - + void end(void); + private: /* methods */ /* - * get communicate baudrate. + * Semaphore construction to prevent double UART actions * + */ + void uart_mutex_lock(void) {do {} while (xSemaphoreTake(_upload_uart_lock, portMAX_DELAY) != pdPASS);}; + void uart_mutex_unlock(void) {xSemaphoreGive(_upload_uart_lock);}; + + /* + * get communicate baudrate. + * * @return communicate baudrate. * */ @@ -162,127 +160,167 @@ class ESPNexUpload * search communicate baudrate. * * @param baudrate - communicate baudrate. - * - * @return true if success, false for failure. + * + * @return true if success, false for failure. */ - bool _searchBaudrate(uint32_t baudrate); + bool _searchBaudrate(int baudrate); /* * set download baudrate. * * @param baudrate - set download baudrate. - * - * @return true if success, false for failure. + * + * @return true if success, false for failure. */ bool _setPrepareForFirmwareUpdate(uint32_t upload_baudrate); /* * set Nextion running mode. * - * Undocumented feature of the Nextion protocol. - * It's used by the 'upload to Nextion device' feature of the Nextion Editor V0.58 - * - * The nextion display doesn't send any response - * + * Undocumented feature of the Nextion protocol. + * It's used by the 'upload to Nextion device' feature of the Nextion Editor V0.58 + * + * The nextion display doesn't send any response + * */ void _setRunningMode(void); /* - * Test UART nextion connection availability - * - * @param input - echo string, - * - * @return true when the 'echo string' that is send is equal to the received string - * - * This test is used by the 'upload to Nextion device' feature of the Nextion Editor V0.58 - * + * Test UART nextion connection availability + * + * @param input - echo string, + * + * @return true when the 'echo string' that is send is equal to the received string + * + * This test is used by the 'upload to Nextion device' feature of the Nextion Editor V0.58 + * */ - bool _echoTest(String input); - + bool _echoTest(std::string input); + /* * This function get the sleep and dim value from the Nextion display. * - * If sleep = 1 meaning: sleep is enabled + * If sleep = 1 meaning: sleep is enabled * action : sleep will be disabled - * If dim = 0, meaning: the display backlight is turned off - * action : dim will be set to 100 (percent) - * + * If dim = 0, meaning: the display backlight is turned off + * action : dim will be set to 100 (percent) + * */ bool _handlingSleepAndDim(void); - + /* * This function (debug) print the Nextion response to a human readable string * - * @param esp_request - true: request message from esp to nextion - * false: response message from nextion to esp - * - * @param input - string to print - * + * @param esp_request - true: request message from esp to nextion + * false: response message from nextion to esp + * + * @param input - string to print + * */ - void _printSerialData(bool esp_request, String input); - - /* - * This function print a prefix debug line - * - * @param line: optional debug/ info line - */ - void _printInfoLine(String line = ""); - + void _printSerialData(bool esp_request, std::string input); + /* * Send command to Nextion. * * @param cmd - the string of command. - * @param tail - end the string with tripple 0xFF byte - * @param null_head - start the string with a single 0x00 byte + * @param tail - end the string with tripple 0xFF byte + * @param null_head - start the string with a single 0x00 byte * * @return none. */ - void sendCommand(const char *cmd, bool tail = true, bool null_head = false); + void sendCommand(const char* cmd, bool tail = true, bool null_head = false); /* - * Receive string data. - * - * @param buffer - save string data. - * @param timeout - set timeout time. + * Receive string data. + * + * @param buffer - save string data. + * @param timeout - set timeout time. * @param recv_flag - if recv_flag is true,will braak when receive 0x05. * * @return the length of string buffer. * - */ - uint16_t recvRetString(String &string, uint32_t timeout = 500, bool recv_flag = false); + */ + uint16_t recvRetString(std::string &string, uint32_t timeout = 500,bool recv_flag = false); /* - * - * This function calculates the transmission time, the transmission time + * + * This function calculates the transmission time, the transmission time * is based on the length of the message and the baudrate. - * - * @param message - only used to determine the length of the message + * + * @param message - only used to determine the length of the message * * @return time in us length of string buffer. * */ - uint32_t calculateTransmissionTimeMs(String message); + uint32_t calculateTransmissionTimeMs(std::string message); + + /* + * Setup UART for communication with display + * + * @param uart_num - UART number + * @param baud_rate - baud rate speed + * @param tx_io_num - GPIO TX pin + * @param rx_io_num - GPIO RX pin + * + */ + void setBaudrate(uart_port_t uart_num, uint32_t baud_rate, gpio_num_t tx_io_num, gpio_num_t rx_io_num); + + /* + * Check is UART is avaialble + */ + uint32_t uartAvailable(); + + /* + * Read one RX byte + * + * @return one received UART byte + */ + uint8_t uartRead(); + + /* + * Write one TX byte + * + * @param c - one byte + * + */ + void uartWrite(uint8_t c); - void nexSerialBegin(uint32_t upload_baudrate, int line, int rx, int tx); + /* + * Write char string + * + * @param data - char string of data to send + * @param len - length of the string + * + */ + void uartWriteBuf(const char * data, size_t len); + + /* + * Clear TX UART buffer + */ + void uartFlushTxOnly(); -private: /* data */ - uint32_t _baudrate; /* nextion serail baudrate */ - uint32_t _undownloadByte; /* undownload byte of tft file */ - uint32_t _upload_baudrate; /* upload baudrate */ - uint16_t _sent_packets = 0; /* upload baudrate */ - uint8_t _rx; - uint8_t _tx; - uint8_t _line; - THandlerFunction _updateProgressCallback; +private: /* data */ + bool protv2; + uint32_t _baudrate; /* nextion serail baudrate */ + uint32_t _undownloadByte; /* undownload byte of tft file */ + uart_port_t _upload_uart_num; /* upload uart port number */ + uint32_t _upload_baudrate; /* upload baudrate */ + gpio_num_t _upload_tx_io_num; /* upload gpio TX */ + gpio_num_t _upload_rx_io_num; /* upload gpio RX */ + xSemaphoreHandle _upload_uart_lock; /* semaphore to prevent double UART actions */ + bool _upload_uart_has_peek; /* UART RX peek flag */ + uint8_t _upload_uart_peek_byte; /* UART RX peek byte */ + //uint16_t _sent_packets = 0; /* _sent_packets till 4096 bytes */ + uint32_t _sent_packets_total = 0; /* total number of uploaded display firmware bytes */ + bool _uart_diver_installed; /* flag, if true UART is installed */ -#ifdef ESP8266 - SoftwareSerial* nexSerial; -#else - Stream* nexSerial; -#endif +std::string str_snprintf(const char *fmt, size_t len, ...); + /// Format the byte array \p data of length \p len in pretty-printed, human-readable hex. +std::string format_hex_pretty(const uint8_t *data, size_t length); +static char format_hex_pretty_char(uint8_t v); }; /** * @} */ -#endif /* #ifndef __ESPNEXUPLOAD_H__ */ \ No newline at end of file +#endif /* #ifndef __ESPNEXUPLOAD_H__ */ diff --git a/src/modules/display/Nextion/Nextion.cpp b/src/modules/display/Nextion/Nextion.cpp index a1a25c33..08bc5354 100644 --- a/src/modules/display/Nextion/Nextion.cpp +++ b/src/modules/display/Nextion/Nextion.cpp @@ -14,6 +14,7 @@ class Nextion : public IoTUart bool _UpTelegram; char _inc; String _inStr = ""; // буфер приема строк в режимах 0, 1, 2 + bool _protv2; // Выводим русские буквы на экран Nextion (преобразуем в кодировку ISO-8859-5) String convertRUS(String text) @@ -65,6 +66,7 @@ class Nextion : public IoTUart jsonRead(parameters, "speed", _speed); jsonRead(parameters, "line", _line); jsonRead(parameters, "uploadTelegram", _UpTelegram); + jsonRead(parameters, "protv2", _protv2); } IoTValue execute(String command, std::vector ¶m) @@ -211,10 +213,9 @@ class Nextion : public IoTUart if (!updated) { SerialPrint("I", F("NextionUpdate"), "connecting to " + (String)_host); - HTTPClient http; + HTTPClient http; #if defined ESP8266 - WiFiClient client; - if (!http.begin(client, _host, 80, _url)) + if (!http.begin(_host, 80, _url)) SerialPrint("I", F("NextionUpdate"), "connection failed "); #elif defined ESP32 if (!http.begin(String("http://") + _host + _url)) @@ -269,29 +270,31 @@ class Nextion : public IoTUart int contentLength = http.getSize(); SerialPrint("I", F("NextionUpdate"), "File received. Update Nextion... "); bool result; - ESPNexUpload nexUp(_speed, _line, _rx, _tx); - nexUp.setUpdateProgressCallback([]() - { SerialPrint("I", F("NextionUpdate"), "... "); }); + ESPNexUpload nexUp(_line, _speed, (gpio_num_t)_tx, (gpio_num_t)_rx); + // nexUp.setUpdateProgressCallback([]() + // { SerialPrint("I", F("NextionUpdate"), "... "); }); - result = nexUp.prepareUpload(contentLength); + result = nexUp.prepareUpload(contentLength, _protv2); if (!result) { - SerialPrint("I", F("NextionUpdate"), "Error: " + (String)nexUp.statusMessage); + SerialPrint("I", F("NextionUpdate"), "Error Connect in prepare upload"); } else { + updated = true; SerialPrint("I", F("NextionUpdate"), "Start upload. File size is: " + (String)contentLength); result = nexUp.upload(*http.getStreamPtr()); if (result) { - updated = true; + SerialPrint("I", F("NextionUpdate"), "Succesfully updated Nextion! "); } else { - SerialPrint("I", F("NextionUpdate"), "Error updating Nextion: " + (String)nexUp.statusMessage); + SerialPrint("I", F("NextionUpdate"), "Error updating Nextion" ); } nexUp.end(); + updated = false; } } //---------------------NEXTION-UPDATE---END------------------------ diff --git a/src/modules/display/Nextion/modinfo.json b/src/modules/display/Nextion/modinfo.json index 7168875d..05aa73df 100644 --- a/src/modules/display/Nextion/modinfo.json +++ b/src/modules/display/Nextion/modinfo.json @@ -17,6 +17,7 @@ "rx": 16, "line": 2, "speed": 9600, + "protv2": 1, "uploadTelegram": 1 } ], @@ -28,8 +29,8 @@ "moduleName": "Nextion", "moduleVersion": "2.0", "usedRam": { - "esp32_4mb": 15, - "esp8266_4mb": 15 + "esp32_4mb": 152, + "esp8266_4mb": 152 }, "title": "Nextion", "moduleDesc": "загрузка прошивки в дисплей Nextion. Команда для запуска обновления дисплея: Nextion.Update(); ", @@ -40,6 +41,7 @@ "line": "Актуально только для ESP32: номер линии hardUART. =2 rx=16 tx=17, для SoftwarwSerial в ESP32 line = -1", "host": "Сервер обновления. Можно использовать LiveServer из VisualCode, указывать ip адрес", "url": "файл прошивки экрана, указывать с расширением, например nextion.tft или iotm/test.tft", + "protv2": "1-использует быстрый протоколо прошивки v1.2, 0-использует оффициальный протокол прошивки", "uploadTelegram": "1 - разрешает прошивать экран через модуль Telegram_v2", "btn-uploadServer": "Кнопка загрузки прошивки с сервера LiveServer или другого по ip" }, @@ -87,7 +89,12 @@ }, "defActive": false, "usedLibs": { - "esp32*": [], - "esp82*": [] + "esp32_4mb": [], + "esp32_4mb3f": [], + "esp8266_4mb": [], + "esp8266_1mb": [], + "esp8266_1mb_ota": [], + "esp8285_1mb": [], + "esp8285_1mb_ota": [] } } \ No newline at end of file diff --git a/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp b/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp index 9d62d553..1c6201c8 100644 --- a/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp +++ b/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp @@ -125,6 +125,8 @@ namespace _Broker } } + bool _debug; + class BrokerMQTT : public IoTItem { private: @@ -132,7 +134,7 @@ namespace _Broker int _port = 0; String _user; String _pass; - bool _debug; + //bool _debug; bool _brige; String _server; String _srvUser; @@ -152,19 +154,6 @@ namespace _Broker jsonRead(parameters, "srvUser", _srvUser); jsonRead(parameters, "srvPass", _srvPass); jsonRead(parameters, "srvPort", _srvPort); - - if (_brige) - { - clientMqtt = new PicoMQTT::Client(_server.c_str(), _srvPort, nullptr, _srvUser.c_str(), _srvPass.c_str()); - if (_debug) - { - SerialPrint("i", F("BrigeMQTT"), "Bridge mode : ON"); - SerialPrint("i", F("BrigeMQTT"), "Bridge server: " + _server); - SerialPrint("i", F("BrigeMQTT"), "Bridge port: " + String(_srvPort)); - SerialPrint("i", F("BrigeMQTT"), "Bridge user: " + _srvUser); - SerialPrint("i", F("BrigeMQTT"), "Bridge pass: " + _srvPass); - } - } } void doByInterval() @@ -178,11 +167,30 @@ namespace _Broker picoMqtt->begin(); picoMqtt->setDebug(_debug); picoMqtt->setAuth(_user, _pass); + if (_brige) + { + clientMqtt = new PicoMQTT::Client(_server.c_str(), _srvPort, chipId.c_str(), _srvUser.c_str(), _srvPass.c_str()); + clientMqtt->begin(); + if (_debug) + { + SerialPrint("i", F("BrigeMQTT"), "Bridge mode : ON"); + SerialPrint("i", F("BrigeMQTT"), "Bridge server: " + _server); + SerialPrint("i", F("BrigeMQTT"), "Bridge port: " + String(_srvPort)); + SerialPrint("i", F("BrigeMQTT"), "Bridge user: " + _srvUser); + SerialPrint("i", F("BrigeMQTT"), "Bridge pass: " + _srvPass); + } + } if (_brige && picoMqtt && clientMqtt) { picoMqtt->subscribe("#", [](const char *topic, const char *message) { clientMqtt->publish(topic, message); - SerialPrint("i", F("BrigeMQTT"), "client publish, topic: " + String(topic) + " msg: " + String(message) ); }); + if (_debug) + SerialPrint("i", F("BrigeMQTT"), "Client publish, topic: " + String(topic) + " msg: " + String(message) ); }); + + clientMqtt->subscribe("#", [](const char *topic, const char *message) + { picoMqtt->publish(topic, message); + if (_debug) + SerialPrint("i", F("BrigeMQTT"), "Server publish, topic: " + String(topic) + " msg: " + String(message) ); }); } // picoMqtt.begin(); xTaskCreatePinnedToCore( diff --git a/src/modules/exec/Telegram_v2/Telegram_v2.cpp b/src/modules/exec/Telegram_v2/Telegram_v2.cpp index b872730a..2581471e 100644 --- a/src/modules/exec/Telegram_v2/Telegram_v2.cpp +++ b/src/modules/exec/Telegram_v2/Telegram_v2.cpp @@ -686,7 +686,7 @@ class Telegram_v2 : public IoTItem { _myBot->sendMessage("ID: " + chipId, _chatID); _myBot->sendMessage("chatID: " + _chatID, _chatID); - _myBot->sendMessage("Command: /help - this text \n /all - inline menu get all values \n /allMenu - bottom menu get all values \n /menu - bottom USER menu from scenario \n /get_id - get value by ID \n /set_id_value - set value in ID \n /file_name_type - take file from esp \n /file_type - support file type \n /reboot - reboot esp \n\n send file and write download - \"download\" file to esp \n\n send *.tft file - flash Nextion \n\n send firmware.bin or littltfs.bin - firmware ESP ", _chatID); + _myBot->sendMessage("Command: /help - this text \n /all - inline menu get all values \n /allMenu - bottom menu get all values \n /menu - bottom USER menu from scenario \n /get_id - get value by ID \n /set_id_value - set value in ID \n /file_/path/name_type - take file from esp \n /file_type - support file type \n /reboot - reboot esp \n\n send file and write download - \"download\" file to esp \n\n send *.tft file - flash Nextion \n\n send firmware.bin or littltfs.bin - firmware ESP ", _chatID); } } else if (msg.text.indexOf("/reboot") != -1) From d6a24b1837f447ab09efdf42551a7043f7e2c231 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 20 Sep 2024 12:05:34 +0300 Subject: [PATCH 004/118] Nextion, VerifyOTA? RollBackConfig --- data_svelte/settings.json | 1 + include/DebugTrace.h | 3 + myProfile.json | 97 ++++---- src/DebugTrace.cpp | 33 +++ src/EspFileSystem.cpp | 20 ++ src/Main.cpp | 11 + src/modules/display/Nextion/ESPNexUpload.cpp | 180 +++++++++------ src/modules/display/Nextion/ESPNexUpload.h | 4 +- src/modules/display/Nextion/Nextion.cpp | 212 +++++++++++------- src/modules/display/Nextion/modinfo.json | 6 +- .../display/NextionUpload/NextionUpload.cpp | 11 +- src/modules/exec/BrokerMQTT/BrokerMQTT.cpp | 4 +- src/modules/exec/Telegram_v2/Telegram_v2.cpp | 6 +- 13 files changed, 371 insertions(+), 217 deletions(-) diff --git a/data_svelte/settings.json b/data_svelte/settings.json index 297019c9..19bfee24 100644 --- a/data_svelte/settings.json +++ b/data_svelte/settings.json @@ -21,6 +21,7 @@ "pinSDA": 0, "i2cFreq": 100000, "wg": "group1", + "debugTrace": 1, "udps": 1, "settings_": "" } \ No newline at end of file diff --git a/include/DebugTrace.h b/include/DebugTrace.h index c8aff58a..bd8b33fc 100644 --- a/include/DebugTrace.h +++ b/include/DebugTrace.h @@ -18,3 +18,6 @@ extern "C" void __real_esp_panic_handler(void*); void printDebugTrace(); void sendDebugTraceAndFreeMemory(bool); void IRAM_ATTR debugUpdate(); + +extern "C" bool verifyRollbackLater(); +void verifyFirmware(); \ No newline at end of file diff --git a/myProfile.json b/myProfile.json index bac5d993..503f4aaa 100644 --- a/myProfile.json +++ b/myProfile.json @@ -20,12 +20,13 @@ "pinSCL": 0, "pinSDA": 0, "i2cFreq": 100000, - "wg": "group1" + "wg": "group1", + "debugTrace": 1 }, "projectProp": { "platformio": { - "default_envs": "esp8266_4mb", - "comments_default_envs": "choose from: esp8266_4mb or esp32_4mb or esp32cam_4mb or esp32s2_4mb or esp32_4mb3f or esp32s3_16mb or esp32c3m_4mb or esp8266_1mb or esp8266_1mb_ota or esp8285_1mb or esp8285_1mb_ota", + "default_envs": "esp32_4mb3f", + "comments_default_envs": "choose from: esp8266_4mb, esp32_4mb, esp32_4mb3f, esp8266_16mb, esp32_16mb, esp32cam_4mb, esp32s2_4mb, esp32s3_16mb, esp32c3m_4mb, esp8266_1mb, esp8266_1mb_ota, esp8266_2mb, esp8266_2mb_ota, esp8285_1mb, esp8285_1mb_ota", "envs": [ { "name": "esp8266_4mb", @@ -134,7 +135,7 @@ }, { "path": "src/modules/virtual/Cron", - "active": true + "active": false }, { "path": "src/modules/virtual/GoogleSheet", @@ -142,23 +143,23 @@ }, { "path": "src/modules/virtual/Loging", - "active": true + "active": false }, { "path": "src/modules/virtual/LogingDaily", - "active": true + "active": false }, { "path": "src/modules/virtual/Math", - "active": true + "active": false }, { "path": "src/modules/virtual/owmWeather", - "active": true + "active": false }, { "path": "src/modules/virtual/Ping", - "active": true + "active": false }, { "path": "src/modules/virtual/Timer", @@ -166,7 +167,7 @@ }, { "path": "src/modules/virtual/Variable", - "active": true + "active": false }, { "path": "src/modules/virtual/VButton", @@ -184,11 +185,11 @@ }, { "path": "src/modules/sensors/A02Distance", - "active": true + "active": false }, { "path": "src/modules/sensors/Acs712", - "active": true + "active": false }, { "path": "src/modules/sensors/Ads1115", @@ -196,11 +197,11 @@ }, { "path": "src/modules/sensors/AhtXX", - "active": true + "active": false }, { "path": "src/modules/sensors/AnalogAdc", - "active": true + "active": false }, { "path": "src/modules/sensors/BH_1750", @@ -208,7 +209,7 @@ }, { "path": "src/modules/sensors/BL0937", - "active": true + "active": false }, { "path": "src/modules/sensors/Ble", @@ -224,19 +225,19 @@ }, { "path": "src/modules/sensors/Bme280", - "active": true + "active": false }, { "path": "src/modules/sensors/Bmp280", - "active": true + "active": false }, { "path": "src/modules/sensors/Dht1122", - "active": true + "active": false }, { "path": "src/modules/sensors/Ds18b20", - "active": true + "active": false }, { "path": "src/modules/sensors/DS2401", @@ -280,7 +281,7 @@ }, { "path": "src/modules/sensors/Impulse", - "active": true + "active": false }, { "path": "src/modules/sensors/Ina219", @@ -308,7 +309,7 @@ }, { "path": "src/modules/sensors/MQgas", - "active": true + "active": false }, { "path": "src/modules/sensors/Ntc", @@ -320,7 +321,7 @@ }, { "path": "src/modules/sensors/Pzem004t_v2", - "active": true + "active": false }, { "path": "src/modules/sensors/RCswitch", @@ -328,11 +329,11 @@ }, { "path": "src/modules/sensors/RTC", - "active": true + "active": false }, { "path": "src/modules/sensors/S8", - "active": true + "active": false }, { "path": "src/modules/sensors/Scd40", @@ -348,25 +349,25 @@ }, { "path": "src/modules/sensors/Sht20", - "active": true + "active": false }, { "path": "src/modules/sensors/Sht30", - "active": true + "active": false }, { "path": "src/modules/sensors/Sonar", - "active": true + "active": false }, { "path": "src/modules/sensors/UART", - "active": true + "active": false } ], "executive_devices": [ { "path": "src/modules/exec/AnalogBtn", - "active": true + "active": false }, { "path": "src/modules/exec/BrokerMQTT", @@ -374,19 +375,23 @@ }, { "path": "src/modules/exec/ButtonIn", - "active": true + "active": false }, { "path": "src/modules/exec/ButtonOut", - "active": true + "active": false }, { "path": "src/modules/exec/Buzzer", + "active": false + }, + { + "path": "src/modules/exec/EctoControlAdapter", "active": true }, { "path": "src/modules/exec/Enconder", - "active": true + "active": false }, { "path": "src/modules/exec/EspCam", @@ -402,7 +407,7 @@ }, { "path": "src/modules/exec/IoTServo", - "active": true + "active": false }, { "path": "src/modules/exec/Mcp23008", @@ -410,15 +415,15 @@ }, { "path": "src/modules/exec/Mcp23017", - "active": true + "active": false }, { "path": "src/modules/exec/Mp3", - "active": true + "active": false }, { "path": "src/modules/exec/Multitouch", - "active": true + "active": false }, { "path": "src/modules/exec/MySensors", @@ -426,15 +431,15 @@ }, { "path": "src/modules/exec/Pcf8574", - "active": true + "active": false }, { "path": "src/modules/exec/Pwm32", - "active": true + "active": false }, { "path": "src/modules/exec/Pwm8266", - "active": true + "active": false }, { "path": "src/modules/exec/SDcard", @@ -442,7 +447,7 @@ }, { "path": "src/modules/exec/SIM800", - "active": false + "active": true }, { "path": "src/modules/exec/SmartBoiler", @@ -458,11 +463,11 @@ }, { "path": "src/modules/exec/TelegramLT", - "active": true + "active": false }, { "path": "src/modules/exec/Telegram_v2", - "active": false + "active": true }, { "path": "src/modules/exec/Thermostat", @@ -476,11 +481,11 @@ "screens": [ { "path": "src/modules/display/DwinI", - "active": true + "active": false }, { "path": "src/modules/display/Lcd2004", - "active": true + "active": false }, { "path": "src/modules/display/Nextion", @@ -496,11 +501,11 @@ }, { "path": "src/modules/display/Oled64", - "active": true + "active": false }, { "path": "src/modules/display/Smi2_m", - "active": true + "active": false }, { "path": "src/modules/display/TM16XX", diff --git a/src/DebugTrace.cpp b/src/DebugTrace.cpp index b2183023..8b8afd85 100644 --- a/src/DebugTrace.cpp +++ b/src/DebugTrace.cpp @@ -62,6 +62,7 @@ extern "C" void __wrap_esp_panic_handler(void *info) debugHeapUpdate(); debugBacktraceUpdate(); + bootloop_panic_count += 1; // Call the original panic handler function to finish processing this error (creating a core dump for example...) __real_esp_panic_handler(info); } @@ -273,6 +274,7 @@ void sendDebugTraceAndFreeMemory( bool postMsg) free(msg); } };*/ + } #else @@ -285,3 +287,34 @@ extern "C" void __wrap_esp_panic_handler(void *info) __real_esp_panic_handler(info); } #endif // RESTART_DEBUG_INFO + + + extern "C" bool verifyRollbackLater(){ + Serial.printf("verifyRollbackLater OVERRIDDEN FUNCTION!"); + return true; + } + + void verifyFirmware(){ + Serial.printf("[SYSTEM] - Checking firmware...\n"); + const esp_partition_t *running = esp_ota_get_running_partition(); + esp_ota_img_states_t ota_state; + if (esp_ota_get_state_partition(running, &ota_state) == ESP_OK) { + const char* otaState = ota_state == ESP_OTA_IMG_NEW ? "ESP_OTA_IMG_NEW" + : ota_state == ESP_OTA_IMG_PENDING_VERIFY ? "ESP_OTA_IMG_PENDING_VERIFY" + : ota_state == ESP_OTA_IMG_VALID ? "ESP_OTA_IMG_VALID" + : ota_state == ESP_OTA_IMG_INVALID ? "ESP_OTA_IMG_INVALID" + : ota_state == ESP_OTA_IMG_ABORTED ? "ESP_OTA_IMG_ABORTED" + : "ESP_OTA_IMG_UNDEFINED"; + Serial.printf( "[System] - Ota state: %s\n",otaState); + + if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) { + if (esp_ota_mark_app_valid_cancel_rollback() == ESP_OK) { + Serial.printf( "[System] - App is valid, rollback cancelled successfully\n"); + } else { + Serial.printf("[System] - Failed to cancel rollback\n"); + } + } + }else{ + Serial.printf("[System] - OTA partition has no record in OTA data\n"); + } + } \ No newline at end of file diff --git a/src/EspFileSystem.cpp b/src/EspFileSystem.cpp index 5b9bbf2c..8197c630 100644 --- a/src/EspFileSystem.cpp +++ b/src/EspFileSystem.cpp @@ -35,6 +35,26 @@ void syncSettingsFlashJson() writeFile(F("settings.json"), settingsFlashJson); } +void resetSettingsFlashByPanic() +{ + FileFS.rename("/config.json", "/config_bak.json"); + /* + update.configJson = readFile("config.json", 4096 * 4); + update.layoutJson = readFile("layout.json", 4096 * 4); + update.scenarioTxt = readFile("scenario.txt", 4096 * 4); + writeFile(F("/config_bak.json"), update.configJson); + writeFile(F("/scenario_bak.txt"), update.scenarioTxt); + writeFile(F("/layout_bak.json"), update.layoutJson); + */ + update.configJson = "[]"; + update.scenarioTxt = ""; + update.layoutJson = "[]"; + writeFile(F("/config.json"), update.configJson); + writeFile(F("/scenario.txt"), update.scenarioTxt); + writeFile(F("/layout.json"), update.layoutJson); + ESP.reset(); +} + void syncValuesFlashJson() { writeFile(F("values.json"), valuesFlashJson); diff --git a/src/Main.cpp b/src/Main.cpp index c0e60c27..767c0c8d 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -124,6 +124,8 @@ void setup() { // получение chip id setChipId(); + verifyFirmware(); + // синхронизация глобальных переменных с flash globalVarsSync(); @@ -148,6 +150,14 @@ void setup() { SerialPrint("i", "i2c", F("i2c pins overriding done")); } + if (bootloop_panic_count >= 3) + { + resetSettingsFlashByPanic(); + bootloop_panic_count = -1; + } + if (bootloop_panic_count == -1) + SerialPrint("E", "CORE", F("CONFIG and SCENARIO reset !!!")); + // настраиваем микроконтроллер configure("/config.json"); @@ -232,6 +242,7 @@ void setup() { Serial.println("--------test end---------"); stopErrorMarker(SETUPLAST_ERRORMARKER); + bootloop_panic_count = 0; } void loop() { diff --git a/src/modules/display/Nextion/ESPNexUpload.cpp b/src/modules/display/Nextion/ESPNexUpload.cpp index c0927713..2125b493 100644 --- a/src/modules/display/Nextion/ESPNexUpload.cpp +++ b/src/modules/display/Nextion/ESPNexUpload.cpp @@ -22,12 +22,14 @@ * along with this program. If not, see . * */ +/* #ifdef CORE_DEBUG_LEVEL #undef CORE_DEBUG_LEVEL #endif #define CORE_DEBUG_LEVEL 3 #define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +*/ #include "ESPNexUpload.h" @@ -77,9 +79,9 @@ bool ESPNexUpload::connect() return true; } -bool ESPNexUpload::prepareUpload(uint32_t file_size, bool prot) +bool ESPNexUpload::prepareUpload(uint32_t file_size, bool oldProt) { - protv2 = prot; + _oldProtv11 = oldProt; _undownloadByte = file_size; ESP_LOGD(TAG, "prepareUpload: %" PRIu32, file_size); vTaskDelay(5 / portTICK_PERIOD_MS); @@ -206,8 +208,8 @@ uint16_t ESPNexUpload::recvRetString(std::string &response, uint32_t timeout, bo bool exit_flag = false; bool ff_flag = false; response = ""; - if (timeout != 500) - ESP_LOGD(TAG, "timeout setting serial read: %" PRIu32, timeout); + // if (timeout != 500) + ESP_LOGD(TAG, "timeout setting serial read: %" PRIu32, timeout); start = (unsigned long)(esp_timer_get_time() / 1000ULL); @@ -238,7 +240,11 @@ uint16_t ESPNexUpload::recvRetString(std::string &response, uint32_t timeout, bo if (recv_flag) { - if (response.find(0x05) != -1) + if (response.find(0x05) != -1 && response.length() == 1) + { + exit_flag = true; + } + else if (response.find(0x08) != -1 && response.length() == 5) { exit_flag = true; } @@ -273,10 +279,10 @@ bool ESPNexUpload::_setPrepareForFirmwareUpdate(uint32_t upload_baudrate) vTaskDelay(10 / portTICK_PERIOD_MS); this->recvRetString(response, 800, true); // normal response time is 400ms ESP_LOGD(TAG, "response (00): %s", response.c_str()); - if (protv2) - cmd = "whmi-wris " + std::to_string(_undownloadByte) + "," + std::to_string(upload_baudrate) + ",1"; - else + if (_oldProtv11) cmd = "whmi-wri " + std::to_string(_undownloadByte) + "," + std::to_string(upload_baudrate) + ",0"; + else + cmd = "whmi-wris " + std::to_string(_undownloadByte) + "," + std::to_string(upload_baudrate) + ",1"; ESP_LOGI(TAG, "cmd: %s", cmd.c_str()); this->sendCommand(cmd.c_str()); @@ -305,6 +311,7 @@ bool ESPNexUpload::_setPrepareForFirmwareUpdate(uint32_t upload_baudrate) } } +// НЕ ПРОВЕРЯЛОСЬ !!!!!!!!!!!!!!!!!! bool ESPNexUpload::upload(const uint8_t *file_buf, size_t file_size) { @@ -327,10 +334,13 @@ bool ESPNexUpload::upload(const uint8_t *file_buf, size_t file_size) { blockSize = file_size - offset; } - uartWriteBuf((char*)file_buf[offset], blockSize); + uartWriteBuf((char *)file_buf[offset], blockSize); // wait for the Nextion to return its 0x05 byte confirming reception and readiness to receive the next packets this->recvRetString(response, 2000, true); + ESP_LOGE(TAG, "response [%s]", + format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); + if (response[0] == 0x08 && response.size() == 5) { // handle partial upload request remainingBlocks -= 1; @@ -341,8 +351,8 @@ bool ESPNexUpload::upload(const uint8_t *file_buf, size_t file_size) ESP_LOGI(TAG, "bulk: %i, total bytes %" PRIu32 ", response: %s", sent_bulk_counter, _sent_packets_total, response.c_str()); } - ESP_LOGE(TAG, "response [%s]", - format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); + // ESP_LOGE(TAG, "response [%s]", + // format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); for (int j = 0; j < 4; ++j) { @@ -362,8 +372,8 @@ bool ESPNexUpload::upload(const uint8_t *file_buf, size_t file_size) ESP_LOGI(TAG, "bulk: %i, total bytes %" PRIu32 ", response: %s", sent_bulk_counter, _sent_packets_total, response.c_str()); } - ESP_LOGE(TAG, "response [%s]", - format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); + // ESP_LOGE(TAG, "response [%s]", + // format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); offset += 4096; } @@ -399,22 +409,23 @@ bool ESPNexUpload::upload(Stream &myFile) uint32_t _seekByte = 0; uint32_t _packets_total_byte = 0; // get available data size - size_t file_size = myFile.available(); + size_t file_size = _undownloadByte; // myFile.available(); if (file_size) { - int remainingBlocks = ceil(file_size / 4096); + int remainingBlocks = ceil(file_size / 4096.); int blockSize = 4096; - + ESP_LOGI(TAG, "Remaining Blocks ALL: %" PRIu32, remainingBlocks); while (remainingBlocks > 0) { - file_size = myFile.available(); - // read up to 4096 byte into the buffer + // myFile.available(); + // read up to 4096 byte into the buffer if (_seekByte > 0) { if (file_size > _seekByte) { blockSize = myFile.readBytes(file_buf, _seekByte); - file_size = myFile.available(); + // file_size = myFile.available(); + file_size -= _seekByte; ESP_LOGI(TAG, "Seek file: %" PRIu32 ", left bytes %" PRIu32, _seekByte, file_size); } else @@ -423,59 +434,71 @@ bool ESPNexUpload::upload(Stream &myFile) return false; } blockSize = myFile.readBytes(file_buf, ((file_size > sizeof(file_buf)) ? sizeof(file_buf) : file_size)); + file_size -= blockSize; // осталось байт } else + { blockSize = myFile.readBytes(file_buf, ((file_size > sizeof(file_buf)) ? sizeof(file_buf) : file_size)); - - uartWriteBuf((char*)file_buf, blockSize); + file_size -= blockSize; // осталось байт + } + uartWriteBuf((char *)file_buf, blockSize); // wait for the Nextion to return its 0x05 byte confirming reception and readiness to receive the next packets - this->recvRetString(response, 2000, true); + if (response[0] == 0x08 || timeout >= 4) + this->recvRetString(response, 2000, true); + else + this->recvRetString(response, 500, true); + ESP_LOGE(TAG, "upload response byte [%s]", + format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); + ESP_LOG_BUFFER_HEX(TAG, response.data(), response.size()); if (response[0] == 0x08 && response.size() == 5) { // handle partial upload request remainingBlocks -= 1; - _sent_packets_total += blockSize; - _packets_total_byte += blockSize; + _sent_packets_total += blockSize; // отправлено байт + _packets_total_byte += blockSize; // всего байт отправлено или пропущено sent_bulk_counter++; if (sent_bulk_counter % 10 == 0) { - ESP_LOGI(TAG, "bulk: %i, total bytes %" PRIu32 ", response: %s", sent_bulk_counter, _sent_packets_total, response.c_str()); + // ESP_LOGI(TAG, "bulk: %i, total bytes %" PRIu32 ", response: %s", sent_bulk_counter, _sent_packets_total, response.c_str()); } - - ESP_LOGE(TAG, "response [%s]", + ESP_LOGE(TAG, "upload response [%s]", format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); - for (int j = 0; j < 4; ++j) { offset += static_cast(response[j + 1]) << (8 * j); - ESP_LOGI(TAG, "Offset : %" PRIu32, offset); } + ESP_LOGI(TAG, "Offset : %" PRIu32, offset); if (offset) { remainingBlocks = ceil((file_size - offset) / blockSize); _seekByte = offset - _packets_total_byte; _packets_total_byte += _seekByte; + ESP_LOGI(TAG, "Seek Byte : %" PRIu32, _seekByte); + ESP_LOGI(TAG, "Remaining Blocks : %" PRIu32, remainingBlocks); } } - else if (response[0] == 0x05) + else if ((response[0] == 0x08 || response[0] == 0x05) && response.size() == 1) { remainingBlocks -= 1; _sent_packets_total += blockSize; _packets_total_byte += blockSize; + file_size -= blockSize; sent_bulk_counter++; if (sent_bulk_counter % 10 == 0) { - ESP_LOGI(TAG, "bulk: %i, total bytes %" PRIu32 ", response: %s", sent_bulk_counter, _sent_packets_total, response.c_str()); + // ESP_LOGI(TAG, "bulk: %i, total bytes %" PRIu32 ", response: %s", sent_bulk_counter, _sent_packets_total, response.c_str()); } - ESP_LOGE(TAG, "response [%s]", + ESP_LOGE(TAG, "upload response [%s]", format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); offset += 4096; } else { - if (timeout >= 2) + ESP_LOGE(TAG, "Fail response [%s]", + format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); + if (timeout >= 9) { ESP_LOGE(TAG, "upload failed, no valid response from display, total bytes send : %" PRIu32, _sent_packets_total); sent_bulk_counter = 0; @@ -483,9 +506,23 @@ bool ESPNexUpload::upload(Stream &myFile) } timeout++; } + ESP_LOGI(TAG, "bulk: %i, total bytes %" PRIu32 ", response: %s", sent_bulk_counter, _sent_packets_total, response.c_str()); + } + this->recvRetString(response, 3000, true); + if (response[0] == 0x88) + { + ESP_LOGI(TAG, "upload finished (Response 0x88), total bytes send : %" PRIu32, _sent_packets_total); + this->end(); + } + else + { + ESP_LOGE(TAG, "upload response [%s]", + format_hex_pretty(reinterpret_cast(response.data()), response.size()).c_str()); + ESP_LOGI(TAG, "upload finished (TimeOut 0x88), total bytes send : %" PRIu32, _sent_packets_total); + this->end(); } - ESP_LOGI(TAG, "upload send last bytes %" PRIu32 ", response: %s", _sent_packets_total, response.c_str()); - // ESP_LOGI(TAG,"upload finished, total bytes send : %"PRIu32, _sent_packets_total); + // ESP_LOGI(TAG, "upload send last bytes %" PRIu32 ", response: %s", _sent_packets_total, response.c_str()); + // ESP_LOGI(TAG,"upload finished, total bytes send : %"PRIu32, _sent_packets_total); sent_bulk_counter = 0; return true; } @@ -511,15 +548,15 @@ void ESPNexUpload::end() } // wait for the nextion to finish internal processes - vTaskDelay(1600 / portTICK_PERIOD_MS); + // vTaskDelay(1600 / portTICK_PERIOD_MS); // soft reset the nextion this->softReset(); // end Serial connection - uart_mutex_lock(); - ESP_ERROR_CHECK(uart_driver_delete(_upload_uart_num)); - uart_mutex_unlock(); + // uart_mutex_lock(); + // ESP_ERROR_CHECK(uart_driver_delete(_upload_uart_num)); + // uart_mutex_unlock(); // reset sent packets counter //_sent_packets = 0; @@ -779,43 +816,48 @@ void ESPNexUpload::setBaudrate(uart_port_t uart_num, uint32_t baud_rate, gpio_nu } ESP_ERROR_CHECK(uart_set_pin(uart_num, tx_io_num, rx_io_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE)); - ESP_ERROR_CHECK(uart_driver_install(uart_num, - CONFIG_NEX_UART_RECV_BUFFER_SIZE, // Receive buffer size. - 0, // Transmit buffer size. - 10, // Queue size. - NULL, // Queue pointer. - 0)); // Allocation flags. + /* + ESP_ERROR_CHECK(uart_driver_install(uart_num, + CONFIG_NEX_UART_RECV_BUFFER_SIZE, // Receive buffer size. + 0, // Transmit buffer size. + 10, // Queue size. + NULL, // Queue pointer. + 0)); // Allocation flags. + */ ESP_LOGD(TAG, "driver installed"); _uart_diver_installed = true; } -std::string ESPNexUpload::str_snprintf(const char *fmt, size_t len, ...) { - std::string str; - va_list args; +std::string ESPNexUpload::str_snprintf(const char *fmt, size_t len, ...) +{ + std::string str; + va_list args; - str.resize(len); - va_start(args, len); - size_t out_length = vsnprintf(&str[0], len + 1, fmt, args); - va_end(args); + str.resize(len); + va_start(args, len); + size_t out_length = vsnprintf(&str[0], len + 1, fmt, args); + va_end(args); - if (out_length < len) - str.resize(out_length); + if (out_length < len) + str.resize(out_length); - return str; + return str; } char ESPNexUpload::format_hex_pretty_char(uint8_t v) { return v >= 10 ? 'A' + (v - 10) : '0' + v; } -std::string ESPNexUpload::format_hex_pretty(const uint8_t *data, size_t length) { - if (length == 0) - return ""; - std::string ret; - ret.resize(3 * length - 1); - for (size_t i = 0; i < length; i++) { - ret[3 * i] = format_hex_pretty_char((data[i] & 0xF0) >> 4); - ret[3 * i + 1] = format_hex_pretty_char(data[i] & 0x0F); - if (i != length - 1) - ret[3 * i + 2] = '.'; - } - if (length > 4) - return ret + " (" + str_snprintf("%u", 32, length) + ")"; - return ret; +std::string ESPNexUpload::format_hex_pretty(const uint8_t *data, size_t length) +{ + if (length == 0) + return ""; + std::string ret; + ret.resize(3 * length - 1); + for (size_t i = 0; i < length; i++) + { + ret[3 * i] = format_hex_pretty_char((data[i] & 0xF0) >> 4); + ret[3 * i + 1] = format_hex_pretty_char(data[i] & 0x0F); + if (i != length - 1) + ret[3 * i + 2] = '.'; + } + if (length > 4) + return ret + " (" + str_snprintf("%u", 32, length) + ")"; + return ret; } \ No newline at end of file diff --git a/src/modules/display/Nextion/ESPNexUpload.h b/src/modules/display/Nextion/ESPNexUpload.h index 497f25c9..bc57852f 100644 --- a/src/modules/display/Nextion/ESPNexUpload.h +++ b/src/modules/display/Nextion/ESPNexUpload.h @@ -114,7 +114,7 @@ class ESPNexUpload * * @return true if success, false for failure. */ - bool prepareUpload(uint32_t file_size, bool prot); + bool prepareUpload(uint32_t file_size, bool oldProt); /** * start update tft file to nextion. @@ -300,7 +300,7 @@ class ESPNexUpload void uartFlushTxOnly(); private: /* data */ - bool protv2; + bool _oldProtv11; uint32_t _baudrate; /* nextion serail baudrate */ uint32_t _undownloadByte; /* undownload byte of tft file */ uart_port_t _upload_uart_num; /* upload uart port number */ diff --git a/src/modules/display/Nextion/Nextion.cpp b/src/modules/display/Nextion/Nextion.cpp index 08bc5354..73fc69a3 100644 --- a/src/modules/display/Nextion/Nextion.cpp +++ b/src/modules/display/Nextion/Nextion.cpp @@ -13,8 +13,8 @@ class Nextion : public IoTUart int _tx, _rx, _speed, _line; bool _UpTelegram; char _inc; - String _inStr = ""; // буфер приема строк в режимах 0, 1, 2 - bool _protv2; + String _inStr = ""; // буфер приема строк в режимах 0, 1, 2 + bool _oldProt; // Выводим русские буквы на экран Nextion (преобразуем в кодировку ISO-8859-5) String convertRUS(String text) @@ -53,7 +53,7 @@ class Nextion : public IoTUart } } return out; - } + } public: Nextion(String parameters) : IoTUart(parameters) @@ -63,10 +63,11 @@ class Nextion : public IoTUart _host = jsonReadStr(parameters, "host"); jsonRead(parameters, "rx", _rx); jsonRead(parameters, "tx", _tx); - jsonRead(parameters, "speed", _speed); - jsonRead(parameters, "line", _line); + jsonRead(parameters, "speed", _speed); + jsonRead(parameters, "line", _line); jsonRead(parameters, "uploadTelegram", _UpTelegram); - jsonRead(parameters, "protv2", _protv2); + if (!jsonRead(parameters, "oldProt_v11", _oldProt)) + _oldProt = false; } IoTValue execute(String command, std::vector ¶m) @@ -76,15 +77,15 @@ class Nextion : public IoTUart { updateServer(); } - else if (command == "printFFF") + else if (command == "printFFF") { - if (param.size() == 2) - //UART.printFFF("auto.val=1",0) + if (param.size() == 2) + // UART.printFFF("auto.val=1",0) { String strToUart = ""; strToUart = param[0].valS; - if (param[1].valD) + if (param[1].valD) uartPrintFFF("\"" + strToUart + "\""); else uartPrintFFF(strToUart); @@ -101,7 +102,7 @@ class Nextion : public IoTUart else uartPrintFFF(strToUart + param[1].valS); } - } + } // отправка кирилических символов на Nextion (русские буквы) else if (command == "printRusFFF") { @@ -125,43 +126,54 @@ class Nextion : public IoTUart else uartPrintFFF(convertRUS(strToUart + param[1].valS)); } - }// else { // не забываем, что переопределяем execute и нужно проверить что в базовом классе проверяется - // return IoTUart::execute(command, param); - // } - return {}; + } // else { // не забываем, что переопределяем execute и нужно проверить что в базовом классе проверяется + // return IoTUart::execute(command, param); + // } + return {}; } - void onModuleOrder(String &key, String &value) { - if (key == "uploadServer") { + void onModuleOrder(String &key, String &value) + { + if (key == "uploadServer") + { updateServer(); } } - void uartPrintFFF(const String& msg) { - if (_myUART) { - SerialPrint("I", F("Nextion"), "uartPrintFFF -> "+msg+" +FFFFFF"); + void uartPrintFFF(const String &msg) + { + if (_myUART) + { + SerialPrint("I", F("Nextion"), "uartPrintFFF -> " + msg + " +FFFFFF"); _myUART->print(msg); _myUART->write(0xff); _myUART->write(0xff); _myUART->write(0xff); } } -//---------------------NEXTION-UART---START------------------------ - void uartHandle() { - if (!_myUART) return; - if (_myUART->available()) { + //---------------------NEXTION-UART---START------------------------ + void uartHandle() + { + if (!_myUART) + return; + if (_myUART->available()) + { _inc = _myUART->read(); - if (_inc == 0xFF) { + if (_inc == 0xFF) + { _inc = _myUART->read(); _inc = _myUART->read(); _inStr = ""; return; } - if (_inc == '\r') return; - - if (_inc == '\n') { - if (_inStr.indexOf("=") == -1) { // если входящее сообщение не по формату, то работаем как в режиме 0 + if (_inc == '\r') + return; + + if (_inc == '\n') + { + if (_inStr.indexOf("=") == -1) + { // если входящее сообщение не по формату, то работаем как в режиме 0 setValue(_inStr); return; } @@ -172,67 +184,79 @@ class Nextion : public IoTUart id.replace(".txt", "_txt"); generateOrder(id, valStr); _inStr = ""; - } else _inStr += _inc; + } + else + _inStr += _inc; } } - void onRegEvent(IoTItem* eventItem) { - if (!_myUART || !eventItem) return; + void onRegEvent(IoTItem *eventItem) + { + if (!_myUART || !eventItem) + return; int indexOf_; String printStr = ""; - printStr += eventItem->getID(); - indexOf_ = printStr.indexOf("_"); - if (indexOf_ == -1) return; // пропускаем событие, если нет используемого признака типа данных - _txt или _vol - - if (printStr.indexOf("_txt") > 0) { - printStr.replace("_txt", ".txt=\""); - printStr += eventItem->getValue(); - printStr += "\""; - } else if (printStr.indexOf("_val") > 0) { - printStr += eventItem->getValue(); - printStr.replace(".", ""); - printStr.replace("_val", ".val="); - } else { - if (indexOf_ == printStr.length()-1) printStr.replace("_", ""); - else printStr.replace("_", "."); - printStr += "="; - printStr += eventItem->getValue(); - } + printStr += eventItem->getID(); + indexOf_ = printStr.indexOf("_"); + if (indexOf_ == -1) + return; // пропускаем событие, если нет используемого признака типа данных - _txt или _vol + + if (printStr.indexOf("_txt") > 0) + { + printStr.replace("_txt", ".txt=\""); + printStr += eventItem->getValue(); + printStr += "\""; + } + else if (printStr.indexOf("_val") > 0) + { + printStr += eventItem->getValue(); + printStr.replace(".", ""); + printStr.replace("_val", ".val="); + } + else + { + if (indexOf_ == printStr.length() - 1) + printStr.replace("_", ""); + else + printStr.replace("_", "."); + printStr += "="; + printStr += eventItem->getValue(); + } - uartPrintFFF(convertRUS(printStr)); + uartPrintFFF(convertRUS(printStr)); } - -//---------------------NEXTION-UART---END------------------------ -//---------------------NEXTION-UPDATE---START------------------------ + //---------------------NEXTION-UART---END------------------------ + + //---------------------NEXTION-UPDATE---START------------------------ void updateServer() { - SerialPrint("I", F("NextionUpdate"), "Update .... "); + SerialPrint("I", F("NextionUpdate"), "Update .... "); - if (!updated) - { - SerialPrint("I", F("NextionUpdate"), "connecting to " + (String)_host); - HTTPClient http; + if (!updated) + { + SerialPrint("I", F("NextionUpdate"), "connecting to " + (String)_host); + HTTPClient http; #if defined ESP8266 - if (!http.begin(_host, 80, _url)) - SerialPrint("I", F("NextionUpdate"), "connection failed "); + if (!http.begin(_host, 80, _url)) + SerialPrint("I", F("NextionUpdate"), "connection failed "); #elif defined ESP32 - if (!http.begin(String("http://") + _host + _url)) - SerialPrint("I", F("NextionUpdate"), "connection failed "); + if (!http.begin(String("http://") + _host + _url)) + SerialPrint("I", F("NextionUpdate"), "connection failed "); #endif - SerialPrint("I", F("NextionUpdate"), "Requesting file: " + (String)_url); - int code = http.GET(); - // Update the nextion display - if (code == 200) - flashNextion(http); - else - SerialPrint("I", F("NextionUpdate"), "HTTP error: " + (String)http.errorToString(code).c_str()); + SerialPrint("I", F("NextionUpdate"), "Requesting file: " + (String)_url); + int code = http.GET(); + // Update the nextion display + if (code == 200) + flashNextion(http); + else + SerialPrint("I", F("NextionUpdate"), "HTTP error: " + (String)http.errorToString(code).c_str()); - http.end(); - SerialPrint("I", F("NextionUpdate"), "Closing connection "); - } + http.end(); + SerialPrint("I", F("NextionUpdate"), "Closing connection "); + } } void uploadNextionTlgrm(String &url) @@ -245,14 +269,14 @@ class Nextion : public IoTUart HTTPClient http; -#ifdef ESP8266 - SerialPrint("I", F("NextionUpdate"), "Update impossible esp8266: Change boards to esp32 :)"); +#ifdef ESP8266 + SerialPrint("I", F("NextionUpdate"), "Update impossible esp8266: Change boards to esp32 :)"); return; -#else +#else if (!http.begin(url)) // пингуем файл SerialPrint("I", F("NextionUpdate"), "connection failed "); #endif - SerialPrint("I", F("NextionUpdate"), "Requesting file: OK" ); + SerialPrint("I", F("NextionUpdate"), "Requesting file: OK"); int code = http.GET(); // Update the nextion display if (code == 200) @@ -260,7 +284,7 @@ class Nextion : public IoTUart else SerialPrint("I", F("NextionUpdate"), "HTTP error: " + (String)http.errorToString(code).c_str()); - http.end(); + //http.end(); SerialPrint("I", F("NextionUpdate"), "Closing connection "); } } @@ -271,10 +295,10 @@ class Nextion : public IoTUart SerialPrint("I", F("NextionUpdate"), "File received. Update Nextion... "); bool result; ESPNexUpload nexUp(_line, _speed, (gpio_num_t)_tx, (gpio_num_t)_rx); - // nexUp.setUpdateProgressCallback([]() - // { SerialPrint("I", F("NextionUpdate"), "... "); }); + // nexUp.setUpdateProgressCallback([]() + // { SerialPrint("I", F("NextionUpdate"), "... "); }); - result = nexUp.prepareUpload(contentLength, _protv2); + result = nexUp.prepareUpload(contentLength, _oldProt); if (!result) { SerialPrint("I", F("NextionUpdate"), "Error Connect in prepare upload"); @@ -288,19 +312,39 @@ class Nextion : public IoTUart { SerialPrint("I", F("NextionUpdate"), "Succesfully updated Nextion! "); + if (tlgrmItem) + tlgrmItem->sendTelegramMsg(false, String("NextionUpdate: Succesfully updated Nextion!")); } else { - SerialPrint("I", F("NextionUpdate"), "Error updating Nextion" ); + SerialPrint("I", F("NextionUpdate"), "Error updating Nextion!"); + if (tlgrmItem) + tlgrmItem->sendTelegramMsg(false, String("NextionUpdate: Error updating Nextion!")); } nexUp.end(); + +#ifdef ESP8266 + _myUART->begin(_speed); +#endif +#ifdef ESP32 + if (_line >= 0) + { + //_myUART = new HardwareSerial(_line); + ((HardwareSerial *)_myUART)->updateBaudRate(_speed); + } + else + { + //_myUART = new SoftwareSerial(_rx, _tx); + ((SoftwareSerial *)_myUART)->begin(_speed); + } +#endif + updated = false; } } -//---------------------NEXTION-UPDATE---END------------------------ + //---------------------NEXTION-UPDATE---END------------------------ ~Nextion(){}; - }; void *getAPI_Nextion(String subtype, String param) diff --git a/src/modules/display/Nextion/modinfo.json b/src/modules/display/Nextion/modinfo.json index 05aa73df..f473471c 100644 --- a/src/modules/display/Nextion/modinfo.json +++ b/src/modules/display/Nextion/modinfo.json @@ -17,8 +17,8 @@ "rx": 16, "line": 2, "speed": 9600, - "protv2": 1, - "uploadTelegram": 1 + "uploadTelegram": 1, + "oldProt_v11": 0 } ], "about": { @@ -41,8 +41,8 @@ "line": "Актуально только для ESP32: номер линии hardUART. =2 rx=16 tx=17, для SoftwarwSerial в ESP32 line = -1", "host": "Сервер обновления. Можно использовать LiveServer из VisualCode, указывать ip адрес", "url": "файл прошивки экрана, указывать с расширением, например nextion.tft или iotm/test.tft", - "protv2": "1-использует быстрый протоколо прошивки v1.2, 0-использует оффициальный протокол прошивки", "uploadTelegram": "1 - разрешает прошивать экран через модуль Telegram_v2", + "oldProt_v11": "0 - По умолчанию используется более быстрый протокол версии 1.2 (не официальный), 1 - Использовать старый протокол версии 1.1 для прошивки экрана.", "btn-uploadServer": "Кнопка загрузки прошивки с сервера LiveServer или другого по ip" }, "funcInfo": [ diff --git a/src/modules/display/NextionUpload/NextionUpload.cpp b/src/modules/display/NextionUpload/NextionUpload.cpp index b8745217..f2db9474 100644 --- a/src/modules/display/NextionUpload/NextionUpload.cpp +++ b/src/modules/display/NextionUpload/NextionUpload.cpp @@ -42,8 +42,7 @@ class NextionUpload : public IoTItem HTTPClient http; #if defined ESP8266 - WiFiClient client; - if (!http.begin(client, _host, 80, _url)) + if (!http.begin(_host, 80, _url)) { // Serial.println("connection failed"); SerialPrint("I", F("NextionUpdate"), "connection failed "); @@ -119,13 +118,7 @@ class NextionUpload : public IoTItem int contentLength = http.getSize(); SerialPrint("I", F("NextionUpdate"), "File received. Update Nextion... "); bool result; - #ifdef ESP8266 - ESPNexUpload nextion(115200, -1, _NEXT_RX, _NEXT_TX); - #elif defined(esp32c3m_4mb) || defined(esp32s2_4mb) - ESPNexUpload nextion(115200, 1, _NEXT_RX, _NEXT_TX); - #else - ESPNexUpload nextion(115200, 2, _NEXT_RX, _NEXT_TX); - #endif + ESPNexUpload nextion(115200, _NEXT_RX, _NEXT_TX); nextion.setUpdateProgressCallback([]() { SerialPrint("I", F("NextionUpdate"), "... "); }); diff --git a/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp b/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp index 1c6201c8..1523d0c0 100644 --- a/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp +++ b/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp @@ -125,8 +125,6 @@ namespace _Broker } } - bool _debug; - class BrokerMQTT : public IoTItem { private: @@ -134,7 +132,7 @@ namespace _Broker int _port = 0; String _user; String _pass; - //bool _debug; + bool _debug; bool _brige; String _server; String _srvUser; diff --git a/src/modules/exec/Telegram_v2/Telegram_v2.cpp b/src/modules/exec/Telegram_v2/Telegram_v2.cpp index 2581471e..9e061424 100644 --- a/src/modules/exec/Telegram_v2/Telegram_v2.cpp +++ b/src/modules/exec/Telegram_v2/Telegram_v2.cpp @@ -11,6 +11,7 @@ #ifdef ESP8266 #define FB_DYNAMIC #endif + #include #include @@ -94,8 +95,8 @@ class Telegram_v2 : public IoTItem _myBot->tick(); if (fl_rollback) { - _myBot->tickManual(); // Чтобы отметить сообщение прочитанным #ifdef ESP32 + _myBot->tickManual(); // Чтобы отметить сообщение прочитанным if (Update.rollBack()) { SerialPrint("I", F("Update"), F("Откат OTA успешно выполнен")); @@ -107,6 +108,9 @@ class Telegram_v2 : public IoTItem SerialPrint("E", F("Update"), F("Откат OTA не выполнен!")); _myBot->sendMessage("Откат OTA не выполнен!", _chatID); } +#else + SerialPrint("I", F("Update"), F("Откат OTA только в ESP32")); + _myBot->sendMessage("Откат OTA поддерживается только в ESP32", _chatID); #endif } // была попытка OTA обновления. Обновляемся после ответа серверу! From b32abb5a28c9cfcf9c677ec62f1a4e0116cdcd97 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 20 Sep 2024 12:19:15 +0300 Subject: [PATCH 005/118] Discovery HA and HomeD --- include/Global.h | 16 + include/classes/IoTDiscovery.h | 36 +++ include/classes/IoTItem.h | 2 + src/ESPConfiguration.cpp | 14 +- src/Global.cpp | 5 + src/MqttClient.cpp | 111 ++++--- src/classes/IoTDiscovery.cpp | 32 ++ src/classes/IoTItem.cpp | 8 + .../virtual/DiscoveryHA/DiscoveryHA.cpp | 242 +++++++++++++++ src/modules/virtual/DiscoveryHA/modinfo.json | 39 +++ .../virtual/DiscoveryHomeD/DiscoveryHomeD.cpp | 277 ++++++++++++++++++ .../virtual/DiscoveryHomeD/modinfo.json | 39 +++ 12 files changed, 782 insertions(+), 39 deletions(-) create mode 100644 include/classes/IoTDiscovery.h create mode 100644 src/classes/IoTDiscovery.cpp create mode 100644 src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp create mode 100644 src/modules/virtual/DiscoveryHA/modinfo.json create mode 100644 src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp create mode 100644 src/modules/virtual/DiscoveryHomeD/modinfo.json diff --git a/include/Global.h b/include/Global.h index f748a4ba..8053cf7e 100644 --- a/include/Global.h +++ b/include/Global.h @@ -9,6 +9,15 @@ #include #include +#ifdef libretiny +#include +#include +#ifdef STANDARD_WEB_SERVER +#include +#endif +#include +#endif + #ifdef ESP32 #include "WiFi.h" #include @@ -22,6 +31,7 @@ #ifdef ASYNC_WEB_SERVER #include +#include "AsyncWebServer.h" #endif #ifdef STANDARD_WEB_SERVER @@ -60,6 +70,9 @@ extern IoTItem* rtcItem; extern IoTItem* tlgrmItem; extern IoTBench* benchLoadItem; extern IoTBench* benchTaskItem; +extern IoTDiscovery* HADiscovery; +extern IoTDiscovery* HOMEdDiscovery; + extern TickerScheduler ts; extern WiFiClient espClient; @@ -77,6 +90,9 @@ extern ESP8266HTTPUpdateServer httpUpdater; #ifdef ESP32 extern WebServer HTTP; #endif +#ifdef libretiny +extern WebServer HTTP; +#endif #endif #ifdef STANDARD_WEB_SOCKETS diff --git a/include/classes/IoTDiscovery.h b/include/classes/IoTDiscovery.h new file mode 100644 index 00000000..f8c9610a --- /dev/null +++ b/include/classes/IoTDiscovery.h @@ -0,0 +1,36 @@ +#pragma once +#include +#include "Global.h" +#include "classes/IoTItem.h" + +class IoTDiscovery : public IoTItem +{ +public: + IoTDiscovery(const String ¶meters); + ~IoTDiscovery(); + +// inline bool isDiscoveryHomed() { return HOMEd; } + +// inline bool isDiscoveryHA() { return HA; } + + String HOMEdTopic = ""; + String HATopic = ""; + //String ChipId = ""; + + virtual void mqttSubscribeDiscovery(); + + virtual void publishStatusHOMEd(const String &topic, const String &data); + + + +protected: + boolean publishRetain(const String &topic, const String &data); + virtual void getlayoutHA(); + virtual void deleteFromHOMEd(); + virtual void getlayoutHOMEd(); + + //bool HOMEd = false; + //bool HA = false; + //String HOMEdTopic; + +}; \ No newline at end of file diff --git a/include/classes/IoTItem.h b/include/classes/IoTItem.h index cfdb33e2..23b63644 100644 --- a/include/classes/IoTItem.h +++ b/include/classes/IoTItem.h @@ -59,6 +59,8 @@ class IoTItem { //virtual IoTBench* getBenchmark(); virtual IoTBench*getBenchmarkTask(); virtual IoTBench*getBenchmarkLoad(); + virtual IoTBench*getHADiscovery(); + virtual IoTBench*getHOMEdDiscovery(); virtual unsigned long getRtcUnixTime(); // делаем доступным модулям отправку сообщений в телеграм diff --git a/src/ESPConfiguration.cpp b/src/ESPConfiguration.cpp index fa15b2a1..5f11b6ba 100644 --- a/src/ESPConfiguration.cpp +++ b/src/ESPConfiguration.cpp @@ -8,6 +8,10 @@ void* getAPI(String subtype, String params); void configure(String path) { File file = seekFile(path); + if (!file) { + SerialPrint(F("E"), F("FS"), F("configure file open error")); + return; + } file.find("["); while (file.available()) { String jsonArrayElement = file.readStringUntil('}') + "}"; @@ -36,6 +40,9 @@ void configure(String path) { // пробуем спросить драйвер Benchmark if (driver = myIoTItem->getBenchmarkTask()) benchTaskItem = ((IoTBench*)driver); if (driver = myIoTItem->getBenchmarkLoad()) benchLoadItem = ((IoTBench*)driver); + // пробуем спросить драйвер для интеграций + if (driver = myIoTItem->getHOMEdDiscovery()) HOMEdDiscovery = ((IoTDiscovery*)driver); + if (driver = myIoTItem->getHADiscovery()) HADiscovery = ((IoTDiscovery*)driver); // пробуем спросить драйвер Telegram_v2 if (driver = myIoTItem->getTlgrmDriver()) tlgrmItem = (IoTItem*)driver; IoTItems.push_back(myIoTItem); @@ -59,8 +66,13 @@ void clearConfigure() { if (*it) delete *it; } IoTItems.clear(); - +#ifdef libretiny + valuesFlashJson.remove(0, valuesFlashJson.length()); +#else valuesFlashJson.clear(); +#endif benchTaskItem = nullptr; benchLoadItem = nullptr; + HOMEdDiscovery = nullptr; + HADiscovery = nullptr; } \ No newline at end of file diff --git a/src/Global.cpp b/src/Global.cpp index 7f6fe4d1..6fe4dfcd 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -20,6 +20,9 @@ ESP8266WebServer HTTP(80); #ifdef ESP32 WebServer HTTP(80); #endif +#ifdef libretiny +WebServer HTTP(80); +#endif #endif #ifdef STANDARD_WEB_SOCKETS @@ -35,6 +38,8 @@ IoTItem* rtcItem = nullptr; IoTItem* tlgrmItem = nullptr; IoTBench* benchTaskItem = nullptr; IoTBench* benchLoadItem = nullptr; +IoTDiscovery* HOMEdDiscovery = nullptr; +IoTDiscovery* HADiscovery = nullptr; String settingsFlashJson = "{}"; // переменная в которой хранятся все настройки, находится в оперативной памяти и синхронизированна с flash памятью String valuesFlashJson = "{}"; // переменная в которой хранятся все значения элементов, которые необходимо сохранить на flash. Находится в оперативной памяти и синхронизированна с flash памятью String errorsHeapJson = "{}"; // переменная в которой хранятся все ошибки, находится в оперативной памяти только diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index 727473ad..a2b31747 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -1,4 +1,5 @@ #include "MqttClient.h" +#include "classes/IoTDiscovery.h" void mqttInit() { mqtt.setCallback(mqttCallback); @@ -59,10 +60,24 @@ boolean mqttConnect() { if (!mqtt.connected()) { bool connected = false; if (mqttUser != "" && mqttPass != "") { - connected = mqtt.connect(chipId.c_str(), mqttUser.c_str(), mqttPass.c_str()); + if (HOMEdDiscovery) + { + connected = mqtt.connect(chipId.c_str(), mqttUser.c_str(), mqttPass.c_str(), (HOMEdDiscovery->HOMEdTopic + "/device/custom/" + chipId).c_str(), 1, true, "{\"status\":\"offline\"}"); + } + else + { + connected = mqtt.connect(chipId.c_str(), mqttUser.c_str(), mqttPass.c_str(), (mqttRootDevice + "/state").c_str(), 1, true, "{\"status\":\"offline\"}"); + } SerialPrint("i", F("MQTT"), F("Go to connection with login and password")); } else if (mqttUser == "" && mqttPass == "") { - connected = mqtt.connect(chipId.c_str()); + if (HOMEdDiscovery) + { + connected = mqtt.connect(chipId.c_str(), (HOMEdDiscovery->HOMEdTopic + "/device/custom/" + chipId).c_str(), 1, true, "{\"status\":\"offline\"}"); + } + else + { + connected = mqtt.connect(chipId.c_str(), (mqttRootDevice + "/state").c_str(), 1, true, "{\"status\":\"offline\"}"); + } SerialPrint("i", F("MQTT"), F("Go to connection without login and password")); } else { SerialPrint("E", F("MQTT"), F("✖ Login or password missed")); @@ -129,17 +144,33 @@ void mqttSubscribe() { } } } + if(HOMEdDiscovery) + HOMEdDiscovery->mqttSubscribeDiscovery(); + if(HADiscovery) + HADiscovery->mqttSubscribeDiscovery(); + // оттправляем все статусы + if(HOMEdDiscovery || HADiscovery) + { + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) + { + if ((*it)->iAmLocal) + { + publishStatusMqtt((*it)->getID(), (*it)->getValue()); + (*it)->onMqttWsAppConnectEvent(); + } + } + } } void mqttSubscribeExternal(String topic, bool usePrefix) { - // SerialPrint("i", F("MQTT"), mqttRootDevice); - String _sb_topic = topic; - if (usePrefix) - { - _sb_topic = mqttPrefix + "/" + topic; - } - mqtt.subscribe(_sb_topic.c_str()); + // SerialPrint("i", F("MQTT"), mqttRootDevice); + String _sb_topic = topic; + if (usePrefix) + { + _sb_topic = mqttPrefix + "/" + topic; + } + mqtt.subscribe(_sb_topic.c_str()); SerialPrint("i", F("MQTT"), ("subscribed external " + _sb_topic).c_str()); } @@ -253,6 +284,10 @@ boolean publishChartMqtt(const String& topic, const String& data) { } boolean publishStatusMqtt(const String& topic, const String& data) { + if (HOMEdDiscovery) + { + HOMEdDiscovery->publishStatusHOMEd(topic, data); + } String path = mqttRootDevice + "/" + topic + "/status"; String json = "{}"; jsonWriteStr(json, "status", data); @@ -322,47 +357,47 @@ void handleMqttStatus(bool send, int state) { const String getStateStr(int e) { switch (e) { case -4: // Нет ответа от сервера - return F("e1"); - break; + return F("e1"); + break; case -3: // Соединение было разорвано - return F("e2"); - break; + return F("e2"); + break; case -2: // Ошибка соединения. Обычно возникает когда неверно указано название сервера MQTT - return F("e3"); - break; + return F("e3"); + break; case -1: // Клиент был отключен - return F("e4"); - break; + return F("e4"); + break; case 0: // подключено - return F("e5"); - break; + return F("e5"); + break; case 1: // Ошибка версии - return F("e6"); - break; + return F("e6"); + break; case 2: // Отклонен идентификатор - return F("e7"); - break; + return F("e7"); + break; case 3: // Не могу установить соединение - return F("e8"); - break; + return F("e8"); + break; case 4: // Неправильное имя пользователя/пароль - return F("e9"); - break; + return F("e9"); + break; case 5: // Не авторизован для подключения - return F("e10"); - break; + return F("e10"); + break; case 6: // Название сервера пустое - return F("e11"); - break; + return F("e11"); + break; case 7: // Имя пользователя или пароль пустые - return F("e12"); - break; + return F("e12"); + break; case 8: // Подключение в процессе - return F("e13"); - break; - default: - return F("unk"); - break; + return F("e13"); + break; + default: + return F("unk"); + break; } } diff --git a/src/classes/IoTDiscovery.cpp b/src/classes/IoTDiscovery.cpp new file mode 100644 index 00000000..734bb560 --- /dev/null +++ b/src/classes/IoTDiscovery.cpp @@ -0,0 +1,32 @@ +#include "Global.h" +#include "classes/IoTDiscovery.h" +#include "IoTDiscovery.h" + +IoTDiscovery::IoTDiscovery(const String ¶meters) : IoTItem(parameters) +{ + /* int _tx, _rx, _speed, _line; + jsonRead(parameters, "rx", _rx); + jsonRead(parameters, "tx", _tx); + jsonRead(parameters, "speed", _speed); + jsonRead(parameters, "line", _line); + */ + //ChipId = getChipId(); +} + +void IoTDiscovery::publishStatusHOMEd(const String &topic, const String &data) {} +void IoTDiscovery::getlayoutHA() {} +void IoTDiscovery::getlayoutHOMEd() {} +void IoTDiscovery::deleteFromHOMEd() {} +void IoTDiscovery::mqttSubscribeDiscovery(){} + +boolean IoTDiscovery::publishRetain(const String &topic, const String &data) +{ + if (mqtt.beginPublish(topic.c_str(), data.length(), true)) + { + mqtt.print(data); + return mqtt.endPublish(); + } + return false; +} + +IoTDiscovery::~IoTDiscovery() {} diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index fd078a6f..b6cb26d5 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -258,6 +258,14 @@ IoTBench *IoTItem::getBenchmarkLoad() { return nullptr; } +IoTBench *IoTItem::getHOMEdDiscovery() +{ + return nullptr; +} +IoTBench *IoTItem::getHADiscovery() +{ + return nullptr; +} unsigned long IoTItem::getRtcUnixTime() { return 0; diff --git a/src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp b/src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp new file mode 100644 index 00000000..ff3b571c --- /dev/null +++ b/src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp @@ -0,0 +1,242 @@ +#include "Global.h" +#include "classes/IoTDiscovery.h" + +class DiscoveryHA : public IoTDiscovery +{ +private: + String _topic = ""; + bool sendOk = false; + // bool topicOk = false; + bool HA = false; +public: + DiscoveryHA(String parameters) : IoTDiscovery(parameters) + { + _topic = jsonReadStr(parameters, "topic"); + if (_topic && _topic != "" && _topic != "null") + { + HA = true; + HATopic = _topic; + } + if (mqttIsConnect() && HA) + { +#if defined ESP32 +// пре реконнекте вызывается отправка всех виджетов из файла layout.json в HA +// на ESP8266 мало оперативки и это можно делать только до момента конфигурации +// mqttReconnect(); +#endif + // sendOk = true; + // mqttSubscribeExternal(_topic); + } + } +/* + void onMqttRecive(String &topic, String &msg) + { + if (!HA) + return; + + if (msg.indexOf("HELLO") == -1) + { + String dev = selectToMarkerLast(topic, "/"); + dev.toUpperCase(); + dev.replace(":", ""); + if (_topic != topic) + { + // SerialPrint("i", "ExternalMQTT", _id + " not equal: " + topic + " msg: " + msg); + return; + } + // обработка топика, на который подписались + } + } */ + + void doByInterval() + { + /* // периодически проверяем связь с MQTT брокером и если она появилась, то подписываемся на нужный топик + if (mqttIsConnect() && !sendOk && &&topicOk) + { + sendOk = true; + getlayoutHA(); + publishRetain(mqttRootDevice + "/state", "{\"status\":\"online\"}"); + //mqttSubscribeExternal(_topic); + } + + // если нет коннектас брокером, то сбрасываем флаг подписки, что бы при реконекте заново подписаться + if (!mqttIsConnect()) + sendOk = false; */ + } + /* String getMqttExterSub() + { + return _topic; + } */ + + void mqttSubscribeDiscovery() + { + if (HA) + { + getlayoutHA(); + publishRetain(mqttRootDevice + "/state", "{\"status\":\"online\"}"); + } + } + + void getlayoutHA() + { + if (HA) + { + auto file = seekFile("layout.json"); + if (!file) + { + SerialPrint("E", F("MQTT"), F("no file layout.json")); + return; + } + size_t size = file.size(); + DynamicJsonDocument doc(size * 2); + DeserializationError error = deserializeJson(doc, file); + if (error) + { + SerialPrint("E", F("MQTT"), error.f_str()); + jsonWriteInt(errorsHeapJson, F("jse3"), 1); // Ошибка чтения json файла с виджетами при отправки в mqtt + } + int i = 0; + // String path = jsonReadStr(settingsFlashJson, F("HomeAssistant")); + JsonArray arr = doc.as(); + for (JsonVariant value : arr) + { + String dev = selectToMarkerLast(value["topic"].as(), "/"); + dev.replace(":", ""); + String HAjson = ""; + HAjson = "{\"availability\":[{\"topic\": \"" + mqttRootDevice + "/state\",\"value_template\": \"{{ value_json.status }}\"}],\"availability_mode\": \"any\","; + HAjson = HAjson + " \"device\": {\"identifiers\": [\"" + value["page"].as() + "\"],"; + HAjson = HAjson + " \"name\": \" " + value["page"].as() + "\"},"; + HAjson = HAjson + " \"name\": \"" + value["descr"].as() + "\","; + HAjson = HAjson + " \"state_topic\": \"" + value["topic"].as() + "/status\","; + HAjson = HAjson + " \"icon\": \"hass:none\","; + + // сенсоры + if (value["name"].as() == "anydataTmp") + { + HAjson = HAjson + " \"value_template\": \"{{ float( value_json.status, default = 0) | default }}\","; + HAjson = HAjson + " \"unique_id\": \"" + dev + "\","; + HAjson = HAjson + " \"state_class\": \"measurement\","; + HAjson = HAjson + " \"unit_of_measurement\": \"°C\""; + } + else if (value["name"].as() == "anydataHum") + { + HAjson = HAjson + " \"value_template\": \"{{ float( value_json.status, default = 0) | default }}\","; + HAjson = HAjson + " \"unique_id\": \"" + dev + "\","; + HAjson = HAjson + " \"state_class\": \"measurement\","; + HAjson = HAjson + " \"unit_of_measurement\": \"%\""; + } + // ввод числа + else if (value["name"].as() == "inputDgt") + { + HAjson = HAjson + " \"value_template\": \"{{ float( value_json.status, default = 0) | default }}\","; + HAjson = HAjson + " \"unique_id\": \"" + dev + "\","; + HAjson = HAjson + " \"command_topic\": \"" + value["topic"].as() + "/control\","; + HAjson = HAjson + " \"mode\": \"box\","; + HAjson = HAjson + " \"min\": " + -1000000 + ","; + HAjson = HAjson + " \"max\": " + 1000000 + ""; + } + // ввод текста inputTxt + else if (value["name"].as() == "inputTxt") + { + HAjson = HAjson + " \"value_template\": \"{{ value_json.status | default }}\","; + HAjson = HAjson + " \"unique_id\": \"" + dev + "\","; + HAjson = HAjson + " \"command_topic\": \"" + value["topic"].as() + "/control\""; + } + // переключатель + else if (value["name"].as() == "toggle") + { + HAjson = HAjson + " \"value_template\": \"{{ value_json.status | default }}\","; + HAjson = HAjson + " \"unique_id\": \"" + dev + "\","; + HAjson = HAjson + " \"command_topic\": \"" + value["topic"].as() + "/control\","; + HAjson = HAjson + " \"device_class\": \"switch\","; + HAjson = HAjson + " \"payload_off\": " + 0 + ","; + HAjson = HAjson + " \"payload_on\": " + 1 + ","; + HAjson = HAjson + " \"state_off\": " + 0 + ","; + HAjson = HAjson + " \"state_on\": " + 1 + ""; + } + else + { + HAjson = HAjson + " \"value_template\": \"{{ value_json.status | default }}\","; + HAjson = HAjson + " \"unique_id\": \"" + dev + "\""; + } + + HAjson = HAjson + " }"; + // "has_entity_name" : false, + + // SerialPrint("E", F("MQTT"), HAjson); + // текст + if (value["widget"].as() == "anydata") + { + + if (!publishRetain(HATopic + "/sensor/" + chipId + "/" + dev + "/config", HAjson)) + { + SerialPrint("E", F("MQTT"), F("Failed publish data to homeassitant")); + } + } + + // ввод числа + if (value["name"].as() == "inputDgt") + { + + if (!publishRetain(HATopic + "/number/" + chipId + "/" + dev + "/config", HAjson)) + { + SerialPrint("E", F("MQTT"), F("Failed publish data to homeassitant")); + } + } + // ввод текста inputTxt + if (value["name"].as() == "inputTxt") + { + + if (!publishRetain(HATopic + "/text/" + chipId + "/" + dev + "/config", HAjson)) + { + SerialPrint("E", F("MQTT"), F("Failed publish data to homeassitant")); + } + } + // переключатель + if (value["name"].as() == "toggle") + { + + if (!publishRetain(HATopic + "/switch/" + chipId + "/" + dev + "/config", HAjson)) + { + SerialPrint("E", F("MQTT"), F("Failed publish data to homeassitant")); + } + } + + i++; + } + file.close(); + + publishRetain(mqttRootDevice + "/state", "{\"status\":\"online\"}"); + + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) + { + if ((*it)->iAmLocal) + { + publishStatusMqtt((*it)->getID(), (*it)->getValue()); + (*it)->onMqttWsAppConnectEvent(); + } + } + } + } + + IoTDiscovery *getBenchmarkTask() + { + if (HA) + return this; + else + return nullptr; + } + ~DiscoveryHA(){}; +}; + +void *getAPI_DiscoveryHA(String subtype, String param) +{ + if (subtype == F("DiscoveryHA")) + { + return new DiscoveryHA(param); + } + else + { + return nullptr; + } +} diff --git a/src/modules/virtual/DiscoveryHA/modinfo.json b/src/modules/virtual/DiscoveryHA/modinfo.json new file mode 100644 index 00000000..cf71635f --- /dev/null +++ b/src/modules/virtual/DiscoveryHA/modinfo.json @@ -0,0 +1,39 @@ +{ + "menuSection": "virtual", + "configItem": [ + { + "global": 0, + "name": "Discovery of HA", + "type": "Reading", + "subtype": "DiscoveryHA", + "id": "ha", + "widget": "", + "page": "", + "descr": "", + "topic": "homeassistant" + } + ], + "about": { + "authorName": "Bubnov Mikhail", + "authorContact": "https://t.me/Mit4bmw", + "authorGit": "https://github.com/Mit4el", + "specialThanks": "@AVAKS", + "moduleName": "DiscoveryHA", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "DiscoveryHA", + "moduleDesc": "Модуль проброса данных в MQTT для HomeAssistant", + "propInfo": { + "topic":"Топик HomeAssistant" + } + + }, + "defActive": false, + "usedLibs": { + "esp32*": [], + "esp82*": [] + } +} \ No newline at end of file diff --git a/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp b/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp new file mode 100644 index 00000000..07088ba6 --- /dev/null +++ b/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp @@ -0,0 +1,277 @@ +#include "Global.h" +#include "classes/IoTDiscovery.h" +// #include "MqttDiscovery.h" +class DiscoveryHomeD : public IoTDiscovery +{ +private: + String _topic = ""; + bool sendOk = false; + // bool topicOk = false; + bool HOMEd = false; + +public: + DiscoveryHomeD(String parameters) : IoTDiscovery(parameters) + { + _topic = jsonReadStr(parameters, "topic"); + if (_topic && _topic != "" && _topic != "null") + { + HOMEd = true; + HOMEdTopic = _topic; + } + if (mqttIsConnect() && HOMEd) + { + mqttReconnect(); + // sendOk = true; + // mqttSubscribeExternal(_topic); + } + } + + void onMqttRecive(String &topic, String &payloadStr) + { + if (!HOMEd) + return; + + if (msg.indexOf("HELLO") == -1) + { +/* String dev = selectToMarkerLast(topic, "/"); + dev.toUpperCase(); + dev.replace(":", ""); + if (_topic != topic) + { + // SerialPrint("i", "ExternalMQTT", _id + " not equal: " + topic + " msg: " + msg); + return; + } */ + // обработка топика, на который подписались + if (topic.indexOf(F("/td/custom")) != -1) + { + + // обрабатываем команды из HOMEd + StaticJsonDocument<200> doc; + deserializeJson(doc, payloadStr); + for (JsonPair kvp : doc.as()) + { + + String key = kvp.key().c_str(); + SerialPrint("i", F("=>MQTT"), "Msg from HOMEd: " + key); + String value = kvp.value().as(); + if (key.indexOf(F("status_")) != -1) + { + key.replace("status_", ""); + if (value == "on") + { + generateOrder(key, "1"); + } + else if (value == "off") + { + generateOrder(key, "0"); + } + else if (value == "toggle") + { + String val = (String)(1 - getItemValue(key).toInt()); + generateOrder(key, val); + } + } + + if (!value) + { + float val = kvp.value(); + generateOrder(key, (String)(val)); + } + } + + SerialPrint("i", F("=>MQTT"), "Msg from HOMEd: " + payloadStr); + } + } + } + + void doByInterval() + { + /* // периодически проверяем связь с MQTT брокером и если она появилась, то подписываемся на нужный топик + if (mqttIsConnect() && !sendOk && topicOk) + { + sendOk = true; + publishRetain(_topic + "/device/custom/" + chipId, "{\"status\":\"online\"}"); + String HOMEdsubscribeTopic = _topic + "/td/custom/" + chipId; + // mqtt.subscribe(HOMEdsubscribeTopic.c_str()); + mqttSubscribeExternal(HOMEdsubscribeTopic); + } + + // если нет коннектас брокером, то сбрасываем флаг подписки, что бы при реконекте заново подписаться + if (!mqttIsConnect()) + sendOk = false; */ + } + + void publishStatusHOMEd(const String &topic, const String &data) + { + String path_h = HOMEdTopic + "/fd/custom/" + chipId; + String json_h = "{}"; + if (topic != "onStart") + { + if (data.toInt() == 1) + { + jsonWriteStr(json_h, "status_" + topic, "on"); + } + else if (data.toInt() == 0) + { + jsonWriteStr(json_h, "status_" + topic, "off"); + } + if (data.toFloat()) + { + jsonWriteFloat(json_h, topic, data.toFloat()); + } + else + { + jsonWriteStr(json_h, topic, data); + } + mqtt.publish(path_h.c_str(), json_h.c_str(), false); + } + } + + void mqttSubscribeDiscovery() + { + if (HOMEd) + { + deleteFromHOMEd(); + getlayoutHOMEd(); + publishRetain(HOMEdTopic + "/device/custom/" + chipId, "{\"status\":\"online\"}"); + String HOMEdsubscribeTopic = HOMEdTopic + "/td/custom/" + chipId; + mqtt.subscribe(HOMEdsubscribeTopic.c_str()); + } + } + + void getlayoutHOMEd() + { + if (HOMEd) + { + String devName = jsonReadStr(settingsFlashJson, F("name")); + + auto file = seekFile("layout.json"); + if (!file) + { + SerialPrint("E", F("MQTT"), F("no file layout.json")); + return; + } + size_t size = file.size(); + DynamicJsonDocument doc(size * 2); + DeserializationError error = deserializeJson(doc, file); + if (error) + { + SerialPrint("E", F("MQTT"), error.f_str()); + jsonWriteInt(errorsHeapJson, F("jse3"), 1); // Ошибка чтения json файла с виджетами при отправки в mqtt + } + int i = 0; + // String path = jsonReadStr(settingsFlashJson, F("HOMEd")); + JsonArray arr = doc.as(); + String HOMEdJSON = ""; + HOMEdJSON = "{\"action\":\"updateDevice\","; + HOMEdJSON = HOMEdJSON + "\"device\":\"" + chipId + "\","; + HOMEdJSON = HOMEdJSON + "\"data\":{"; + HOMEdJSON = HOMEdJSON + "\"active\": true,"; + HOMEdJSON = HOMEdJSON + "\"cloud\": false,"; + HOMEdJSON = HOMEdJSON + "\"discovery\": false,"; + HOMEdJSON = HOMEdJSON + "\"id\":\"" + chipId + "\","; + HOMEdJSON = HOMEdJSON + "\"name\":\"" + devName + "\","; + HOMEdJSON = HOMEdJSON + "\"real\":true,"; + HOMEdJSON = HOMEdJSON + "\"exposes\": ["; + String options = ""; + for (JsonVariant value : arr) + { + String name = value["descr"]; + String device = selectToMarkerLast(value["topic"].as(), "/"); + String id = chipId + "-" + device; + String expose = value["name"]; + if (value["name"].as() == "toggle") + { + HOMEdJSON = HOMEdJSON + "\"switch_" + device + "\","; + } + else + { + HOMEdJSON = HOMEdJSON + "\"" + device + "\","; + } + + if (value["name"].as() == "anydataTmp") + { + // HOMEdJSON = HOMEdJSON + "\"temperature_" + device + "\","; + options = options + "\"" + device + "\":{\"type\": \"sensor\", \"class\": \"temperature\", \"state\": \"measurement\", \"unit\": \"°C\", \"round\": 1},"; + } + if (value["name"].as() == "anydataHum") + { + // HOMEdJSON = HOMEdJSON + "\"humidity_" + device + "\","; + options = options + "\"" + device + "\":{\"type\": \"sensor\", \"class\": \"humidity\", \"state\": \"measurement\", \"unit\": \"%\", \"round\": 1},"; + } + if (value["name"].as() == "inputDgt") + { + options = options + "\"" + device + "\":{\"type\": \"number\", \"min\": -10000, \"max\": 100000, \"step\": 0.1},"; + } + + i++; + } + options = options.substring(0, options.length() - 1); + HOMEdJSON = HOMEdJSON.substring(0, HOMEdJSON.length() - 1); + HOMEdJSON = HOMEdJSON + "],"; + HOMEdJSON = HOMEdJSON + " \"options\": {" + options + "}"; + HOMEdJSON = HOMEdJSON + "}}"; + String topic = (HOMEdTopic + "/command/custom").c_str(); + if (!publish(topic, HOMEdJSON)) + { + SerialPrint("E", F("MQTT"), F("Failed publish data to HOMEd")); + } + + file.close(); + + publishRetain(HOMEdTopic + "/device/custom/" + chipId, "{\"status\":\"online\"}"); + + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) + { + if ((*it)->iAmLocal) + { + publishStatusMqtt((*it)->getID(), (*it)->getValue()); + (*it)->onMqttWsAppConnectEvent(); + } + } + } + } + void deleteFromHOMEd() + { + if (HOMEd) + { + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) + { + if (*it) + { + String id_widget = (*it)->getID().c_str(); + String HOMEdjson = ""; + HOMEdjson = "{\"action\":\"removeDevice\","; + HOMEdjson = HOMEdjson + "\"device\":\""; + HOMEdjson = HOMEdjson + chipId; + HOMEdjson = HOMEdjson + "\"}"; + String topic = (HOMEdTopic + "/command/custom").c_str(); + if (!publish(topic, HOMEdjson)) + { + SerialPrint("E", F("MQTT"), F("Failed remove from HOMEd")); + } + } + } + } + } + IoTBench *getBenchmarkTask() + { + if (HOMEd) + return this; + else + return nullptr; + } + ~DiscoveryHomeD(){}; +}; + +void *getAPI_DiscoveryHomeD(String subtype, String param) +{ + if (subtype == F("DiscoveryHomeD")) + { + return new DiscoveryHomeD(param); + } + else + { + return nullptr; + } +} diff --git a/src/modules/virtual/DiscoveryHomeD/modinfo.json b/src/modules/virtual/DiscoveryHomeD/modinfo.json new file mode 100644 index 00000000..049d3507 --- /dev/null +++ b/src/modules/virtual/DiscoveryHomeD/modinfo.json @@ -0,0 +1,39 @@ +{ + "menuSection": "virtual", + "configItem": [ + { + "global": 0, + "name": "Discovery of HomeD", + "type": "Reading", + "subtype": "DiscoveryHomeD", + "id": "homed", + "widget": "", + "page": "", + "descr": "", + "topic": "homed" + } + ], + "about": { + "authorName": "Bubnov Mikhail", + "authorContact": "https://t.me/Mit4bmw", + "authorGit": "https://github.com/Mit4el", + "specialThanks": "@AVAKS", + "moduleName": "DiscoveryHomeD", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "DiscoveryHomeD", + "moduleDesc": "Модуль проброса данных в MQTT для HOMEd-Custom", + "propInfo": { + "topic":"Топик службы HOMEd-Custom, например /myRoom/homed" + } + + }, + "defActive": false, + "usedLibs": { + "esp32*": [], + "esp82*": [] + } +} \ No newline at end of file From 596eb9cad409692ecc60a3b6a68e4726a039ff8d Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 20 Sep 2024 12:45:17 +0300 Subject: [PATCH 006/118] libretiny --- include/Const.h | 9 +- include/DeviceList.h | 6 +- include/EspFileSystem.h | 12 + include/Global.h | 4 +- include/UpgradeFirm.h | 2 +- include/utils/WiFiUtils.h | 3 + lib/LT_WebSockets/.clang-format | 63 ++ lib/LT_WebSockets/.github/workflows/main.yml | 186 ++++ lib/LT_WebSockets/.gitignore | 37 + lib/LT_WebSockets/.piopm | 1 + lib/LT_WebSockets/.travis.yml | 45 + lib/LT_WebSockets/LICENSE | 502 +++++++++ lib/LT_WebSockets/README.md | 102 ++ .../Nginx/esp8266.ssl.reverse.proxy.conf | 83 ++ .../WebSocketClientAVR/WebSocketClientAVR.ino | 84 ++ .../esp32/WebSocketClient/WebSocketClient.ino | 110 ++ .../WebSocketClientSSL/WebSocketClientSSL.ino | 106 ++ .../WebSocketClientSocketIOack.ino | 155 +++ .../esp32/WebSocketServer/WebSocketServer.ino | 104 ++ .../WebSocketClient/WebSocketClient.ino | 106 ++ .../esp8266/WebSocketClientOTA/README.md | 27 + .../WebSocketClientOTA/WebSocketClientOTA.ino | 263 +++++ .../python_ota_server/main.py | 235 +++++ .../python_ota_server/requirements.txt | 2 + .../WebSocketClientSSL/WebSocketClientSSL.ino | 88 ++ .../WebSocketClientSSLWithCA.ino | 103 ++ .../WebSocketClientSocketIO.ino | 128 +++ .../WebSocketClientSocketIOack.ino | 165 +++ .../WebSocketClientStomp.ino | 149 +++ .../WebSocketClientStompOverSockJs.ino | 150 +++ .../WebSocketServer/WebSocketServer.ino | 86 ++ .../WebSocketServerAllFunctionsDemo.ino | 132 +++ .../WebSocketServerFragmentation.ino | 94 ++ .../WebSocketServerHooked.ino | 103 ++ .../esp8266/WebSocketServerHooked/emu | 20 + .../WebSocketServerHooked/ws-testclient.py | 45 + .../WebSocketServerHttpHeaderValidation.ino | 86 ++ .../WebSocketServer_LEDcontrol.ino | 121 +++ .../ParticleWebSocketClient/application.cpp | 46 + lib/LT_WebSockets/library.json | 25 + lib/LT_WebSockets/library.properties | 9 + lib/LT_WebSockets/src/SocketIOclient.cpp | 260 +++++ lib/LT_WebSockets/src/SocketIOclient.h | 105 ++ lib/LT_WebSockets/src/WebSockets.cpp | 776 ++++++++++++++ lib/LT_WebSockets/src/WebSockets.h | 379 +++++++ lib/LT_WebSockets/src/WebSockets4WebServer.h | 80 ++ lib/LT_WebSockets/src/WebSocketsClient.cpp | 980 ++++++++++++++++++ lib/LT_WebSockets/src/WebSocketsClient.h | 171 +++ lib/LT_WebSockets/src/WebSocketsServer.cpp | 966 +++++++++++++++++ lib/LT_WebSockets/src/WebSocketsServer.h | 244 +++++ lib/LT_WebSockets/src/WebSocketsVersion.h | 36 + lib/LT_WebSockets/travis/common.sh | 134 +++ lib/LT_WebSockets/travis/version.py | 132 +++ lib/TickerScheduler/TickerScheduler.cpp | 4 +- lib/TickerScheduler/TickerScheduler.h | 11 +- platformio.ini | 50 + src/DeviceList.cpp | 14 +- src/ESPConfiguration.cpp | 2 +- src/EspFileSystem.cpp | 16 +- src/Global.cpp | 2 +- src/Main.cpp | 7 +- src/NTP.cpp | 22 + src/PeriodicTasks.cpp | 5 + src/StandWebServer.cpp | 127 ++- src/UpgradeFirm.cpp | 4 + src/WsServer.cpp | 42 +- src/classes/IoTGpio.cpp | 20 +- src/classes/IoTScenario.cpp | 8 +- src/modules/sensors/BL0937/BL0937.cpp | 9 +- src/modules/sensors/BL0937/BL0937lib.cpp | 11 +- src/modules/virtual/Loging/Loging.cpp | 8 + .../virtual/LogingDaily/LogingDaily.cpp | 8 + src/modules/virtual/owmWeather/owmWeather.cpp | 2 +- src/utils/FileUtils.cpp | 12 +- src/utils/I2CUtils.cpp | 4 +- src/utils/Statistic.cpp | 4 + src/utils/WiFiUtils.cpp | 130 ++- tools/lt_fsbuildscript.py | 58 ++ 78 files changed, 8577 insertions(+), 63 deletions(-) create mode 100644 lib/LT_WebSockets/.clang-format create mode 100644 lib/LT_WebSockets/.github/workflows/main.yml create mode 100644 lib/LT_WebSockets/.gitignore create mode 100644 lib/LT_WebSockets/.piopm create mode 100644 lib/LT_WebSockets/.travis.yml create mode 100644 lib/LT_WebSockets/LICENSE create mode 100644 lib/LT_WebSockets/README.md create mode 100644 lib/LT_WebSockets/examples/Nginx/esp8266.ssl.reverse.proxy.conf create mode 100644 lib/LT_WebSockets/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino create mode 100644 lib/LT_WebSockets/examples/esp32/WebSocketClient/WebSocketClient.ino create mode 100644 lib/LT_WebSockets/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino create mode 100644 lib/LT_WebSockets/examples/esp32/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino create mode 100644 lib/LT_WebSockets/examples/esp32/WebSocketServer/WebSocketServer.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketClient/WebSocketClient.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/README.md create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/WebSocketClientOTA.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/python_ota_server/main.py create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/python_ota_server/requirements.txt create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketServer/WebSocketServer.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/WebSocketServerHooked.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/emu create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/ws-testclient.py create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino create mode 100644 lib/LT_WebSockets/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino create mode 100644 lib/LT_WebSockets/examples/particle/ParticleWebSocketClient/application.cpp create mode 100644 lib/LT_WebSockets/library.json create mode 100644 lib/LT_WebSockets/library.properties create mode 100644 lib/LT_WebSockets/src/SocketIOclient.cpp create mode 100644 lib/LT_WebSockets/src/SocketIOclient.h create mode 100644 lib/LT_WebSockets/src/WebSockets.cpp create mode 100644 lib/LT_WebSockets/src/WebSockets.h create mode 100644 lib/LT_WebSockets/src/WebSockets4WebServer.h create mode 100644 lib/LT_WebSockets/src/WebSocketsClient.cpp create mode 100644 lib/LT_WebSockets/src/WebSocketsClient.h create mode 100644 lib/LT_WebSockets/src/WebSocketsServer.cpp create mode 100644 lib/LT_WebSockets/src/WebSocketsServer.h create mode 100644 lib/LT_WebSockets/src/WebSocketsVersion.h create mode 100644 lib/LT_WebSockets/travis/common.sh create mode 100644 lib/LT_WebSockets/travis/version.py create mode 100644 tools/lt_fsbuildscript.py diff --git a/include/Const.h b/include/Const.h index 599de170..1be5c5b6 100644 --- a/include/Const.h +++ b/include/Const.h @@ -52,6 +52,10 @@ #define FIRMWARE_NAME "esp32s3_16mb" #endif +#ifdef LIBRETINY +#define FIRMWARE_NAME "libretiny" +#endif + // Размер буфера json #define JSON_BUFFER_SIZE 4096 // держим 2 кб не меняем @@ -72,8 +76,9 @@ WEB_SOCKETS_FRAME_SIZE создан для того что бы не загру #define STANDARD_WEB_SERVER #define STANDARD_WEB_SOCKETS +//#ifndef LIBRETINY #define UDP_ENABLED - +//#endif // #define REST_FILE_OPERATIONS #define MQTT_RECONNECT_INTERVAL 20000 @@ -94,7 +99,7 @@ enum TimerTask_t { TIME, TIME_SYNC, UPTIME, - UDP, // UDPP + UDPt, // UDPP TIMES, // периодические секундные проверки PTASK, ST, diff --git a/include/DeviceList.h b/include/DeviceList.h index 773492f9..c698f7e5 100644 --- a/include/DeviceList.h +++ b/include/DeviceList.h @@ -1,13 +1,15 @@ #pragma once #include "Global.h" -#ifdef ESP8266 +#if defined (ESP8266) || defined(LIBRETINY) // эта библиотека встроена в ядро #include "ESPAsyncUDP.h" -#else +#elif defined(ESP32) #include "AsyncUDP.h" #endif +#ifndef LIBRETINY extern AsyncUDP asyncUdp; +#endif extern const String getThisDevice(); extern void addThisDeviceToList(); diff --git a/include/EspFileSystem.h b/include/EspFileSystem.h index 078f0f8d..1d468a88 100644 --- a/include/EspFileSystem.h +++ b/include/EspFileSystem.h @@ -15,6 +15,18 @@ extern FS* filesystem; #endif #endif +#if defined(LIBRETINY) +#include + +#include "LittleFS.h" + +#define FileFS LittleFS +#define FS_NAME "LittleFS_LT" +#define FILE_READ "r" +#define FILE_WRITE "w" +#define FILE_APPEND "a" +#endif + #ifdef ESP8266 #if USE_LITTLEFS #include "LittleFS.h" diff --git a/include/Global.h b/include/Global.h index 8053cf7e..5823e68f 100644 --- a/include/Global.h +++ b/include/Global.h @@ -9,7 +9,7 @@ #include #include -#ifdef libretiny +#ifdef LIBRETINY #include #include #ifdef STANDARD_WEB_SERVER @@ -90,7 +90,7 @@ extern ESP8266HTTPUpdateServer httpUpdater; #ifdef ESP32 extern WebServer HTTP; #endif -#ifdef libretiny +#ifdef LIBRETINY extern WebServer HTTP; #endif #endif diff --git a/include/UpgradeFirm.h b/include/UpgradeFirm.h index c7b8d120..2c5c5c3f 100644 --- a/include/UpgradeFirm.h +++ b/include/UpgradeFirm.h @@ -3,7 +3,7 @@ // #include "Upgrade.h" #ifdef ESP8266 // #include "ESP8266.h" -#else +#elif ESP32 #include #endif diff --git a/include/utils/WiFiUtils.h b/include/utils/WiFiUtils.h index 28524211..593a39f1 100644 --- a/include/utils/WiFiUtils.h +++ b/include/utils/WiFiUtils.h @@ -9,3 +9,6 @@ bool startAPMode(); boolean RouterFind(std::vector jArray); uint8_t RSSIquality(); extern void wifiSignalInit(); +#ifdef LIBRETINY +String httpGetString(HTTPClient &http); +#endif \ No newline at end of file diff --git a/lib/LT_WebSockets/.clang-format b/lib/LT_WebSockets/.clang-format new file mode 100644 index 00000000..e72c54b1 --- /dev/null +++ b/lib/LT_WebSockets/.clang-format @@ -0,0 +1,63 @@ +--- +BasedOnStyle: Google +AccessModifierOffset: '-2' +AlignAfterOpenBracket: DontAlign +AlignConsecutiveAssignments: 'true' +AlignConsecutiveDeclarations: 'false' +AlignEscapedNewlines: Left +AlignTrailingComments: 'true' +AllowAllParametersOfDeclarationOnNextLine: 'false' +AllowShortBlocksOnASingleLine: 'false' +AllowShortCaseLabelsOnASingleLine: 'false' +AllowShortFunctionsOnASingleLine: InlineOnly +AllowShortIfStatementsOnASingleLine: 'true' +AllowShortLoopsOnASingleLine: 'true' +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: 'true' +AlwaysBreakTemplateDeclarations: 'false' +BinPackParameters: 'true' +BreakAfterJavaFieldAnnotations: 'false' +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeInheritanceComma: 'false' +BreakBeforeTernaryOperators: 'false' +BreakConstructorInitializers: BeforeColon +BreakStringLiterals: 'false' +ColumnLimit: '0' +CompactNamespaces: 'true' +ConstructorInitializerAllOnOneLineOrOnePerLine: 'true' +ConstructorInitializerIndentWidth: '4' +ContinuationIndentWidth: '4' +Cpp11BracedListStyle: 'false' +DerivePointerAlignment: 'false' +FixNamespaceComments: 'true' +IndentCaseLabels: 'true' +IndentWidth: '4' +IndentWrappedFunctionNames: 'false' +JavaScriptQuotes: Single +JavaScriptWrapImports: 'false' +KeepEmptyLinesAtTheStartOfBlocks: 'false' +MaxEmptyLinesToKeep: '1' +NamespaceIndentation: All +ObjCBlockIndentWidth: '4' +ObjCSpaceAfterProperty: 'false' +ObjCSpaceBeforeProtocolList: 'false' +PointerAlignment: Middle +SortIncludes: 'false' +SortUsingDeclarations: 'true' +SpaceAfterCStyleCast: 'false' +SpaceAfterTemplateKeyword: 'false' +SpaceBeforeAssignmentOperators: 'true' +SpaceBeforeParens: Never +SpaceInEmptyParentheses: 'false' +SpacesBeforeTrailingComments: '4' +SpacesInAngles: 'false' +SpacesInCStyleCastParentheses: 'false' +SpacesInContainerLiterals: 'false' +SpacesInParentheses: 'false' +SpacesInSquareBrackets: 'false' +TabWidth: '4' +UseTab: Never + +... diff --git a/lib/LT_WebSockets/.github/workflows/main.yml b/lib/LT_WebSockets/.github/workflows/main.yml new file mode 100644 index 00000000..d7bea656 --- /dev/null +++ b/lib/LT_WebSockets/.github/workflows/main.yml @@ -0,0 +1,186 @@ +name: CI +on: + schedule: + - cron: '0 0 * * 5' + push: + branches: [ master ] + pull_request: + branches: [ master ] + release: + types: [ published, created, edited ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + check_version_files: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: check version + run: | + $GITHUB_WORKSPACE/travis/version.py --check + + prepare_example_json: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: generate examples + id: set-matrix + run: | + source $GITHUB_WORKSPACE/travis/common.sh + cd $GITHUB_WORKSPACE + echo -en "::set-output name=matrix::" + echo -en "[" + + get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp8266 esp8266 1.8.19 esp8266com:esp8266:generic:xtal=80,dbg=Serial1 + echo -en "," + + get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp8266 esp8266 1.8.19 esp8266com:esp8266:generic:xtal=80,eesz=1M,FlashMode=qio,FlashFreq=80 + echo -en "," + + get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp32 esp32 1.8.19 espressif:esp32:esp32:FlashFreq=80 + + echo -en "]" + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + + prepare_ide: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + IDE_VERSION: [1.8.19] + env: + IDE_VERSION: ${{ matrix.IDE_VERSION }} + + steps: + - uses: actions/checkout@v2 + + - name: Get Date + id: get-date + run: | + echo "::set-output name=date::$(/bin/date -u "+%Y%m%d")" + shell: bash + + - uses: actions/cache@v2 + id: cache_all + with: + path: | + /home/runner/arduino_ide + /home/runner/Arduino + key: ${{ runner.os }}-${{ steps.get-date.outputs.date }}-${{ matrix.IDE_VERSION }} + + - name: download IDE + if: steps.cache_all.outputs.cache-hit != 'true' + run: | + wget http://downloads.arduino.cc/arduino-$IDE_VERSION-linux64.tar.xz -q + tar xf arduino-$IDE_VERSION-linux64.tar.xz + mv arduino-$IDE_VERSION $HOME/arduino_ide + + - name: download ArduinoJson + if: steps.cache_all.outputs.cache-hit != 'true' + run: | + mkdir -p $HOME/Arduino/libraries + wget https://github.com/bblanchon/ArduinoJson/archive/6.x.zip -q + unzip 6.x.zip + mv ArduinoJson-6.x $HOME/Arduino/libraries/ArduinoJson + + - name: download esp8266 + if: steps.cache_all.outputs.cache-hit != 'true' + run: | + source $GITHUB_WORKSPACE/travis/common.sh + get_core esp8266 + + - name: download esp32 + if: steps.cache_all.outputs.cache-hit != 'true' + run: | + source $GITHUB_WORKSPACE/travis/common.sh + get_core esp32 + + build: + needs: [prepare_ide, prepare_example_json] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: ${{ fromJson(needs.prepare_example_json.outputs.matrix) }} + env: + CPU: ${{ matrix.cpu }} + BOARD: ${{ matrix.board }} + IDE_VERSION: ${{ matrix.ideversion }} + SKETCH: ${{ matrix.sketch }} + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - uses: actions/checkout@v2 + + - name: install libgtk2.0-0 + run: | + sudo apt-get install -y libgtk2.0-0 + + - name: Get Date + id: get-date + run: | + echo "::set-output name=date::$(/bin/date -u "+%Y%m%d")" + shell: bash + + - uses: actions/cache@v2 + id: cache_all + with: + path: | + /home/runner/arduino_ide + /home/runner/Arduino + key: ${{ runner.os }}-${{ steps.get-date.outputs.date }}-${{ matrix.ideversion }} + + - name: install python serial + if: matrix.cpu == 'esp32' + run: | + sudo pip3 install pyserial + sudo pip install pyserial +# sudo apt install python-is-python3 + + - name: start DISPLAY + run: | + /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16 + export DISPLAY=:1.0 + sleep 3 + + - name: test IDE + run: | + export PATH="$HOME/arduino_ide:$PATH" + which arduino + + - name: copy code + run: | + mkdir -p $HOME/Arduino/libraries/ + cp -r $GITHUB_WORKSPACE $HOME/Arduino/libraries/arduinoWebSockets + + - name: config IDE + run: | + export DISPLAY=:1.0 + export PATH="$HOME/arduino_ide:$PATH" + arduino --board $BOARD --save-prefs + arduino --get-pref sketchbook.path + arduino --pref update.check=false + + - name: build example + timeout-minutes: 20 + run: | + set -ex + export DISPLAY=:1.0 + export PATH="$HOME/arduino_ide:$PATH" + source $GITHUB_WORKSPACE/travis/common.sh + cd $GITHUB_WORKSPACE + build_sketch arduino $SKETCH + + done: + needs: [prepare_ide, prepare_example_json, build, check_version_files] + runs-on: ubuntu-latest + steps: + - name: Done + run: | + echo DONE diff --git a/lib/LT_WebSockets/.gitignore b/lib/LT_WebSockets/.gitignore new file mode 100644 index 00000000..267af0de --- /dev/null +++ b/lib/LT_WebSockets/.gitignore @@ -0,0 +1,37 @@ +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app +/tests/webSocketServer/node_modules + +# IDE +.vscode +.cproject +.project +.settings +*.swp + diff --git a/lib/LT_WebSockets/.piopm b/lib/LT_WebSockets/.piopm new file mode 100644 index 00000000..3871c04b --- /dev/null +++ b/lib/LT_WebSockets/.piopm @@ -0,0 +1 @@ +{"type": "library", "name": "WebSockets", "version": "2.3.7", "spec": {"owner": "links2004", "id": 549, "name": "WebSockets", "requirements": null, "uri": null}} \ No newline at end of file diff --git a/lib/LT_WebSockets/.travis.yml b/lib/LT_WebSockets/.travis.yml new file mode 100644 index 00000000..6cdf5db4 --- /dev/null +++ b/lib/LT_WebSockets/.travis.yml @@ -0,0 +1,45 @@ +sudo: false +dist: + - xenial +addons: + apt: + packages: + - xvfb +language: bash +os: + - linux +env: + matrix: + - CPU="esp8266" BOARD="esp8266com:esp8266:generic:xtal=80" IDE_VERSION=1.6.13 + - CPU="esp8266" BOARD="esp8266com:esp8266:generic:xtal=80,dbg=Serial1" IDE_VERSION=1.6.13 + - CPU="esp8266" BOARD="esp8266com:esp8266:generic:xtal=80,eesz=1M,FlashMode=qio,FlashFreq=80" IDE_VERSION=1.8.13 + - CPU="esp32" BOARD="espressif:esp32:esp32:FlashFreq=80" IDE_VERSION=1.8.5 + - CPU="esp32" BOARD="espressif:esp32:esp32:FlashFreq=80" IDE_VERSION=1.8.9 + - CPU="esp32" BOARD="espressif:esp32:esp32:FlashFreq=80" IDE_VERSION=1.8.13 +script: + - /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16 + - export DISPLAY=:1.0 + - sleep 3 + - wget http://downloads.arduino.cc/arduino-$IDE_VERSION-linux64.tar.xz + - tar xf arduino-$IDE_VERSION-linux64.tar.xz + - mv arduino-$IDE_VERSION $HOME/arduino_ide + - export PATH="$HOME/arduino_ide:$PATH" + - which arduino + - mkdir -p $HOME/Arduino/libraries + + - wget https://github.com/bblanchon/ArduinoJson/archive/6.x.zip + - unzip 6.x.zip + - mv ArduinoJson-6.x $HOME/Arduino/libraries/ArduinoJson + - cp -r $TRAVIS_BUILD_DIR $HOME/Arduino/libraries/arduinoWebSockets + - source $TRAVIS_BUILD_DIR/travis/common.sh + - get_core $CPU + - cd $TRAVIS_BUILD_DIR + - arduino --board $BOARD --save-prefs + - arduino --get-pref sketchbook.path + - arduino --pref update.check=false + - build_sketches arduino $HOME/Arduino/libraries/arduinoWebSockets/examples/$CPU $CPU + +notifications: + email: + on_success: change + on_failure: change diff --git a/lib/LT_WebSockets/LICENSE b/lib/LT_WebSockets/LICENSE new file mode 100644 index 00000000..f166cc57 --- /dev/null +++ b/lib/LT_WebSockets/LICENSE @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! \ No newline at end of file diff --git a/lib/LT_WebSockets/README.md b/lib/LT_WebSockets/README.md new file mode 100644 index 00000000..ae2497f0 --- /dev/null +++ b/lib/LT_WebSockets/README.md @@ -0,0 +1,102 @@ +WebSocket Server and Client for Arduino [![Build Status](https://github.com/Links2004/arduinoWebSockets/workflows/CI/badge.svg?branch=master)](https://github.com/Links2004/arduinoWebSockets/actions?query=workflow%3ACI+branch%3Amaster) +=========================================== + +a WebSocket Server and Client for Arduino based on RFC6455. + + +##### Supported features of RFC6455 ##### + - text frame + - binary frame + - connection close + - ping + - pong + - continuation frame + +##### Limitations ##### + - max input length is limited to the ram size and the ```WEBSOCKETS_MAX_DATA_SIZE``` define + - max output length has no limit (the hardware is the limit) + - Client send big frames with mask 0x00000000 (on AVR all frames) + - continuation frame reassembly need to be handled in the application code + + ##### Limitations for Async ##### + - Functions called from within the context of the websocket event might not honor `yield()` and/or `delay()`. See [this issue](https://github.com/Links2004/arduinoWebSockets/issues/58#issuecomment-192376395) for more info and a potential workaround. + - wss / SSL is not possible. + +##### Supported Hardware ##### + - ESP8266 [Arduino for ESP8266](https://github.com/esp8266/Arduino/) + - ESP32 [Arduino for ESP32](https://github.com/espressif/arduino-esp32) + - ESP31B + - Particle with STM32 ARM Cortex M3 + - ATmega328 with Ethernet Shield (ATmega branch) + - ATmega328 with enc28j60 (ATmega branch) + - ATmega2560 with Ethernet Shield (ATmega branch) + - ATmega2560 with enc28j60 (ATmega branch) + +###### Note: ###### + + version 2.0.0 and up is not compatible with AVR/ATmega, check ATmega branch. + + version 2.3.0 has API changes for the ESP8266 BareSSL (may brakes existing code) + + Arduino for AVR not supports std namespace of c++. + +### wss / SSL ### + supported for: + - wss client on the ESP8266 + - wss / SSL is not natively supported in WebSocketsServer however it is possible to achieve secure websockets + by running the device behind an SSL proxy. See [Nginx](examples/Nginx/esp8266.ssl.reverse.proxy.conf) for a + sample Nginx server configuration file to enable this. + +### ESP Async TCP ### + +This libary can run in Async TCP mode on the ESP. + +The mode can be activated in the ```WebSockets.h``` (see WEBSOCKETS_NETWORK_TYPE define). + +[ESPAsyncTCP](https://github.com/me-no-dev/ESPAsyncTCP) libary is required. + + +### High Level Client API ### + + - `begin` : Initiate connection sequence to the websocket host. +```c++ +void begin(const char *host, uint16_t port, const char * url = "/", const char * protocol = "arduino"); +void begin(String host, uint16_t port, String url = "/", String protocol = "arduino"); + ``` + - `onEvent`: Callback to handle for websocket events + + ```c++ + void onEvent(WebSocketClientEvent cbEvent); + ``` + + - `WebSocketClientEvent`: Handler for websocket events + ```c++ + void (*WebSocketClientEvent)(WStype_t type, uint8_t * payload, size_t length) + ``` +Where `WStype_t type` is defined as: + ```c++ + typedef enum { + WStype_ERROR, + WStype_DISCONNECTED, + WStype_CONNECTED, + WStype_TEXT, + WStype_BIN, + WStype_FRAGMENT_TEXT_START, + WStype_FRAGMENT_BIN_START, + WStype_FRAGMENT, + WStype_FRAGMENT_FIN, + WStype_PING, + WStype_PONG, + } WStype_t; + ``` + +### Issues ### +Submit issues to: https://github.com/Links2004/arduinoWebSockets/issues + +[![Join the chat at https://gitter.im/Links2004/arduinoWebSockets](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Links2004/arduinoWebSockets?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +### License and credits ### + +The library is licensed under [LGPLv2.1](https://github.com/Links2004/arduinoWebSockets/blob/master/LICENSE) + +[libb64](http://libb64.sourceforge.net/) written by Chris Venter. It is distributed under Public Domain see [LICENSE](https://github.com/Links2004/arduinoWebSockets/blob/master/src/libb64/LICENSE). diff --git a/lib/LT_WebSockets/examples/Nginx/esp8266.ssl.reverse.proxy.conf b/lib/LT_WebSockets/examples/Nginx/esp8266.ssl.reverse.proxy.conf new file mode 100644 index 00000000..ec5aa89f --- /dev/null +++ b/lib/LT_WebSockets/examples/Nginx/esp8266.ssl.reverse.proxy.conf @@ -0,0 +1,83 @@ +# ESP8266 nginx SSL reverse proxy configuration file (tested and working on nginx v1.10.0) + +# proxy cache location +proxy_cache_path /opt/etc/nginx/cache levels=1:2 keys_zone=ESP8266_cache:10m max_size=10g inactive=5m use_temp_path=off; + +# webserver proxy +server { + + # general server parameters + listen 50080; + server_name myDomain.net; + access_log /opt/var/log/nginx/myDomain.net.access.log; + + # SSL configuration + ssl on; + ssl_certificate /usr/builtin/etc/certificate/lets-encrypt/myDomain.net/fullchain.pem; + ssl_certificate_key /usr/builtin/etc/certificate/lets-encrypt/myDomain.net/privkey.pem; + ssl_session_cache builtin:1000 shared:SSL:10m; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; + ssl_prefer_server_ciphers on; + + location / { + + # proxy caching configuration + proxy_cache ESP8266_cache; + proxy_cache_revalidate on; + proxy_cache_min_uses 1; + proxy_cache_use_stale off; + proxy_cache_lock on; + # proxy_cache_bypass $http_cache_control; + # include the sessionId cookie value as part of the cache key - keeps the cache per user + # proxy_cache_key $proxy_host$request_uri$cookie_sessionId; + + # header pass through configuration + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # ESP8266 custom headers which identify to the device that it's running through an SSL proxy + proxy_set_header X-SSL On; + proxy_set_header X-SSL-WebserverPort 50080; + proxy_set_header X-SSL-WebsocketPort 50081; + + # extra debug headers + add_header X-Proxy-Cache $upstream_cache_status; + add_header X-Forwarded-For $proxy_add_x_forwarded_for; + + # actual proxying configuration + proxy_ssl_session_reuse on; + # target the IP address of the device with proxy_pass + proxy_pass http://192.168.0.20; + proxy_read_timeout 90; + } + } + +# websocket proxy +server { + + # general server parameters + listen 50081; + server_name myDomain.net; + access_log /opt/var/log/nginx/myDomain.net.wss.access.log; + + # SSL configuration + ssl on; + ssl_certificate /usr/builtin/etc/certificate/lets-encrypt/myDomain.net/fullchain.pem; + ssl_certificate_key /usr/builtin/etc/certificate/lets-encrypt/myDomain.net/privkey.pem; + ssl_session_cache builtin:1000 shared:SSL:10m; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; + ssl_prefer_server_ciphers on; + + location / { + + # websocket upgrade tunnel configuration + proxy_pass http://192.168.0.20:81; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_read_timeout 86400; + } + } diff --git a/lib/LT_WebSockets/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino b/lib/LT_WebSockets/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino new file mode 100644 index 00000000..9d49d149 --- /dev/null +++ b/lib/LT_WebSockets/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino @@ -0,0 +1,84 @@ +/* + * WebSocketClientAVR.ino + * + * Created on: 10.12.2015 + * + */ + +#include + +#include +#include + +#include + + + +// Enter a MAC address for your controller below. +// Newer Ethernet shields have a MAC address printed on a sticker on the shield +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + +// Set the static IP address to use if the DHCP fails to assign +IPAddress ip(192, 168, 0, 177); + +WebSocketsClient webSocket; + + + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + + switch(type) { + case WStype_DISCONNECTED: + Serial.println("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + { + Serial.print("[WSc] Connected to url: "); + Serial.println((char *)payload); + // send message to server when Connected + webSocket.sendTXT("Connected"); + } + break; + case WStype_TEXT: + Serial.print("[WSc] get text: "); + Serial.println((char *)payload); + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + Serial.print("[WSc] get binary length: "); + Serial.println(length); + // hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + } + +} + +void setup() +{ + // Open serial communications and wait for port to open: + Serial.begin(115200); + while (!Serial) {} + + // start the Ethernet connection: + if (Ethernet.begin(mac) == 0) { + Serial.println("Failed to configure Ethernet using DHCP"); + // no point in carrying on, so do nothing forevermore: + // try to congifure using IP address instead of DHCP: + Ethernet.begin(mac, ip); + } + + webSocket.begin("192.168.0.123", 8011); + webSocket.onEvent(webSocketEvent); + +} + + +void loop() +{ + webSocket.loop(); +} diff --git a/lib/LT_WebSockets/examples/esp32/WebSocketClient/WebSocketClient.ino b/lib/LT_WebSockets/examples/esp32/WebSocketClient/WebSocketClient.ino new file mode 100644 index 00000000..5e5ead46 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp32/WebSocketClient/WebSocketClient.ino @@ -0,0 +1,110 @@ +/* + * WebSocketClient.ino + * + * Created on: 24.05.2015 + * + */ + +#include + +#include +#include +#include + +#include + + +WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + +#define USE_SERIAL Serial1 + +void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) { + const uint8_t* src = (const uint8_t*) mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_ERROR: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // server address, port and URL + webSocket.begin("192.168.0.123", 81, "/"); + + // event handler + webSocket.onEvent(webSocketEvent); + + // use HTTP Basic Authorization this is optional remove if not needed + webSocket.setAuthorization("user", "Password"); + + // try ever 5000 again if connection has failed + webSocket.setReconnectInterval(5000); + +} + +void loop() { + webSocket.loop(); +} diff --git a/lib/LT_WebSockets/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino b/lib/LT_WebSockets/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino new file mode 100644 index 00000000..9d722427 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino @@ -0,0 +1,106 @@ +/* + * WebSocketClientSSL.ino + * + * Created on: 10.12.2015 + * + * note SSL is only possible with the ESP8266 + * + */ + +#include + +#include +#include +#include + +#include + + +WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + +#define USE_SERIAL Serial1 + +void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) { + const uint8_t* src = (const uint8_t*) mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_ERROR: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.beginSSL("192.168.0.123", 81); + webSocket.onEvent(webSocketEvent); + +} + +void loop() { + webSocket.loop(); +} diff --git a/lib/LT_WebSockets/examples/esp32/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino b/lib/LT_WebSockets/examples/esp32/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino new file mode 100644 index 00000000..af3572f9 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp32/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino @@ -0,0 +1,155 @@ +/* + * WebSocketClientSocketIOack.ino + * + * Created on: 20.07.2019 + * + */ + +#include + +#include +#include +#include + +#include + +#include +#include + +WiFiMulti WiFiMulti; +SocketIOclient socketIO; + +#define USE_SERIAL Serial + + +void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) { + switch(type) { + case sIOtype_DISCONNECT: + USE_SERIAL.printf("[IOc] Disconnected!\n"); + break; + case sIOtype_CONNECT: + USE_SERIAL.printf("[IOc] Connected to url: %s\n", payload); + + // join default namespace (no auto join in Socket.IO V3) + socketIO.send(sIOtype_CONNECT, "/"); + break; + case sIOtype_EVENT: + { + char * sptr = NULL; + int id = strtol((char *)payload, &sptr, 10); + USE_SERIAL.printf("[IOc] get event: %s id: %d\n", payload, id); + if(id) { + payload = (uint8_t *)sptr; + } + DynamicJsonDocument doc(1024); + DeserializationError error = deserializeJson(doc, payload, length); + if(error) { + USE_SERIAL.print(F("deserializeJson() failed: ")); + USE_SERIAL.println(error.c_str()); + return; + } + + String eventName = doc[0]; + USE_SERIAL.printf("[IOc] event name: %s\n", eventName.c_str()); + + // Message Includes a ID for a ACK (callback) + if(id) { + // creat JSON message for Socket.IO (ack) + DynamicJsonDocument docOut(1024); + JsonArray array = docOut.to(); + + // add payload (parameters) for the ack (callback function) + JsonObject param1 = array.createNestedObject(); + param1["now"] = millis(); + + // JSON to String (serializion) + String output; + output += id; + serializeJson(docOut, output); + + // Send event + socketIO.send(sIOtype_ACK, output); + } + } + break; + case sIOtype_ACK: + USE_SERIAL.printf("[IOc] get ack: %u\n", length); + break; + case sIOtype_ERROR: + USE_SERIAL.printf("[IOc] get error: %u\n", length); + break; + case sIOtype_BINARY_EVENT: + USE_SERIAL.printf("[IOc] get binary: %u\n", length); + break; + case sIOtype_BINARY_ACK: + USE_SERIAL.printf("[IOc] get binary ack: %u\n", length); + break; + } +} + +void setup() { + //USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + String ip = WiFi.localIP().toString(); + USE_SERIAL.printf("[SETUP] WiFi Connected %s\n", ip.c_str()); + + // server address, port and URL + socketIO.begin("10.11.100.100", 8880, "/socket.io/?EIO=4"); + + // event handler + socketIO.onEvent(socketIOEvent); +} + +unsigned long messageTimestamp = 0; +void loop() { + socketIO.loop(); + + uint64_t now = millis(); + + if(now - messageTimestamp > 2000) { + messageTimestamp = now; + + // creat JSON message for Socket.IO (event) + DynamicJsonDocument doc(1024); + JsonArray array = doc.to(); + + // add evnet name + // Hint: socket.on('event_name', .... + array.add("event_name"); + + // add payload (parameters) for the event + JsonObject param1 = array.createNestedObject(); + param1["now"] = (uint32_t) now; + + // JSON to String (serializion) + String output; + serializeJson(doc, output); + + // Send event + socketIO.sendEVENT(output); + + // Print JSON for debugging + USE_SERIAL.println(output); + } +} diff --git a/lib/LT_WebSockets/examples/esp32/WebSocketServer/WebSocketServer.ino b/lib/LT_WebSockets/examples/esp32/WebSocketServer/WebSocketServer.ino new file mode 100644 index 00000000..3e0d4f5b --- /dev/null +++ b/lib/LT_WebSockets/examples/esp32/WebSocketServer/WebSocketServer.ino @@ -0,0 +1,104 @@ +/* + * WebSocketServer.ino + * + * Created on: 22.05.2015 + * + */ + +#include + +#include +#include +#include + +#include + +WiFiMulti WiFiMulti; +WebSocketsServer webSocket = WebSocketsServer(81); + +#define USE_SERIAL Serial1 + +void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) { + const uint8_t* src = (const uint8_t*) mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: + { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + + // send message to client + // webSocket.sendTXT(num, "message here"); + + // send data to all connected clients + // webSocket.broadcastTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[%u] get binary length: %u\n", num, length); + hexdump(payload, length); + + // send message to client + // webSocket.sendBIN(num, payload, length); + break; + case WStype_ERROR: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.begin(); + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketClient/WebSocketClient.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketClient/WebSocketClient.ino new file mode 100644 index 00000000..5ee489cd --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketClient/WebSocketClient.ino @@ -0,0 +1,106 @@ +/* + * WebSocketClient.ino + * + * Created on: 24.05.2015 + * + */ + +#include + +#include +#include + +#include + +#include + +ESP8266WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + +#define USE_SERIAL Serial1 + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_PING: + // pong will be send automatically + USE_SERIAL.printf("[WSc] get ping\n"); + break; + case WStype_PONG: + // answer to a ping we send + USE_SERIAL.printf("[WSc] get pong\n"); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // server address, port and URL + webSocket.begin("192.168.0.123", 81, "/"); + + // event handler + webSocket.onEvent(webSocketEvent); + + // use HTTP Basic Authorization this is optional remove if not needed + webSocket.setAuthorization("user", "Password"); + + // try ever 5000 again if connection has failed + webSocket.setReconnectInterval(5000); + + // start heartbeat (optional) + // ping server every 15000 ms + // expect pong from server within 3000 ms + // consider connection disconnected if pong is not received 2 times + webSocket.enableHeartbeat(15000, 3000, 2); + +} + +void loop() { + webSocket.loop(); +} diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/README.md b/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/README.md new file mode 100644 index 00000000..496eef25 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/README.md @@ -0,0 +1,27 @@ +## Minimal example of WebsocketClientOTA and Python server + +Take this as small example, how achieve OTA update on ESP8266 and ESP32. + +Python server was wrote from train so take it only as bare example. +It's working, but it's not mean to run in production. + + +### Usage: + +Start server: +```bash +cd python_ota_server +python3 -m venv .venv +source .venv/bin/activate +pip3 install -r requirements.txt +python3 main.py +``` + +Flash ESP with example sketch and start it. + +Change version inside example sketch to higher and compile it and save it to bin file. + +Rename it to `mydevice-1.0.1-esp8266.bin` and place it inside new folder firmware (server create it). + +When the ESP connect to server, it check if version flashed is equal to fw in firmware folder. If higher FW version is present, +start the flash process. \ No newline at end of file diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/WebSocketClientOTA.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/WebSocketClientOTA.ino new file mode 100644 index 00000000..2c87c251 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/WebSocketClientOTA.ino @@ -0,0 +1,263 @@ +/* + * WebSocketClientOTA.ino + * + * Created on: 25.10.2021 + * + */ + +#include +#include + +#ifdef ESP8266 + #include + #include + #include +#endif +#ifdef ESP32 + #include "WiFi.h" + #include "ESPmDNS.h" + #include +#endif + +#include +#include + +#include + +#include + +ESP8266WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + +#define USE_SERIAL Serial + +// Variables: +// Settable: +const char *version = "1.0.0"; +const char *name = "mydevice"; + +// Others: +#ifdef ESP8266 + const char *chip = "esp8266"; +#endif +#ifdef ESP32 + const char *chip = "esp32"; +#endif + +uint32_t maxSketchSpace = 0; +int SketchSize = 0; +bool ws_conn = false; + +String IpAddress2String(const IPAddress& ipAddress) +{ + return String(ipAddress[0]) + String(".") + + String(ipAddress[1]) + String(".") + + String(ipAddress[2]) + String(".") + + String(ipAddress[3]); +} + +void greetings_(){ + StaticJsonDocument<200> doc; + doc["type"] = "greetings"; + doc["mac"] = WiFi.macAddress(); + doc["ip"] = IpAddress2String(WiFi.localIP()); + doc["version"] = version; + doc["name"] = name; + doc["chip"] = chip; + + char data[200]; + serializeJson(doc, data); + webSocket.sendTXT(data); +} + +void register_(){ + StaticJsonDocument<200> doc; + doc["type"] = "register"; + doc["mac"] = WiFi.macAddress(); + + char data[200]; + serializeJson(doc, data); + webSocket.sendTXT(data); + ws_conn = true; +} + +typedef void (*CALLBACK_FUNCTION)(JsonDocument &msg); + +typedef struct { + char type[50]; + CALLBACK_FUNCTION func; +} RESPONSES_STRUCT; + +void OTA(JsonDocument &msg){ + USE_SERIAL.print(F("[WSc] OTA mode: ")); + const char* go = "go"; + const char* ok = "ok"; + if(strncmp( msg["value"], go, strlen(go)) == 0 ) { + USE_SERIAL.print(F("go\n")); + SketchSize = int(msg["size"]); + maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; + USE_SERIAL.printf("[WSc] Max sketch size: %u\n", maxSketchSpace); + USE_SERIAL.printf("[WSc] Sketch size: %d\n", SketchSize); + USE_SERIAL.setDebugOutput(true); + if (!Update.begin(maxSketchSpace)) { //start with max available size + Update.printError(Serial); + ESP.restart(); + } + } else if (strncmp( msg["value"], ok, strlen(ok)) == 0) { + USE_SERIAL.print(F("OK\n")); + register_(); + } else { + USE_SERIAL.print(F("unknown value : ")); + USE_SERIAL.print(msg["value"].as()); + USE_SERIAL.print(F("\n")); + } +} + +void STATE(JsonDocument &msg){ + // Do something with message +} + +RESPONSES_STRUCT responses[] = { + {"ota", OTA}, + {"state", STATE}, +}; + +void text(uint8_t * payload, size_t length){ + // Convert mesage to something usable + char msgch[length]; + for (unsigned int i = 0; i < length; i++) + { + USE_SERIAL.print((char)payload[i]); + msgch[i] = ((char)payload[i]); + } + msgch[length] = '\0'; + + // Parse Json + StaticJsonDocument<200> doc_in; + DeserializationError error = deserializeJson(doc_in, msgch); + + if (error) { + USE_SERIAL.print(F("deserializeJson() failed: ")); + USE_SERIAL.println(error.c_str()); + return; + } + + // Handle each TYPE of message + int b = 0; + + for( b=0 ; strlen(responses[b].type) ; b++ ) + { + if( strncmp(doc_in["type"], responses[b].type, strlen(responses[b].type)) == 0 ) { + responses[b].func(doc_in); + } + } +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + // webSocket.sendTXT("Connected"); + greetings_(); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + text(payload, length); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + // hexdump(payload, length); + if (Update.write(payload, length) != length) { + Update.printError(Serial); + ESP.restart(); + } + yield(); + SketchSize -= length; + USE_SERIAL.printf("[WSc] Sketch size left: %u\n", SketchSize); + if (SketchSize < 1){ + if (Update.end(true)) { //true to set the size to the current progress + USE_SERIAL.printf("Update Success: \nRebooting...\n"); + delay(5); + yield(); + ESP.restart(); + } else { + Update.printError(USE_SERIAL); + ESP.restart(); + } + USE_SERIAL.setDebugOutput(false); + } + + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_PING: + // pong will be send automatically + USE_SERIAL.printf("[WSc] get ping\n"); + break; + case WStype_PONG: + // answer to a ping we send + USE_SERIAL.printf("[WSc] get pong\n"); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.print(F("\nMAC: ")); + USE_SERIAL.println(WiFi.macAddress()); + USE_SERIAL.print(F("\nDevice: ")); + USE_SERIAL.println(name); + USE_SERIAL.printf("\nVersion: %s\n", version); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "PASS"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // server address, port and URL + webSocket.begin("10.0.1.5", 8081, "/"); + + // event handler + webSocket.onEvent(webSocketEvent); + + // use HTTP Basic Authorization this is optional remove if not needed + // webSocket.setAuthorization("USER", "PASS"); + + // try ever 5000 again if connection has failed + webSocket.setReconnectInterval(5000); + + // start heartbeat (optional) + // ping server every 15000 ms + // expect pong from server within 3000 ms + // consider connection disconnected if pong is not received 2 times + webSocket.enableHeartbeat(15000, 3000, 2); + +} + +void loop() { + webSocket.loop(); +} diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/python_ota_server/main.py b/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/python_ota_server/main.py new file mode 100644 index 00000000..7e7fba11 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/python_ota_server/main.py @@ -0,0 +1,235 @@ +"""Minimal example of Python websocket server +handling OTA updates for ESP32 amd ESP8266 + +Check and upload of firmware works. +Register and state function are jus for example. +""" +# pylint: disable=W0703,E1101 +import asyncio +import copy +import json +import logging +import subprocess +import threading +import time +from os import listdir +from os.path import join as join_pth +from pathlib import Path + +import websockets +from packaging import version + +# Logger settings +logging.basicConfig(filename="ws_server.log") +Logger = logging.getLogger('WS-OTA') +Logger.addHandler(logging.StreamHandler()) +Logger.setLevel(logging.INFO) + +# Path to directory with FW +fw_path = join_pth(Path().absolute(), "firmware") + + +def create_path(path: str) -> None: + """Check if path exist or create it""" + Path(path).mkdir(parents=True, exist_ok=True) + + +def shell(command): + """Handle execution of shell commands""" + with subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE, + universal_newlines=True + ) as process: + for stdout_line in iter(process.stdout.readline, ""): + Logger.debug(stdout_line) + process.stdout.close() + return_code = process.wait() + Logger.debug("Shell returned: %s", return_code) + + return process.returncode + return None + + +async def binary_send(websocket, fw_file): + """Read firmware file, divide it to chunks and send them""" + with open(fw_file, "rb") as binaryfile: + + while True: + chunk = binaryfile.read(2048) + if not chunk: + break + try: + await websocket.send(chunk) + except Exception as exception: + Logger.exception(exception) + return False + time.sleep(0.2) + + +def version_checker(name, vdev, vapp): + """Parse and compare FW version""" + + if version.parse(vdev) < version.parse(vapp): + Logger.info("Client(%s) version %s is smaller than %s: Go for update", name, vdev, vapp) + return True + Logger.info("Client(%s) version %s is greater or equal to %s: Not updating", name, vdev, vapp) + return False + + +class WsOtaHandler (threading.Thread): + """Thread handling ota update + + Runing ota directly from message would kill WS + as message bus would timeout. + """ + def __init__(self, name, message, websocket): + threading.Thread.__init__(self, daemon=True) + self.name = name + self.msg = message + self.websocket = websocket + + def run(self, ): + try: + asyncio.run(self.start_) + except Exception as exception: + Logger.exception(exception) + finally: + pass + + async def start_(self): + """Start _ota se asyncio future""" + msg_task = asyncio.ensure_future( + self._ota()) + + done, pending = await asyncio.wait( + [msg_task], + return_when=asyncio.FIRST_COMPLETED, + ) + Logger.info("WS Ota Handler done: %s", done) + for task in pending: + task.cancel() + + async def _ota(self): + """Check for new fw and update or pass""" + device_name = self.msg['name'] + device_chip = self.msg['chip'] + device_version = self.msg['version'] + fw_version = '' + fw_name = '' + fw_device = '' + + for filename in listdir(fw_path): + fw_info = filename.split("-") + fw_device = fw_info[0] + if fw_device == device_name: + fw_version = fw_info[1] + fw_name = filename + break + + if not fw_version: + Logger.info("Client(%s): No fw found!", device_name) + msg = '{"type": "ota", "value":"ok"}' + await self.websocket.send(msg) + return + + if not version_checker(device_name, device_version, fw_version): + return + + fw_file = join_pth(fw_path, fw_name) + if device_chip == 'esp8266' and not fw_file.endswith('.gz'): + # We can compress fw to make it smaller for upload + fw_cpress = fw_file + fw_file = fw_cpress + ".gz" + cpress = f"gzip -9 {fw_cpress}" + cstate = shell(cpress) + if cstate: + Logger.error("Cannot compress firmware: %s", fw_name) + return + + # Get size of fw + size = Path(fw_file).stat().st_size + + # Request ota mode + msg = '{"type": "ota", "value":"go", "size":' + str(size) + '}' + await self.websocket.send(msg) + + # send file by chunks trough websocket + await binary_send(self.websocket, fw_file) + + +async def _register(websocket, message): + mac = message.get('mac') + name = message.get('name') + Logger.info("Client(%s) mac: %s", name, mac) + # Some code + + response = {'response_type': 'registry', 'state': 'ok'} + await websocket.send(json.dumps(response)) + + +async def _state(websocket, message): + mac = message.get('mac') + name = message.get('name') + Logger.info("Client(%s) mac: %s", name, mac) + # Some code + + response = {'response_type': 'state', 'state': 'ok'} + await websocket.send(json.dumps(response)) + + +async def _unhandleld(websocket, msg): + Logger.info("Unhandled message from device: %s", str(msg)) + response = {'response_type': 'response', 'state': 'nok'} + await websocket.send(json.dumps(response)) + + +async def _greetings(websocket, message): + WsOtaHandler('thread_ota', copy.deepcopy(message), websocket).start() + + +async def message_received(websocket, message) -> None: + """Handle incoming messages + + Check if message contain json and run waned function + """ + switcher = {"greetings": _greetings, + "register": _register, + "state": _state + } + + if message[0:1] == "{": + try: + msg_json = json.loads(message) + except Exception as exception: + Logger.error(exception) + return + + type_ = msg_json.get('type') + name = msg_json.get('name') + func = switcher.get(type_, _unhandleld) + Logger.debug("Client(%s)said: %s", name, type_) + + try: + await func(websocket, msg_json) + except Exception as exception: + Logger.error(exception) + + +# pylint: disable=W0613 +async def ws_server(websocket, path) -> None: + """Run in cycle and wait for new messages""" + async for message in websocket: + await message_received(websocket, message) + + +async def main(): + """Server starter + + Normal user can bind only port nubers greater than 1024 + """ + async with websockets.serve(ws_server, "10.0.1.5", 8081): + await asyncio.Future() # run forever + + +create_path(fw_path) +asyncio.run(main()) diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/python_ota_server/requirements.txt b/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/python_ota_server/requirements.txt new file mode 100644 index 00000000..4fc2553f --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketClientOTA/python_ota_server/requirements.txt @@ -0,0 +1,2 @@ +packaging +websockets \ No newline at end of file diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino new file mode 100644 index 00000000..d45060e9 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino @@ -0,0 +1,88 @@ +/* + * WebSocketClientSSL.ino + * + * Created on: 10.12.2015 + * + * note SSL is only possible with the ESP8266 + * + */ + +#include + +#include +#include + +#include + +#include + +ESP8266WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + + +#define USE_SERIAL Serial1 + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.beginSSL("192.168.0.123", 81); + webSocket.onEvent(webSocketEvent); + +} + +void loop() { + webSocket.loop(); +} diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino new file mode 100644 index 00000000..214f5e61 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino @@ -0,0 +1,103 @@ +/* + * WebSocketClientSSLWithCA.ino + * + * Created on: 27.10.2019 + * + * note SSL is only possible with the ESP8266 + * + */ + +#include + +#include +#include + +#include + +ESP8266WiFiMulti WiFiMulti; +WebSocketsClient webSocket; + +#define USE_SERIAL Serial1 + + +// Can be obtained with: +// openssl s_client -showcerts -connect echo.websocket.org:443 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + //When using BearSSL, client certificate and private key can be set: + //webSocket.setSSLClientCertKey(clientCert, clientPrivateKey); + //clientCert and clientPrivateKey can be of types (const char *, const char *) , or of types (BearSSL::X509List, BearSSL::PrivateKey) + + webSocket.beginSslWithCA("echo.websocket.org", 443, "/", ENDPOINT_CA_CERT); + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino new file mode 100644 index 00000000..5ceacea4 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino @@ -0,0 +1,128 @@ +/* + * WebSocketClientSocketIO.ino + * + * Created on: 06.06.2016 + * + */ + +#include + +#include +#include + +#include + +#include +#include + +#include + +ESP8266WiFiMulti WiFiMulti; +SocketIOclient socketIO; + +#define USE_SERIAL Serial1 + +void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) { + switch(type) { + case sIOtype_DISCONNECT: + USE_SERIAL.printf("[IOc] Disconnected!\n"); + break; + case sIOtype_CONNECT: + USE_SERIAL.printf("[IOc] Connected to url: %s\n", payload); + + // join default namespace (no auto join in Socket.IO V3) + socketIO.send(sIOtype_CONNECT, "/"); + break; + case sIOtype_EVENT: + USE_SERIAL.printf("[IOc] get event: %s\n", payload); + break; + case sIOtype_ACK: + USE_SERIAL.printf("[IOc] get ack: %u\n", length); + hexdump(payload, length); + break; + case sIOtype_ERROR: + USE_SERIAL.printf("[IOc] get error: %u\n", length); + hexdump(payload, length); + break; + case sIOtype_BINARY_EVENT: + USE_SERIAL.printf("[IOc] get binary: %u\n", length); + hexdump(payload, length); + break; + case sIOtype_BINARY_ACK: + USE_SERIAL.printf("[IOc] get binary ack: %u\n", length); + hexdump(payload, length); + break; + } +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + // disable AP + if(WiFi.getMode() & WIFI_AP) { + WiFi.softAPdisconnect(true); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + String ip = WiFi.localIP().toString(); + USE_SERIAL.printf("[SETUP] WiFi Connected %s\n", ip.c_str()); + + // server address, port and URL + socketIO.begin("10.11.100.100", 8880, "/socket.io/?EIO=4"); + + // event handler + socketIO.onEvent(socketIOEvent); +} + +unsigned long messageTimestamp = 0; +void loop() { + socketIO.loop(); + + uint64_t now = millis(); + + if(now - messageTimestamp > 2000) { + messageTimestamp = now; + + // creat JSON message for Socket.IO (event) + DynamicJsonDocument doc(1024); + JsonArray array = doc.to(); + + // add evnet name + // Hint: socket.on('event_name', .... + array.add("event_name"); + + // add payload (parameters) for the event + JsonObject param1 = array.createNestedObject(); + param1["now"] = (uint32_t) now; + + // JSON to String (serializion) + String output; + serializeJson(doc, output); + + // Send event + socketIO.sendEVENT(output); + + // Print JSON for debugging + USE_SERIAL.println(output); + } +} diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino new file mode 100644 index 00000000..3e4f87e1 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino @@ -0,0 +1,165 @@ +/* + * WebSocketClientSocketIOack.ino + * + * Created on: 20.07.2019 + * + */ + +#include + +#include +#include + +#include + +#include +#include + +#include + +ESP8266WiFiMulti WiFiMulti; +SocketIOclient socketIO; + +#define USE_SERIAL Serial + + +void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) { + switch(type) { + case sIOtype_DISCONNECT: + USE_SERIAL.printf("[IOc] Disconnected!\n"); + break; + case sIOtype_CONNECT: + USE_SERIAL.printf("[IOc] Connected to url: %s\n", payload); + + // join default namespace (no auto join in Socket.IO V3) + socketIO.send(sIOtype_CONNECT, "/"); + break; + case sIOtype_EVENT: + { + char * sptr = NULL; + int id = strtol((char *)payload, &sptr, 10); + USE_SERIAL.printf("[IOc] get event: %s id: %d\n", payload, id); + if(id) { + payload = (uint8_t *)sptr; + } + DynamicJsonDocument doc(1024); + DeserializationError error = deserializeJson(doc, payload, length); + if(error) { + USE_SERIAL.print(F("deserializeJson() failed: ")); + USE_SERIAL.println(error.c_str()); + return; + } + + String eventName = doc[0]; + USE_SERIAL.printf("[IOc] event name: %s\n", eventName.c_str()); + + // Message Includes a ID for a ACK (callback) + if(id) { + // creat JSON message for Socket.IO (ack) + DynamicJsonDocument docOut(1024); + JsonArray array = docOut.to(); + + // add payload (parameters) for the ack (callback function) + JsonObject param1 = array.createNestedObject(); + param1["now"] = millis(); + + // JSON to String (serializion) + String output; + output += id; + serializeJson(docOut, output); + + // Send event + socketIO.send(sIOtype_ACK, output); + } + } + break; + case sIOtype_ACK: + USE_SERIAL.printf("[IOc] get ack: %u\n", length); + hexdump(payload, length); + break; + case sIOtype_ERROR: + USE_SERIAL.printf("[IOc] get error: %u\n", length); + hexdump(payload, length); + break; + case sIOtype_BINARY_EVENT: + USE_SERIAL.printf("[IOc] get binary: %u\n", length); + hexdump(payload, length); + break; + case sIOtype_BINARY_ACK: + USE_SERIAL.printf("[IOc] get binary ack: %u\n", length); + hexdump(payload, length); + break; + } +} + +void setup() { + //USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + // disable AP + if(WiFi.getMode() & WIFI_AP) { + WiFi.softAPdisconnect(true); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + String ip = WiFi.localIP().toString(); + USE_SERIAL.printf("[SETUP] WiFi Connected %s\n", ip.c_str()); + + // server address, port and URL + socketIO.begin("10.11.100.100", 8880, "/socket.io/?EIO=4"); + + // event handler + socketIO.onEvent(socketIOEvent); +} + +unsigned long messageTimestamp = 0; +void loop() { + socketIO.loop(); + + uint64_t now = millis(); + + if(now - messageTimestamp > 2000) { + messageTimestamp = now; + + // creat JSON message for Socket.IO (event) + DynamicJsonDocument doc(1024); + JsonArray array = doc.to(); + + // add evnet name + // Hint: socket.on('event_name', .... + array.add("event_name"); + + // add payload (parameters) for the event + JsonObject param1 = array.createNestedObject(); + param1["now"] = (uint32_t) now; + + // JSON to String (serializion) + String output; + serializeJson(doc, output); + + // Send event + socketIO.sendEVENT(output); + + // Print JSON for debugging + USE_SERIAL.println(output); + } +} diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino new file mode 100644 index 00000000..a0eb011f --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino @@ -0,0 +1,149 @@ +/* + WebSocketClientStomp.ino + + Example for connecting and maintining a connection with a STOMP websocket connection. + In this example, we connect to a Spring application (see https://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html). + + Created on: 25.09.2017 + Author: Martin Becker , Contact: becker@informatik.uni-wuerzburg.de +*/ + +// PRE + +#define USE_SERIAL Serial + + +// LIBRARIES + +#include +#include + +#include +#include + + +// SETTINGS + +const char* wlan_ssid = "yourssid"; +const char* wlan_password = "somepassword"; + +const char* ws_host = "the.host.net"; +const int ws_port = 80; + +// URL for STOMP endpoint. +// For the default config of Spring's STOMP support, the default URL is "/socketentry/websocket". +const char* stompUrl = "/socketentry/websocket"; // don't forget the leading "/" !!! + + +// VARIABLES + +WebSocketsClient webSocket; + + +// FUNCTIONS + +/** + * STOMP messages need to be NULL-terminated (i.e., \0 or \u0000). + * However, when we send a String or a char[] array without specifying + * a length, the size of the message payload is derived by strlen() internally, + * thus dropping any NULL values appended to the "msg"-String. + * + * To solve this, we first convert the String to a NULL terminated char[] array + * via "c_str" and set the length of the payload to include the NULL value. + */ +void sendMessage(String & msg) { + webSocket.sendTXT(msg.c_str(), msg.length() + 1); +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + switch (type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + String msg = "CONNECT\r\naccept-version:1.1,1.0\r\nheart-beat:10000,10000\r\n\r\n"; + sendMessage(msg); + } + break; + case WStype_TEXT: + { + // ##################### + // handle STOMP protocol + // ##################### + + String text = (char*) payload; + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + if (text.startsWith("CONNECTED")) { + + // subscribe to some channels + + String msg = "SUBSCRIBE\nid:sub-0\ndestination:/user/queue/messages\n\n"; + sendMessage(msg); + delay(1000); + + // and send a message + + msg = "SEND\ndestination:/app/message\n\n{\"user\":\"esp\",\"message\":\"Hello!\"}"; + sendMessage(msg); + delay(1000); + + } else { + + // do something with messages + + } + + break; + } + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + } + +} + +void setup() { + + // setup serial + + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + // USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + + + // connect to WiFi + + USE_SERIAL.print("Logging into WLAN: "); Serial.print(wlan_ssid); Serial.print(" ..."); + WiFi.mode(WIFI_STA); + WiFi.begin(wlan_ssid, wlan_password); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + USE_SERIAL.print("."); + } + USE_SERIAL.println(" success."); + USE_SERIAL.print("IP: "); USE_SERIAL.println(WiFi.localIP()); + + + // connect to websocket + webSocket.begin(ws_host, ws_port, stompUrl); + webSocket.setExtraHeaders(); // remove "Origin: file://" header because it breaks the connection with Spring's default websocket config + // webSocket.setExtraHeaders("foo: I am so funny\r\nbar: not"); // some headers, in case you feel funny + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino new file mode 100644 index 00000000..cb0c45be --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino @@ -0,0 +1,150 @@ +/* + WebSocketClientStompOverSockJs.ino + + Example for connecting and maintining a connection with a SockJS+STOMP websocket connection. + In this example, we connect to a Spring application (see https://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html). + + Created on: 18.07.2017 + Author: Martin Becker , Contact: becker@informatik.uni-wuerzburg.de +*/ + +// PRE + +#define USE_SERIAL Serial + + +// LIBRARIES + +#include +#include + +#include +#include + + +// SETTINGS + +const char* wlan_ssid = "yourssid"; +const char* wlan_password = "somepassword"; + +const char* ws_host = "the.host.net"; +const int ws_port = 80; + +// base URL for SockJS (websocket) connection +// The complete URL will look something like this(cf. http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html#section-36): +// ws://://<3digits>//websocket +// For the default config of Spring's SockJS/STOMP support, the default base URL is "/socketentry/". +const char* ws_baseurl = "/socketentry/"; // don't forget leading and trailing "/" !!! + + +// VARIABLES + +WebSocketsClient webSocket; + + +// FUNCTIONS + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + + switch (type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + { + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + } + break; + case WStype_TEXT: + { + // ##################### + // handle SockJs+STOMP protocol + // ##################### + + String text = (char*) payload; + + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + if (payload[0] == 'h') { + + USE_SERIAL.println("Heartbeat!"); + + } else if (payload[0] == 'o') { + + // on open connection + char *msg = "[\"CONNECT\\naccept-version:1.1,1.0\\nheart-beat:10000,10000\\n\\n\\u0000\"]"; + webSocket.sendTXT(msg); + + } else if (text.startsWith("a[\"CONNECTED")) { + + // subscribe to some channels + + char *msg = "[\"SUBSCRIBE\\nid:sub-0\\ndestination:/user/queue/messages\\n\\n\\u0000\"]"; + webSocket.sendTXT(msg); + delay(1000); + + // and send a message + + msg = "[\"SEND\\ndestination:/app/message\\n\\n{\\\"user\\\":\\\"esp\\\",\\\"message\\\":\\\"Hello!\\\"}\\u0000\"]"; + webSocket.sendTXT(msg); + delay(1000); + } + + break; + } + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + } + +} + +void setup() { + + // setup serial + + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + // USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + + + // connect to WiFi + + USE_SERIAL.print("Logging into WLAN: "); Serial.print(wlan_ssid); Serial.print(" ..."); + WiFi.mode(WIFI_STA); + WiFi.begin(wlan_ssid, wlan_password); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + USE_SERIAL.print("."); + } + USE_SERIAL.println(" success."); + USE_SERIAL.print("IP: "); USE_SERIAL.println(WiFi.localIP()); + + + // ##################### + // create socket url according to SockJS protocol (cf. http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html#section-36) + // ##################### + String socketUrl = ws_baseurl; + socketUrl += random(0, 999); + socketUrl += "/"; + socketUrl += random(0, 999999); // should be a random string, but this works (see ) + socketUrl += "/websocket"; + + // connect to websocket + webSocket.begin(ws_host, ws_port, socketUrl); + webSocket.setExtraHeaders(); // remove "Origin: file://" header because it breaks the connection with Spring's default websocket config + // webSocket.setExtraHeaders("foo: I am so funny\r\nbar: not"); // some headers, in case you feel funny + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketServer/WebSocketServer.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketServer/WebSocketServer.ino new file mode 100644 index 00000000..1ac3002d --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketServer/WebSocketServer.ino @@ -0,0 +1,86 @@ +/* + * WebSocketServer.ino + * + * Created on: 22.05.2015 + * + */ + +#include + +#include +#include +#include +#include + +ESP8266WiFiMulti WiFiMulti; + +WebSocketsServer webSocket = WebSocketsServer(81); + +#define USE_SERIAL Serial1 + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: + { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + + // send message to client + // webSocket.sendTXT(num, "message here"); + + // send data to all connected clients + // webSocket.broadcastTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[%u] get binary length: %u\n", num, length); + hexdump(payload, length); + + // send message to client + // webSocket.sendBIN(num, payload, length); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.begin(); + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} + diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino new file mode 100644 index 00000000..5fed1a95 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino @@ -0,0 +1,132 @@ +/* + * WebSocketServerAllFunctionsDemo.ino + * + * Created on: 10.05.2018 + * + */ + +#include + +#include +#include +#include +#include +#include +#include + +#define LED_RED 15 +#define LED_GREEN 12 +#define LED_BLUE 13 + +#define USE_SERIAL Serial + +ESP8266WiFiMulti WiFiMulti; + +ESP8266WebServer server(80); +WebSocketsServer webSocket = WebSocketsServer(81); + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + + if(payload[0] == '#') { + // we get RGB data + + // decode rgb data + uint32_t rgb = (uint32_t) strtol((const char *) &payload[1], NULL, 16); + + analogWrite(LED_RED, ((rgb >> 16) & 0xFF)); + analogWrite(LED_GREEN, ((rgb >> 8) & 0xFF)); + analogWrite(LED_BLUE, ((rgb >> 0) & 0xFF)); + } + + break; + } + +} + +void setup() { + //USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + pinMode(LED_RED, OUTPUT); + pinMode(LED_GREEN, OUTPUT); + pinMode(LED_BLUE, OUTPUT); + + digitalWrite(LED_RED, 1); + digitalWrite(LED_GREEN, 1); + digitalWrite(LED_BLUE, 1); + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // start webSocket server + webSocket.begin(); + webSocket.onEvent(webSocketEvent); + + if(MDNS.begin("esp8266")) { + USE_SERIAL.println("MDNS responder started"); + } + + // handle index + server.on("/", []() { + // send index.html + server.send(200, "text/html", "LED Control:

R:
G:
B:
"); + }); + + server.begin(); + + // Add service to MDNS + MDNS.addService("http", "tcp", 80); + MDNS.addService("ws", "tcp", 81); + + digitalWrite(LED_RED, 0); + digitalWrite(LED_GREEN, 0); + digitalWrite(LED_BLUE, 0); + +} + +unsigned long last_10sec = 0; +unsigned int counter = 0; + +void loop() { + unsigned long t = millis(); + webSocket.loop(); + server.handleClient(); + + if((t - last_10sec) > 10 * 1000) { + counter++; + bool ping = (counter % 2); + int i = webSocket.connectedClients(ping); + USE_SERIAL.printf("%d Connected websocket clients ping: %d\n", i, ping); + last_10sec = millis(); + } +} diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino new file mode 100644 index 00000000..84c9775d --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino @@ -0,0 +1,94 @@ +/* + * WebSocketServer.ino + * + * Created on: 22.05.2015 + * + */ + +#include + +#include +#include +#include +#include + +ESP8266WiFiMulti WiFiMulti; + +WebSocketsServer webSocket = WebSocketsServer(81); + +#define USE_SERIAL Serial + +String fragmentBuffer = ""; + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + break; + case WStype_BIN: + USE_SERIAL.printf("[%u] get binary length: %u\n", num, length); + hexdump(payload, length); + break; + + // Fragmentation / continuation opcode handling + // case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT_TEXT_START: + fragmentBuffer = (char*)payload; + USE_SERIAL.printf("[%u] get start start of Textfragment: %s\n", num, payload); + break; + case WStype_FRAGMENT: + fragmentBuffer += (char*)payload; + USE_SERIAL.printf("[%u] get Textfragment : %s\n", num, payload); + break; + case WStype_FRAGMENT_FIN: + fragmentBuffer += (char*)payload; + USE_SERIAL.printf("[%u] get end of Textfragment: %s\n", num, payload); + USE_SERIAL.printf("[%u] full frame: %s\n", num, fragmentBuffer.c_str()); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + webSocket.begin(); + webSocket.onEvent(webSocketEvent); +} + +void loop() { + webSocket.loop(); +} + diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/WebSocketServerHooked.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/WebSocketServerHooked.ino new file mode 100644 index 00000000..e762626b --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/WebSocketServerHooked.ino @@ -0,0 +1,103 @@ +/* + * WebSocketServerHooked.ino + * + * Created on: 22.05.2015 + * Hooked on: 28.10.2020 + * + */ + +#include + +#include +#include +#include +#include +#include + +ESP8266WiFiMulti WiFiMulti; + +ESP8266WebServer server(80); +WebSockets4WebServer webSocket; + +#define USE_SERIAL Serial + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: + { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + + // send message to client + // webSocket.sendTXT(num, "message here"); + + // send data to all connected clients + // webSocket.broadcastTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[%u] get binary length: %u\n", num, length); + hexdump(payload, length); + + // send message to client + // webSocket.sendBIN(num, payload, length); + break; + } + +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + server.on("/", []() { + server.send(200, "text/plain", "I am a regular webserver on port 80!\r\n"); + server.send(200, "text/plain", "I am also a websocket server on '/ws' on the same port 80\r\n"); + }); + + server.addHook(webSocket.hookForWebserver("/ws", webSocketEvent)); + + server.begin(); + Serial.println("HTTP server started on port 80"); + Serial.println("WebSocket server started on the same port"); + Serial.printf("my network address is either 'arduinoWebsockets.local' (mDNS) or '%s'\n", WiFi.localIP().toString().c_str()); + + if (!MDNS.begin("arduinoWebsockets")) { + Serial.println("Error setting up MDNS responder!"); + } +} + +void loop() { + server.handleClient(); + webSocket.loop(); + MDNS.update(); +} diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/emu b/lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/emu new file mode 100644 index 00000000..867a8cd7 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/emu @@ -0,0 +1,20 @@ +#!/bin/sh + +# linux script to compile&run arduinoWebSockets in a mock environment + +if [ -z "$ESP8266ARDUINO" ]; then + echo "please set ESP8266ARDUINO env-var to where esp8266/arduino sits" + exit 1 +fi + +set -e + +where=$(pwd) + +cd $ESP8266ARDUINO/tests/host/ + +make -j FORCE32=0 \ + ULIBDIRS=../../libraries/Hash/:~/dev/proj/arduino/libraries/arduinoWebSockets \ + ${where}/WebSocketServerHooked + +valgrind ./bin/WebSocketServerHooked/WebSocketServerHooked -b "$@" diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/ws-testclient.py b/lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/ws-testclient.py new file mode 100644 index 00000000..546c7ff2 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketServerHooked/ws-testclient.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 + +# python websocket client to test with +# emulator: server is at ws://127.0.0.1:9080/ws +# esp8266: server is at ws:///ws +# (uncomment the right line below) + +#uri = "ws://127.0.0.1:9080/ws" +uri = "ws://arduinoWebsockets.local/ws" + +import websocket +try: + import thread +except ImportError: + import _thread as thread +import time + +def on_message(ws, message): + print("message"); + print(message) + +def on_error(ws, error): + print("error") + print(error) + +def on_close(ws): + print("### closed ###") + +def on_open(ws): + print("opened") + def run(*args): + for i in range(3): + time.sleep(1) + ws.send("Hello %d" % i) + time.sleep(1) + ws.close() + print("thread terminating...") + thread.start_new_thread(run, ()) + + +if __name__ == "__main__": + websocket.enableTrace(True) + ws = websocket.WebSocketApp(uri, on_message = on_message, on_error = on_error, on_close = on_close) + ws.on_open = on_open + ws.run_forever() diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino new file mode 100644 index 00000000..8bc646c4 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino @@ -0,0 +1,86 @@ +/* + * WebSocketServerHttpHeaderValidation.ino + * + * Created on: 08.06.2016 + * + */ + +#include + +#include +#include +#include +#include + +ESP8266WiFiMulti WiFiMulti; + +WebSocketsServer webSocket = WebSocketsServer(81); + +#define USE_SERIAL Serial1 + +const unsigned long int validSessionId = 12345; //some arbitrary value to act as a valid sessionId + +/* + * Returns a bool value as an indicator to describe whether a user is allowed to initiate a websocket upgrade + * based on the value of a cookie. This function expects the rawCookieHeaderValue to look like this "sessionId=|" + */ +bool isCookieValid(String rawCookieHeaderValue) { + + if (rawCookieHeaderValue.indexOf("sessionId") != -1) { + String sessionIdStr = rawCookieHeaderValue.substring(rawCookieHeaderValue.indexOf("sessionId=") + 10, rawCookieHeaderValue.indexOf("|")); + unsigned long int sessionId = strtoul(sessionIdStr.c_str(), NULL, 10); + return sessionId == validSessionId; + } + return false; +} + +/* + * The WebSocketServerHttpHeaderValFunc delegate passed to webSocket.onValidateHttpHeader + */ +bool validateHttpHeader(String headerName, String headerValue) { + + //assume a true response for any headers not handled by this validator + bool valid = true; + + if(headerName.equalsIgnoreCase("Cookie")) { + //if the header passed is the Cookie header, validate it according to the rules in 'isCookieValid' function + valid = isCookieValid(headerValue); + } + + return valid; +} + +void setup() { + // USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + //connecting clients must supply a valid session cookie at websocket upgrade handshake negotiation time + const char * headerkeys[] = { "Cookie" }; + size_t headerKeyCount = sizeof(headerkeys) / sizeof(char*); + webSocket.onValidateHttpHeader(validateHttpHeader, headerkeys, headerKeyCount); + webSocket.begin(); +} + +void loop() { + webSocket.loop(); +} + diff --git a/lib/LT_WebSockets/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino b/lib/LT_WebSockets/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino new file mode 100644 index 00000000..8f32e753 --- /dev/null +++ b/lib/LT_WebSockets/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino @@ -0,0 +1,121 @@ +/* + * WebSocketServer_LEDcontrol.ino + * + * Created on: 26.11.2015 + * + */ + +#include + +#include +#include +#include +#include +#include +#include + +#define LED_RED 15 +#define LED_GREEN 12 +#define LED_BLUE 13 + +#define USE_SERIAL Serial + + +ESP8266WiFiMulti WiFiMulti; + +ESP8266WebServer server(80); +WebSocketsServer webSocket = WebSocketsServer(81); + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[%u] Disconnected!\n", num); + break; + case WStype_CONNECTED: { + IPAddress ip = webSocket.remoteIP(num); + USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); + + // send message to client + webSocket.sendTXT(num, "Connected"); + } + break; + case WStype_TEXT: + USE_SERIAL.printf("[%u] get Text: %s\n", num, payload); + + if(payload[0] == '#') { + // we get RGB data + + // decode rgb data + uint32_t rgb = (uint32_t) strtol((const char *) &payload[1], NULL, 16); + + analogWrite(LED_RED, ((rgb >> 16) & 0xFF)); + analogWrite(LED_GREEN, ((rgb >> 8) & 0xFF)); + analogWrite(LED_BLUE, ((rgb >> 0) & 0xFF)); + } + + break; + } + +} + +void setup() { + //USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + pinMode(LED_RED, OUTPUT); + pinMode(LED_GREEN, OUTPUT); + pinMode(LED_BLUE, OUTPUT); + + digitalWrite(LED_RED, 1); + digitalWrite(LED_GREEN, 1); + digitalWrite(LED_BLUE, 1); + + WiFiMulti.addAP("SSID", "passpasspass"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // start webSocket server + webSocket.begin(); + webSocket.onEvent(webSocketEvent); + + if(MDNS.begin("esp8266")) { + USE_SERIAL.println("MDNS responder started"); + } + + // handle index + server.on("/", []() { + // send index.html + server.send(200, "text/html", "LED Control:

R:
G:
B:
"); + }); + + server.begin(); + + // Add service to MDNS + MDNS.addService("http", "tcp", 80); + MDNS.addService("ws", "tcp", 81); + + digitalWrite(LED_RED, 0); + digitalWrite(LED_GREEN, 0); + digitalWrite(LED_BLUE, 0); + +} + +void loop() { + webSocket.loop(); + server.handleClient(); +} diff --git a/lib/LT_WebSockets/examples/particle/ParticleWebSocketClient/application.cpp b/lib/LT_WebSockets/examples/particle/ParticleWebSocketClient/application.cpp new file mode 100644 index 00000000..461228f3 --- /dev/null +++ b/lib/LT_WebSockets/examples/particle/ParticleWebSocketClient/application.cpp @@ -0,0 +1,46 @@ +/* To compile using make CLI, create a folder under \firmware\user\applications and copy application.cpp there. +* Then, copy src files under particleWebSocket folder. +*/ + +#include "application.h" +#include "particleWebSocket/WebSocketsClient.h" + +WebSocketsClient webSocket; + +void webSocketEvent(WStype_t type, uint8_t* payload, size_t length) +{ + switch (type) + { + case WStype_DISCONNECTED: + Serial.printlnf("[WSc] Disconnected!"); + break; + case WStype_CONNECTED: + Serial.printlnf("[WSc] Connected to URL: %s", payload); + webSocket.sendTXT("Connected\r\n"); + break; + case WStype_TEXT: + Serial.printlnf("[WSc] get text: %s", payload); + break; + case WStype_BIN: + Serial.printlnf("[WSc] get binary length: %u", length); + break; + } +} + +void setup() +{ + Serial.begin(9600); + + WiFi.setCredentials("[SSID]", "[PASSWORD]", WPA2, WLAN_CIPHER_AES_TKIP); + WiFi.connect(); + + webSocket.begin("192.168.1.153", 85, "/ClientService/?variable=Test1212"); + webSocket.onEvent(webSocketEvent); +} + +void loop() +{ + webSocket.sendTXT("Hello world!"); + delay(500); + webSocket.loop(); +} diff --git a/lib/LT_WebSockets/library.json b/lib/LT_WebSockets/library.json new file mode 100644 index 00000000..0de54214 --- /dev/null +++ b/lib/LT_WebSockets/library.json @@ -0,0 +1,25 @@ +{ + "authors": [ + { + "maintainer": true, + "name": "Markus Sattler", + "url": "https://github.com/Links2004" + } + ], + "description": "WebSocket Server and Client for Arduino based on RFC6455", + "export": { + "exclude": [ + "tests" + ] + }, + "frameworks": "arduino", + "keywords": "wifi, http, web, server, client, websocket", + "license": "LGPL-2.1", + "name": "LT_WebSockets", + "platforms": "atmelavr, espressif8266, espressif32", + "repository": { + "type": "git", + "url": "https://github.com/Links2004/arduinoWebSockets.git" + }, + "version": "2.3.7" +} \ No newline at end of file diff --git a/lib/LT_WebSockets/library.properties b/lib/LT_WebSockets/library.properties new file mode 100644 index 00000000..c6c20a52 --- /dev/null +++ b/lib/LT_WebSockets/library.properties @@ -0,0 +1,9 @@ +name=LT_WebSockets +version=2.3.7 +author=Markus Sattler +maintainer=Markus Sattler +sentence=WebSockets for Arduino (Server + Client) +paragraph=use 2.x.x for ESP and 1.3 for AVR +category=Communication +url=https://github.com/Links2004/arduinoWebSockets +architectures=* diff --git a/lib/LT_WebSockets/src/SocketIOclient.cpp b/lib/LT_WebSockets/src/SocketIOclient.cpp new file mode 100644 index 00000000..bf611953 --- /dev/null +++ b/lib/LT_WebSockets/src/SocketIOclient.cpp @@ -0,0 +1,260 @@ +/* + * SocketIOclient.cpp + * + * Created on: May 12, 2018 + * Author: links + */ + +#include "WebSockets.h" +#include "WebSocketsClient.h" +#include "SocketIOclient.h" + +SocketIOclient::SocketIOclient() { +} + +SocketIOclient::~SocketIOclient() { +} + +void SocketIOclient::begin(const char * host, uint16_t port, const char * url, const char * protocol) { + WebSocketsClient::beginSocketIO(host, port, url, protocol); + WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); +} + +void SocketIOclient::begin(String host, uint16_t port, String url, String protocol) { + WebSocketsClient::beginSocketIO(host, port, url, protocol); + WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); +} +#if defined(HAS_SSL) +void SocketIOclient::beginSSL(const char * host, uint16_t port, const char * url, const char * protocol) { + WebSocketsClient::beginSocketIOSSL(host, port, url, protocol); + WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); +} + +void SocketIOclient::beginSSL(String host, uint16_t port, String url, String protocol) { + WebSocketsClient::beginSocketIOSSL(host, port, url, protocol); + WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); +} +#if defined(SSL_BARESSL) +void SocketIOclient::beginSSLWithCA(const char * host, uint16_t port, const char * url, const char * CA_cert, const char * protocol) { + WebSocketsClient::beginSocketIOSSLWithCA(host, port, url, CA_cert, protocol); + WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); +} + +void SocketIOclient::beginSSLWithCA(const char * host, uint16_t port, const char * url, BearSSL::X509List * CA_cert, const char * protocol) { + WebSocketsClient::beginSocketIOSSLWithCA(host, port, url, CA_cert, protocol); + WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + initClient(); +} + +void SocketIOclient::setSSLClientCertKey(const char * clientCert, const char * clientPrivateKey) { + WebSocketsClient::setSSLClientCertKey(clientCert, clientPrivateKey); +} + +void SocketIOclient::setSSLClientCertKey(BearSSL::X509List * clientCert, BearSSL::PrivateKey * clientPrivateKey) { + WebSocketsClient::setSSLClientCertKey(clientCert, clientPrivateKey); +} + +#endif +#endif + +void SocketIOclient::configureEIOping(bool disableHeartbeat) { + _disableHeartbeat = disableHeartbeat; +} + +void SocketIOclient::initClient(void) { + if(_client.cUrl.indexOf("EIO=4") != -1) { + DEBUG_WEBSOCKETS("[wsIOc] found EIO=4 disable EIO ping on client\n"); + configureEIOping(true); + } +} + +/** + * set callback function + * @param cbEvent SocketIOclientEvent + */ +void SocketIOclient::onEvent(SocketIOclientEvent cbEvent) { + _cbEvent = cbEvent; +} + +bool SocketIOclient::isConnected(void) { + return WebSocketsClient::isConnected(); +} + +void SocketIOclient::setExtraHeaders(const char * extraHeaders) { + return WebSocketsClient::setExtraHeaders(extraHeaders); +} + +void SocketIOclient::setReconnectInterval(unsigned long time) { + return WebSocketsClient::setReconnectInterval(time); +} + +/** + * send text data to client + * @param num uint8_t client id + * @param type socketIOmessageType_t + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool SocketIOclient::send(socketIOmessageType_t type, uint8_t * payload, size_t length, bool headerToPayload) { + bool ret = false; + if(length == 0) { + length = strlen((const char *)payload); + } + if(clientIsConnected(&_client) && _client.status == WSC_CONNECTED) { + if(!headerToPayload) { + // webSocket Header + ret = WebSocketsClient::sendFrameHeader(&_client, WSop_text, length + 2, true); + // Engine.IO / Socket.IO Header + if(ret) { + uint8_t buf[3] = { eIOtype_MESSAGE, type, 0x00 }; + ret = WebSocketsClient::write(&_client, buf, 2); + } + if(ret && payload && length > 0) { + ret = WebSocketsClient::write(&_client, payload, length); + } + return ret; + } else { + // TODO implement + } + } + return false; +} + +bool SocketIOclient::send(socketIOmessageType_t type, const uint8_t * payload, size_t length) { + return send(type, (uint8_t *)payload, length); +} + +bool SocketIOclient::send(socketIOmessageType_t type, char * payload, size_t length, bool headerToPayload) { + return send(type, (uint8_t *)payload, length, headerToPayload); +} + +bool SocketIOclient::send(socketIOmessageType_t type, const char * payload, size_t length) { + return send(type, (uint8_t *)payload, length); +} + +bool SocketIOclient::send(socketIOmessageType_t type, String & payload) { + return send(type, (uint8_t *)payload.c_str(), payload.length()); +} + +/** + * send text data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool SocketIOclient::sendEVENT(uint8_t * payload, size_t length, bool headerToPayload) { + return send(sIOtype_EVENT, payload, length, headerToPayload); +} + +bool SocketIOclient::sendEVENT(const uint8_t * payload, size_t length) { + return sendEVENT((uint8_t *)payload, length); +} + +bool SocketIOclient::sendEVENT(char * payload, size_t length, bool headerToPayload) { + return sendEVENT((uint8_t *)payload, length, headerToPayload); +} + +bool SocketIOclient::sendEVENT(const char * payload, size_t length) { + return sendEVENT((uint8_t *)payload, length); +} + +bool SocketIOclient::sendEVENT(String & payload) { + return sendEVENT((uint8_t *)payload.c_str(), payload.length()); +} + +void SocketIOclient::loop(void) { + WebSocketsClient::loop(); + unsigned long t = millis(); + if(!_disableHeartbeat && (t - _lastHeartbeat) > EIO_HEARTBEAT_INTERVAL) { + _lastHeartbeat = t; + DEBUG_WEBSOCKETS("[wsIOc] send ping\n"); + WebSocketsClient::sendTXT(eIOtype_PING); + } +} + +void SocketIOclient::handleCbEvent(WStype_t type, uint8_t * payload, size_t length) { + switch(type) { + case WStype_DISCONNECTED: + runIOCbEvent(sIOtype_DISCONNECT, NULL, 0); + DEBUG_WEBSOCKETS("[wsIOc] Disconnected!\n"); + break; + case WStype_CONNECTED: { + DEBUG_WEBSOCKETS("[wsIOc] Connected to url: %s\n", payload); + // send message to server when Connected + // Engine.io upgrade confirmation message (required) + WebSocketsClient::sendTXT("2probe"); + WebSocketsClient::sendTXT(eIOtype_UPGRADE); + runIOCbEvent(sIOtype_CONNECT, payload, length); + } break; + case WStype_TEXT: { + if(length < 1) { + break; + } + + engineIOmessageType_t eType = (engineIOmessageType_t)payload[0]; + switch(eType) { + case eIOtype_PING: + payload[0] = eIOtype_PONG; + DEBUG_WEBSOCKETS("[wsIOc] get ping send pong (%s)\n", payload); + WebSocketsClient::sendTXT(payload, length, false); + break; + case eIOtype_PONG: + DEBUG_WEBSOCKETS("[wsIOc] get pong\n"); + break; + case eIOtype_MESSAGE: { + if(length < 2) { + break; + } + socketIOmessageType_t ioType = (socketIOmessageType_t)payload[1]; + uint8_t * data = &payload[2]; + size_t lData = length - 2; + switch(ioType) { + case sIOtype_EVENT: + DEBUG_WEBSOCKETS("[wsIOc] get event (%d): %s\n", lData, data); + break; + case sIOtype_CONNECT: + DEBUG_WEBSOCKETS("[wsIOc] connected (%d): %s\n", lData, data); + return; + case sIOtype_DISCONNECT: + case sIOtype_ACK: + case sIOtype_ERROR: + case sIOtype_BINARY_EVENT: + case sIOtype_BINARY_ACK: + default: + DEBUG_WEBSOCKETS("[wsIOc] Socket.IO Message Type %c (%02X) is not implemented\n", ioType, ioType); + DEBUG_WEBSOCKETS("[wsIOc] get text: %s\n", payload); + break; + } + + runIOCbEvent(ioType, data, lData); + } break; + case eIOtype_OPEN: + case eIOtype_CLOSE: + case eIOtype_UPGRADE: + case eIOtype_NOOP: + default: + DEBUG_WEBSOCKETS("[wsIOc] Engine.IO Message Type %c (%02X) is not implemented\n", eType, eType); + DEBUG_WEBSOCKETS("[wsIOc] get text: %s\n", payload); + break; + } + } break; + case WStype_ERROR: + case WStype_BIN: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + case WStype_PING: + case WStype_PONG: + break; + } +} diff --git a/lib/LT_WebSockets/src/SocketIOclient.h b/lib/LT_WebSockets/src/SocketIOclient.h new file mode 100644 index 00000000..2eccea3d --- /dev/null +++ b/lib/LT_WebSockets/src/SocketIOclient.h @@ -0,0 +1,105 @@ +/** + * SocketIOclient.h + * + * Created on: May 12, 2018 + * Author: links + */ + +#ifndef SOCKETIOCLIENT_H_ +#define SOCKETIOCLIENT_H_ + +#include "WebSockets.h" +#include "WebSocketsClient.h" + +#define EIO_HEARTBEAT_INTERVAL 20000 + +#define EIO_MAX_HEADER_SIZE (WEBSOCKETS_MAX_HEADER_SIZE + 1) +#define SIO_MAX_HEADER_SIZE (EIO_MAX_HEADER_SIZE + 1) + +typedef enum { + eIOtype_OPEN = '0', ///< Sent from the server when a new transport is opened (recheck) + eIOtype_CLOSE = '1', ///< Request the close of this transport but does not shutdown the connection itself. + eIOtype_PING = '2', ///< Sent by the client. Server should answer with a pong packet containing the same data + eIOtype_PONG = '3', ///< Sent by the server to respond to ping packets. + eIOtype_MESSAGE = '4', ///< actual message, client and server should call their callbacks with the data + eIOtype_UPGRADE = '5', ///< Before engine.io switches a transport, it tests, if server and client can communicate over this transport. If this test succeed, the client sends an upgrade packets which requests the server to flush its cache on the old transport and switch to the new transport. + eIOtype_NOOP = '6', ///< A noop packet. Used primarily to force a poll cycle when an incoming websocket connection is received. +} engineIOmessageType_t; + +typedef enum { + sIOtype_CONNECT = '0', + sIOtype_DISCONNECT = '1', + sIOtype_EVENT = '2', + sIOtype_ACK = '3', + sIOtype_ERROR = '4', + sIOtype_BINARY_EVENT = '5', + sIOtype_BINARY_ACK = '6', +} socketIOmessageType_t; + +class SocketIOclient : protected WebSocketsClient { + public: +#ifdef __AVR__ + typedef void (*SocketIOclientEvent)(socketIOmessageType_t type, uint8_t * payload, size_t length); +#else + typedef std::function SocketIOclientEvent; +#endif + + SocketIOclient(void); + virtual ~SocketIOclient(void); + + void begin(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); + void begin(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino"); + +#ifdef HAS_SSL + void beginSSL(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); + void beginSSL(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino"); +#ifndef SSL_AXTLS + void beginSSLWithCA(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * CA_cert = NULL, const char * protocol = "arduino"); + void beginSSLWithCA(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", BearSSL::X509List * CA_cert = NULL, const char * protocol = "arduino"); + void setSSLClientCertKey(const char * clientCert = NULL, const char * clientPrivateKey = NULL); + void setSSLClientCertKey(BearSSL::X509List * clientCert = NULL, BearSSL::PrivateKey * clientPrivateKey = NULL); +#endif +#endif + bool isConnected(void); + + void onEvent(SocketIOclientEvent cbEvent); + + bool sendEVENT(uint8_t * payload, size_t length = 0, bool headerToPayload = false); + bool sendEVENT(const uint8_t * payload, size_t length = 0); + bool sendEVENT(char * payload, size_t length = 0, bool headerToPayload = false); + bool sendEVENT(const char * payload, size_t length = 0); + bool sendEVENT(String & payload); + + bool send(socketIOmessageType_t type, uint8_t * payload, size_t length = 0, bool headerToPayload = false); + bool send(socketIOmessageType_t type, const uint8_t * payload, size_t length = 0); + bool send(socketIOmessageType_t type, char * payload, size_t length = 0, bool headerToPayload = false); + bool send(socketIOmessageType_t type, const char * payload, size_t length = 0); + bool send(socketIOmessageType_t type, String & payload); + + void setExtraHeaders(const char * extraHeaders = NULL); + void setReconnectInterval(unsigned long time); + + void loop(void); + + void configureEIOping(bool disableHeartbeat = false); + + protected: + bool _disableHeartbeat = false; + uint64_t _lastHeartbeat = 0; + SocketIOclientEvent _cbEvent; + virtual void runIOCbEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) { + if(_cbEvent) { + _cbEvent(type, payload, length); + } + } + + void initClient(void); + + // Handeling events from websocket layer + virtual void runCbEvent(WStype_t type, uint8_t * payload, size_t length) { + handleCbEvent(type, payload, length); + } + void handleCbEvent(WStype_t type, uint8_t * payload, size_t length); +}; + +#endif /* SOCKETIOCLIENT_H_ */ diff --git a/lib/LT_WebSockets/src/WebSockets.cpp b/lib/LT_WebSockets/src/WebSockets.cpp new file mode 100644 index 00000000..888981b4 --- /dev/null +++ b/lib/LT_WebSockets/src/WebSockets.cpp @@ -0,0 +1,776 @@ +/** + * @file WebSockets.cpp + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "WebSockets.h" + +#ifdef ESP8266 +#include +#endif + +extern "C" { +#if defined CORE_HAS_LIBB64 || defined LIBRETINY +#include +#else +#include "libb64/cencode_inc.h" +#endif +} + +#ifdef ESP8266 +#include +#elif defined(ESP32) +#include + +#if ESP_IDF_VERSION_MAJOR >= 4 +#if(ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(1, 0, 6)) +#include "sha/sha_parallel_engine.h" +#else +#include +#endif +#else +#include +#endif + +#else + +#if defined LIBRETINY +extern "C" { +#include +#include +} +#else +extern "C" { +#include "libsha1/libsha1.h" +} +#endif +#endif + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param code uint16_t see RFC + * @param reason ptr to the disconnect reason message + * @param reasonLen length of the disconnect reason message + */ +void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] clientDisconnect code: %u\n", client->num, code); + if(client->status == WSC_CONNECTED && code) { + if(reason) { + sendFrame(client, WSop_close, (uint8_t *)reason, reasonLen); + } else { + uint8_t buffer[2]; + buffer[0] = ((code >> 8) & 0xFF); + buffer[1] = (code & 0xFF); + sendFrame(client, WSop_close, &buffer[0], 2); + } + } + clientDisconnect(client); +} + +/** + * + * @param buf uint8_t * ptr to the buffer for writing + * @param opcode WSopcode_t + * @param length size_t length of the payload + * @param mask bool add dummy mask to the frame (needed for web browser) + * @param maskkey uint8_t[4] key used for payload + * @param fin bool can be used to send data in more then one frame (set fin on the last frame) + */ +uint8_t WebSockets::createHeader(uint8_t * headerPtr, WSopcode_t opcode, size_t length, bool mask, uint8_t maskKey[4], bool fin) { + uint8_t headerSize; + // calculate header Size + if(length < 126) { + headerSize = 2; + } else if(length < 0xFFFF) { + headerSize = 4; + } else { + headerSize = 10; + } + + if(mask) { + headerSize += 4; + } + + // create header + + // byte 0 + *headerPtr = 0x00; + if(fin) { + *headerPtr |= bit(7); ///< set Fin + } + *headerPtr |= opcode; ///< set opcode + headerPtr++; + + // byte 1 + *headerPtr = 0x00; + if(mask) { + *headerPtr |= bit(7); ///< set mask + } + + if(length < 126) { + *headerPtr |= length; + headerPtr++; + } else if(length < 0xFFFF) { + *headerPtr |= 126; + headerPtr++; + *headerPtr = ((length >> 8) & 0xFF); + headerPtr++; + *headerPtr = (length & 0xFF); + headerPtr++; + } else { + // Normally we never get here (to less memory) + *headerPtr |= 127; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = 0x00; + headerPtr++; + *headerPtr = ((length >> 24) & 0xFF); + headerPtr++; + *headerPtr = ((length >> 16) & 0xFF); + headerPtr++; + *headerPtr = ((length >> 8) & 0xFF); + headerPtr++; + *headerPtr = (length & 0xFF); + headerPtr++; + } + + if(mask) { + *headerPtr = maskKey[0]; + headerPtr++; + *headerPtr = maskKey[1]; + headerPtr++; + *headerPtr = maskKey[2]; + headerPtr++; + *headerPtr = maskKey[3]; + headerPtr++; + } + return headerSize; +} + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param opcode WSopcode_t + * @param length size_t length of the payload + * @param fin bool can be used to send data in more then one frame (set fin on the last frame) + * @return true if ok + */ +bool WebSockets::sendFrameHeader(WSclient_t * client, WSopcode_t opcode, size_t length, bool fin) { + uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 }; + uint8_t buffer[WEBSOCKETS_MAX_HEADER_SIZE] = { 0 }; + + uint8_t headerSize = createHeader(&buffer[0], opcode, length, client->cIsClient, maskKey, fin); + + if(write(client, &buffer[0], headerSize) != headerSize) { + return false; + } + + return true; +} + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param opcode WSopcode_t + * @param payload uint8_t * ptr to the payload + * @param length size_t length of the payload + * @param fin bool can be used to send data in more then one frame (set fin on the last frame) + * @param headerToPayload bool set true if the payload has reserved 14 Byte at the beginning to dynamically add the Header (payload neet to be in RAM!) + * @return true if ok + */ +bool WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin, bool headerToPayload) { + if(client->tcp && !client->tcp->connected()) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num); + return false; + } + + if(client->status != WSC_CONNECTED) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num); + return false; + } + + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] ------- send message frame -------\n", client->num); + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] fin: %u opCode: %u mask: %u length: %u headerToPayload: %u\n", client->num, fin, opcode, client->cIsClient, length, headerToPayload); + + if(opcode == WSop_text) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0))); + } + + uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 }; + uint8_t buffer[WEBSOCKETS_MAX_HEADER_SIZE] = { 0 }; + + uint8_t headerSize; + uint8_t * headerPtr; + uint8_t * payloadPtr = payload; + bool useInternBuffer = false; + bool ret = true; + + // calculate header Size + if(length < 126) { + headerSize = 2; + } else if(length < 0xFFFF) { + headerSize = 4; + } else { + headerSize = 10; + } + + if(client->cIsClient) { + headerSize += 4; + } + +#ifdef WEBSOCKETS_USE_BIG_MEM + // only for ESP since AVR has less HEAP + // try to send data in one TCP package (only if some free Heap is there) + if(!headerToPayload && ((length > 0) && (length < 1400)) && (GET_FREE_HEAP > 6000)) { + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num); + uint8_t * dataPtr = (uint8_t *)malloc(length + WEBSOCKETS_MAX_HEADER_SIZE); + if(dataPtr) { + memcpy((dataPtr + WEBSOCKETS_MAX_HEADER_SIZE), payload, length); + headerToPayload = true; + useInternBuffer = true; + payloadPtr = dataPtr; + } + } +#endif + + // set Header Pointer + if(headerToPayload) { + // calculate offset in payload + headerPtr = (payloadPtr + (WEBSOCKETS_MAX_HEADER_SIZE - headerSize)); + } else { + headerPtr = &buffer[0]; + } + + if(client->cIsClient && useInternBuffer) { + // if we use a Intern Buffer we can modify the data + // by this fact its possible the do the masking + for(uint8_t x = 0; x < sizeof(maskKey); x++) { + maskKey[x] = random(0xFF); + } + } + + createHeader(headerPtr, opcode, length, client->cIsClient, maskKey, fin); + + if(client->cIsClient && useInternBuffer) { + uint8_t * dataMaskPtr; + + if(headerToPayload) { + dataMaskPtr = (payloadPtr + WEBSOCKETS_MAX_HEADER_SIZE); + } else { + dataMaskPtr = payloadPtr; + } + + for(size_t x = 0; x < length; x++) { + dataMaskPtr[x] = (dataMaskPtr[x] ^ maskKey[x % 4]); + } + } + +#ifndef NODEBUG_WEBSOCKETS + unsigned long start = micros(); +#endif + + if(headerToPayload) { + // header has be added to payload + // payload is forced to reserved 14 Byte but we may not need all based on the length and mask settings + // offset in payload is calculatetd 14 - headerSize + if(write(client, &payloadPtr[(WEBSOCKETS_MAX_HEADER_SIZE - headerSize)], (length + headerSize)) != (length + headerSize)) { + ret = false; + } + } else { + // send header + if(write(client, &buffer[0], headerSize) != headerSize) { + ret = false; + } + + if(payloadPtr && length > 0) { + // send payload + if(write(client, &payloadPtr[0], length) != length) { + ret = false; + } + } + } + + DEBUG_WEBSOCKETS("[WS][%d][sendFrame] sending Frame Done (%luus).\n", client->num, (micros() - start)); + +#ifdef WEBSOCKETS_USE_BIG_MEM + if(useInternBuffer && payloadPtr) { + free(payloadPtr); + } +#endif + + return ret; +} + +/** + * callen when HTTP header is done + * @param client WSclient_t * ptr to the client struct + */ +void WebSockets::headerDone(WSclient_t * client) { + client->status = WSC_CONNECTED; + client->cWsRXsize = 0; + DEBUG_WEBSOCKETS("[WS][%d][headerDone] Header Handling Done.\n", client->num); +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->cHttpLine = ""; + handleWebsocket(client); +#endif +} + +/** + * handle the WebSocket stream + * @param client WSclient_t * ptr to the client struct + */ +void WebSockets::handleWebsocket(WSclient_t * client) { + if(client->cWsRXsize == 0) { + handleWebsocketCb(client); + } +} + +/** + * wait for + * @param client + * @param size + */ +bool WebSockets::handleWebsocketWaitFor(WSclient_t * client, size_t size) { + if(!client->tcp || !client->tcp->connected()) { + return false; + } + + if(size > WEBSOCKETS_MAX_HEADER_SIZE) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor] size: %d too big!\n", client->num, size); + return false; + } + + if(client->cWsRXsize >= size) { + return true; + } + + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor] size: %d cWsRXsize: %d\n", client->num, size, client->cWsRXsize); + readCb(client, &client->cWsHeader[client->cWsRXsize], (size - client->cWsRXsize), std::bind([](WebSockets * server, size_t size, WSclient_t * client, bool ok) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor][readCb] size: %d ok: %d\n", client->num, size, ok); + if(ok) { + client->cWsRXsize = size; + server->handleWebsocketCb(client); + } else { + DEBUG_WEBSOCKETS("[WS][%d][readCb] failed.\n", client->num); + client->cWsRXsize = 0; + // timeout or error + server->clientDisconnect(client, 1002); + } + }, + this, size, std::placeholders::_1, std::placeholders::_2)); + return false; +} + +void WebSockets::handleWebsocketCb(WSclient_t * client) { + if(!client->tcp || !client->tcp->connected()) { + return; + } + + uint8_t * buffer = client->cWsHeader; + + WSMessageHeader_t * header = &client->cWsHeaderDecode; + uint8_t * payload = NULL; + + uint8_t headerLen = 2; + + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + + // split first 2 bytes in the data + header->fin = ((*buffer >> 7) & 0x01); + header->rsv1 = ((*buffer >> 6) & 0x01); + header->rsv2 = ((*buffer >> 5) & 0x01); + header->rsv3 = ((*buffer >> 4) & 0x01); + header->opCode = (WSopcode_t)(*buffer & 0x0F); + buffer++; + + header->mask = ((*buffer >> 7) & 0x01); + header->payloadLen = (WSopcode_t)(*buffer & 0x7F); + buffer++; + + if(header->payloadLen == 126) { + headerLen += 2; + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + header->payloadLen = buffer[0] << 8 | buffer[1]; + buffer += 2; + } else if(header->payloadLen == 127) { + headerLen += 8; + // read 64bit integer as length + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + + if(buffer[0] != 0 || buffer[1] != 0 || buffer[2] != 0 || buffer[3] != 0) { + // really too big! + header->payloadLen = 0xFFFFFFFF; + } else { + header->payloadLen = buffer[4] << 24 | buffer[5] << 16 | buffer[6] << 8 | buffer[7]; + } + buffer += 8; + } + + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num); + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n", client->num, header->fin, header->rsv1, header->rsv2, header->rsv3, header->opCode); + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] mask: %u payloadLen: %u\n", client->num, header->mask, header->payloadLen); + + if(header->payloadLen > WEBSOCKETS_MAX_DATA_SIZE) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload too big! (%u)\n", client->num, header->payloadLen); + clientDisconnect(client, 1009); + return; + } + + if(header->mask) { + headerLen += 4; + if(!handleWebsocketWaitFor(client, headerLen)) { + return; + } + header->maskKey = buffer; + buffer += 4; + } + + if(header->payloadLen > 0) { + // if text data we need one more + payload = (uint8_t *)malloc(header->payloadLen + 1); + + if(!payload) { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, header->payloadLen); + clientDisconnect(client, 1011); + return; + } + readCb(client, payload, header->payloadLen, std::bind(&WebSockets::handleWebsocketPayloadCb, this, std::placeholders::_1, std::placeholders::_2, payload)); + } else { + handleWebsocketPayloadCb(client, true, NULL); + } +} + +void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * payload) { + WSMessageHeader_t * header = &client->cWsHeaderDecode; + if(ok) { + if(header->payloadLen > 0) { + payload[header->payloadLen] = 0x00; + + if(header->mask) { + // decode XOR + for(size_t i = 0; i < header->payloadLen; i++) { + payload[i] = (payload[i] ^ header->maskKey[i % 4]); + } + } + } + + switch(header->opCode) { + case WSop_text: + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); + // no break here! + case WSop_binary: + case WSop_continuation: + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_ping: + // send pong back + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ping received (%s)\n", client->num, payload ? (const char *)payload : ""); + sendFrame(client, WSop_pong, payload, header->payloadLen); + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_pong: + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload ? (const char *)payload : ""); + client->pongReceived = true; + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_close: { +#ifndef NODEBUG_WEBSOCKETS + uint16_t reasonCode = 1000; + if(header->payloadLen >= 2) { + reasonCode = payload[0] << 8 | payload[1]; + } +#endif + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d\n", client->num, reasonCode); + if(header->payloadLen > 2) { + DEBUG_WEBSOCKETS(" (%s)\n", (payload + 2)); + } else { + DEBUG_WEBSOCKETS("\n"); + } + clientDisconnect(client, 1000); + } break; + default: + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] got unknown opcode: %d\n", client->num, header->opCode); + clientDisconnect(client, 1002); + break; + } + + if(payload) { + free(payload); + } + + // reset input + client->cWsRXsize = 0; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + // register callback for next message + handleWebsocketWaitFor(client, 2); +#endif + + } else { + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num); + free(payload); + clientDisconnect(client, 1002); + } +} + +/** + * generate the key for Sec-WebSocket-Accept + * @param clientKey String + * @return String Accept Key + */ +String WebSockets::acceptKey(String & clientKey) { + uint8_t sha1HashBin[20] = { 0 }; +#ifdef ESP8266 + sha1(clientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", &sha1HashBin[0]); +#elif defined(ESP32) + String data = clientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + esp_sha(SHA1, (unsigned char *)data.c_str(), data.length(), &sha1HashBin[0]); +#else + clientKey += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + SHA1_CTX ctx; + SHA1Init(&ctx); + SHA1Update(&ctx, (const unsigned char *)clientKey.c_str(), clientKey.length()); + SHA1Final(&sha1HashBin[0], &ctx); +#endif + + String key = base64_encode(sha1HashBin, 20); + key.trim(); + + return key; +} + +/** + * base64_encode + * @param data uint8_t * + * @param length size_t + * @return base64 encoded String + */ +String WebSockets::base64_encode(uint8_t * data, size_t length) { + size_t size = ((length * 1.6f) + 1); + char * buffer = (char *)malloc(size); + if(buffer) { + base64_encodestate _state; + base64_init_encodestate(&_state); + int len = base64_encode_block((const char *)&data[0], length, &buffer[0], &_state); + len = base64_encode_blockend((buffer + len), &_state); + + String base64 = String(buffer); + free(buffer); + return base64; + } + return String("-FAIL-"); +} + +/** + * read x byte from tcp or get timeout + * @param client WSclient_t * + * @param out uint8_t * data buffer + * @param n size_t byte count + * @return true if ok + */ +bool WebSockets::readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWaitCb cb) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + if(!client->tcp || !client->tcp->connected()) { + return false; + } + + client->tcp->readBytes(out, n, std::bind([](WSclient_t * client, bool ok, WSreadWaitCb cb) { + if(cb) { + cb(client, ok); + } + }, + client, std::placeholders::_1, cb)); + +#else + unsigned long t = millis(); + ssize_t len; + DEBUG_WEBSOCKETS("[readCb] n: %zu t: %lu\n", n, t); + while(n > 0) { + if(client->tcp == NULL) { + DEBUG_WEBSOCKETS("[readCb] tcp is null!\n"); + if(cb) { + cb(client, false); + } + return false; + } + + if(!client->tcp->connected()) { + DEBUG_WEBSOCKETS("[readCb] not connected!\n"); + if(cb) { + cb(client, false); + } + return false; + } + + if((millis() - t) > WEBSOCKETS_TCP_TIMEOUT) { + DEBUG_WEBSOCKETS("[readCb] receive TIMEOUT! %lu\n", (millis() - t)); + if(cb) { + cb(client, false); + } + return false; + } + + if(!client->tcp->available()) { + WEBSOCKETS_YIELD_MORE(); + continue; + } + + len = client->tcp->read((uint8_t *)out, n); + if(len > 0) { + t = millis(); + out += len; + n -= len; + // DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); + } else { + // DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); + } + if(n > 0) { + WEBSOCKETS_YIELD(); + } + } + if(cb) { + cb(client, true); + } + WEBSOCKETS_YIELD(); +#endif + return true; +} + +/** + * write x byte to tcp or get timeout + * @param client WSclient_t * + * @param out uint8_t * data buffer + * @param n size_t byte count + * @return bytes send + */ +size_t WebSockets::write(WSclient_t * client, uint8_t * out, size_t n) { + if(out == NULL) + return 0; + if(client == NULL) + return 0; + unsigned long t = millis(); + size_t len = 0; + size_t total = 0; + DEBUG_WEBSOCKETS("[write] n: %zu t: %lu\n", n, t); + while(n > 0) { + if(client->tcp == NULL) { + DEBUG_WEBSOCKETS("[write] tcp is null!\n"); + break; + } + + if(!client->tcp->connected()) { + DEBUG_WEBSOCKETS("[write] not connected!\n"); + break; + } + + if((millis() - t) > WEBSOCKETS_TCP_TIMEOUT) { + DEBUG_WEBSOCKETS("[write] write TIMEOUT! %lu\n", (millis() - t)); + break; + } + + len = client->tcp->write((const uint8_t *)out, n); + if(len) { + t = millis(); + out += len; + n -= len; + total += len; + // DEBUG_WEBSOCKETS("write %d left %d!\n", len, n); + } else { + DEBUG_WEBSOCKETS("WS write %d failed left %d!\n", len, n); + } + if(n > 0) { + WEBSOCKETS_YIELD(); + } + } + WEBSOCKETS_YIELD(); + return total; +} + +size_t WebSockets::write(WSclient_t * client, const char * out) { + if(client == NULL) + return 0; + if(out == NULL) + return 0; + return write(client, (uint8_t *)out, strlen(out)); +} + +/** + * enable ping/pong heartbeat process + * @param client WSclient_t * + * @param pingInterval uint32_t how often ping will be sent + * @param pongTimeout uint32_t millis after which pong should timout if not received + * @param disconnectTimeoutCount uint8_t how many timeouts before disconnect, 0=> do not disconnect + */ +void WebSockets::enableHeartbeat(WSclient_t * client, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { + if(client == NULL) + return; + client->pingInterval = pingInterval; + client->pongTimeout = pongTimeout; + client->disconnectTimeoutCount = disconnectTimeoutCount; + client->pongReceived = false; +} + +/** + * handle ping/pong heartbeat timeout process + * @param client WSclient_t * + */ +void WebSockets::handleHBTimeout(WSclient_t * client) { + if(client->pingInterval) { // if heartbeat is enabled + uint32_t pi = millis() - client->lastPing; + + if(client->pongReceived) { + client->pongTimeoutCount = 0; + } else { + if(pi > client->pongTimeout) { // pong not received in time + client->pongTimeoutCount++; + client->lastPing = millis() - client->pingInterval - 500; // force ping on the next run + + DEBUG_WEBSOCKETS("[HBtimeout] pong TIMEOUT! lp=%d millis=%d pi=%d count=%d\n", client->lastPing, millis(), pi, client->pongTimeoutCount); + + if(client->disconnectTimeoutCount && client->pongTimeoutCount >= client->disconnectTimeoutCount) { + DEBUG_WEBSOCKETS("[HBtimeout] count=%d, DISCONNECTING\n", client->pongTimeoutCount); + clientDisconnect(client); + } + } + } + } +} + +#ifdef LIBRETINY +void randomSeed(unsigned long seed) +{ + if (seed != 0) { + srand(seed); + } +} +#endif diff --git a/lib/LT_WebSockets/src/WebSockets.h b/lib/LT_WebSockets/src/WebSockets.h new file mode 100644 index 00000000..9867d919 --- /dev/null +++ b/lib/LT_WebSockets/src/WebSockets.h @@ -0,0 +1,379 @@ +/** + * @file WebSockets.h + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef WEBSOCKETS_H_ +#define WEBSOCKETS_H_ + +#ifdef STM32_DEVICE +#include +#define bit(b) (1UL << (b)) // Taken directly from Arduino.h +#else +#include +#include +#endif + +#ifdef ARDUINO_ARCH_AVR +#error Version 2.x.x currently does not support Arduino with AVR since there is no support for std namespace of c++. +#error Use Version 1.x.x. (ATmega branch) +#else +#include +#endif + +#include "WebSocketsVersion.h" + +#ifndef NODEBUG_WEBSOCKETS +#ifdef DEBUG_ESP_PORT +#define DEBUG_WEBSOCKETS(...) \ + { \ + DEBUG_ESP_PORT.printf(__VA_ARGS__); \ + DEBUG_ESP_PORT.flush(); \ + } +#else +//#define DEBUG_WEBSOCKETS(...) os_printf( __VA_ARGS__ ) +#endif +#endif + +#ifndef DEBUG_WEBSOCKETS +#define DEBUG_WEBSOCKETS(...) +#ifndef NODEBUG_WEBSOCKETS +#define NODEBUG_WEBSOCKETS +#endif +#endif + +#if defined(ESP8266) || defined(ESP32) + +#define WEBSOCKETS_MAX_DATA_SIZE (15 * 1024) +#define WEBSOCKETS_USE_BIG_MEM +#define GET_FREE_HEAP ESP.getFreeHeap() +// moves all Header strings to Flash (~300 Byte) +//#define WEBSOCKETS_SAVE_RAM + +#if defined(ESP8266) +#define WEBSOCKETS_YIELD() delay(0) +#define WEBSOCKETS_YIELD_MORE() delay(1) +#elif defined(ESP32) +#define WEBSOCKETS_YIELD() yield() +#define WEBSOCKETS_YIELD_MORE() delay(1) +#endif + +#elif defined(STM32_DEVICE) + +#define WEBSOCKETS_MAX_DATA_SIZE (15 * 1024) +#define WEBSOCKETS_USE_BIG_MEM +#define GET_FREE_HEAP System.freeMemory() +#define WEBSOCKETS_YIELD() +#define WEBSOCKETS_YIELD_MORE() +#else + +// atmega328p has only 2KB ram! +#define WEBSOCKETS_MAX_DATA_SIZE (1024) +// moves all Header strings to Flash +#define WEBSOCKETS_SAVE_RAM +#define WEBSOCKETS_YIELD() +#define WEBSOCKETS_YIELD_MORE() +#endif + +#define WEBSOCKETS_TCP_TIMEOUT (5000) + +#define NETWORK_ESP8266_ASYNC (0) +#define NETWORK_ESP8266 (1) +#define NETWORK_W5100 (2) +#define NETWORK_ENC28J60 (3) +#define NETWORK_ESP32 (4) +#define NETWORK_ESP32_ETH (5) + +// max size of the WS Message Header +#define WEBSOCKETS_MAX_HEADER_SIZE (14) + +#if !defined(WEBSOCKETS_NETWORK_TYPE) +// select Network type based +#if defined(ESP8266) || defined(ESP31B) +#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266 +//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266_ASYNC +//#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 + +#elif defined(ESP32) +#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32 +//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32_ETH +#elif defined(LIBRETINY) +#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266 +#else +#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 + +#endif +#endif + +// Includes and defined based on Network Type +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + +// Note: +// No SSL/WSS support for client in Async mode +// TLS lib need a sync interface! + +#if defined(ESP8266) +#include +#elif defined(ESP32) +#include +#include +#define SSL_AXTLS +#elif defined(ESP31B) +#include +#else +#error "network type ESP8266 ASYNC only possible on the ESP mcu!" +#endif + +#include +#include +#define WEBSOCKETS_NETWORK_CLASS AsyncTCPbuffer +#define WEBSOCKETS_NETWORK_SERVER_CLASS AsyncServer + + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) && !defined(LIBRETINY) +#if !defined(ESP8266) && !defined(ESP31B) +#error "network type ESP8266 only possible on the ESP mcu!" +#endif + +#if defined(ESP8266) +#include +#if defined(wificlientbearssl_h) && !defined(USING_AXTLS) && !defined(wificlientsecure_h) +#define SSL_BARESSL +#else +#define SSL_AXTLS +#endif +#else +#include +#endif + +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SSL_CLASS WiFiClientSecure +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) + +#ifdef STM32_DEVICE +#define WEBSOCKETS_NETWORK_CLASS TCPClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS TCPServer +#endif + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ENC28J60) + +#include +#define WEBSOCKETS_NETWORK_CLASS UIPClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS UIPServer + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + +#include +#include +#define SSL_AXTLS +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SSL_CLASS WiFiClientSecure +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32_ETH) + +#include +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + +#elif defined(LIBRETINY) +//#include +//#include +//#define WEBSOCKETS_NETWORK_CLASS EthernetClient +//#define WEBSOCKETS_NETWORK_SERVER_CLASS EthernetServer +//#if defined(LIBRETINY) +typedef struct SHA1Context SHA1_CTX; +#include +//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266 +//#include +//#define SSL_AXTLS +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +//#define WEBSOCKETS_NETWORK_SSL_CLASS WiFiClientSecure +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer +//#endif +#else +#error "no network type selected!" +#endif + +#ifdef WEBSOCKETS_NETWORK_SSL_CLASS +#define HAS_SSL +#endif + +// moves all Header strings to Flash (~300 Byte) +#ifdef WEBSOCKETS_SAVE_RAM +#define WEBSOCKETS_STRING(var) F(var) +#else +#define WEBSOCKETS_STRING(var) var +#endif + +typedef enum { + WSC_NOT_CONNECTED, + WSC_HEADER, + WSC_BODY, + WSC_CONNECTED +} WSclientsStatus_t; + +typedef enum { + WStype_ERROR, + WStype_DISCONNECTED, + WStype_CONNECTED, + WStype_TEXT, + WStype_BIN, + WStype_FRAGMENT_TEXT_START, + WStype_FRAGMENT_BIN_START, + WStype_FRAGMENT, + WStype_FRAGMENT_FIN, + WStype_PING, + WStype_PONG, +} WStype_t; + +typedef enum { + WSop_continuation = 0x00, ///< %x0 denotes a continuation frame + WSop_text = 0x01, ///< %x1 denotes a text frame + WSop_binary = 0x02, ///< %x2 denotes a binary frame + ///< %x3-7 are reserved for further non-control frames + WSop_close = 0x08, ///< %x8 denotes a connection close + WSop_ping = 0x09, ///< %x9 denotes a ping + WSop_pong = 0x0A ///< %xA denotes a pong + ///< %xB-F are reserved for further control frames +} WSopcode_t; + +typedef struct { + bool fin; + bool rsv1; + bool rsv2; + bool rsv3; + + WSopcode_t opCode; + bool mask; + + size_t payloadLen; + + uint8_t * maskKey; +} WSMessageHeader_t; + +typedef struct { + void init(uint8_t num, + uint32_t pingInterval, + uint32_t pongTimeout, + uint8_t disconnectTimeoutCount) { + this->num = num; + this->pingInterval = pingInterval; + this->pongTimeout = pongTimeout; + this->disconnectTimeoutCount = disconnectTimeoutCount; + } + + uint8_t num = 0; ///< connection number + + WSclientsStatus_t status = WSC_NOT_CONNECTED; + + WEBSOCKETS_NETWORK_CLASS * tcp = nullptr; + + bool isSocketIO = false; ///< client for socket.io server + +#if defined(HAS_SSL) + bool isSSL = false; ///< run in ssl mode + WEBSOCKETS_NETWORK_SSL_CLASS * ssl; +#endif + + String cUrl; ///< http url + uint16_t cCode = 0; ///< http code + + bool cIsClient = false; ///< will be used for masking + bool cIsUpgrade = false; ///< Connection == Upgrade + bool cIsWebsocket = false; ///< Upgrade == websocket + + String cSessionId; ///< client Set-Cookie (session id) + String cKey; ///< client Sec-WebSocket-Key + String cAccept; ///< client Sec-WebSocket-Accept + String cProtocol; ///< client Sec-WebSocket-Protocol + String cExtensions; ///< client Sec-WebSocket-Extensions + uint16_t cVersion = 0; ///< client Sec-WebSocket-Version + + uint8_t cWsRXsize = 0; ///< State of the RX + uint8_t cWsHeader[WEBSOCKETS_MAX_HEADER_SIZE]; ///< RX WS Message buffer + WSMessageHeader_t cWsHeaderDecode; + + String base64Authorization; ///< Base64 encoded Auth request + String plainAuthorization; ///< Base64 encoded Auth request + + String extraHeaders; + + bool cHttpHeadersValid = false; ///< non-websocket http header validity indicator + size_t cMandatoryHeadersCount; ///< non-websocket mandatory http headers present count + + bool pongReceived = false; + uint32_t pingInterval = 0; // how often ping will be sent, 0 means "heartbeat is not active" + uint32_t lastPing = 0; // millis when last pong has been received + uint32_t pongTimeout = 0; // interval in millis after which pong is considered to timeout + uint8_t disconnectTimeoutCount = 0; // after how many subsequent pong timeouts discconnect will happen, 0 means "do not disconnect" + uint8_t pongTimeoutCount = 0; // current pong timeout count + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + String cHttpLine; ///< HTTP header lines +#endif + +} WSclient_t; + +class WebSockets { + protected: +#ifdef __AVR__ + typedef void (*WSreadWaitCb)(WSclient_t * client, bool ok); +#else + typedef std::function WSreadWaitCb; +#endif + + virtual void clientDisconnect(WSclient_t * client) = 0; + virtual bool clientIsConnected(WSclient_t * client) = 0; + + void clientDisconnect(WSclient_t * client, uint16_t code, char * reason = NULL, size_t reasonLen = 0); + + virtual void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin) = 0; + + uint8_t createHeader(uint8_t * buf, WSopcode_t opcode, size_t length, bool mask, uint8_t maskKey[4], bool fin); + bool sendFrameHeader(WSclient_t * client, WSopcode_t opcode, size_t length = 0, bool fin = true); + bool sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload = NULL, size_t length = 0, bool fin = true, bool headerToPayload = false); + + void headerDone(WSclient_t * client); + + void handleWebsocket(WSclient_t * client); + + bool handleWebsocketWaitFor(WSclient_t * client, size_t size); + void handleWebsocketCb(WSclient_t * client); + void handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * payload); + + String acceptKey(String & clientKey); + String base64_encode(uint8_t * data, size_t length); + + bool readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWaitCb cb); + virtual size_t write(WSclient_t * client, uint8_t * out, size_t n); + size_t write(WSclient_t * client, const char * out); + + void enableHeartbeat(WSclient_t * client, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount); + void handleHBTimeout(WSclient_t * client); +}; + +#ifndef UNUSED +#define UNUSED(var) (void)(var) +#endif +#endif /* WEBSOCKETS_H_ */ diff --git a/lib/LT_WebSockets/src/WebSockets4WebServer.h b/lib/LT_WebSockets/src/WebSockets4WebServer.h new file mode 100644 index 00000000..a542f1ea --- /dev/null +++ b/lib/LT_WebSockets/src/WebSockets4WebServer.h @@ -0,0 +1,80 @@ +/** + * @file WebSocketsServer.cpp + * @date 28.10.2020 + * @author Markus Sattler & esp8266/arduino community + * + * Copyright (c) 2020 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __WEBSOCKETS4WEBSERVER_H +#define __WEBSOCKETS4WEBSERVER_H + +#include +#include + +#if WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266 && WEBSERVER_HAS_HOOK + +class WebSockets4WebServer : public WebSocketsServerCore { + public: + WebSockets4WebServer(const String & origin = "", const String & protocol = "arduino") + : WebSocketsServerCore(origin, protocol) { + begin(); + } + + ESP8266WebServer::HookFunction hookForWebserver(const String & wsRootDir, WebSocketServerEvent event) { + onEvent(event); + + return [&, wsRootDir](const String & method, const String & url, WiFiClient * tcpClient, ESP8266WebServer::ContentTypeFunction contentType) { + (void)contentType; + + if(!(method == "GET" && url.indexOf(wsRootDir) == 0)) { + return ESP8266WebServer::CLIENT_REQUEST_CAN_CONTINUE; + } + + // allocate a WiFiClient copy (like in WebSocketsServer::handleNewClients()) + WEBSOCKETS_NETWORK_CLASS * newTcpClient = new WEBSOCKETS_NETWORK_CLASS(*tcpClient); + + // Then initialize a new WSclient_t (like in WebSocketsServer::handleNewClient()) + WSclient_t * client = handleNewClient(newTcpClient); + + if(client) { + // give "GET " + String headerLine; + headerLine.reserve(url.length() + 5); + headerLine = "GET "; + headerLine += url; + handleHeader(client, &headerLine); + } + + // tell webserver to not close but forget about this client + return ESP8266WebServer::CLIENT_IS_GIVEN; + }; + } +}; +#else // WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266 && WEBSERVER_HAS_HOOK + +#ifndef WEBSERVER_HAS_HOOK +#error Your current Framework / Arduino core version does not support Webserver Hook Functions +#else +#error Your Hardware Platform does not support Webserver Hook Functions +#endif + +#endif // WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266 && WEBSERVER_HAS_HOOK + +#endif // __WEBSOCKETS4WEBSERVER_H diff --git a/lib/LT_WebSockets/src/WebSocketsClient.cpp b/lib/LT_WebSockets/src/WebSocketsClient.cpp new file mode 100644 index 00000000..60e38f5c --- /dev/null +++ b/lib/LT_WebSockets/src/WebSocketsClient.cpp @@ -0,0 +1,980 @@ +/** + * @file WebSocketsClient.cpp + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "WebSockets.h" +#include "WebSocketsClient.h" + +WebSocketsClient::WebSocketsClient() { + _cbEvent = NULL; + _client.num = 0; + _client.cIsClient = true; + _client.extraHeaders = WEBSOCKETS_STRING("Origin: file://"); + _reconnectInterval = 500; + _port = 0; + _host = ""; +} + +WebSocketsClient::~WebSocketsClient() { + disconnect(); +} + +/** + * calles to init the Websockets server + */ +void WebSocketsClient::begin(const char * host, uint16_t port, const char * url, const char * protocol) { + _host = host; + _port = port; +#if defined(HAS_SSL) + _fingerprint = SSL_FINGERPRINT_NULL; + _CA_cert = NULL; +#endif + + _client.num = 0; + _client.status = WSC_NOT_CONNECTED; + _client.tcp = NULL; +#if defined(HAS_SSL) + _client.isSSL = false; + _client.ssl = NULL; +#endif + _client.cUrl = url; + _client.cCode = 0; + _client.cIsUpgrade = false; + _client.cIsWebsocket = true; + _client.cKey = ""; + _client.cAccept = ""; + _client.cProtocol = protocol; + _client.cExtensions = ""; + _client.cVersion = 0; + _client.base64Authorization = ""; + _client.plainAuthorization = ""; + _client.isSocketIO = false; + + _client.lastPing = 0; + _client.pongReceived = false; + _client.pongTimeoutCount = 0; + +#ifdef ESP8266 + randomSeed(RANDOM_REG32); +#else + // todo find better seed + randomSeed(millis()); +#endif +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + asyncConnect(); +#endif + + _lastConnectionFail = 0; + _lastHeaderSent = 0; + + DEBUG_WEBSOCKETS("[WS-Client] Websocket Version: " WEBSOCKETS_VERSION "\n"); +} + +void WebSocketsClient::begin(String host, uint16_t port, String url, String protocol) { + begin(host.c_str(), port, url.c_str(), protocol.c_str()); +} + +#ifndef LIBRETINY +void WebSocketsClient::begin(IPAddress host, uint16_t port, const char * url, const char * protocol) { + return begin(host.toString().c_str(), port, url, protocol); +} +#endif + +#if defined(HAS_SSL) +#if defined(SSL_AXTLS) +void WebSocketsClient::beginSSL(const char * host, uint16_t port, const char * url, const char * fingerprint, const char * protocol) { + begin(host, port, url, protocol); + _client.isSSL = true; + _fingerprint = fingerprint; + _CA_cert = NULL; +} + +void WebSocketsClient::beginSSL(String host, uint16_t port, String url, String fingerprint, String protocol) { + beginSSL(host.c_str(), port, url.c_str(), fingerprint.c_str(), protocol.c_str()); +} + +void WebSocketsClient::beginSslWithCA(const char * host, uint16_t port, const char * url, const char * CA_cert, const char * protocol) { + begin(host, port, url, protocol); + _client.isSSL = true; + _fingerprint = SSL_FINGERPRINT_NULL; + _CA_cert = CA_cert; +} +#else +void WebSocketsClient::beginSSL(const char * host, uint16_t port, const char * url, const uint8_t * fingerprint, const char * protocol) { + begin(host, port, url, protocol); + _client.isSSL = true; + _fingerprint = fingerprint; + _CA_cert = NULL; +} + +void WebSocketsClient::beginSslWithCA(const char * host, uint16_t port, const char * url, BearSSL::X509List * CA_cert, const char * protocol) { + begin(host, port, url, protocol); + _client.isSSL = true; + _fingerprint = SSL_FINGERPRINT_NULL; + _CA_cert = CA_cert; +} + +void WebSocketsClient::beginSslWithCA(const char * host, uint16_t port, const char * url, const char * CA_cert, const char * protocol) { + beginSslWithCA(host, port, url, new BearSSL::X509List(CA_cert), protocol); +} + +void WebSocketsClient::setSSLClientCertKey(BearSSL::X509List * clientCert, BearSSL::PrivateKey * clientPrivateKey) { + _client_cert = clientCert; + _client_key = clientPrivateKey; +} + +void WebSocketsClient::setSSLClientCertKey(const char * clientCert, const char * clientPrivateKey) { + setSSLClientCertKey(new BearSSL::X509List(clientCert), new BearSSL::PrivateKey(clientPrivateKey)); +} + +#endif // SSL_AXTLS +#endif // HAS_SSL + +void WebSocketsClient::beginSocketIO(const char * host, uint16_t port, const char * url, const char * protocol) { + begin(host, port, url, protocol); + _client.isSocketIO = true; +} + +void WebSocketsClient::beginSocketIO(String host, uint16_t port, String url, String protocol) { + beginSocketIO(host.c_str(), port, url.c_str(), protocol.c_str()); +} + +#if defined(HAS_SSL) +void WebSocketsClient::beginSocketIOSSL(const char * host, uint16_t port, const char * url, const char * protocol) { + begin(host, port, url, protocol); + _client.isSocketIO = true; + _client.isSSL = true; + _fingerprint = SSL_FINGERPRINT_NULL; +} + +void WebSocketsClient::beginSocketIOSSL(String host, uint16_t port, String url, String protocol) { + beginSocketIOSSL(host.c_str(), port, url.c_str(), protocol.c_str()); +} + +#if defined(SSL_BARESSL) +void WebSocketsClient::beginSocketIOSSLWithCA(const char * host, uint16_t port, const char * url, BearSSL::X509List * CA_cert, const char * protocol) { + begin(host, port, url, protocol); + _client.isSocketIO = true; + _client.isSSL = true; + _fingerprint = SSL_FINGERPRINT_NULL; + _CA_cert = CA_cert; +} +#endif + +void WebSocketsClient::beginSocketIOSSLWithCA(const char * host, uint16_t port, const char * url, const char * CA_cert, const char * protocol) { + begin(host, port, url, protocol); + _client.isSocketIO = true; + _client.isSSL = true; + _fingerprint = SSL_FINGERPRINT_NULL; +#if defined(SSL_BARESSL) + _CA_cert = new BearSSL::X509List(CA_cert); +#else + _CA_cert = CA_cert; +#endif +} + +#endif + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) +/** + * called in arduino loop + */ +void WebSocketsClient::loop(void) { + if(_port == 0) { + return; + } + WEBSOCKETS_YIELD(); + if(!clientIsConnected(&_client)) { + // do not flood the server + if((millis() - _lastConnectionFail) < _reconnectInterval) { + return; + } + +#if defined(HAS_SSL) + if(_client.isSSL) { + DEBUG_WEBSOCKETS("[WS-Client] connect wss...\n"); + if(_client.ssl) { + delete _client.ssl; + _client.ssl = NULL; + _client.tcp = NULL; + } + _client.ssl = new WEBSOCKETS_NETWORK_SSL_CLASS(); + _client.tcp = _client.ssl; + if(_CA_cert) { + DEBUG_WEBSOCKETS("[WS-Client] setting CA certificate"); +#if defined(ESP32) + _client.ssl->setCACert(_CA_cert); +#elif defined(ESP8266) && defined(SSL_AXTLS) + _client.ssl->setCACert((const uint8_t *)_CA_cert, strlen(_CA_cert) + 1); +#elif defined(ESP8266) && defined(SSL_BARESSL) + _client.ssl->setTrustAnchors(_CA_cert); +#else +#error setCACert not implemented +#endif +#if defined(ESP32) + } else if(!SSL_FINGERPRINT_IS_SET) { + _client.ssl->setInsecure(); +#elif defined(SSL_BARESSL) + } else if(SSL_FINGERPRINT_IS_SET) { + _client.ssl->setFingerprint(_fingerprint); + } else { + _client.ssl->setInsecure(); + } + if(_client_cert && _client_key) { + _client.ssl->setClientRSACert(_client_cert, _client_key); + DEBUG_WEBSOCKETS("[WS-Client] setting client certificate and key"); +#endif + } + } else { + DEBUG_WEBSOCKETS("[WS-Client] connect ws...\n"); + if(_client.tcp) { + delete _client.tcp; + _client.tcp = NULL; + } + _client.tcp = new WEBSOCKETS_NETWORK_CLASS(); + } +#else + _client.tcp = new WEBSOCKETS_NETWORK_CLASS(); +#endif + + if(!_client.tcp) { + DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); + return; + } + WEBSOCKETS_YIELD(); +#if defined(ESP32) + if(_client.tcp->connect(_host.c_str(), _port, WEBSOCKETS_TCP_TIMEOUT)) { +#else + if(_client.tcp->connect(_host.c_str(), _port)) { +#endif + connectedCb(); + _lastConnectionFail = 0; + } else { + connectFailedCb(); + _lastConnectionFail = millis(); + } + } else { + handleClientData(); + WEBSOCKETS_YIELD(); + if(_client.status == WSC_CONNECTED) { + handleHBPing(); + handleHBTimeout(&_client); + } + } +} +#endif + +/** + * set callback function + * @param cbEvent WebSocketServerEvent + */ +void WebSocketsClient::onEvent(WebSocketClientEvent cbEvent) { + _cbEvent = cbEvent; +} + +/** + * send text data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsClient::sendTXT(uint8_t * payload, size_t length, bool headerToPayload) { + if(length == 0) { + length = strlen((const char *)payload); + } + if(clientIsConnected(&_client)) { + return sendFrame(&_client, WSop_text, payload, length, true, headerToPayload); + } + return false; +} + +bool WebSocketsClient::sendTXT(const uint8_t * payload, size_t length) { + return sendTXT((uint8_t *)payload, length); +} + +bool WebSocketsClient::sendTXT(char * payload, size_t length, bool headerToPayload) { + return sendTXT((uint8_t *)payload, length, headerToPayload); +} + +bool WebSocketsClient::sendTXT(const char * payload, size_t length) { + return sendTXT((uint8_t *)payload, length); +} + +bool WebSocketsClient::sendTXT(String & payload) { + return sendTXT((uint8_t *)payload.c_str(), payload.length()); +} + +bool WebSocketsClient::sendTXT(char payload) { + uint8_t buf[WEBSOCKETS_MAX_HEADER_SIZE + 2] = { 0x00 }; + buf[WEBSOCKETS_MAX_HEADER_SIZE] = payload; + return sendTXT(buf, 1, true); +} + +/** + * send binary data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsClient::sendBIN(uint8_t * payload, size_t length, bool headerToPayload) { + if(clientIsConnected(&_client)) { + return sendFrame(&_client, WSop_binary, payload, length, true, headerToPayload); + } + return false; +} + +bool WebSocketsClient::sendBIN(const uint8_t * payload, size_t length) { + return sendBIN((uint8_t *)payload, length); +} + +/** + * sends a WS ping to Server + * @param payload uint8_t * + * @param length size_t + * @return true if ping is send out + */ +bool WebSocketsClient::sendPing(uint8_t * payload, size_t length) { + if(clientIsConnected(&_client)) { + bool sent = sendFrame(&_client, WSop_ping, payload, length); + if(sent) + _client.lastPing = millis(); + return sent; + } + return false; +} + +bool WebSocketsClient::sendPing(String & payload) { + return sendPing((uint8_t *)payload.c_str(), payload.length()); +} + +/** + * disconnect one client + * @param num uint8_t client id + */ +void WebSocketsClient::disconnect(void) { + if(clientIsConnected(&_client)) { + WebSockets::clientDisconnect(&_client, 1000); + } +} + +/** + * set the Authorizatio for the http request + * @param user const char * + * @param password const char * + */ +void WebSocketsClient::setAuthorization(const char * user, const char * password) { + if(user && password) { + String auth = user; + auth += ":"; + auth += password; + _client.base64Authorization = base64_encode((uint8_t *)auth.c_str(), auth.length()); + } +} + +/** + * set the Authorizatio for the http request + * @param auth const char * base64 + */ +void WebSocketsClient::setAuthorization(const char * auth) { + if(auth) { + //_client.base64Authorization = auth; + _client.plainAuthorization = auth; + } +} + +/** + * set extra headers for the http request; + * separate headers by "\r\n" + * @param extraHeaders const char * extraHeaders + */ +void WebSocketsClient::setExtraHeaders(const char * extraHeaders) { + _client.extraHeaders = extraHeaders; +} + +/** + * set the reconnect Interval + * how long to wait after a connection initiate failed + * @param time in ms + */ +void WebSocketsClient::setReconnectInterval(unsigned long time) { + _reconnectInterval = time; +} + +bool WebSocketsClient::isConnected(void) { + return (_client.status == WSC_CONNECTED); +} + +//################################################################################# +//################################################################################# +//################################################################################# + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param opcode WSopcode_t + * @param payload uint8_t * + * @param length size_t + */ +void WebSocketsClient::messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin) { + WStype_t type = WStype_ERROR; + + UNUSED(client); + + switch(opcode) { + case WSop_text: + type = fin ? WStype_TEXT : WStype_FRAGMENT_TEXT_START; + break; + case WSop_binary: + type = fin ? WStype_BIN : WStype_FRAGMENT_BIN_START; + break; + case WSop_continuation: + type = fin ? WStype_FRAGMENT_FIN : WStype_FRAGMENT; + break; + case WSop_ping: + type = WStype_PING; + break; + case WSop_pong: + type = WStype_PONG; + break; + case WSop_close: + default: + break; + } + + runCbEvent(type, payload, length); +} + +/** + * Disconnect an client + * @param client WSclient_t * ptr to the client struct + */ +void WebSocketsClient::clientDisconnect(WSclient_t * client) { + bool event = false; + +#if defined(HAS_SSL) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + if(client->isSSL && client->ssl) { + if(client->ssl->connected()) { + client->ssl->flush(); + client->ssl->stop(); + } + event = true; + delete client->ssl; + client->ssl = NULL; + client->tcp = NULL; + } +#endif +#endif //ssl + if(client->tcp) { + if(client->tcp->connected()) { +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + client->tcp->flush(); +#endif + client->tcp->stop(); + } + event = true; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->status = WSC_NOT_CONNECTED; +#else + delete client->tcp; +#endif + client->tcp = NULL; + } + + client->cCode = 0; + client->cKey = ""; + client->cAccept = ""; + client->cVersion = 0; + client->cIsUpgrade = false; + client->cIsWebsocket = false; + client->cSessionId = ""; + + client->status = WSC_NOT_CONNECTED; + _lastConnectionFail = millis(); + + DEBUG_WEBSOCKETS("[WS-Client] client disconnected.\n"); + if(event) { + runCbEvent(WStype_DISCONNECTED, NULL, 0); + } +} + +/** + * get client state + * @param client WSclient_t * ptr to the client struct + * @return true = conneted + */ +bool WebSocketsClient::clientIsConnected(WSclient_t * client) { + if(!client->tcp) { + return false; + } + + if(client->tcp->connected()) { + if(client->status != WSC_NOT_CONNECTED) { + return true; + } + } else { + // client lost + if(client->status != WSC_NOT_CONNECTED) { + DEBUG_WEBSOCKETS("[WS-Client] connection lost.\n"); + // do cleanup + clientDisconnect(client); + } + } + + if(client->tcp) { + // do cleanup + clientDisconnect(client); + } + + return false; +} +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) +/** + * Handel incomming data from Client + */ +void WebSocketsClient::handleClientData(void) { + if((_client.status == WSC_HEADER || _client.status == WSC_BODY) && _lastHeaderSent + WEBSOCKETS_TCP_TIMEOUT < millis()) { + DEBUG_WEBSOCKETS("[WS-Client][handleClientData] header response timeout.. disconnecting!\n"); + clientDisconnect(&_client); + WEBSOCKETS_YIELD(); + return; + } + + int len = _client.tcp->available(); + if(len > 0) { + switch(_client.status) { + case WSC_HEADER: { + String headerLine = _client.tcp->readStringUntil('\n'); + handleHeader(&_client, &headerLine); + } break; + case WSC_BODY: { + char buf[256] = { 0 }; + _client.tcp->readBytes(&buf[0], std::min((size_t)len, sizeof(buf))); + String bodyLine = buf; + handleHeader(&_client, &bodyLine); + } break; + case WSC_CONNECTED: + WebSockets::handleWebsocket(&_client); + break; + default: + WebSockets::clientDisconnect(&_client, 1002); + break; + } + } + WEBSOCKETS_YIELD(); +} +#endif + +/** + * send the WebSocket header to Server + * @param client WSclient_t * ptr to the client struct + */ +void WebSocketsClient::sendHeader(WSclient_t * client) { + static const char * NEW_LINE = "\r\n"; + + DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header...\n"); + + uint8_t randomKey[16] = { 0 }; + + for(uint8_t i = 0; i < sizeof(randomKey); i++) { + randomKey[i] = random(0xFF); + } + + client->cKey = base64_encode(&randomKey[0], 16); + +#ifndef NODEBUG_WEBSOCKETS + unsigned long start = micros(); +#endif + + String handshake; + bool ws_header = true; + String url = client->cUrl; + + if(client->isSocketIO) { + if(client->cSessionId.length() == 0) { + url += WEBSOCKETS_STRING("&transport=polling"); + ws_header = false; + } else { + url += WEBSOCKETS_STRING("&transport=websocket&sid="); + url += client->cSessionId; + } + } + + handshake = WEBSOCKETS_STRING("GET "); + handshake += url + WEBSOCKETS_STRING( + " HTTP/1.1\r\n" + "Host: "); + handshake += _host + ":" + _port + NEW_LINE; + + if(ws_header) { + handshake += WEBSOCKETS_STRING( + "Connection: Upgrade\r\n" + "Upgrade: websocket\r\n" + "Sec-WebSocket-Version: 13\r\n" + "Sec-WebSocket-Key: "); + handshake += client->cKey + NEW_LINE; + + if(client->cProtocol.length() > 0) { + handshake += WEBSOCKETS_STRING("Sec-WebSocket-Protocol: "); + handshake += client->cProtocol + NEW_LINE; + } + + if(client->cExtensions.length() > 0) { + handshake += WEBSOCKETS_STRING("Sec-WebSocket-Extensions: "); + handshake += client->cExtensions + NEW_LINE; + } + } else { + handshake += WEBSOCKETS_STRING("Connection: keep-alive\r\n"); + } + + // add extra headers; by default this includes "Origin: file://" + if(client->extraHeaders.length() > 0) { + handshake += client->extraHeaders + NEW_LINE; + } + + handshake += WEBSOCKETS_STRING("User-Agent: arduino-WebSocket-Client\r\n"); + + if(client->base64Authorization.length() > 0) { + handshake += WEBSOCKETS_STRING("Authorization: Basic "); + handshake += client->base64Authorization + NEW_LINE; + } + + if(client->plainAuthorization.length() > 0) { + handshake += WEBSOCKETS_STRING("Authorization: "); + handshake += client->plainAuthorization + NEW_LINE; + } + + handshake += NEW_LINE; + + DEBUG_WEBSOCKETS("[WS-Client][sendHeader] handshake %s", (uint8_t *)handshake.c_str()); + write(client, (uint8_t *)handshake.c_str(), handshake.length()); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsClient::handleHeader, this, client, &(client->cHttpLine))); +#endif + + DEBUG_WEBSOCKETS("[WS-Client][sendHeader] sending header... Done (%luus).\n", (micros() - start)); + _lastHeaderSent = millis(); +} + +/** + * handle the WebSocket header reading + * @param client WSclient_t * ptr to the client struct + */ +void WebSocketsClient::handleHeader(WSclient_t * client, String * headerLine) { + headerLine->trim(); // remove \r + + // this code handels the http body for Socket.IO V3 requests + if(headerLine->length() > 0 && client->isSocketIO && client->status == WSC_BODY && client->cSessionId.length() == 0) { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] socket.io json: %s\n", headerLine->c_str()); + String sid_begin = WEBSOCKETS_STRING("\"sid\":\""); + if(headerLine->indexOf(sid_begin) > -1) { + int start = headerLine->indexOf(sid_begin) + sid_begin.length(); + int end = headerLine->indexOf('"', start); + client->cSessionId = headerLine->substring(start, end); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cSessionId: %s\n", client->cSessionId.c_str()); + + // Trigger websocket connection code path + *headerLine = ""; + } + } + + // headle HTTP header + if(headerLine->length() > 0) { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] RX: %s\n", headerLine->c_str()); + + if(headerLine->startsWith(WEBSOCKETS_STRING("HTTP/1."))) { + // "HTTP/1.1 101 Switching Protocols" + client->cCode = headerLine->substring(9, headerLine->indexOf(' ', 9)).toInt(); + } else if(headerLine->indexOf(':') >= 0) { + String headerName = headerLine->substring(0, headerLine->indexOf(':')); + String headerValue = headerLine->substring(headerLine->indexOf(':') + 1); + + // remove space in the beginning (RFC2616) + if(headerValue[0] == ' ') { + headerValue.remove(0, 1); + } + + if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Connection"))) { + if(headerValue.equalsIgnoreCase(WEBSOCKETS_STRING("upgrade"))) { + client->cIsUpgrade = true; + } + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Upgrade"))) { + if(headerValue.equalsIgnoreCase(WEBSOCKETS_STRING("websocket"))) { + client->cIsWebsocket = true; + } + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Accept"))) { + client->cAccept = headerValue; + client->cAccept.trim(); // see rfc6455 + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Protocol"))) { + client->cProtocol = headerValue; + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Extensions"))) { + client->cExtensions = headerValue; + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Version"))) { + client->cVersion = headerValue.toInt(); + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Set-Cookie"))) { + if(headerValue.indexOf(';') > -1) { + client->cSessionId = headerValue.substring(headerValue.indexOf('=') + 1, headerValue.indexOf(";")); + } else { + client->cSessionId = headerValue.substring(headerValue.indexOf('=') + 1); + } + } + } else { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine->c_str()); + } + + (*headerLine) = ""; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsClient::handleHeader, this, client, &(client->cHttpLine))); +#endif + } else { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header read fin.\n"); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Client settings:\n"); + + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cURL: %s\n", client->cUrl.c_str()); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cKey: %s\n", client->cKey.c_str()); + + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Server header:\n"); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cCode: %d\n", client->cCode); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsUpgrade: %d\n", client->cIsUpgrade); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cIsWebsocket: %d\n", client->cIsWebsocket); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cAccept: %s\n", client->cAccept.c_str()); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cProtocol: %s\n", client->cProtocol.c_str()); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cExtensions: %s\n", client->cExtensions.c_str()); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cVersion: %d\n", client->cVersion); + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] - cSessionId: %s\n", client->cSessionId.c_str()); + + if(client->isSocketIO && client->cSessionId.length() == 0 && clientIsConnected(client)) { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] still missing cSessionId try socket.io V3\n"); + client->status = WSC_BODY; + return; + } else { + client->status = WSC_HEADER; + } + + bool ok = (client->cIsUpgrade && client->cIsWebsocket); + + if(ok) { + switch(client->cCode) { + case 101: ///< Switching Protocols + + break; + case 200: + if(client->isSocketIO) { + break; + } + // falls through + case 403: ///< Forbidden + // todo handle login + // falls through + default: ///< Server dont unterstand requrst + ok = false; + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] serverCode is not 101 (%d)\n", client->cCode); + clientDisconnect(client); + _lastConnectionFail = millis(); + break; + } + } + + if(ok) { + if(client->cAccept.length() == 0) { + ok = false; + } else { + // generate Sec-WebSocket-Accept key for check + String sKey = acceptKey(client->cKey); + if(sKey != client->cAccept) { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Sec-WebSocket-Accept is wrong\n"); + ok = false; + } + } + } + + if(ok) { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Websocket connection init done.\n"); + headerDone(client); + + runCbEvent(WStype_CONNECTED, (uint8_t *)client->cUrl.c_str(), client->cUrl.length()); +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + } else if(client->isSocketIO) { + if(client->cSessionId.length() > 0) { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] found cSessionId\n"); + if(clientIsConnected(client) && _client.tcp->available()) { + // read not needed data + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] still data in buffer (%d), clean up.\n", _client.tcp->available()); + while(_client.tcp->available() > 0) { + _client.tcp->read(); + } + } + sendHeader(client); + } +#endif + } else { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] no Websocket connection close.\n"); + _lastConnectionFail = millis(); + if(clientIsConnected(client)) { + write(client, "This is a webSocket client!"); + } + clientDisconnect(client); + } + } +} + +void WebSocketsClient::connectedCb() { + DEBUG_WEBSOCKETS("[WS-Client] connected to %s:%u.\n", _host.c_str(), _port); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + _client.tcp->onDisconnect(std::bind([](WebSocketsClient * c, AsyncTCPbuffer * obj, WSclient_t * client) -> bool { + DEBUG_WEBSOCKETS("[WS-Server][%d] Disconnect client\n", client->num); + client->status = WSC_NOT_CONNECTED; + client->tcp = NULL; + + // reconnect + c->asyncConnect(); + + return true; + }, + this, std::placeholders::_1, &_client)); +#endif + + _client.status = WSC_HEADER; + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + // set Timeout for readBytesUntil and readStringUntil + _client.tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); +#endif + +#if !defined(LIBRETINY) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + _client.tcp->setNoDelay(true); +#endif +#endif + +#if defined(HAS_SSL) +#if defined(SSL_AXTLS) || defined(ESP32) + if(_client.isSSL && SSL_FINGERPRINT_IS_SET) { + if(!_client.ssl->verify(_fingerprint.c_str(), _host.c_str())) { + DEBUG_WEBSOCKETS("[WS-Client] certificate mismatch\n"); + WebSockets::clientDisconnect(&_client, 1000); + return; + } +#else + if(_client.isSSL && SSL_FINGERPRINT_IS_SET) { +#endif + } else if(_client.isSSL && !_CA_cert) { +#if defined(SSL_BARESSL) + _client.ssl->setInsecure(); +#endif + } +#endif + + // send Header to Server + sendHeader(&_client); +} + +void WebSocketsClient::connectFailedCb() { + DEBUG_WEBSOCKETS("[WS-Client] connection to %s:%u Failed\n", _host.c_str(), _port); +} + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + +void WebSocketsClient::asyncConnect() { + DEBUG_WEBSOCKETS("[WS-Client] asyncConnect...\n"); + + AsyncClient * tcpclient = new AsyncClient(); + + if(!tcpclient) { + DEBUG_WEBSOCKETS("[WS-Client] creating AsyncClient class failed!\n"); + return; + } + + tcpclient->onDisconnect([](void * obj, AsyncClient * c) { + c->free(); + delete c; + }); + + tcpclient->onConnect(std::bind([](WebSocketsClient * ws, AsyncClient * tcp) { + ws->_client.tcp = new AsyncTCPbuffer(tcp); + if(!ws->_client.tcp) { + DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!\n"); + ws->connectFailedCb(); + return; + } + ws->connectedCb(); + }, + this, std::placeholders::_2)); + + tcpclient->onError(std::bind([](WebSocketsClient * ws, AsyncClient * tcp) { + ws->connectFailedCb(); + + // reconnect + ws->asyncConnect(); + }, + this, std::placeholders::_2)); + + if(!tcpclient->connect(_host.c_str(), _port)) { + connectFailedCb(); + delete tcpclient; + } +} + +#endif + +/** + * send heartbeat ping to server in set intervals + */ +void WebSocketsClient::handleHBPing() { + if(_client.pingInterval == 0) + return; + uint32_t pi = millis() - _client.lastPing; + if(pi > _client.pingInterval) { + DEBUG_WEBSOCKETS("[WS-Client] sending HB ping\n"); + if(sendPing()) { + _client.lastPing = millis(); + _client.pongReceived = false; + } else { + DEBUG_WEBSOCKETS("[WS-Client] sending HB ping failed\n"); + WebSockets::clientDisconnect(&_client, 1000); + } + } +} + +/** + * enable ping/pong heartbeat process + * @param pingInterval uint32_t how often ping will be sent + * @param pongTimeout uint32_t millis after which pong should timout if not received + * @param disconnectTimeoutCount uint8_t how many timeouts before disconnect, 0=> do not disconnect + */ +void WebSocketsClient::enableHeartbeat(uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { + WebSockets::enableHeartbeat(&_client, pingInterval, pongTimeout, disconnectTimeoutCount); +} + +/** + * disable ping/pong heartbeat process + */ +void WebSocketsClient::disableHeartbeat() { + _client.pingInterval = 0; +} diff --git a/lib/LT_WebSockets/src/WebSocketsClient.h b/lib/LT_WebSockets/src/WebSocketsClient.h new file mode 100644 index 00000000..6be0d777 --- /dev/null +++ b/lib/LT_WebSockets/src/WebSocketsClient.h @@ -0,0 +1,171 @@ +/** + * @file WebSocketsClient.h + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef WEBSOCKETSCLIENT_H_ +#define WEBSOCKETSCLIENT_H_ + +#include "WebSockets.h" + +class WebSocketsClient : protected WebSockets { + public: +#ifdef __AVR__ + typedef void (*WebSocketClientEvent)(WStype_t type, uint8_t * payload, size_t length); +#else + typedef std::function WebSocketClientEvent; +#endif + + WebSocketsClient(void); + virtual ~WebSocketsClient(void); + + void begin(const char * host, uint16_t port, const char * url = "/", const char * protocol = "arduino"); + void begin(String host, uint16_t port, String url = "/", String protocol = "arduino"); +#ifndef LIBRETINY + void begin(IPAddress host, uint16_t port, const char * url = "/", const char * protocol = "arduino"); +#endif + +#if defined(HAS_SSL) +#ifdef SSL_AXTLS + void beginSSL(const char * host, uint16_t port, const char * url = "/", const char * fingerprint = "", const char * protocol = "arduino"); + void beginSSL(String host, uint16_t port, String url = "/", String fingerprint = "", String protocol = "arduino"); +#else + void beginSSL(const char * host, uint16_t port, const char * url = "/", const uint8_t * fingerprint = NULL, const char * protocol = "arduino"); + void beginSslWithCA(const char * host, uint16_t port, const char * url = "/", BearSSL::X509List * CA_cert = NULL, const char * protocol = "arduino"); + void setSSLClientCertKey(BearSSL::X509List * clientCert = NULL, BearSSL::PrivateKey * clientPrivateKey = NULL); + void setSSLClientCertKey(const char * clientCert = NULL, const char * clientPrivateKey = NULL); +#endif + void beginSslWithCA(const char * host, uint16_t port, const char * url = "/", const char * CA_cert = NULL, const char * protocol = "arduino"); +#endif + + void beginSocketIO(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); + void beginSocketIO(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino"); + +#if defined(HAS_SSL) + void beginSocketIOSSL(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); + void beginSocketIOSSL(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino"); + + void beginSocketIOSSLWithCA(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * CA_cert = NULL, const char * protocol = "arduino"); +#if defined(SSL_BARESSL) + void beginSocketIOSSLWithCA(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", BearSSL::X509List * CA_cert = NULL, const char * protocol = "arduino"); +#endif +#endif + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void loop(void); +#else + // Async interface not need a loop call + void loop(void) __attribute__((deprecated)) {} +#endif + + void onEvent(WebSocketClientEvent cbEvent); + + bool sendTXT(uint8_t * payload, size_t length = 0, bool headerToPayload = false); + bool sendTXT(const uint8_t * payload, size_t length = 0); + bool sendTXT(char * payload, size_t length = 0, bool headerToPayload = false); + bool sendTXT(const char * payload, size_t length = 0); + bool sendTXT(String & payload); + bool sendTXT(char payload); + + bool sendBIN(uint8_t * payload, size_t length, bool headerToPayload = false); + bool sendBIN(const uint8_t * payload, size_t length); + + bool sendPing(uint8_t * payload = NULL, size_t length = 0); + bool sendPing(String & payload); + + void disconnect(void); + + void setAuthorization(const char * user, const char * password); + void setAuthorization(const char * auth); + + void setExtraHeaders(const char * extraHeaders = NULL); + + void setReconnectInterval(unsigned long time); + + void enableHeartbeat(uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount); + void disableHeartbeat(); + + bool isConnected(void); + + protected: + String _host; + uint16_t _port; + +#if defined(HAS_SSL) +#ifdef SSL_AXTLS + String _fingerprint; + const char * _CA_cert; +#define SSL_FINGERPRINT_IS_SET (_fingerprint.length()) +#define SSL_FINGERPRINT_NULL "" +#else + const uint8_t * _fingerprint; + BearSSL::X509List * _CA_cert; + BearSSL::X509List * _client_cert; + BearSSL::PrivateKey * _client_key; +#define SSL_FINGERPRINT_IS_SET (_fingerprint != NULL) +#define SSL_FINGERPRINT_NULL NULL +#endif + +#endif + WSclient_t _client; + + WebSocketClientEvent _cbEvent; + + unsigned long _lastConnectionFail; + unsigned long _reconnectInterval; + unsigned long _lastHeaderSent; + + void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin); + + void clientDisconnect(WSclient_t * client); + bool clientIsConnected(WSclient_t * client); + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void handleClientData(void); +#endif + + void sendHeader(WSclient_t * client); + void handleHeader(WSclient_t * client, String * headerLine); + + void connectedCb(); + void connectFailedCb(); + + void handleHBPing(); // send ping in specified intervals + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + void asyncConnect(); +#endif + + /** + * called for sending a Event to the app + * @param type WStype_t + * @param payload uint8_t * + * @param length size_t + */ + virtual void runCbEvent(WStype_t type, uint8_t * payload, size_t length) { + if(_cbEvent) { + _cbEvent(type, payload, length); + } + } +}; + +#endif /* WEBSOCKETSCLIENT_H_ */ diff --git a/lib/LT_WebSockets/src/WebSocketsServer.cpp b/lib/LT_WebSockets/src/WebSocketsServer.cpp new file mode 100644 index 00000000..a189a63e --- /dev/null +++ b/lib/LT_WebSockets/src/WebSocketsServer.cpp @@ -0,0 +1,966 @@ +/** + * @file WebSocketsServer.cpp + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "WebSockets.h" +#include "WebSocketsServer.h" +#ifdef LIBRETINY +#include "Common.h" +#endif +WebSocketsServerCore::WebSocketsServerCore(const String & origin, const String & protocol) { + _origin = origin; + _protocol = protocol; + _runnning = false; + _pingInterval = 0; + _pongTimeout = 0; + _disconnectTimeoutCount = 0; + + _cbEvent = NULL; + + _httpHeaderValidationFunc = NULL; + _mandatoryHttpHeaders = NULL; + _mandatoryHttpHeaderCount = 0; +} + +WebSocketsServer::WebSocketsServer(uint16_t port, const String & origin, const String & protocol) + : WebSocketsServerCore(origin, protocol) { + _port = port; + + _server = new WEBSOCKETS_NETWORK_SERVER_CLASS(port); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + _server->onClient([](void * s, AsyncClient * c) { + ((WebSocketsServerCore *)s)->newClient(new AsyncTCPbuffer(c)); + }, + this); +#endif +} + +WebSocketsServerCore::~WebSocketsServerCore() { + // disconnect all clients + close(); + + if(_mandatoryHttpHeaders) + delete[] _mandatoryHttpHeaders; + + _mandatoryHttpHeaderCount = 0; +} + +WebSocketsServer::~WebSocketsServer() { +} + +/** + * called to initialize the Websocket server + */ +void WebSocketsServerCore::begin(void) { + // adjust clients storage: + // _clients[i]'s constructor are already called, + // all its members are initialized to their default value, + // except the ones explicitly detailed in WSclient_t() constructor. + // Then we need to initialize some members to non-trivial values: + for(int i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + _clients[i].init(i, _pingInterval, _pongTimeout, _disconnectTimeoutCount); + } + +#ifdef ESP8266 + randomSeed(RANDOM_REG32); +#elif defined(ESP32) +#define DR_REG_RNG_BASE 0x3ff75144 + randomSeed(READ_PERI_REG(DR_REG_RNG_BASE)); +#else + // TODO find better seed + randomSeed(millis()); +#endif + + _runnning = true; + + DEBUG_WEBSOCKETS("[WS-Server] Websocket Version: " WEBSOCKETS_VERSION "\n"); +} + +void WebSocketsServerCore::close(void) { + _runnning = false; + disconnect(); + + // restore _clients[] to their initial state + // before next call to ::begin() + for(int i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + _clients[i] = WSclient_t(); + } +} + +/** + * set callback function + * @param cbEvent WebSocketServerEvent + */ +void WebSocketsServerCore::onEvent(WebSocketServerEvent cbEvent) { + _cbEvent = cbEvent; +} + +/* + * Sets the custom http header validator function + * @param httpHeaderValidationFunc WebSocketServerHttpHeaderValFunc ///< pointer to the custom http header validation function + * @param mandatoryHttpHeaders[] const char* ///< the array of named http headers considered to be mandatory / must be present in order for websocket upgrade to succeed + * @param mandatoryHttpHeaderCount size_t ///< the number of items in the mandatoryHttpHeaders array + */ +void WebSocketsServerCore::onValidateHttpHeader( + WebSocketServerHttpHeaderValFunc validationFunc, + const char * mandatoryHttpHeaders[], + size_t mandatoryHttpHeaderCount) { + _httpHeaderValidationFunc = validationFunc; + + if(_mandatoryHttpHeaders) + delete[] _mandatoryHttpHeaders; + + _mandatoryHttpHeaderCount = mandatoryHttpHeaderCount; + _mandatoryHttpHeaders = new String[_mandatoryHttpHeaderCount]; + + for(size_t i = 0; i < _mandatoryHttpHeaderCount; i++) { + _mandatoryHttpHeaders[i] = mandatoryHttpHeaders[i]; + } +} + +/* + * send text data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServerCore::sendTXT(uint8_t num, uint8_t * payload, size_t length, bool headerToPayload) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return false; + } + if(length == 0) { + length = strlen((const char *)payload); + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return sendFrame(client, WSop_text, payload, length, true, headerToPayload); + } + return false; +} + +bool WebSocketsServerCore::sendTXT(uint8_t num, const uint8_t * payload, size_t length) { + return sendTXT(num, (uint8_t *)payload, length); +} + +bool WebSocketsServerCore::sendTXT(uint8_t num, char * payload, size_t length, bool headerToPayload) { + return sendTXT(num, (uint8_t *)payload, length, headerToPayload); +} + +bool WebSocketsServerCore::sendTXT(uint8_t num, const char * payload, size_t length) { + return sendTXT(num, (uint8_t *)payload, length); +} + +bool WebSocketsServerCore::sendTXT(uint8_t num, String & payload) { + return sendTXT(num, (uint8_t *)payload.c_str(), payload.length()); +} + +/** + * send text data to client all + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServerCore::broadcastTXT(uint8_t * payload, size_t length, bool headerToPayload) { + WSclient_t * client; + bool ret = true; + if(length == 0) { + length = strlen((const char *)payload); + } + + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + if(!sendFrame(client, WSop_text, payload, length, true, headerToPayload)) { + ret = false; + } + } + WEBSOCKETS_YIELD(); + } + return ret; +} + +bool WebSocketsServerCore::broadcastTXT(const uint8_t * payload, size_t length) { + return broadcastTXT((uint8_t *)payload, length); +} + +bool WebSocketsServerCore::broadcastTXT(char * payload, size_t length, bool headerToPayload) { + return broadcastTXT((uint8_t *)payload, length, headerToPayload); +} + +bool WebSocketsServerCore::broadcastTXT(const char * payload, size_t length) { + return broadcastTXT((uint8_t *)payload, length); +} + +bool WebSocketsServerCore::broadcastTXT(String & payload) { + return broadcastTXT((uint8_t *)payload.c_str(), payload.length()); +} + +/** + * send binary data to client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServerCore::sendBIN(uint8_t num, uint8_t * payload, size_t length, bool fin, bool continuation, bool headerToPayload) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return false; + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + if(continuation) { + return sendFrame(client, WSop_continuation, payload, length, fin, headerToPayload); + } else { + return sendFrame(client, WSop_binary, payload, length, fin, headerToPayload); + } + } + return false; +} + +bool WebSocketsServerCore::sendBIN(uint8_t num, const uint8_t * payload, size_t length) { + return sendBIN(num, (uint8_t *)payload, length); +} + +/** + * send binary data to client all + * @param payload uint8_t * + * @param length size_t + * @param headerToPayload bool (see sendFrame for more details) + * @return true if ok + */ +bool WebSocketsServerCore::broadcastBIN(uint8_t * payload, size_t length, bool fin, bool continuation, bool headerToPayload) { + WSclient_t * client; + bool ret = true; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + if(continuation) { + ret = sendFrame(client, WSop_continuation, payload, length, fin, headerToPayload); + } else { + ret = sendFrame(client, WSop_binary, payload, length, fin, headerToPayload); + } + } + WEBSOCKETS_YIELD(); + } + return ret; +} + +bool WebSocketsServerCore::broadcastBIN(const uint8_t * payload, size_t length) { + return broadcastBIN((uint8_t *)payload, length); +} + +/** + * sends a WS ping to Client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @return true if ping is send out + */ +bool WebSocketsServerCore::sendPing(uint8_t num, uint8_t * payload, size_t length) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return false; + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return sendFrame(client, WSop_ping, payload, length); + } + return false; +} + +bool WebSocketsServerCore::sendPing(uint8_t num, String & payload) { + return sendPing(num, (uint8_t *)payload.c_str(), payload.length()); +} + +/** + * sends a WS ping to all Client + * @param payload uint8_t * + * @param length size_t + * @return true if ping is send out + */ +bool WebSocketsServerCore::broadcastPing(uint8_t * payload, size_t length) { + WSclient_t * client; + bool ret = true; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + if(!sendFrame(client, WSop_ping, payload, length)) { + ret = false; + } + } + WEBSOCKETS_YIELD(); + } + return ret; +} + +bool WebSocketsServerCore::broadcastPing(String & payload) { + return broadcastPing((uint8_t *)payload.c_str(), payload.length()); +} + +/** + * disconnect all clients + */ +void WebSocketsServerCore::disconnect(void) { + WSclient_t * client; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + WebSockets::clientDisconnect(client, 1000); + } + } +} + +/** + * disconnect one client + * @param num uint8_t client id + */ +void WebSocketsServerCore::disconnect(uint8_t num) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return; + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + WebSockets::clientDisconnect(client, 1000); + } +} + +/* + * set the Authorization for the http request + * @param user const char * + * @param password const char * + */ +void WebSocketsServerCore::setAuthorization(const char * user, const char * password) { + if(user && password) { + String auth = user; + auth += ":"; + auth += password; + _base64Authorization = base64_encode((uint8_t *)auth.c_str(), auth.length()); + } +} + +/** + * set the Authorizatio for the http request + * @param auth const char * base64 + */ +void WebSocketsServerCore::setAuthorization(const char * auth) { + if(auth) { + _base64Authorization = auth; + } +} + +/** + * count the connected clients (optional ping them) + * @param ping bool ping the connected clients + */ +int WebSocketsServerCore::connectedClients(bool ping) { + WSclient_t * client; + int count = 0; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(client->status == WSC_CONNECTED) { + if(ping != true || sendPing(i)) { + count++; + } + } + } + return count; +} + +/** + * see if one client is connected + * @param num uint8_t client id + */ +bool WebSocketsServerCore::clientIsConnected(uint8_t num) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return false; + } + WSclient_t * client = &_clients[num]; + return clientIsConnected(client); +} + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +/** + * get an IP for a client + * @param num uint8_t client id + * @return IPAddress + */ +IPAddress WebSocketsServerCore::remoteIP(uint8_t num) { + if(num < WEBSOCKETS_SERVER_CLIENT_MAX) { + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return client->tcp->remoteIP(); + } + } + + return IPAddress(); +} +#endif + +//################################################################################# +//################################################################################# +//################################################################################# + +/** + * handle new client connection + * @param client + */ +WSclient_t * WebSocketsServerCore::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient) { + WSclient_t * client; + // search free list entry for client + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + + // state is not connected or tcp connection is lost + if(!clientIsConnected(client)) { + client->tcp = TCPclient; +#if defined(HAS_SSL) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + client->isSSL = false; + client->tcp->setNoDelay(true); +#endif +#endif //ssl +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + // set Timeout for readBytesUntil and readStringUntil + client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); +#endif + client->status = WSC_HEADER; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#ifndef NODEBUG_WEBSOCKETS + IPAddress ip = client->tcp->remoteIP(); +#endif + DEBUG_WEBSOCKETS("[WS-Server][%d] new client from %d.%d.%d.%d\n", client->num, ip[0], ip[1], ip[2], ip[3]); +#else + DEBUG_WEBSOCKETS("[WS-Server][%d] new client\n", client->num); +#endif + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->tcp->onDisconnect(std::bind([](WebSocketsServerCore * server, AsyncTCPbuffer * obj, WSclient_t * client) -> bool { + DEBUG_WEBSOCKETS("[WS-Server][%d] Disconnect client\n", client->num); + + AsyncTCPbuffer ** sl = &server->_clients[client->num].tcp; + if(*sl == obj) { + client->status = WSC_NOT_CONNECTED; + *sl = NULL; + } + return true; + }, + this, std::placeholders::_1, client)); + + client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsServerCore::handleHeader, this, client, &(client->cHttpLine))); +#endif + + client->pingInterval = _pingInterval; + client->pongTimeout = _pongTimeout; + client->disconnectTimeoutCount = _disconnectTimeoutCount; + client->lastPing = millis(); + client->pongReceived = false; + + return client; + break; + } + } + return nullptr; +} + +/** + * + * @param client WSclient_t * ptr to the client struct + * @param opcode WSopcode_t + * @param payload uint8_t * + * @param length size_t + */ +void WebSocketsServerCore::messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin) { + WStype_t type = WStype_ERROR; + + switch(opcode) { + case WSop_text: + type = fin ? WStype_TEXT : WStype_FRAGMENT_TEXT_START; + break; + case WSop_binary: + type = fin ? WStype_BIN : WStype_FRAGMENT_BIN_START; + break; + case WSop_continuation: + type = fin ? WStype_FRAGMENT_FIN : WStype_FRAGMENT; + break; + case WSop_ping: + type = WStype_PING; + break; + case WSop_pong: + type = WStype_PONG; + break; + case WSop_close: + default: + break; + } + + runCbEvent(client->num, type, payload, length); +} + +/** + * Discard a native client + * @param client WSclient_t * ptr to the client struct contaning the native client "->tcp" + */ +void WebSocketsServerCore::dropNativeClient(WSclient_t * client) { + if(!client) { + return; + } + if(client->tcp) { + if(client->tcp->connected()) { +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP32) + client->tcp->flush(); +#endif + client->tcp->stop(); + } +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->status = WSC_NOT_CONNECTED; +#else + delete client->tcp; +#endif + client->tcp = NULL; + } +} + +/** + * Disconnect an client + * @param client WSclient_t * ptr to the client struct + */ +void WebSocketsServerCore::clientDisconnect(WSclient_t * client) { +#if defined(HAS_SSL) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + if(client->isSSL && client->ssl) { + if(client->ssl->connected()) { + client->ssl->flush(); + client->ssl->stop(); + } + delete client->ssl; + client->ssl = NULL; + client->tcp = NULL; + } +#endif +#endif //ssl + + dropNativeClient(client); + + client->cUrl = ""; + client->cKey = ""; + client->cProtocol = ""; + client->cVersion = 0; + client->cIsUpgrade = false; + client->cIsWebsocket = false; + + client->cWsRXsize = 0; + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->cHttpLine = ""; +#endif + + client->status = WSC_NOT_CONNECTED; + + DEBUG_WEBSOCKETS("[WS-Server][%d] client disconnected.\n", client->num); + + runCbEvent(client->num, WStype_DISCONNECTED, NULL, 0); +} + +/** + * get client state + * @param client WSclient_t * ptr to the client struct + * @return true = connected + */ +bool WebSocketsServerCore::clientIsConnected(WSclient_t * client) { + if(!client->tcp) { + return false; + } + + if(client->tcp->connected()) { + if(client->status != WSC_NOT_CONNECTED) { + return true; + } + } else { + // client lost + if(client->status != WSC_NOT_CONNECTED) { + DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); + // do cleanup + clientDisconnect(client); + } + } + + if(client->tcp) { + // do cleanup + DEBUG_WEBSOCKETS("[WS-Server][%d] client list cleanup.\n", client->num); + clientDisconnect(client); + } + + return false; +} +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) +/** + * Handle incoming Connection Request + */ +WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tcpClient) { + WSclient_t * client = newClient(tcpClient); + + if(!client) { + // no free space to handle client +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#ifndef NODEBUG_WEBSOCKETS + IPAddress ip = tcpClient->remoteIP(); +#endif + DEBUG_WEBSOCKETS("[WS-Server] no free space new client from %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]); +#else + DEBUG_WEBSOCKETS("[WS-Server] no free space new client\n"); +#endif + // no client! => create dummy! + WSclient_t dummy = WSclient_t(); + client = &dummy; + client->tcp = tcpClient; + dropNativeClient(client); + } + + WEBSOCKETS_YIELD(); + + return client; +} + +/** + * Handle incoming Connection Request + */ +void WebSocketsServer::handleNewClients(void) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + while(_server->hasClient()) { +#endif + + // store new connection + WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->available()); + if(!tcpClient) { + DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); + return; + } + + handleNewClient(tcpClient); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + } +#endif +} + +/** + * Handel incomming data from Client + */ +void WebSocketsServerCore::handleClientData(void) { + WSclient_t * client; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + int len = client->tcp->available(); + if(len > 0) { + // DEBUG_WEBSOCKETS("[WS-Server][%d][handleClientData] len: %d\n", client->num, len); + switch(client->status) { + case WSC_HEADER: { + String headerLine = client->tcp->readStringUntil('\n'); + handleHeader(client, &headerLine); + } break; + case WSC_CONNECTED: + WebSockets::handleWebsocket(client); + break; + default: + DEBUG_WEBSOCKETS("[WS-Server][%d][handleClientData] unknown client status %d\n", client->num, client->status); + WebSockets::clientDisconnect(client, 1002); + break; + } + } + + handleHBPing(client); + handleHBTimeout(client); + } + WEBSOCKETS_YIELD(); + } +} +#endif + +/* + * returns an indicator whether the given named header exists in the configured _mandatoryHttpHeaders collection + * @param headerName String ///< the name of the header being checked + */ +bool WebSocketsServerCore::hasMandatoryHeader(String headerName) { + for(size_t i = 0; i < _mandatoryHttpHeaderCount; i++) { + if(_mandatoryHttpHeaders[i].equalsIgnoreCase(headerName)) + return true; + } + return false; +} + +/** + * handles http header reading for WebSocket upgrade + * @param client WSclient_t * ///< pointer to the client struct + * @param headerLine String ///< the header being read / processed + */ +void WebSocketsServerCore::handleHeader(WSclient_t * client, String * headerLine) { + static const char * NEW_LINE = "\r\n"; + + headerLine->trim(); // remove \r + + if(headerLine->length() > 0) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine->c_str()); + + // websocket requests always start with GET see rfc6455 + if(headerLine->startsWith("GET ")) { + // cut URL out + client->cUrl = headerLine->substring(4, headerLine->indexOf(' ', 4)); + + // reset non-websocket http header validation state for this client + client->cHttpHeadersValid = true; + client->cMandatoryHeadersCount = 0; + + } else if(headerLine->indexOf(':') >= 0) { + String headerName = headerLine->substring(0, headerLine->indexOf(':')); + String headerValue = headerLine->substring(headerLine->indexOf(':') + 1); + + // remove space in the beginning (RFC2616) + if(headerValue[0] == ' ') { + headerValue.remove(0, 1); + } + + if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Connection"))) { + headerValue.toLowerCase(); + if(headerValue.indexOf(WEBSOCKETS_STRING("upgrade")) >= 0) { + client->cIsUpgrade = true; + } + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Upgrade"))) { + if(headerValue.equalsIgnoreCase(WEBSOCKETS_STRING("websocket"))) { + client->cIsWebsocket = true; + } + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Version"))) { + client->cVersion = headerValue.toInt(); + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Key"))) { + client->cKey = headerValue; + client->cKey.trim(); // see rfc6455 + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Protocol"))) { + client->cProtocol = headerValue; + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Extensions"))) { + client->cExtensions = headerValue; + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Authorization"))) { + client->base64Authorization = headerValue; + } else { + client->cHttpHeadersValid &= execHttpHeaderValidation(headerName, headerValue); + if(_mandatoryHttpHeaderCount > 0 && hasMandatoryHeader(headerName)) { + client->cMandatoryHeadersCount++; + } + } + + } else { + DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine->c_str()); + } + + (*headerLine) = ""; +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsServerCore::handleHeader, this, client, &(client->cHttpLine))); +#endif + } else { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Header read fin.\n", client->num); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cURL: %s\n", client->num, client->cUrl.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsUpgrade: %d\n", client->num, client->cIsUpgrade); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsWebsocket: %d\n", client->num, client->cIsWebsocket); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cKey: %s\n", client->num, client->cKey.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cProtocol: %s\n", client->num, client->cProtocol.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cExtensions: %s\n", client->num, client->cExtensions.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cVersion: %d\n", client->num, client->cVersion); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - base64Authorization: %s\n", client->num, client->base64Authorization.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cHttpHeadersValid: %d\n", client->num, client->cHttpHeadersValid); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cMandatoryHeadersCount: %d\n", client->num, client->cMandatoryHeadersCount); + + bool ok = (client->cIsUpgrade && client->cIsWebsocket); + + if(ok) { + if(client->cUrl.length() == 0) { + ok = false; + } + if(client->cKey.length() == 0) { + ok = false; + } + if(client->cVersion != 13) { + ok = false; + } + if(!client->cHttpHeadersValid) { + ok = false; + } + if(client->cMandatoryHeadersCount != _mandatoryHttpHeaderCount) { + ok = false; + } + } + + if(_base64Authorization.length() > 0) { + String auth = WEBSOCKETS_STRING("Basic "); + auth += _base64Authorization; + if(auth != client->base64Authorization) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] HTTP Authorization failed!\n", client->num); + handleAuthorizationFailed(client); + return; + } + } + + if(ok) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Websocket connection incoming.\n", client->num); + + // generate Sec-WebSocket-Accept key + String sKey = acceptKey(client->cKey); + + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - sKey: %s\n", client->num, sKey.c_str()); + + client->status = WSC_CONNECTED; + + String handshake = WEBSOCKETS_STRING( + "HTTP/1.1 101 Switching Protocols\r\n" + "Server: arduino-WebSocketsServer\r\n" + "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Version: 13\r\n" + "Sec-WebSocket-Accept: "); + handshake += sKey + NEW_LINE; + + if(_origin.length() > 0) { + handshake += WEBSOCKETS_STRING("Access-Control-Allow-Origin: "); + handshake += _origin + NEW_LINE; + } + + if(client->cProtocol.length() > 0) { + handshake += WEBSOCKETS_STRING("Sec-WebSocket-Protocol: "); + handshake += _protocol + NEW_LINE; + } + + // header end + handshake += NEW_LINE; + + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] handshake %s", client->num, (uint8_t *)handshake.c_str()); + + write(client, (uint8_t *)handshake.c_str(), handshake.length()); + + headerDone(client); + + // send ping + WebSockets::sendFrame(client, WSop_ping); + + runCbEvent(client->num, WStype_CONNECTED, (uint8_t *)client->cUrl.c_str(), client->cUrl.length()); + + } else { + handleNonWebsocketConnection(client); + } + } +} + +/** + * send heartbeat ping to server in set intervals + */ +void WebSocketsServerCore::handleHBPing(WSclient_t * client) { + if(client->pingInterval == 0) + return; + uint32_t pi = millis() - client->lastPing; + if(pi > client->pingInterval) { + DEBUG_WEBSOCKETS("[WS-Server][%d] sending HB ping\n", client->num); + if(sendPing(client->num)) { + client->lastPing = millis(); + client->pongReceived = false; + } + } +} + +/** + * enable ping/pong heartbeat process + * @param pingInterval uint32_t how often ping will be sent + * @param pongTimeout uint32_t millis after which pong should timout if not received + * @param disconnectTimeoutCount uint8_t how many timeouts before disconnect, 0=> do not disconnect + */ +void WebSocketsServerCore::enableHeartbeat(uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { + _pingInterval = pingInterval; + _pongTimeout = pongTimeout; + _disconnectTimeoutCount = disconnectTimeoutCount; + + WSclient_t * client; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + WebSockets::enableHeartbeat(client, pingInterval, pongTimeout, disconnectTimeoutCount); + } +} + +/** + * disable ping/pong heartbeat process + */ +void WebSocketsServerCore::disableHeartbeat() { + _pingInterval = 0; + + WSclient_t * client; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + client->pingInterval = 0; + } +} + +//////////////////// +// WebSocketServer + +/** + * called to initialize the Websocket server + */ +void WebSocketsServer::begin(void) { + WebSocketsServerCore::begin(); + _server->begin(); + + DEBUG_WEBSOCKETS("[WS-Server] Server Started.\n"); +} + +void WebSocketsServer::close(void) { + WebSocketsServerCore::close(); +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + _server->close(); +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) + _server->end(); +#else + // TODO how to close server? +#endif +} + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) +/** + * called in arduino loop + */ +void WebSocketsServerCore::loop(void) { + if(_runnning) { + WEBSOCKETS_YIELD(); + handleClientData(); + } +} + +/** + * called in arduino loop + */ +void WebSocketsServer::loop(void) { + if(_runnning) { + WEBSOCKETS_YIELD(); + handleNewClients(); + WebSocketsServerCore::loop(); + } +} +#endif diff --git a/lib/LT_WebSockets/src/WebSocketsServer.h b/lib/LT_WebSockets/src/WebSocketsServer.h new file mode 100644 index 00000000..a8472a5b --- /dev/null +++ b/lib/LT_WebSockets/src/WebSocketsServer.h @@ -0,0 +1,244 @@ +/** + * @file WebSocketsServer.h + * @date 20.05.2015 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef WEBSOCKETSSERVER_H_ +#define WEBSOCKETSSERVER_H_ + +#include "WebSockets.h" + +#ifndef WEBSOCKETS_SERVER_CLIENT_MAX +#define WEBSOCKETS_SERVER_CLIENT_MAX (5) +#endif + +class WebSocketsServerCore : protected WebSockets { + public: + WebSocketsServerCore(const String & origin = "", const String & protocol = "arduino"); + virtual ~WebSocketsServerCore(void); + + void begin(void); + void close(void); + +#ifdef __AVR__ + typedef void (*WebSocketServerEvent)(uint8_t num, WStype_t type, uint8_t * payload, size_t length); + typedef bool (*WebSocketServerHttpHeaderValFunc)(String headerName, String headerValue); +#else + typedef std::function WebSocketServerEvent; + typedef std::function WebSocketServerHttpHeaderValFunc; +#endif + + void onEvent(WebSocketServerEvent cbEvent); + void onValidateHttpHeader( + WebSocketServerHttpHeaderValFunc validationFunc, + const char * mandatoryHttpHeaders[], + size_t mandatoryHttpHeaderCount); + + bool sendTXT(uint8_t num, uint8_t * payload, size_t length = 0, bool headerToPayload = false); + bool sendTXT(uint8_t num, const uint8_t * payload, size_t length = 0); + bool sendTXT(uint8_t num, char * payload, size_t length = 0, bool headerToPayload = false); + bool sendTXT(uint8_t num, const char * payload, size_t length = 0); + bool sendTXT(uint8_t num, String & payload); + + bool broadcastTXT(uint8_t * payload, size_t length = 0, bool headerToPayload = false); + bool broadcastTXT(const uint8_t * payload, size_t length = 0); + bool broadcastTXT(char * payload, size_t length = 0, bool headerToPayload = false); + bool broadcastTXT(const char * payload, size_t length = 0); + bool broadcastTXT(String & payload); + + bool sendBIN(uint8_t num, uint8_t * payload, size_t length, bool fin = true, bool continuation = false, bool headerToPayload = false); + bool sendBIN(uint8_t num, const uint8_t * payload, size_t length); + + bool broadcastBIN(uint8_t * payload, size_t length, bool fin = true, bool continuation = false, bool headerToPayload = false); + bool broadcastBIN(const uint8_t * payload, size_t length); + + bool sendPing(uint8_t num, uint8_t * payload = NULL, size_t length = 0); + bool sendPing(uint8_t num, String & payload); + + bool broadcastPing(uint8_t * payload = NULL, size_t length = 0); + bool broadcastPing(String & payload); + + void disconnect(void); + void disconnect(uint8_t num); + + void setAuthorization(const char * user, const char * password); + void setAuthorization(const char * auth); + + int connectedClients(bool ping = false); + + bool clientIsConnected(uint8_t num); + + void enableHeartbeat(uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount); + void disableHeartbeat(); + +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) + IPAddress remoteIP(uint8_t num); +#endif + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void loop(void); // handle client data only +#endif + + WSclient_t * newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient); + + protected: + String _origin; + String _protocol; + String _base64Authorization; ///< Base64 encoded Auth request + String * _mandatoryHttpHeaders; + size_t _mandatoryHttpHeaderCount; + + WSclient_t _clients[WEBSOCKETS_SERVER_CLIENT_MAX]; + + WebSocketServerEvent _cbEvent; + WebSocketServerHttpHeaderValFunc _httpHeaderValidationFunc; + + bool _runnning; + + uint32_t _pingInterval; + uint32_t _pongTimeout; + uint8_t _disconnectTimeoutCount; + + void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin); + + void clientDisconnect(WSclient_t * client); + bool clientIsConnected(WSclient_t * client); + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void handleClientData(void); +#endif + + void handleHeader(WSclient_t * client, String * headerLine); + + void handleHBPing(WSclient_t * client); // send ping in specified intervals + + /** + * called if a non Websocket connection is coming in. + * Note: can be override + * @param client WSclient_t * ptr to the client struct + */ + virtual void handleNonWebsocketConnection(WSclient_t * client) { + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] no Websocket connection close.\n", client->num); + client->tcp->write( + "HTTP/1.1 400 Bad Request\r\n" + "Server: arduino-WebSocket-Server\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 32\r\n" + "Connection: close\r\n" + "Sec-WebSocket-Version: 13\r\n" + "\r\n" + "This is a Websocket server only!"); + clientDisconnect(client); + } + + /** + * called if a non Authorization connection is coming in. + * Note: can be override + * @param client WSclient_t * ptr to the client struct + */ + virtual void handleAuthorizationFailed(WSclient_t * client) { + client->tcp->write( + "HTTP/1.1 401 Unauthorized\r\n" + "Server: arduino-WebSocket-Server\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 45\r\n" + "Connection: close\r\n" + "Sec-WebSocket-Version: 13\r\n" + "WWW-Authenticate: Basic realm=\"WebSocket Server\"" + "\r\n" + "This Websocket server requires Authorization!"); + clientDisconnect(client); + } + + /** + * called for sending a Event to the app + * @param num uint8_t + * @param type WStype_t + * @param payload uint8_t * + * @param length size_t + */ + virtual void runCbEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + if(_cbEvent) { + _cbEvent(num, type, payload, length); + } + } + + /* + * Called at client socket connect handshake negotiation time for each http header that is not + * a websocket specific http header (not Connection, Upgrade, Sec-WebSocket-*) + * If the custom httpHeaderValidationFunc returns false for any headerName / headerValue passed, the + * socket negotiation is considered invalid and the upgrade to websockets request is denied / rejected + * This mechanism can be used to enable custom authentication schemes e.g. test the value + * of a session cookie to determine if a user is logged on / authenticated + */ + virtual bool execHttpHeaderValidation(String headerName, String headerValue) { + if(_httpHeaderValidationFunc) { + // return the value of the custom http header validation function + return _httpHeaderValidationFunc(headerName, headerValue); + } + // no custom http header validation so just assume all is good + return true; + } + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + WSclient_t * handleNewClient(WEBSOCKETS_NETWORK_CLASS * tcpClient); +#endif + + /** + * drop native tcp connection (client->tcp) + */ + void dropNativeClient(WSclient_t * client); + + private: + /* + * returns an indicator whether the given named header exists in the configured _mandatoryHttpHeaders collection + * @param headerName String ///< the name of the header being checked + */ + bool hasMandatoryHeader(String headerName); +}; + +class WebSocketsServer : public WebSocketsServerCore { + public: + WebSocketsServer(uint16_t port, const String & origin = "", const String & protocol = "arduino"); + virtual ~WebSocketsServer(void); + + void begin(void); + void close(void); + +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void loop(void); // handle incoming client and client data +#else + // Async interface not need a loop call + void loop(void) __attribute__((deprecated)) { + } +#endif + + protected: +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) + void handleNewClients(void); +#endif + + uint16_t _port; + WEBSOCKETS_NETWORK_SERVER_CLASS * _server; +}; + +#endif /* WEBSOCKETSSERVER_H_ */ diff --git a/lib/LT_WebSockets/src/WebSocketsVersion.h b/lib/LT_WebSockets/src/WebSocketsVersion.h new file mode 100644 index 00000000..bf2526c1 --- /dev/null +++ b/lib/LT_WebSockets/src/WebSocketsVersion.h @@ -0,0 +1,36 @@ +/** + * @file WebSocketsVersion.h + * @date 05.04.2022 + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef WEBSOCKETSVERSION_H_ +#define WEBSOCKETSVERSION_H_ + +#define WEBSOCKETS_VERSION "2.3.7" + +#define WEBSOCKETS_VERSION_MAJOR 2 +#define WEBSOCKETS_VERSION_MINOR 3 +#define WEBSOCKETS_VERSION_PATCH 7 + +#define WEBSOCKETS_VERSION_INT 2003007 + +#endif /* WEBSOCKETSVERSION_H_ */ diff --git a/lib/LT_WebSockets/travis/common.sh b/lib/LT_WebSockets/travis/common.sh new file mode 100644 index 00000000..c1c23285 --- /dev/null +++ b/lib/LT_WebSockets/travis/common.sh @@ -0,0 +1,134 @@ +#!/bin/bash + +set -ex + +function build_sketches() +{ + local arduino=$1 + local srcpath=$2 + local platform=$3 + local sketches=$(find $srcpath -name *.ino) + for sketch in $sketches; do + local sketchdir=$(dirname $sketch) + if [[ -f "$sketchdir/.$platform.skip" ]]; then + echo -e "\n\n ------------ Skipping $sketch ------------ \n\n"; + continue + fi + echo -e "\n\n ------------ Building $sketch ------------ \n\n"; + $arduino --verify $sketch; + local result=$? + if [ $result -ne 0 ]; then + echo "Build failed ($sketch) build verbose..." + $arduino --verify --verbose --preserve-temp-files $sketch + result=$? + fi + if [ $result -ne 0 ]; then + echo "Build failed ($1) $sketch" + return $result + fi + done +} + +function build_sketch() +{ + local arduino=$1 + local sketch=$2 + $arduino --verify $sketch; + local result=$? + if [ $result -ne 0 ]; then + echo "Build failed ($sketch) build verbose..." + $arduino --verify --verbose --preserve-temp-files $sketch + result=$? + fi + if [ $result -ne 0 ]; then + echo "Build failed ($1) $sketch" + return $result + fi +} + +function get_sketches_json() +{ + local arduino=$1 + local srcpath=$2 + local platform=$3 + local sketches=($(find $srcpath -name *.ino)) + echo -en "[" + for sketch in "${sketches[@]}" ; do + local sketchdir=$(dirname $sketch) + if [[ -f "$sketchdir/.$platform.skip" ]]; then + continue + fi + echo -en "\"$sketch\"" + if [[ $sketch != ${sketches[-1]} ]] ; then + echo -en "," + fi + + done + echo -en "]" +} + +function get_sketches_json_matrix() +{ + local arduino=$1 + local srcpath=$2 + local platform=$3 + local ideversion=$4 + local board=$5 + local sketches=($(find $srcpath -name *.ino)) + for sketch in "${sketches[@]}" ; do + local sketchdir=$(dirname $sketch) + local sketchname=$(basename $sketch) + if [[ -f "$sketchdir/.$platform.skip" ]]; then + continue + fi + echo -en "{\"name\":\"$sketchname\",\"board\":\"$board\",\"ideversion\":\"$ideversion\",\"cpu\":\"$platform\",\"sketch\":\"$sketch\"}" + if [[ $sketch != ${sketches[-1]} ]] ; then + echo -en "," + fi + done +} + +function get_core() +{ + echo Setup core for $1 + + cd $HOME/arduino_ide/hardware + + if [ "$1" = "esp8266" ] ; then + mkdir esp8266com + cd esp8266com + git clone --depth 1 https://github.com/esp8266/Arduino.git esp8266 + cd esp8266/ + git submodule update --init + rm -rf .git + cd tools + python get.py + fi + + if [ "$1" = "esp32" ] ; then + mkdir espressif + cd espressif + git clone --depth 1 https://github.com/espressif/arduino-esp32.git esp32 + cd esp32/ + rm -rf .git + cd tools + python get.py + fi + +} + +function clone_library() { + local url=$1 + echo clone $(basename $url) + mkdir -p $HOME/Arduino/libraries + cd $HOME/Arduino/libraries + git clone --depth 1 $url + rm -rf */.git + rm -rf */.github + rm -rf */examples +} + +function hash_library_names() { + cd $HOME/Arduino/libraries + ls | sha1sum -z | cut -c1-5 +} \ No newline at end of file diff --git a/lib/LT_WebSockets/travis/version.py b/lib/LT_WebSockets/travis/version.py new file mode 100644 index 00000000..71454abb --- /dev/null +++ b/lib/LT_WebSockets/travis/version.py @@ -0,0 +1,132 @@ +#!/usr/bin/python3 + +import json +import configparser +import argparse +import re +import os +import datetime + +travis_dir = os.path.dirname(os.path.abspath(__file__)) +base_dir = os.path.abspath(travis_dir + "/../") + +def write_header_file(version): + hvs = version.split('.') + intversion = int(hvs[0]) * 1000000 + int(hvs[1]) * 1000 + int(hvs[2]) + now = datetime.datetime.now() + + text = f'''/** + * @file WebSocketsVersion.h + * @date {now.strftime("%d.%m.%Y")} + * @author Markus Sattler + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the WebSockets for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef WEBSOCKETSVERSION_H_ +#define WEBSOCKETSVERSION_H_ + +#define WEBSOCKETS_VERSION "{version}" + +#define WEBSOCKETS_VERSION_MAJOR {hvs[0]} +#define WEBSOCKETS_VERSION_MINOR {hvs[1]} +#define WEBSOCKETS_VERSION_PATCH {hvs[2]} + +#define WEBSOCKETS_VERSION_INT {intversion} + +#endif /* WEBSOCKETSVERSION_H_ */ +''' + with open(f'{base_dir}/src/WebSocketsVersion.h', 'w') as f: + f.write(text) + + +def get_library_properties_version(): + library_properties = {} + with open(f'{base_dir}/library.properties', 'r') as f: + library_properties = configparser.ConfigParser() + library_properties.read_string('[root]\n' + f.read()) + return library_properties['root']['version'] + + +def get_library_json_version(): + library_json = {} + with open(f'{base_dir}/library.json', 'r') as f: + library_json = json.load(f) + return library_json['version'] + + +def get_header_versions(): + data = {} + define = re.compile('^#define WEBSOCKETS_VERSION_?(.*) "?([0-9\.]*)"?$') + with open(f'{base_dir}/src/WebSocketsVersion.h', 'r') as f: + for line in f: + m = define.match(line) + if m: + name = m[1] + if name == "": + name = "VERSION" + data[name] = m[2] + return data + + +parser = argparse.ArgumentParser(description='Checks and update Version files') +parser.add_argument( + '--update', action='store_true', default=False) +parser.add_argument( + '--check', action='store_true', default=True) + +args = parser.parse_args() + +if args.update: + library_properties_version = get_library_properties_version() + + with open(f'{base_dir}/library.json', 'r') as f: + library_json = json.load(f) + + library_json['version'] = library_properties_version + + with open(f'{base_dir}/library.json', 'w') as f: + json.dump(library_json, f, indent=4, sort_keys=True) + + write_header_file(library_properties_version) + + +library_json_version = get_library_json_version() +library_properties_version = get_library_properties_version() +header_version = get_header_versions() + +print("WebSocketsVersion.h", header_version) +print(f"library.json: {library_json_version}") +print(f"library.properties: {library_properties_version}") + +if args.check: + if library_json_version != library_properties_version or header_version['VERSION'] != library_properties_version: + raise Exception('versions did not match!') + + hvs = header_version['VERSION'].split('.') + if header_version['MAJOR'] != hvs[0]: + raise Exception('header MAJOR version wrong!') + if header_version['MINOR'] != hvs[1]: + raise Exception('header MINOR version wrong!') + if header_version['PATCH'] != hvs[2]: + raise Exception('header PATCH version wrong!') + + intversion = int(hvs[0]) * 1000000 + int(hvs[1]) * 1000 + int(hvs[2]) + if int(header_version['INT']) != intversion: + raise Exception('header INT version wrong!') diff --git a/lib/TickerScheduler/TickerScheduler.cpp b/lib/TickerScheduler/TickerScheduler.cpp index af47ffa1..0f19e78c 100644 --- a/lib/TickerScheduler/TickerScheduler.cpp +++ b/lib/TickerScheduler/TickerScheduler.cpp @@ -105,9 +105,9 @@ void TickerScheduler::update() { if (this->items[i].is_used) { - #ifdef ARDUINO_ARCH_AVR + //#ifdef ARDUINO_ARCH_AVR this->items[i].t.Tick(); - #endif + //#endif handleTicker(this->items[i].cb, this->items[i].cb_arg, &this->items[i].flag); } diff --git a/lib/TickerScheduler/TickerScheduler.h b/lib/TickerScheduler/TickerScheduler.h index 98ae1f05..ec2e82da 100644 --- a/lib/TickerScheduler/TickerScheduler.h +++ b/lib/TickerScheduler/TickerScheduler.h @@ -7,7 +7,7 @@ #include -#ifdef ARDUINO_ARCH_AVR +#if defined ARDUINO_ARCH_AVR || defined LIBRETINY class Ticker { typedef void(*ticker_callback_t)(bool*); @@ -41,12 +41,17 @@ class Ticker this->is_attached = true; } }; -#endif + +#else //#ifdef ARDUINO_ARCH_ESP8266 #include #include -//#endif +#endif +#if defined LIBRETINY +#include +#endif + void tickerFlagHandle(volatile bool * flag); diff --git a/platformio.ini b/platformio.ini index db541216..13953505 100644 --- a/platformio.ini +++ b/platformio.ini @@ -347,6 +347,43 @@ build_src_filter = + ${env:esp32_16mb_fromitems.build_src_filter} +[env:tiny] +extra_scripts = pre:tools/lt_fsbuildscript.py +lib_compat_mode = off +lib_deps = + LT_WebSockets + https://github.com/Mit4el/ESPAsyncUDP#master + ${common_env_data.lib_deps_external} + ${env:tiny_fromitems.lib_deps} +lib_ignore = EspSoftwareSerial, HTTPUpdate, WebSockets +platform = https://github.com/Mit4el/libretiny#master +framework = arduino +board = generic-bk7231n-qfn32-tuya +custom_fw_name = iotm_tiny +custom_fw_version = 0.0.1 +upload_speed = 115200 +monitor_speed = 115200 +build_flags = + -DLT_LOGLEVEL=LT_LEVEL_DEBUG + -DLT_DEBUG_ALL=1 + #-DLFS_THREADSAFE=1 + -DPROJECT_DATA_DIR="data_svelte" + -DLT_USE_TIME=1 + -DDEBUG_ESP_PORT=Serial1 + -DNODEBUG_WEBSOCKETS=1 + -DLT_UART_DEFAULT_PORT=1 + -DUPLOAD_PORT=auto +build_src_filter = + +<*.cpp> + + + + + + + ${env:tiny_fromitems.build_src_filter} + +[task_flash_fs] +description = Flash File System +cmd = echo "Flash FS Tiny board" && patch\ltchiptool.exe flash --start 0x1DB000 --skip 0x00000 --length 0x25000 -f lt_littlefs.bin -p %UPLOAD_PORT% && echo "Complete!" + [env:esp8266_1mb_ota_fromitems] lib_deps = adafruit/Adafruit BME280 Library @@ -809,3 +846,16 @@ build_src_filter = + + +[env:tiny_fromitems] +lib_deps = +build_src_filter = + + + + + + + + + + + + + + + + + + + diff --git a/src/DeviceList.cpp b/src/DeviceList.cpp index 96903e16..937ba315 100644 --- a/src/DeviceList.cpp +++ b/src/DeviceList.cpp @@ -37,7 +37,11 @@ void addThisDeviceToList() { AsyncUDP asyncUdp; void udpListningInit() { - if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) { +#if defined(LIBRETINY) + if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210/* , WiFi.localIP() */)) { +#else + if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) { +#endif asyncUdp.onPacket([](AsyncUDPPacket packet) { // если был включен автоматический поиск устройств то начнем запись в оперативную память if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { @@ -65,8 +69,12 @@ void udpListningInit() { String loacalWorkgroup = ""; jsonRead(settingsFlashJson, F("wg"), loacalWorkgroup); if (remoteWorkgroup == loacalWorkgroup) { +#if defined(LIBRETINY) + SerialPrint("i", F("UDP"), "IP: " + ipToString(packet.remoteIP()) + ":" + String(packet.remotePort()) + " localIP:"+String(packet.localIP())); +#else SerialPrint("i", F("UDP"), "IP: " + packet.remoteIP().toString() + ":" + String(packet.remotePort())); - jsonMergeArrays(devListHeapJson, data); +#endif + jsonMergeArrays(devListHeapJson, data); // эксперементальный вариант отправки нового списка сразу по приходу // sendStringToWs("devlis", devListHeapJson, -1); } @@ -91,7 +99,7 @@ void udpListningInit() { void udpBroadcastInit() { // будем отправлять каждые 60 секунд презентацию данного устройства ts.add( - UDP, 60000, [&](void*) { // UDPP + UDPt, 60000, [&](void*) { // UDPP if (isNetworkActive()) { SerialPrint("i", F("UDP"), F("Broadcast device presentation")); asyncUdp.broadcastTo(getThisDevice().c_str(), 4210); diff --git a/src/ESPConfiguration.cpp b/src/ESPConfiguration.cpp index 5f11b6ba..2326d3aa 100644 --- a/src/ESPConfiguration.cpp +++ b/src/ESPConfiguration.cpp @@ -66,7 +66,7 @@ void clearConfigure() { if (*it) delete *it; } IoTItems.clear(); -#ifdef libretiny +#ifdef LIBRETINY valuesFlashJson.remove(0, valuesFlashJson.length()); #else valuesFlashJson.clear(); diff --git a/src/EspFileSystem.cpp b/src/EspFileSystem.cpp index 8197c630..2c73801d 100644 --- a/src/EspFileSystem.cpp +++ b/src/EspFileSystem.cpp @@ -18,14 +18,17 @@ void globalVarsSync() valuesFlashJson = readFile(F("values.json"), 4096); valuesFlashJson.replace("\r\n", ""); - + if (settingsFlashJson == "failed") + return; mqttPrefix = jsonReadStr(settingsFlashJson, F("mqttPrefix")); jsonWriteStr_(settingsFlashJson, "id", chipId); mqttRootDevice = mqttPrefix + "/" + chipId; - +#ifdef LIBRETINY + jsonWriteStr_(settingsFlashJson, "ip", ipToString(WiFi.localIP())); +#else jsonWriteStr_(settingsFlashJson, "ip", WiFi.localIP().toString()); - +#endif // это не используется - удалить в последствии jsonWriteStr_(settingsFlashJson, "root", mqttRootDevice); } @@ -134,7 +137,7 @@ uint32_t getFlashChipIdNew() } // esp_flash_read_id(nullptr, &flashChipId); -#elif defined(ESP8266) +#elif defined(ESP8266) || defined(LIBRETINY) flashChipId = ESP.getFlashChipId(); #endif // ifdef ESP32 } @@ -148,9 +151,12 @@ const String getMacAddress() #if defined(ESP8266) WiFi.macAddress(mac); sprintf(buf, MACSTR, MAC2STR(mac)); -#else +#elif defined(ESP32) esp_read_mac(mac, ESP_MAC_WIFI_STA); sprintf(buf, MACSTR, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); +#elif defined(LIBRETINY) + uint32_t macid = lt_cpu_get_mac_id (); + memcpy(buf, &macid, sizeof(macid)); #endif return String(buf); } \ No newline at end of file diff --git a/src/Global.cpp b/src/Global.cpp index 6fe4dfcd..7145d956 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -20,7 +20,7 @@ ESP8266WebServer HTTP(80); #ifdef ESP32 WebServer HTTP(80); #endif -#ifdef libretiny +#ifdef LIBRETINY WebServer HTTP(80); #endif #endif diff --git a/src/Main.cpp b/src/Main.cpp index 767c0c8d..441d76d3 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -3,7 +3,9 @@ #include "classes/IoTDB.h" #include "utils/Statistic.h" #include "classes/IoTBench.h" +#ifndef LIBRETINY #include +#endif #include "DebugTrace.h" #if defined(esp32s2_4mb) || defined(esp32s3_16mb) #include @@ -143,7 +145,7 @@ void setup() { #ifdef ESP32 Wire.end(); Wire.begin(pinSDA, pinSCL, (uint32_t)i2cFreq); -#else +#elif defined(ESP8266) Wire.begin(pinSDA, pinSCL); Wire.setClock(i2cFreq); #endif @@ -211,9 +213,10 @@ void setup() { // запуск работы udp addThisDeviceToList(); + #ifdef UDP_ENABLED udpListningInit(); udpBroadcastInit(); - + #endif // создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке createItemFromNet("onStart", "1", 1); diff --git a/src/NTP.cpp b/src/NTP.cpp index f43654ce..185c6269 100644 --- a/src/NTP.cpp +++ b/src/NTP.cpp @@ -1,9 +1,23 @@ #include "NTP.h" +#if defined(LIBRETINY) +#include "lwip/apps/sntp.h" +#endif + #include "Global.h" #include "utils/SerialPrint.h" void ntpInit() { +#if defined(USE_LIBRETINY) + if (sntp_enabled()) { + sntp_stop(); + } + sntp_setoperatingmode(SNTP_OPMODE_POLL); + sntp_setservername(0, jsonReadStr(settingsFlashJson, F("ntp")).c_str()); + sntp_setservername(1, "pool.ntp.org"); + sntp_setservername(2, "ru.pool.ntp.org"); + sntp_init(); +#endif synchTime(); ts.add( @@ -44,7 +58,15 @@ void ntpInit() { } void synchTime() { +#if defined LIBRETINY + // force resync + if (sntp_enabled()) { + sntp_stop(); + sntp_init(); + } +#else configTime(0, 0, "pool.ntp.org", "ru.pool.ntp.org", jsonReadStr(settingsFlashJson, F("ntp")).c_str()); +#endif } //событие смены даты diff --git a/src/PeriodicTasks.cpp b/src/PeriodicTasks.cpp index c82d49ce..c4979963 100644 --- a/src/PeriodicTasks.cpp +++ b/src/PeriodicTasks.cpp @@ -59,6 +59,11 @@ String ESP_getResetReason(void) { return ESP.getResetReason(); } #endif +#ifdef LIBRETINY +String ESP_getResetReason(void) { + return ESP.getResetReason(); +} +#endif #if defined(esp32s2_4mb) || defined(esp32s3_16mb) || defined(esp32c3m_4mb) String ESP_getResetReason(void) { // return ESP32GetResetReason(0); // CPU 0 diff --git a/src/StandWebServer.cpp b/src/StandWebServer.cpp index 6a23378f..1e97c246 100644 --- a/src/StandWebServer.cpp +++ b/src/StandWebServer.cpp @@ -231,7 +231,12 @@ bool handleFileRead(String path) { return the path of the closest parent still existing */ String lastExistingParent(String path) { - while (!path.isEmpty() && !FileFS.exists(path)) { + #ifndef LIBRETINY + while (!path.isEmpty() && !FileFS.exists(path)) + #else + while (!path.length()==0 && !FileFS.exists(path)) + #endif + { if (path.lastIndexOf('/') > 0) { path = path.substring(0, path.lastIndexOf('/')); } else { @@ -278,7 +283,7 @@ void handleFileUpload() { } } -#ifdef ESP8266 +#if defined ESP8266 void deleteRecursive(String path) { File file = FileFS.open(path, "r"); bool isDir = file.isDirectory(); @@ -299,14 +304,14 @@ void deleteRecursive(String path) { } #endif -#ifdef ESP32 +#if defined ESP32 || defined LIBRETINY struct treename { uint8_t type; char *name; }; void deleteRecursive(String path) { - fs::File dir = FileFS.open(path); + fs::File dir = FileFS.open(path.c_str()); if (!dir.isDirectory()) { Serial.printf("%s is a file\n", path); @@ -321,7 +326,11 @@ void deleteRecursive(String path) { while (entry = dir.openNextFile()) { if (entry.isDirectory()) { +#if defined ESP32 deleteRecursive(entry.path()); +#elif defined LIBRETINY + deleteRecursive(entry.fullName()); +#endif } else { String tmpname = path + "/" + strdup(entry.name()); // buffer file name entry.close(); @@ -342,10 +351,15 @@ void deleteRecursive(String path) { */ void handleFileDelete() { String path = HTTP.arg(0); + #ifndef LIBRETINY if (path.isEmpty() || path == "/") { return replyBadRequest("BAD PATH"); } - + #else + if (path.length()==0 || path == "/") { + return replyBadRequest("BAD PATH"); + } + #endif // DBG_OUTPUT_PORT.println(String("handleFileDelete: ") + path); if (!FileFS.exists(path)) { return replyNotFound(FPSTR(FILE_NOT_FOUND)); @@ -368,10 +382,15 @@ void handleFileDelete() { */ void handleFileCreate() { String path = HTTP.arg("path"); + #ifndef LIBRETINY if (path.isEmpty()) { return replyBadRequest(F("PATH ARG MISSING")); } - + #else + if (path.length()==0) { + return replyBadRequest(F("PATH ARG MISSING")); + } + #endif #ifdef USE_SPIFFS if (checkForUnsupportedPath(path).length() > 0) { return replyServerError(F("INVALID FILENAME")); @@ -386,7 +405,11 @@ void handleFileCreate() { } String src = HTTP.arg("src"); + #ifndef LIBRETINY if (src.isEmpty()) { + #else + if (src.length()==0) { + #endif // No source specified: creation // DBG_OUTPUT_PORT.println(String("handleFileCreate: ") + path); if (path.endsWith("/")) { @@ -404,6 +427,9 @@ void handleFileCreate() { #endif #ifdef ESP32 file.write(0); +#endif +#ifdef LIBRETINY + file.write((uint8_t)0); #endif file.close(); } else { @@ -509,7 +535,7 @@ void handleFileList() { } #endif -#ifdef ESP32 +#if defined ESP32 void handleFileList() { if (!HTTP.hasArg("dir")) { HTTP.send(500, "text/plain", "BAD ARGS"); @@ -517,15 +543,29 @@ void handleFileList() { } String path = HTTP.arg("dir"); - // DBG_OUTPUT_PORT.println("handleFileList: " + path); - + if (path != "/" && !FileFS.exists(path)) { + return replyBadRequest("BAD PATH"); + } + //path = "/build/"; + Serial.println("handleFileList: " + path); +#if defined LIBRETINY + File root = FileFS.open(path.c_str()); + //Dir root = FileFS.openDir(path); + Serial.println("handleFileList FIRST OPEN Name: " + String(root.name())); +#else File root = FileFS.open(path); +#endif path = String(); String output = "["; if (root.isDirectory()) { + Serial.println("handleFileList IS DIR: " + String(root.name())); + //root.close(); File file = root.openNextFile(); + Serial.println("handleFileList openNextFile: " + String(file.name())); + while (file) { + if (output != "[") { output += ','; } @@ -549,6 +589,72 @@ void handleFileList() { } #endif +#if defined LIBRETINY +void handleFileList() { + if (!HTTP.hasArg("dir")) { + HTTP.send(500, "text/plain", "BAD ARGS"); + return; + } + String path = HTTP.arg("dir"); + if (path != "/" && !FileFS.exists(path)) { + return replyBadRequest("BAD PATH"); + } + +lfs_dir_t dir; +struct lfs_info info; +int err = lfs_dir_open(&lfs, &dir, path); +if (err) { + HTTP.send(500, "text/plain", "FAIL OPEN DIR"); + return; +} +String output = "["; +while (true) { + int res = lfs_dir_read(&lfs, &dir, &info); + if (res < 0) { + lfs_dir_close(&lfs, &dir); + return err; + } + + if (!res) { + break; + } + + Serial.printf("%s %d", info.name, info.type); + + if (output != "[") { + output += ','; + } + output += "{\"type\":\""; + // output += (file.isDirectory()) ? "dir" : "file"; + if (info.type == LFS_TYPE_DIR) { + output += "dir"; + } else { + output += F("file\",\"size\":\""); + output += info.size; + } + + output += "\",\"name\":\""; + output += String(info.name); + output += "\"}"; + //file = root.openNextFile(); + +} + +err = lfs_dir_close(&lfs, &dir); +if (err) { + HTTP.send(500, "text/plain", "FAIL CLOSE DIR"); + return; +} + + + + + + + output += "]"; + HTTP.send(200, "text/json", output); +} +#endif /* The "Not Found" handler catches all URI not explicitly declared in code First try to find and return the requested file from the filesystem, @@ -560,6 +666,9 @@ void handleNotFound() { #endif #ifdef ESP32 String uri = WebServer::urlDecode(HTTP.uri()); // required to read paths with blanks +#endif +#ifdef LIBRETINY + String uri = WebServer::urlDecode(HTTP.uri()); // required to read paths with blanks #endif if (handleFileRead(uri)) { return; diff --git a/src/UpgradeFirm.cpp b/src/UpgradeFirm.cpp index 525ea345..eaa44b6c 100644 --- a/src/UpgradeFirm.cpp +++ b/src/UpgradeFirm.cpp @@ -36,6 +36,7 @@ void upgrade_firmware(int type, String path) { bool upgradeFS(String path) { bool ret = false; +#ifndef LIBRETINY WiFiClient wifiClient; SerialPrint("!!!", F("Update"), "Start upgrade FS... " + path); @@ -67,11 +68,13 @@ bool upgradeFS(String path) { SerialPrint("E", F("Update"), "HTTP_UPDATE_NO_UPDATES"); } } +#endif return ret; } bool upgradeBuild(String path) { bool ret = false; +#ifndef LIBRETINY WiFiClient wifiClient; SerialPrint("!!!", F("Update"), "Start upgrade BUILD... " + path); @@ -102,6 +105,7 @@ bool upgradeBuild(String path) { SerialPrint("E", F("Update"), "HTTP_UPDATE_NO_UPDATES"); } } +#endif return ret; } diff --git a/src/WsServer.cpp b/src/WsServer.cpp index 98123e75..a80ed967 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -378,6 +378,7 @@ void sendFileToWsByFrames(const String& filename, const String& header, const St auto path = filepath(filename); auto file = FileFS.open(path, "r"); + //SerialPrint("I", "sendFileToWsByFrames", ("reed file: ")+ path); if (!file) { SerialPrint("E", "FS", F("reed file error")); return; @@ -425,16 +426,25 @@ void sendFileToWsByFrames(const String& filename, const String& header, const St continuation = true; } - // Serial.println(String(i) + ") " + "ws: " + String(client_id) + " fr sz: - // " + String(size) + " fin: " + String(fin) + " cnt: " + - // String(continuation)); - + Serial.println(String(i) + ") " + "ws: " + String(client_id) + " fr sz: " + + String(size) + " fin: " + String(fin) + " cnt: " + + String(continuation)); +#ifdef ASYNC_WEB_SOCKETS + if (client_id == -1) { + //ws.broadcastBIN(frameBuf, size, fin, continuation); + ws.binaryAll(frameBuf, size); + } else { + //ws.sendBIN(client_id, frameBuf, size, fin, continuation); + ws.binary(client_id,frameBuf, size); + } +#elif defined (STANDARD_WEB_SOCKETS) if (client_id == -1) { standWebSocket.broadcastBIN(frameBuf, size, fin, continuation); } else { standWebSocket.sendBIN(client_id, frameBuf, size, fin, continuation); } +#endif } i++; } @@ -444,7 +454,12 @@ void sendFileToWsByFrames(const String& filename, const String& header, const St } void sendStringToWs(const String& header, String& payload, int client_id) { - if ((!getNumAPClients() && !isNetworkActive()) || !getNumWSClients()) { +#ifdef LIBRETINY + if (/* (!getNumAPClients() && !isNetworkActive()) || */ !getNumWSClients()) { +#else + if ( (!getNumAPClients() && !isNetworkActive()) || !getNumWSClients()) { +#endif + // SerialPrint("E", "sendStringToWs", "getNumAPClients: " + String(getNumAPClients()) + "isNetworkActive: " + String(isNetworkActive() + "getNumWSClients: " + String(getNumWSClients()))); // standWebSocket.disconnect(); // это и ниже надо сделать при - // standWebSocket.close(); // - отключении AP И WiFi(STA), надо менять ядро WiFi. Сейчас не закрывается сессия клиента при пропаже AP И WiFi(STA) return; @@ -457,14 +472,22 @@ void sendStringToWs(const String& header, String& payload, int client_id) { String msg = header + "|0012|" + payload; size_t totalSize = msg.length(); - + // SerialPrint("E", "sendStringToWs", msg); char dataArray[totalSize]; msg.toCharArray(dataArray, totalSize + 1); +#ifdef ASYNC_WEB_SOCKETS + if (client_id == -1) { + ws.binaryAll((uint8_t*)dataArray, totalSize); + } else { + ws.binary(client_id, (uint8_t*)dataArray, totalSize); + } +#elif defined (STANDARD_WEB_SOCKETS) if (client_id == -1) { standWebSocket.broadcastBIN((uint8_t*)dataArray, totalSize); } else { standWebSocket.sendBIN(client_id, (uint8_t*)dataArray, totalSize); } +#endif } void sendDeviceList(uint8_t num) { @@ -478,5 +501,8 @@ void sendDeviceList(uint8_t num) { SerialPrint("i", "FS", "flash list"); } } - -int getNumWSClients() { return standWebSocket.connectedClients(false); } \ No newline at end of file +#ifdef ASYNC_WEB_SOCKETS +int getNumWSClients() { return ws.count(); } +#elif defined (STANDARD_WEB_SOCKETS) +int getNumWSClients() { return standWebSocket.connectedClients(false); } +#endif \ No newline at end of file diff --git a/src/classes/IoTGpio.cpp b/src/classes/IoTGpio.cpp index f5bef51f..b3161990 100644 --- a/src/classes/IoTGpio.cpp +++ b/src/classes/IoTGpio.cpp @@ -9,7 +9,7 @@ IoTGpio::~IoTGpio(){ } - +#ifndef LIBRETINY void IoTGpio::pinMode(int pin, uint8_t mode) { int pinH = pin/100; if (_drivers[pinH]) _drivers[pinH]->pinMode(pin - pinH*100, mode); @@ -21,7 +21,19 @@ void IoTGpio::digitalWrite(int pin, uint8_t val) { if (_drivers[pinH]) _drivers[pinH]->digitalWrite(pin - pinH*100, val); else ::digitalWrite(pin, val); } +#else +void IoTGpio::pinMode(int pin, uint8_t mode) { + int pinH = pin/100; + if (_drivers[pinH]) _drivers[pinH]->pinMode(pin - pinH*100, mode); + else ::pinMode(pin, (PinMode)mode); +} +void IoTGpio::digitalWrite(int pin, uint8_t val) { + int pinH = pin/100; + if (_drivers[pinH]) _drivers[pinH]->digitalWrite(pin - pinH*100, val); + else ::digitalWrite(pin, (PinStatus)val); +} +#endif int IoTGpio::digitalRead(int pin) { int pinH = pin/100; if (_drivers[pinH]) return _drivers[pinH]->digitalRead(pin - pinH*100); @@ -51,7 +63,11 @@ void IoTGpio::analogWrite(int pin, int val) { void IoTGpio::digitalInvert(int pin) { int pinH = pin/100; if (_drivers[pinH]) _drivers[pinH]->digitalInvert(pin - pinH*100); - else ::digitalWrite(pin, 1 - ::digitalRead(pin)); +#ifdef LIBRETINY + else ::digitalWrite(pin, (PinStatus)(1 - ::digitalRead(pin))); +#else + else ::digitalWrite(pin, (1 - ::digitalRead(pin))); +#endif } diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 6aa26e77..7abce5f8 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -414,11 +414,11 @@ IoTValue sysExecute(SysOp command, std::vector ¶m) { case sysop_deepSleep: if (param.size()) { Serial.printf("Ушел спать на %d сек...", (int)param[0].valD); -#ifdef ESP32 +#if defined(ESP32) esp_sleep_enable_timer_wakeup(param[0].valD * 1000000); delay(1000); esp_deep_sleep_start(); -#else +#elif defined(ESP8266) ESP.deepSleep(param[0].valD * 1000000); #endif } @@ -435,7 +435,7 @@ IoTValue sysExecute(SysOp command, std::vector ¶m) { if (param.size() == 2) { // Serial.printf("Call from sysExecute %s %s\n", param[0].valS.c_str(), param[1].valS.c_str()); String tmpStr = param[1].valS; - if (param[1].isDecimal) tmpStr = param[1].valD; + if (param[1].isDecimal) tmpStr = String(param[1].valD); value.valD = mqtt.publish(param[0].valS.c_str(), tmpStr.c_str(), false); } break; @@ -658,7 +658,7 @@ int IoTScenario::gettok() { LastChar = getLastChar(); if (isalpha(LastChar) || LastChar == '_') { // идентификатор: [a-zA-Z][a-zA-Z0-9]* - IdentifierStr = (char)LastChar; + IdentifierStr = String((char)LastChar); while (isalnum((LastChar = getLastChar())) || LastChar == '_') { IdentifierStr += (char)LastChar; } diff --git a/src/modules/sensors/BL0937/BL0937.cpp b/src/modules/sensors/BL0937/BL0937.cpp index 1e709f06..a3eb39d4 100644 --- a/src/modules/sensors/BL0937/BL0937.cpp +++ b/src/modules/sensors/BL0937/BL0937.cpp @@ -138,12 +138,19 @@ class BL0937wh : public IoTItem ~BL0937wh(){}; }; - +#if defined LIBRETINY +void /* ICACHE_RAM_ATTR */ bl0937_cf1_interrupt() +#else void ICACHE_RAM_ATTR bl0937_cf1_interrupt() +#endif { bl0937->cf1_interrupt(); } +#if defined LIBRETINY +void /* ICACHE_RAM_ATTR */ bl0937_cf_interrupt() +#else void ICACHE_RAM_ATTR bl0937_cf_interrupt() +#endif { bl0937->cf_interrupt(); } diff --git a/src/modules/sensors/BL0937/BL0937lib.cpp b/src/modules/sensors/BL0937/BL0937lib.cpp index a54e68b4..d2f4b987 100644 --- a/src/modules/sensors/BL0937/BL0937lib.cpp +++ b/src/modules/sensors/BL0937/BL0937lib.cpp @@ -177,16 +177,21 @@ void BL0937::setResistors(double current, double voltage_upstream, double voltag _calculateDefaultMultipliers(); } } - +#if defined LIBRETINY +void /* ICACHE_RAM_ATTR */ BL0937::cf_interrupt() { +#else void ICACHE_RAM_ATTR BL0937::cf_interrupt() { +#endif unsigned long now = micros(); _power_pulse_width = now - _last_cf_interrupt; _last_cf_interrupt = now; _pulse_count++; } - +#if defined LIBRETINY +void /* ICACHE_RAM_ATTR */ BL0937::cf1_interrupt() { +#else void ICACHE_RAM_ATTR BL0937::cf1_interrupt() { - +#endif unsigned long now = micros(); if ((now - _first_cf1_interrupt) > _pulse_timeout) { diff --git a/src/modules/virtual/Loging/Loging.cpp b/src/modules/virtual/Loging/Loging.cpp index 362fcdeb..513cf241 100644 --- a/src/modules/virtual/Loging/Loging.cpp +++ b/src/modules/virtual/Loging/Loging.cpp @@ -174,7 +174,11 @@ class Loging : public IoTItem { SerialPrint("E", F("Loging"), "'" + id + "' db file writing error, return"); return; } +#ifdef LIBRETINY + SerialPrint("i", F("Loging"), "'" + id + "' file created http://" + ipToString(WiFi.localIP()) + path); +#else SerialPrint("i", F("Loging"), "'" + id + "' file created http://" + WiFi.localIP().toString() + path); +#endif } void addNewDataToExistingFile(String &path, String &logData) { @@ -183,7 +187,11 @@ class Loging : public IoTItem { SerialPrint("i", F("Loging"), "'" + id + "' file writing error, return"); return; }; +#ifdef LIBRETINY + SerialPrint("i", F("Loging"), "'" + id + "' loging in file http://" + ipToString(WiFi.localIP()) + path); +#else SerialPrint("i", F("Loging"), "'" + id + "' loging in file http://" + WiFi.localIP().toString() + path); +#endif } // данная функция уже перенесена в ядро и будет удалена в последствии diff --git a/src/modules/virtual/LogingDaily/LogingDaily.cpp b/src/modules/virtual/LogingDaily/LogingDaily.cpp index b6f5b1e0..29926cf9 100644 --- a/src/modules/virtual/LogingDaily/LogingDaily.cpp +++ b/src/modules/virtual/LogingDaily/LogingDaily.cpp @@ -139,7 +139,11 @@ class LogingDaily : public IoTItem { SerialPrint("E", F("LogingDaily"), "'" + id + "' db file writing error, return"); return; } + #ifdef LIBRETINY + SerialPrint("i", F("LogingDaily"), "'" + id + "' file created http://" + ipToString(WiFi.localIP()) + path); + #else SerialPrint("i", F("LogingDaily"), "'" + id + "' file created http://" + WiFi.localIP().toString() + path); + #endif } void addNewDataToExistingFile(String &path, String &logData) { @@ -148,7 +152,11 @@ class LogingDaily : public IoTItem { SerialPrint("i", F("LogingDaily"), "'" + id + "' file writing error, return"); return; }; + #ifdef LIBRETINY + SerialPrint("i", F("LogingDaily"), "'" + id + "' LogingDaily in file http://" + ipToString(WiFi.localIP()) + path); + #else SerialPrint("i", F("LogingDaily"), "'" + id + "' LogingDaily in file http://" + WiFi.localIP().toString() + path); + #endif } bool hasDayChanged() { diff --git a/src/modules/virtual/owmWeather/owmWeather.cpp b/src/modules/virtual/owmWeather/owmWeather.cpp index 1ba7b0e9..54abd407 100644 --- a/src/modules/virtual/owmWeather/owmWeather.cpp +++ b/src/modules/virtual/owmWeather/owmWeather.cpp @@ -77,7 +77,7 @@ class owmWeather : public IoTItem if (httpCode > 0) { - ret = httpCode; + ret = String(httpCode); if (httpCode == HTTP_CODE_OK) { diff --git a/src/utils/FileUtils.cpp b/src/utils/FileUtils.cpp index c12bffbe..b6f5ee30 100644 --- a/src/utils/FileUtils.cpp +++ b/src/utils/FileUtils.cpp @@ -60,9 +60,12 @@ File seekFile(const String& filename, size_t position) { const String writeFile(const String& filename, const String& str) { String path = filepath(filename); -#ifdef ESP32 +#if defined ESP32 auto file = FileFS.open(path, FILE_WRITE, true); #endif +#if defined LIBRETINY + auto file = FileFS.open(path, FILE_WRITE); +#endif #ifdef ESP8266 auto file = FileFS.open(path, FILE_WRITE); #endif @@ -77,9 +80,12 @@ const String writeFile(const String& filename, const String& str) { const String writeEmptyFile(const String& filename) { String path = filepath(filename); -#ifdef ESP32 +#if defined ESP32 auto file = FileFS.open(path, FILE_WRITE, true); #endif +#if defined LIBRETINY + auto file = FileFS.open(path, FILE_WRITE); +#endif #ifdef ESP8266 auto file = FileFS.open(path, FILE_WRITE); #endif @@ -285,7 +291,7 @@ String getFilesList(String& directory) { #endif } -#if defined(ESP8266) +#if defined(ESP8266) || defined (LIBRETINY) bool getInfo(FSInfo& info) { return FileFS.info(info); } // Информация о ФС diff --git a/src/utils/I2CUtils.cpp b/src/utils/I2CUtils.cpp index a8c643c6..077578f2 100644 --- a/src/utils/I2CUtils.cpp +++ b/src/utils/I2CUtils.cpp @@ -1,3 +1,4 @@ +#ifndef LIBRETINY #include #include "utils/SerialPrint.h" @@ -29,4 +30,5 @@ void scanI2C() { message += "done\n"; SerialPrint("i", "I2C Scaner", message); -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/utils/Statistic.cpp b/src/utils/Statistic.cpp index 1a992514..b9f359d8 100644 --- a/src/utils/Statistic.cpp +++ b/src/utils/Statistic.cpp @@ -36,7 +36,11 @@ void updateDeviceStatus() { if (httpResponseCode > 0) { ret = http.errorToString(httpResponseCode).c_str(); if (httpResponseCode == HTTP_CODE_OK) { + #ifndef LIBRETINY String payload = http.getString(); + #else + String payload = httpGetString(http); + #endif ret += " " + payload; } } else { diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index b2e0fb2f..f69a7ae5 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -2,12 +2,32 @@ #include #define TRIESONE 25 // количество попыток подключения к одной сети из несколких #define TRIES 40 // количество попыток подключения сети если она одна +/* +IPAddress stringToIp(String strIp) +{ + IPAddress ip; + ip.fromString(strIp); + return ip; +} */ + void routerConnect() { +#if !defined LIBRETINY WiFi.setAutoConnect(false); WiFi.persistent(false); - +#endif +/* String s_staip = "192.168.2.62"; + String s_gateway = "192.168.2.1"; + String s_netmask = "255.255.255.0"; + String s_dns = "192.168.2.1"; + SerialPrint("i", "WIFI", "Use static IP"); + WiFi.config(stringToIp(s_staip), stringToIp(s_gateway), stringToIp(s_netmask), stringToIp(s_dns)); + // bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000); + SerialPrint("i", "WIFI", "Static IP: " + s_staip); + SerialPrint("i", "WIFI", "Gateway: " + s_gateway); + SerialPrint("i", "WIFI", "Netmask: " + s_netmask); + SerialPrint("i", "WIFI", "DNS: " + s_dns); */ WiFi.mode(WIFI_STA); byte triesOne = TRIESONE; @@ -20,14 +40,16 @@ void routerConnect() if (_passwordList.size() == 0 && _ssidList[0] == "" && _passwordList[0] == "") { + #ifndef LIBRETINY WiFi.begin(); + #endif } else { WiFi.begin(_ssidList[0].c_str(), _passwordList[0].c_str()); -#ifdef ESP32 +#if defined (ESP32) WiFi.setTxPower(WIFI_POWER_19_5dBm); -#else +#elif defined (ESP8266) WiFi.setOutputPower(20.5); #endif String _ssid; @@ -79,8 +101,13 @@ void routerConnect() else { Serial.println(""); +#ifdef LIBRETINY + SerialPrint("i", "WIFI", "http://" + ipToString(WiFi.localIP())); + jsonWriteStr(settingsFlashJson, "ip", ipToString(WiFi.localIP())); +#else SerialPrint("i", "WIFI", "http://" + WiFi.localIP().toString()); jsonWriteStr(settingsFlashJson, "ip", WiFi.localIP().toString()); +#endif mqttInit(); } @@ -96,13 +123,18 @@ bool startAPMode() String _ssidAP = jsonReadStr(settingsFlashJson, "apssid"); String _passwordAP = jsonReadStr(settingsFlashJson, "appass"); - - WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str()); + if (_passwordAP == "") + WiFi.softAP(_ssidAP.c_str()); + else + WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str()); IPAddress myIP = WiFi.softAPIP(); - +#ifdef LIBRETINY + SerialPrint("i", "WIFI", "AP IP: " + ipToString(myIP)); + jsonWriteStr(settingsFlashJson, "ip", ipToString(myIP)); +#else SerialPrint("i", "WIFI", "AP IP: " + myIP.toString()); jsonWriteStr(settingsFlashJson, "ip", myIP.toString()); - +#endif if (jsonReadInt(errorsHeapJson, "passer") != 1) { ts.add( @@ -126,7 +158,54 @@ bool startAPMode() } return true; } +#if defined (LIBRETINY) +boolean RouterFind(std::vector jArray) +{ + bool res = false; + int n = WiFi.scanComplete(); + SerialPrint("i", "WIFI", "scan result: " + String(n, DEC)); + + if (n == -2) + { // Сканирование не было запущено, запускаем + SerialPrint("i", "WIFI", "start scanning"); + n = WiFi.scanNetworks(false, false); // async, show_hidden + SerialPrint("i", "WIFI", "scan result: " + String(n, DEC)); + } + else if (n == -1) + { // Сканирование все еще выполняется + SerialPrint("i", "WIFI", "scanning in progress"); + } + + else if (n == 0) + { // ни одна сеть не найдена + SerialPrint("i", "WIFI", "no networks found"); + n = WiFi.scanNetworks(false, false); + SerialPrint("i", "WIFI", "scan result: " + String(n, DEC)); + } + + if (n > 0) + { + for (int8_t i = 0; i < n; i++) + { + for (int8_t k = 0; k < jArray.size(); k++) + { + if (WiFi.SSID(i) == jArray[k]) + { + res = true; + } + } + // SerialPrint("i", "WIFI", (res ? "*" : "") + String(i, DEC) + ") " + WiFi.SSID(i)); + jsonWriteStr_(ssidListHeapJson, String(i), WiFi.SSID(i)); + + // String(WiFi.RSSI(i) + } + } + SerialPrint("i", "WIFI", ssidListHeapJson); + WiFi.scanDelete(); + return res; +} +#elif defined (ESP8266) || defined (ESP32) boolean RouterFind(std::vector jArray) { bool res = false; @@ -170,6 +249,7 @@ boolean RouterFind(std::vector jArray) WiFi.scanDelete(); return res; } +#endif boolean isNetworkActive() { return WiFi.status() == WL_CONNECTED; @@ -199,3 +279,39 @@ uint8_t RSSIquality() { } return res; } + +#ifdef LIBRETINY +String httpGetString(HTTPClient &http) +{ + String payload = ""; + int len = http.getSize(); + uint8_t buff[128] = { 0 }; + WiFiClient * stream = http.getStreamPtr(); + + // read all data from server + while(http.connected() && (len > 0 || len == -1)) { + // get available data size + size_t size = stream->available(); + + if(size) { + // read up to 128 byte + int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size)); + + // write it to Serial + // Serial.write(buff,c); + + //payload += String((char*)buff); + char charBuff[c + 1]; // Create a character array with space for null terminator + memcpy(charBuff, buff, c); // Copy the data to the character array + charBuff[c] = '\0'; // Null-terminate the character array + payload += String(charBuff); // Append the character array to the payload + + if(len > 0) { + len -= c; + } + } + delay(1); + } + return payload; +} +#endif \ No newline at end of file diff --git a/tools/lt_fsbuildscript.py b/tools/lt_fsbuildscript.py new file mode 100644 index 00000000..b636aa45 --- /dev/null +++ b/tools/lt_fsbuildscript.py @@ -0,0 +1,58 @@ + +#import os +import subprocess +#import json +#from datetime import datetime +from os.path import basename, join, normpath +Import("env") +from platformio.platform.base import PlatformBase +from platformio.platform.board import PlatformBoardConfig +#from SCons.Script import DefaultEnvironment, Environment +#env: Environment = DefaultEnvironment() +platform: PlatformBase = env.PioPlatform() + +def build_ltfs(): + print("Current Data dir", env.get("PROJECT_DATA_DIR")) + pathmk = env.get("PROJECT_DIR")+ "/tools/mklittlefs.exe" + pathmk = normpath(pathmk).replace("\\", "/") + print("Current tools dir", pathmk) + FS_SIZE ="0x25000" + FS_PAGE = "0x100" + FS_BLOCK = "0x1000" + subprocess.call([pathmk, "-c", env.get("PROJECT_DATA_DIR"), "-s", FS_SIZE, "-p", FS_PAGE, "-b", FS_BLOCK, "lt_littlefs.bin", ]) + print("------------!!!!!!!!!-------------") + print("FS_SIZE", FS_SIZE) + print("FS_PAGE", FS_PAGE) + print("FS_BLOCK", FS_BLOCK) + print("------------!!!!!!!!!-------------") + #subprocess.call(["c:/USER_BMW/IoTManager_4dev/IoTManager_C6_Tiny/tools/mklittlefs.exe", '-c', '${SOURCES}', '-s', '${FS_SIZE}', '-p', '${FS_PAGE}', '-b', '${FS_BLOCK}', 'lt_littlefs.bin']) + # ./mklittlefs.exe -c c:\USER_BMW\IoTManager_4dev\IoTManager_C6_Tiny\data_svelte -s 0x25000 -p 0x100 -b 0x1000 lt_littlefs.bin +def upload_ltfs(): + print("Flash UserData offset", env.get("FLASH_USERDATA_OFFSET")) + print("Flash UserData length", env.get("FLASH_USERDATA_LENGTH")) + LT_TOOL = 'python.exe -m ltchiptool -r -i 1 -L ' + platform.get_dir() + 'flash write' + print(LT_TOOL) + #subprocess.call(LT_TOOL , shell=True) + #"${LTCHIPTOOL}" +def before_build(): # source, target, env + print("Current Build targets", BUILD_TARGETS) + # Это всё потому что не работает "buildprog". При сборке прошивки Targets пустой, на всякий случай исключим все остальные + if (BUILD_TARGETS == ['upload'] or + BUILD_TARGETS == ['buildfs'] or + BUILD_TARGETS == ['uploadfs'] or + BUILD_TARGETS == ['uploadfsota'] or + BUILD_TARGETS == ['size']): + return + + #print("Clear BUILD_TIME, delete main.o !") + # config = configparser.ConfigParser() # создаём объекта парсера INI + # config.read("platformio.ini") + #deviceName = config["platformio"]["default_envs"] + build_ltfs() + upload_ltfs() + +before_build() + +#на всякий случай +#cd data_svelte/ +#curl.exe -F "file=@edit.htm.gz;filename=edit.htm.gz" http://192.168.2.110/edit \ No newline at end of file From a1ab70fc0774dbc897cdcb173a43e3292072c1db Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 20 Sep 2024 13:13:42 +0300 Subject: [PATCH 007/118] EctoControl Opentherm --- platformio.ini | 5 + .../EctoControlAdapter/EctoControlAdapter.cpp | 273 ++++++++++++++++++ .../EctoControlAdapter/lib/AdapterCommon.h | 182 ++++++++++++ .../exec/EctoControlAdapter/lib/ModbusEC.h | 97 +++++++ .../EctoControlAdapter/lib/librsEctoControl.a | Bin 0 -> 678102 bytes .../EctoControlAdapter/lib/rsEctoControl.h | 113 ++++++++ .../exec/EctoControlAdapter/lib/util/crc16.h | 88 ++++++ .../exec/EctoControlAdapter/lib/util/word.h | 64 ++++ .../exec/EctoControlAdapter/modinfo.json | 208 +++++++++++++ 9 files changed, 1030 insertions(+) create mode 100644 src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp create mode 100644 src/modules/exec/EctoControlAdapter/lib/AdapterCommon.h create mode 100644 src/modules/exec/EctoControlAdapter/lib/ModbusEC.h create mode 100644 src/modules/exec/EctoControlAdapter/lib/librsEctoControl.a create mode 100644 src/modules/exec/EctoControlAdapter/lib/rsEctoControl.h create mode 100644 src/modules/exec/EctoControlAdapter/lib/util/crc16.h create mode 100644 src/modules/exec/EctoControlAdapter/lib/util/word.h create mode 100644 src/modules/exec/EctoControlAdapter/modinfo.json diff --git a/platformio.ini b/platformio.ini index 13953505..ff87dc80 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,6 +9,11 @@ lib_deps_external = [env] extra_scripts = pre:tools/prebuildscript.py +build_flags = + ; библиотека OpenTherm EctoControl Adapter + -I./src/modules/exec/EctoControlAdapter/lib + -L./src/modules/exec/EctoControlAdapter/lib + -lEctoControlAdapterLib [env:esp8266_1mb_ota] lib_deps = diff --git a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp new file mode 100644 index 00000000..27e7ca73 --- /dev/null +++ b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp @@ -0,0 +1,273 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include +#include + +#include "rsEctoControl.h" + +// class ModbusUart; +Stream *_mbUART = nullptr; + +#define UART_LINE 2 + +// Modbus stuff +// Данные Modbus по умолчанию + +#define MODBUS_RX_PIN 18 // Rx pin +#define MODBUS_TX_PIN 19 // Tx pin +#define MODBUS_SERIAL_BAUD 9600 // Baud rate for esp32 and max485 communication + +// void modbusPreTransmission() +// { +// // delay(500); +// if (_DIR_PIN) +// digitalWrite(_DIR_PIN, HIGH); +// } + +// // Pin 4 made low for Modbus receive mode +// // Контакт 4 установлен на низком уровне для режима приема Modbus +// void modbusPostTransmission() +// { +// if (_DIR_PIN) +// digitalWrite(_DIR_PIN, LOW); +// // delay(500); +// } + +// ModbusMaster node; + +RsEctoControl *rsEC; + +class EctoControlAdapter : public IoTItem +{ +private: + int _rx = MODBUS_RX_PIN; // адреса прочитаем с веба + int _tx = MODBUS_TX_PIN; + int _baud = MODBUS_SERIAL_BAUD; + String _prot = "SERIAL_8N1"; + int protocol = SERIAL_8N1; + uint8_t _addr = 0xF0; // Адрес слейва от 1 до 247 + uint8_t _type = 0x14; // Тип устройства: 0x14 – адаптер OpenTherm (вторая версия); 0x11 – адаптер OpenTherm (первая версия, снята с производства) + bool _debugLevel; // Дебаг + //uint8_t _dir_pin; + +public: + EctoControlAdapter(String parameters) : IoTItem(parameters) + { + //_dir_pin = 0; + _addr = jsonReadInt(parameters, "addr"); // адреса slave прочитаем с веба + _rx = jsonReadInt(parameters, "RX"); // прочитаем с веба + _tx = jsonReadInt(parameters, "TX"); + //_dir_pin = jsonReadInt(parameters, "DIR_PIN"); + _baud = jsonReadInt(parameters, "baud"); + _prot = jsonReadStr(parameters, "protocol"); + jsonRead(parameters, "debug", _debugLevel); + + if (_prot == "SERIAL_8N1") + { + protocol = SERIAL_8N1; + } + else if (_prot == "SERIAL_8N2") + { + protocol = SERIAL_8N2; + } + + // Serial2.begin(baud-rate, protocol, RX pin, TX pin); + + _mbUART = new HardwareSerial(UART_LINE); + + if (_debugLevel > 2) + { + SerialPrint("I", "EctoControlAdapter", "baud: " + String(_baud) + ", protocol: " + String(protocol, HEX) + ", RX: " + String(_rx) + ", TX: " + String(_tx)); + } + ((HardwareSerial *)_mbUART)->begin(_baud, protocol, _rx, _tx); // выбираем тип протокола, скорость и все пины с веба + ((HardwareSerial *)_mbUART)->setTimeout(200); + rsEC = new RsEctoControl(parameters); + rsEC->begin(_addr, (Stream &)*_mbUART); + } + + void doByInterval() + { + if (rsEC) + rsEC->doByInterval(); + } + + void loop() + { + if (rsEC) + rsEC->loop(isNetworkActive(), mqttIsConnect()); + // для новых версий IoTManager + IoTItem::loop(); + } + + IoTValue execute(String command, std::vector ¶m) + { + if (rsEC) + rsEC->execute(command, param); + else + return {}; + if (command == "getModelVersion") + { + rsEC->getModelVersion(); + } + if (command == "getModelVersion") + { + rsEC->getModelVersion(); + } + if (command == "getBoilerInfo") + { + rsEC->getBoilerInfo(); + } + if (command == "getBoilerStatus") + { + rsEC->getBoilerStatus(); + } + if (command == "getCodeError") + { + rsEC->getCodeError(); + } + if (command == "getCodeErrorExt") + { + rsEC->getCodeErrorExt(); + } + if (command == "getFlagErrorOT") + { + rsEC->getFlagErrorOT(); + } + if (command == "getFlowRate") + { + rsEC->getFlowRate(); + } + if (command == "getMaxSetCH") + { + rsEC->getMaxSetCH(); + } + if (command == "getMaxSetDHW") + { + rsEC->getMaxSetDHW(); + } + if (command == "getMinSetCH") + { + rsEC->getMinSetCH(); + } + if (command == "getMinSetDHW") + { + rsEC->getMinSetDHW(); + } + if (command == "getModLevel") + { + rsEC->getModLevel(); + } + if (command == "getPressure") + { + rsEC->getPressure(); + } + if (command == "getTempCH") + { + rsEC->getTempCH(); + } + if (command == "getTempDHW") + { + rsEC->getTempDHW(); + } + if (command == "getTempOutside") + { + rsEC->getTempOutside(); + } + + if (command == "setTypeConnect") + { + rsEC->setTypeConnect(param[0].valD); + } + if (command == "setTCH") + { + rsEC->setTCH(param[0].valD); + } + if (command == "setTCHFaultConn") + { + rsEC->setTCHFaultConn(param[0].valD); + } + if (command == "setMinCH") + { + rsEC->setMinCH(param[0].valD); + } + if (command == "setMaxCH") + { + rsEC->setMaxCH(param[0].valD); + } + if (command == "setMinDHW") + { + rsEC->setMinDHW(param[0].valD); + } + if (command == "setMaxDHW") + { + rsEC->setMaxDHW(param[0].valD); + } + if (command == "setTDHW") + { + rsEC->setTDHW(param[0].valD); + } + if (command == "setMaxModLevel") + { + rsEC->setMaxModLevel(param[0].valD); + } + if (command == "setStatusCH") + { + rsEC->setStatusCH((bool)param[0].valD); + } + if (command == "setStatusDHW") + { + rsEC->setStatusDHW((bool)param[0].valD); + } + if (command == "setStatusCH2") + { + rsEC->setStatusCH2((bool)param[0].valD); + } + + if (command == "lockOutReset") + { + rsEC->lockOutReset(); + } + if (command == "rebootAdapter") + { + rsEC->rebootAdapter(); + } + return {}; + } + + void publishData(String widget, String status) + { + + IoTItem *tmp = findIoTItem(widget); + if (tmp) + tmp->setValue(status, true); + else + { + if (_debugLevel > 0) + SerialPrint("i", "NEW", widget + " = " + status); + } + } + + static void sendTelegramm(String msg) + { + if (tlgrmItem) + tlgrmItem->sendTelegramMsg(false, msg); + } + + ~EctoControlAdapter() + { + delete rsEC; + rsEC = nullptr; + }; +}; + +void *getAPI_EctoControlAdapter(String subtype, String param) +{ + + if (subtype == F("ecAdapter")) + { + return new EctoControlAdapter(param); + } + { + return nullptr; + } +} diff --git a/src/modules/exec/EctoControlAdapter/lib/AdapterCommon.h b/src/modules/exec/EctoControlAdapter/lib/AdapterCommon.h new file mode 100644 index 00000000..4b6b7bca --- /dev/null +++ b/src/modules/exec/EctoControlAdapter/lib/AdapterCommon.h @@ -0,0 +1,182 @@ +#pragma once +#include + +#define comm_RebootAdapter 2u +#define comm_LockOutReset 3u + +struct BoilerInfo +{ + uint8_t adapterType; // тип адаптера. 000 - Opentherm 001 - eBus 010 - Navien + uint8_t boilerStatus; // состояние связи с котлом 0 - нет ответа от котла на последнюю команду 1 - есть ответ от котла на последнюю команду + uint8_t rebootStatus; // Код последней перезагрузки адаптера. 0...255 - код + uint8_t adapterHardVer; // Аппаратная версия адаптера. 0...255 - номер версии + uint8_t adapterSoftVer; // u8 Программная версия адаптера. 0...255 - номер версии + uint16_t boilerMemberCode; // 0x0021 R u16 Код производителя котла. Зависит от марки и модели котла. 0...65535 - код производителя + uint16_t boilerModelCode; // 0x0022 R u16 Код модели котла. Зависит от марки и модели котла. 0...65535 - код модели +}; + +struct BoilerStatus +{ + uint8_t burnStatus; // бит 0 - текущее состояние горелки 0 - отключена 1 - включена + uint8_t CHStatus; // бит 1 - текущее состояние отопления 0 - отключено 1 - включено + uint8_t DHWStatus; // бит 2 - текущее состояние ГВС 0 - отключено 1 - включено +}; + +// Флаги ошибок (только для котлов с интерфейсом OpenTherm) +enum FlagErrorOT //: uitn8_t +{ + er_SecviceReq, // 0: Необходимо обслуживание + er_LockOut, // 1: Котел заблокирован + er_LowWater, // 2: Низкое давление в отопительном контуре + er_FlameFault, // 3: Ошибка розжига + er_AirPresFault, // 4: Низкое давление воздуха + er_OverTem // 5: Перегрев теплоносителя в контуре +}; + +////////////////// Данные регистров второй версии адаптера котла +//////////////////// Регистры для чтения + +enum ReadDataEctoControl //: uitn16_t +{ + ecR_AdapterInfo = 0x0010, // 0x0010 R bitfields бит 2...0 - тип адаптера. 000 - Opentherm 001 - eBus 010 - Navien + // бит 3 - состояние связи с котлом 0 - нет ответа от котла на последнюю команду 1 - есть ответ от котла на последнюю команду + // u8 Код последней перезагрузки адаптера. 0...255 - код + + ecR_AdaperVersion = 0x0011, // 0x0011 R u8 Аппаратная версия адаптера. 0...255 - номер версии + // u8 Программная версия адаптера. 0...255 - номер версии + + ecR_Time = 0x0012, // 0x0012 - 0x0013 R u32 Время работы адаптера после перезагрузки 0...4294967295 - время в секундах + ecR_MinSetCH = 0x0014, // 0x0014 R u8 Нижний предел уставки теплоносителя. 0...100 - температура уставки в град. С + ecR_MaxSetCH = 0x0015, // 0x0015 R u8 Верхний предел уставки теплоносителя 0...100 - температура уставки в град. С + ecR_MinSetDHW = 0x0016, // 0x0016 R u8 Нижний предел уставки ГВС 0...100 - температура уставки в град. С + ecR_MaxSetDHW = 0x0017, // 0x0017 R u8 Верхний предел уставки ГВС 0...100 - температура уставки в град. С + ecR_TempCH = 0x0018, // 0x0018 R i16 Текущая температура теплоносителя -100...100 - температура в 0.1 гр. С + ecR_TempDHW = 0x0019, // 0x0019 R u16 Текущая температура ГВС 0...100 - температура в 0.1 гр. С + ecR_Pressure = 0x001A, // 0x001A R u8 Текущее Давление в контуре 0...50 - давление в (0,1бар) + ecR_FlowRate = 0x001B, // 0x001B R u8? Текущий расход ГВС 1...255 - расход в (0,1 л/мин) + ecR_ModLevel = 0x001C, // 0x001C R u8? Текущая модуляция горелки 0xFF - не определено 0...100 - модуляция в (%) + ecR_BoilerStatus = 0x001D, // 0x001D R bitfields бит 0 - текущее состояние горелки 0 - отключена 1 - включена + // бит 1 - текущее состояние отопления 0 - отключено 1 - включено + // бит 2 - текущее состояние ГВС 0 - отключено 1 - включено + + ecR_CodeError = 0x001E, // 0x001E R u16 Код ошибки котла (основной). Зависит от марки и модели котла. 0...65535 - код ошибки + ecR_CodeErrorExt = 0x001F, // 0x001F R u16 Код ошибки котла (дополнительный). Зависит от марки и модели котла. 0...65535 - код ошибки + ecR_TempOutside = 0x0020, // 0x0020 R s8 Температура уличного датчика котла (при егоналичии). -65…+100 температура в градусах С + ecR_MemberCode = 0x0021, // 0x0021 R u16 Код производителя котла. Зависит от марки и модели котла. 0...65535 - код производителя + ecR_ModelCode = 0x0022, // 0x0022 R u16 Код модели котла. Зависит от марки и модели котла. 0...65535 - код модели + ecR_FlagErrorOT = 0x0023 // 0x0023 R s8 Флаги ошибок (только для котлов с интерфейсом OpenTherm) + // 0: Необходимо обслуживание + // 1: Котел заблокирован + // 2: Низкое давление в отопительном контуре + // 3: Ошибка розжига + // 4: Низкое давление воздуха + // 5: Перегрев теплоносителя в контуре +}; + +////////////////////////////// WRITE ///////////// + +enum WriteDataEctoControl //: uitn16_t +{ + ecW_SetTypeConnect = 0x0030, // 0x0030 W u8 Тип внешних подключений (будет сохранено в постоянной памяти адаптера) + // 0 - адаптер подключен к котлу + // 1 - котел подключен к внешнему устройству (панель или перемычка) + + ecW_TSetCH = 0x0031, // 0x0031 W int16 Уставка теплоносителя (будет сохранено в постоянной памяти адаптера). + // Будет передана котлу при старте адаптера, пока главным устройством не + // были записаны регистры уставки температуры. + // 0...1000 - температура уставки в десятых долях градуса С (например, для + // установки 45С нужно записать число 450). Во многих котлах необходимо до + // подключения адаптера необходимо поднять температуру теплоносителя + // отопления (нажимая “+” на панели котла) для согласования диапазона + // температуры теплоносителя, в противном случае температура теплоносителя + // может не достигнуть требуемого значения. + + ecW_TSetCHFaultConn = 0x0032, // 0x0032 W int16 Уставка теплоносителя в аварийном режиме(будет сохранено в постоянной памяти адаптера). + // Будет передана котлу в случае + // отсутствия связи с главным управляющим устройством. + // 0...1000 - температура уставки в десятых долях град. С (например, + // для установки 45С нужно записать число 450) + + ecW_TSetMinCH = 0x0033, // 0x0033 W u8 Нижний предел уставки теплоносителя 0...100 - температура уставки в град. С + // Не все котлы поддерживают этот параметр. Как правило, этот + // предел не должен быть ниже аналогичного предела, + // установленного в настройках котла. + + ecW_TSetMaxCH = 0x0034, // 0x0034 W u8 Верхний предел уставки теплоносителя 0...100 - температура уставки в град. С + // Не все котлы поддерживают этот параметр. Как правило, этот + // предел не должен быть выше аналогичного предела, + // установленного в настройках котла. + + ecW_TSetMinDHW = 0x0035, // 0x0035 W u8 Нижний предел уставки ГВС 0...100 - температура уставки в град. С + // Не все котлы поддерживают этот параметр. Как правило, этот + // предел не должен быть ниже аналогичного предела, + // установленного в настройках котла. + + ecW_TSetMaxDHW = 0x0036, // 0x0036 W u8 Верхний предел уставки ГВС 0...100 - температура уставки в град. С + // Не все котлы поддерживают этот параметр. Как правило, этот + // предел не должен быть выше аналогичного предела, + // установленного в настройках котла. + + ecW_TSetDHW = 0x0037, // 0x0037 W u8 Уставка ГВС (EPROM) 0...100 - температура уставки в град. С + // Для большинства котлов эта уставка должна находиться ниже + // предела, установленного в меню самого котла, иначе она может быть + // проигнорирована котлом. Для некоторых котлов стоит устанавливать + // этот параметр равным верхнему пределу уставки ГВС. + + ecW_SetMaxModLevel = 0x0038, // 0x0038 W u8 Уставка максимальной модуляции горелки (будет сохранено в постоянной памяти адаптера) 0...100 - уровень модуляции в процентах. + // Данный параметр поддерживается не всеми котлами. Для + // электрических трехфазных котлов возможно задать только 3 + // уровня модуляции (в диапазоне 0…100%). + + ecW_SetStatusBoiler = 0x0039, // 0x0039 W bitfields бит 0 - режим контура отопления (будет сохранено в постоянной памяти адаптера) 0 - отключен 1 - включен + // бит 1 - режим контура ГВС 0 - отключен 1 - включен + // бит 2 - “второй контур”, используется только некоторыми котлами с + // интерфейсом OpenTherm и может отвечать за активацию бойлера + // косвенного нагрева или встроенной функции ГВС. 0 - отключен 1 - включен + + + ecW_Command = 0x0080 // 0x0080 W uint16 команда + // 0 - нет команды + // 1 - CH water filling (зарезервировано) + // 2 - перезагрузка адаптера + // 3 - сброс ошибок котла + // 4..65525 - зарезервировано + // При записи любой команды, кроме «нет команды», сразу же меняется + // состояние регистра «Ответ на команду» - становится 2 – идет + // обработка команжы + + +}; + +///////////////////////////////////////// Регистры состояния: + +/* +0x0040…0x006F R i16 состояние данных в регистре ($addr - 0x30) + -2 - ошибка чтения/записи в котел + -1 - регистр не поддерживается + 0- для регистра на чтение означает, что данные из котла прочитаны и + валидны. Для регистра на запись означает, что данные успешно приняты + котлом. + 1- не инициализирован. + если регистр R: чтение соответствующих данные из котла не + приводилось, + если регистр W: адаптеру не было задано значение для записи + соответствующего значения в котле +*/ + + +/* +0x0081 R int16 Ответ на команду + -32768..-6 - зарезервировано + -5 – ошибка выполнения команды + -4 – неподдерживаемая котлом команда + -3 – не поддерживаемый котлом идентификатор устройства + -2 – не поддерживается данный адаптером + -1 – не получен ответ за отведенное врекмя + 0 – команда выполнена успешно + 1 – не было команды (значение по умолчанию) + 2 – идет обработка команды (обмен данными) + 3..32767 - зарезервировано + Если команда после перезагрузки адаптера не давалась, регистр + читается как 1 - не было команды. +*/ diff --git a/src/modules/exec/EctoControlAdapter/lib/ModbusEC.h b/src/modules/exec/EctoControlAdapter/lib/ModbusEC.h new file mode 100644 index 00000000..64105d60 --- /dev/null +++ b/src/modules/exec/EctoControlAdapter/lib/ModbusEC.h @@ -0,0 +1,97 @@ + +#ifndef ModbusEC_h +#define ModbusEC_h + +#define __MODBUSMASTER_DEBUG__ (0) +#define __MODBUSMASTER_DEBUG_PIN_A__ 4 +#define __MODBUSMASTER_DEBUG_PIN_B__ 5 + +#include "Arduino.h" +#include "util/crc16.h" +#include "util/word.h" + +/* _____CLASS DEFINITIONS____________________________________________________ */ +/** +Arduino class library for communicating with Modbus slaves over +RS232/485 (via RTU protocol). +*/ +class ModbusMaster +{ +public: + ModbusMaster(); + + void begin(uint8_t, Stream &serial); + void idle(void (*)()); + void preTransmission(void (*)()); + void postTransmission(void (*)()); + + static const uint8_t ku8MBIllegalFunction = 0x01; + static const uint8_t ku8MBIllegalDataAddress = 0x02; + static const uint8_t ku8MBIllegalDataValue = 0x03; + static const uint8_t ku8MBSlaveDeviceFailure = 0x04; + static const uint8_t ku8MBSuccess = 0x00; + static const uint8_t ku8MBInvalidSlaveID = 0xE0; + static const uint8_t ku8MBInvalidFunction = 0xE1; + static const uint8_t ku8MBResponseTimedOut = 0xE2; + static const uint8_t ku8MBInvalidCRC = 0xE3; + + uint16_t getResponseBuffer(uint8_t); + void clearResponseBuffer(); + uint8_t setTransmitBuffer(uint8_t, uint16_t); + void clearTransmitBuffer(); + + void beginTransmission(uint16_t); + uint8_t requestFrom(uint16_t, uint16_t); + void sendBit(bool); + void send(uint8_t); + void send(uint16_t); + void send(uint32_t); + uint8_t available(void); + uint16_t receive(void); + + uint8_t readHoldingRegisters(uint16_t, uint16_t); + uint8_t writeMultipleRegisters(uint16_t, uint16_t); + uint8_t writeMultipleRegisters(); + + uint8_t readAddresEctoControl(); + uint8_t writeAddresEctoControl(uint8_t); + +private: + Stream *_serial; ///< reference to serial port object + uint8_t _u8MBSlave; ///< Modbus slave (1..255) initialized in begin() + static const uint8_t ku8MaxBufferSize = 20; ///< size of response/transmit buffers + uint16_t _u16ReadAddress; ///< slave register from which to read + uint16_t _u16ReadQty; ///< quantity of words to read + uint16_t _u16ResponseBuffer[ku8MaxBufferSize]; ///< buffer to store Modbus slave response; read via GetResponseBuffer() + uint16_t _u16WriteAddress; ///< slave register to which to write + uint16_t _u16WriteQty; ///< quantity of words to write + uint16_t _u16TransmitBuffer[ku8MaxBufferSize]; ///< buffer containing data to transmit to Modbus slave; set via SetTransmitBuffer() + uint16_t *txBuffer; // from Wire.h -- need to clean this up Rx + uint8_t _u8TransmitBufferIndex; + uint16_t u16TransmitBufferLength; + uint16_t *rxBuffer; // from Wire.h -- need to clean this up Rx + uint8_t _u8ResponseBufferIndex; + uint8_t _u8ResponseBufferLength; + + // Modbus function codes for 16 bit access + static const uint8_t ku8MBReadHoldingRegisters = 0x03; ///< Modbus function 0x03 Read Holding Registers + static const uint8_t ku8MBWriteMultipleRegisters = 0x10; ///< Modbus function 0x10 Write Multiple Registers + + static const uint8_t ku8MBProgRead46 = 0x46; ///< EctoControl function 0x46 Устройство возвращает в ответе свой текущий адрес ADDR + static const uint8_t ku8MBProgWrite47 = 0x47; ///< EctoControl function 0x47 высылается ведущим устройством ведомому с указанием сменить свой имеющийся адрес на заданный + // высылается ведущим устройством единственному устройству на шине с неизвестным адресом + + // Modbus timeout [milliseconds] + static const uint16_t ku16MBResponseTimeout = 2000; ///< Modbus timeout [milliseconds] + + // master function that conducts Modbus transactions + uint8_t ModbusMasterTransaction(uint8_t u8MBFunction); + + // idle callback function; gets called during idle time between TX and RX + void (*_idle)(); + // preTransmission callback function; gets called before writing a Modbus message + void (*_preTransmission)(); + // postTransmission callback function; gets called after a Modbus message has been sent + void (*_postTransmission)(); +}; +#endif diff --git a/src/modules/exec/EctoControlAdapter/lib/librsEctoControl.a b/src/modules/exec/EctoControlAdapter/lib/librsEctoControl.a new file mode 100644 index 0000000000000000000000000000000000000000..f1a36c0eb056ef96a581aea2305e6dbd08e5bb01 GIT binary patch literal 678102 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

1?62Nt7Pu-nl34>-;)ox9 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 + +struct IoTValue; + +// static void publishData(String widget, String status); +static void (*_publishData)(String, String); + +// static void sendTelegramm(String msg); +static void (*_sendTelegramm)(String); + +static void (*_SerialPrint)(const String &, const String &, const String &); //, const String& itemId = "" + +class RsEctoControl //: public ModbusMaster +{ +private: + ModbusMaster node; + String _license; + uint8_t _addr; + uint8_t _debug; + Stream *_modbusUART; + + BoilerInfo info; + BoilerStatus status; + + uint16_t code; + uint16_t codeExt; + uint8_t flagErr; + float flow; + float maxSetCH; + float maxSetDHW; + float minSetCH; + float minSetDHW; + float modLevel; + float press; + float tCH; + float tDHW; + float tOut; + bool enableCH; + bool enableDHW; + bool enableCH2; + bool _isNetworkActive; + bool _mqttIsConnect; + int md = 0; + int md2 = 0; + + uint32_t getFlashChipIdNew(); + + uint32_t ESP_getChipId(void); + + const String getChipId(); + + bool readFunctionModBus(const uint16_t ®, uint16_t &reading); + + bool writeFunctionModBus(const uint16_t ®, uint16_t &data); + +public: + uint8_t _DIR_PIN; + //======================================================================================================= + // setup() + RsEctoControl(String parameters); //: ModbusMaster(); + + ~RsEctoControl(); + + void begin(uint8_t slave, Stream &serial); + + static void initFunction(void (*_publishData_)(String, String), void (*_sendTelegramm_)(String), void (*_SerialPrint_)(const String &, const String &, const String &)); //, const String& + + void doByInterval(); + + // Основной цикл программы + void loop(bool isNetworkActive, bool mqttIsConnect); + + // Исполнительные комманды + void execute(String command, std::vector ¶m); + + bool getModelVersion(); + bool getBoilerInfo(); + bool getBoilerStatus(); + bool getCodeError(); + bool getCodeErrorExt(); + bool getFlagErrorOT(); + bool getFlowRate(); + bool getMaxSetCH(); + bool getMaxSetDHW(); + bool getMinSetCH(); + bool getMinSetDHW(); + bool getModLevel(); + bool getPressure(); + bool getTempCH(); + bool getTempDHW(); + bool getTempOutside(); + + bool setTypeConnect(float &data); + bool setTCH(float &data); + bool setTCHFaultConn(float &data); + bool setMinCH(float &data); + bool setMaxCH(float &data); + bool setMinDHW(float &data); + bool setMaxDHW(float &data); + bool setTDHW(float &data); + bool setMaxModLevel(float &data); + bool setStatusCH(bool data); + bool setStatusDHW(bool data); + bool setStatusCH2(bool data); + + bool lockOutReset(); + bool rebootAdapter(); +}; diff --git a/src/modules/exec/EctoControlAdapter/lib/util/crc16.h b/src/modules/exec/EctoControlAdapter/lib/util/crc16.h new file mode 100644 index 00000000..27ea89ec --- /dev/null +++ b/src/modules/exec/EctoControlAdapter/lib/util/crc16.h @@ -0,0 +1,88 @@ +/** +@file +CRC Computations + +@defgroup util_crc16 "util/crc16.h": CRC Computations +@code#include "util/crc16.h"@endcode + +This header file provides functions for calculating +cyclic redundancy checks (CRC) using common polynomials. +Modified by Doc Walker to be processor-independent (removed inline +assembler to allow it to compile on SAM3X8E processors). + +@par References: +Jack Crenshaw's "Implementing CRCs" article in the January 1992 issue of @e +Embedded @e Systems @e Programming. This may be difficult to find, but it +explains CRC's in very clear and concise terms. Well worth the effort to +obtain a copy. + +*/ +/* Copyright (c) 2002, 2003, 2004 Marek Michalkiewicz + Copyright (c) 2005, 2007 Joerg Wunsch + Copyright (c) 2013 Dave Hylands + Copyright (c) 2013 Frederic Nadeau + Copyright (c) 2015 Doc Walker + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + + +#ifndef _UTIL_CRC16_H_ +#define _UTIL_CRC16_H_ + + +/** @ingroup util_crc16 + Processor-independent CRC-16 calculation. + + Polynomial: x^16 + x^15 + x^2 + 1 (0xA001)
+ Initial value: 0xFFFF + + This CRC is normally used in disk-drive controllers. + + @param uint16_t crc (0x0000..0xFFFF) + @param uint8_t a (0x00..0xFF) + @return calculated CRC (0x0000..0xFFFF) +*/ +static uint16_t crc16_update(uint16_t crc, uint8_t a) +{ + int i; + + crc ^= a; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0xA001; + else + crc = (crc >> 1); + } + + return crc; +} + + +#endif /* _UTIL_CRC16_H_ */ diff --git a/src/modules/exec/EctoControlAdapter/lib/util/word.h b/src/modules/exec/EctoControlAdapter/lib/util/word.h new file mode 100644 index 00000000..c72ad944 --- /dev/null +++ b/src/modules/exec/EctoControlAdapter/lib/util/word.h @@ -0,0 +1,64 @@ +/** +@file +Utility Functions for Manipulating Words + +@defgroup util_word "util/word.h": Utility Functions for Manipulating Words +@code#include "util/word.h"@endcode + +This header file provides utility functions for manipulating words. + +*/ +/* + + word.h - Utility Functions for Manipulating Words + + This file is part of ModbusMaster. + + ModbusMaster is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ModbusMaster is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ModbusMaster. If not, see . + + Written by Doc Walker (Rx) + Copyright © 2009-2015 Doc Walker <4-20ma at wvfans dot net> + +*/ + + +#ifndef _UTIL_WORD_H_ +#define _UTIL_WORD_H_ + + +/** @ingroup util_word + Return low word of a 32-bit integer. + + @param uint32_t ww (0x00000000..0xFFFFFFFF) + @return low word of input (0x0000..0xFFFF) +*/ +static inline uint16_t lowWord(uint32_t ww) +{ + return (uint16_t) ((ww) & 0xFFFF); +} + + +/** @ingroup util_word + Return high word of a 32-bit integer. + + @param uint32_t ww (0x00000000..0xFFFFFFFF) + @return high word of input (0x0000..0xFFFF) +*/ +static inline uint16_t highWord(uint32_t ww) +{ + return (uint16_t) ((ww) >> 16); +} + + +#endif /* _UTIL_WORD_H_ */ diff --git a/src/modules/exec/EctoControlAdapter/modinfo.json b/src/modules/exec/EctoControlAdapter/modinfo.json new file mode 100644 index 00000000..dbd8c178 --- /dev/null +++ b/src/modules/exec/EctoControlAdapter/modinfo.json @@ -0,0 +1,208 @@ +{ + "menuSection": "sensors", + "configItem": [ + { + "global": 0, + "name": "ectoCtrlAdapter", + "type": "Reading", + "subtype": "ecAdapter", + "id": "ecto", + "widget": "anydataTmp", + "page": "Котёл", + "descr": "Адаптер", + "int": 60, + "addr": "0xF0", + "RX": 18, + "TX": 19, + "DIR_PIN": 4, + "baud": 9600, + "protocol": "SERIAL_8N2", + "debug": 1 + } + ], + "about": { + "authorName": "Mikhail Bubnov", + "authorContact": "https://t.me/Mit4bmw", + "authorGit": "https://github.com/Mit4el", + "specialThanks": "", + "moduleName": "EctoControlAdapter", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "subTypes": [ + "ecAdapter" + ], + "title": "EctoControlAdapter", + "moduleDesc": "Управление отопительным котлом через адаптер EctoControl по протоколам OpenTherm, eBUS, Navien. Посредством Modbus RTU. Разъем 4P4C: 1-Желтый(красный)+12V; 2-Белый-GND; 3-Зелёный-A; 4-Коричневый(Синий)-B", + "propInfo": { + "addr": "Адрес slav", + "int": "Количество секунд между опросами датчика.", + "RX": "Пин RX", + "TX": "Пин TX", + "DIR_PIN": "connect DR, RE pin of MAX485 to gpio, указать 0 если не нужен", + "baud": "скорость Uart", + "protocol": "Протокол Uart: SERIAL_8N1 или SERIAL_8N2", + "debug": "0 - отключить дебаг, 1 - включить вывод дебага, 2 - лог комманд, 3 - вывод modbus" + }, + "funcInfo": [ + { + "name": "getModelVersion", + "descr": "Запрос модели и версии адаптера и бойлера", + "params": [] + }, + { + "name": "getBoilerInfo", + "descr": "Запрос состояния связи с котлом, типа адаптера и код перезагрузки адаптера", + "params": [] + }, + { + "name": "getBoilerStatus", + "descr": "Запрос состояния контуров котла и горелки", + "params": [] + }, + { + "name": "getCodeError", + "descr": "Код ошибки котла (основной). Зависит от марки и модели котла.", + "params": [] + }, + { + "name": "getCodeErrorExt", + "descr": "Код ошибки котла (дополнительный). Зависит от марки и модели котла.", + "params": [] + }, + { + "name": "getFlagErrorOT", + "descr": "Стандартные флаги ошибок котла (только для котлов с интерфейсом OpenTherm)", + "params": [] + }, + { + "name": "getFlowRate", + "descr": "Текущий расхода ГВС", + "params": [] + }, + { + "name": "getMaxSetCH", + "descr": "Верхний предел уставки теплоносителя", + "params": [] + }, + { + "name": "getMaxSetDHW", + "descr": "Верхний предел уставки ГВС", + "params": [] + }, + { + "name": "getMinSetCH", + "descr": "Нижний предел уставки теплоносителя", + "params": [] + }, + { + "name": "getMinSetDHW", + "descr": "Нижний предел уставки ГВС", + "params": [] + }, + { + "name": "getModLevel", + "descr": "Текущая модуляция горелки", + "params": [] + }, + { + "name": "getPressure", + "descr": "Текущее Давление в контуре", + "params": [] + }, + { + "name": "getTempCH", + "descr": "Текущая температура теплоносителя", + "params": [] + }, + { + "name": "getTempDHW", + "descr": "Текущая температура ГВС", + "params": [] + }, + { + "name": "getTempOutside", + "descr": "Температура уличного датчика котла", + "params": [] + }, + { + "name": "setTypeConnect", + "descr": "Установить тип внешних подключений (сохраняется в EPROM Адаптера): 0 - адаптер подключен к котлу, 1 - котел подключен к внешнему устройству (панель или перемычка)", + "params": ["Тип подключения"] + }, + { + "name": "setTCH", + "descr": "Уставка температуры теплоносителя (сохраняется в EPROM Адаптера)", + "params": ["температура передаётся до десятых градуса"] + }, + { + "name": "setTDHW", + "descr": "Уставка температуры ГВС (сохраняется в EPROM Адаптера)", + "params": ["температура передаётся до десятых градуса"] + }, + { + "name": "setTCHFaultConn", + "descr": "Уставка теплоносителя в аварийном режиме (сохраняется в EPROM Адаптера). Будет передана котлу в случае отсутствия связи адаптера с управляющим устройством", + "params": ["температура передаётся до десятых градуса"] + }, + { + "name": "setMinCH", + "descr": "Задать нижний предел уставки теплоносителя", + "params": ["температура от 0 до 100"] + }, + { + "name": "setMaxCH", + "descr": "Задать верхний предел уставки теплоносителя", + "params": ["температура от 0 до 100"] + }, + { + "name": "setMinDHW", + "descr": "Задать нижний предел уставки ГВС", + "params": ["температура от 0 до 100"] + }, + { + "name": "setMaxDHW", + "descr": "Задать верхний предел уставки ГВС", + "params": ["температура от 0 до 100"] + }, + + { + "name": "setMaxModLevel", + "descr": "Уставка максимальной модуляции горелки (сохраняется в EPROM Адаптера)", + "params": ["уровень модуляции 0-100%"] + }, + { + "name": "setStatusCH", + "descr": "Установить режим (Включить) контура отопления; 0 - отключен, 1 - включен", + "params": ["вкл/откл отопления"] + }, + { + "name": "setStatusDHW", + "descr": "Установить режим (Включить) ГВС; 0 - отключен, 1 - включен", + "params": ["вкл/откл ГВС"] + }, + { + "name": "setStatusCH2", + "descr": "Установить режим (Включить) второго контура отопления; 0 - отключен, 1 - включен. используется только некоторыми котлами с интерфейсом OpenTherm и может отвечать за активацию бойлера косвенного нагрева или встроенной функции ГВС", + "params": ["вкл/откл второго контура отопления"] + }, + { + "name": "lockOutReset", + "descr": "Сброс ошибок котла", + "params": [] + }, + { + "name": "rebootAdapter", + "descr": "Перезагрузка адаптера", + "params": [] + } + ] + }, + "defActive": false, + "usedLibs": { + "esp32*": [], + "esp82*": [] + } +} \ No newline at end of file From b9c07b809f7b101748297cc19db4b9b84a89ded5 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 20 Sep 2024 13:22:49 +0300 Subject: [PATCH 008/118] msg by used ELF file --- include/DebugTrace.h | 7 ++++++- src/DebugTrace.cpp | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/DebugTrace.h b/include/DebugTrace.h index bd8b33fc..a3532060 100644 --- a/include/DebugTrace.h +++ b/include/DebugTrace.h @@ -1,5 +1,10 @@ #pragma once -// + +// В папке toolchchain с которым собирались +// (Для esp32 например %%USERPROFILE%/.platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin) +// из командной строки Windows (cmd) запустить файл c параметрами: +// xtensa-esp32-elf-addr2line.exe -pfiaC -e Путь_к_файлу/firmware.elf Стэк_адресов_из_сообщения +// %%USERPROFILE%/.platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin xtensa-esp32-elf-addr2line.exe -pfiaC -e .pio/build/esp32_4mb3f/firmware.elf Стэк_адресов #include "Global.h" #define RESTART_DEBUG_INFO diff --git a/src/DebugTrace.cpp b/src/DebugTrace.cpp index 8b8afd85..14b011a4 100644 --- a/src/DebugTrace.cpp +++ b/src/DebugTrace.cpp @@ -89,6 +89,8 @@ re_restart_debug_t debugGet() #define CONFIG_MESSAGE_TG_VERSION_HEAP "! Устройство аварийно перезапущено !\n\nИмя устройства: %s\nПричина перезапуска: %s\nCPU0: %s\nCPU1: %s\nHEAP: %s" #define CONFIG_MESSAGE_TG_VERSION_TRACE "! Устройство аварийно перезапущено !\n\nИмя устройства: %s\nПричина перезапуска: %s\nCPU0: %s\nCPU1: %s\nHEAP: %s\nTRACE: %s" +#define INFO_MESSAGE_DEBUG "By used -> USERPROFILE/.platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin xtensa-esp32-elf-addr2line.exe -pfiaC -e .pio/build/esp32_4mb3f/firmware.elf Стэк_адресов" + char *malloc_stringf(const char *format, ...) { char *ret = nullptr; @@ -211,6 +213,8 @@ void printDebugTrace() jsonReadStr(settingsFlashJson, F("name")), ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str()); } + Serial.println(INFO_MESSAGE_DEBUG); + } void sendDebugTraceAndFreeMemory( bool postMsg) From af0f782f07f45b379d9f3e2da5f9a6086c3031b9 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 21 Sep 2024 11:28:46 +0300 Subject: [PATCH 009/118] fix Discovery, DugTrace --- include/DebugTrace.h | 3 + include/EspFileSystem.h | 1 + include/Global.h | 2 +- include/classes/IoTItem.h | 9 +- lib/TickerScheduler/TickerScheduler.cpp | 4 +- myProfile.json | 14 ++- platformio.ini | 111 ++++++------------ src/DebugTrace.cpp | 1 + src/EspFileSystem.cpp | 14 +-- src/Main.cpp | 3 + src/classes/IoTDiscovery.cpp | 1 - src/classes/IoTItem.cpp | 4 +- .../exec/EctoControlAdapter/modinfo.json | 4 +- .../virtual/DiscoveryHA/DiscoveryHA.cpp | 2 +- src/modules/virtual/DiscoveryHA/modinfo.json | 2 +- .../virtual/DiscoveryHomeD/DiscoveryHomeD.cpp | 4 +- .../virtual/DiscoveryHomeD/modinfo.json | 2 +- 17 files changed, 80 insertions(+), 101 deletions(-) diff --git a/include/DebugTrace.h b/include/DebugTrace.h index a3532060..aff80087 100644 --- a/include/DebugTrace.h +++ b/include/DebugTrace.h @@ -19,6 +19,9 @@ typedef struct { } re_restart_debug_t; #endif // RESTART_DEBUG_INFO + +__NOINIT_ATTR static int8_t bootloop_panic_count; + extern "C" void __real_esp_panic_handler(void*); void printDebugTrace(); void sendDebugTraceAndFreeMemory(bool); diff --git a/include/EspFileSystem.h b/include/EspFileSystem.h index 1d468a88..332b1c25 100644 --- a/include/EspFileSystem.h +++ b/include/EspFileSystem.h @@ -51,6 +51,7 @@ extern void globalVarsSync(); // extern String getParamsJson(); extern void syncSettingsFlashJson(); +void resetSettingsFlashByPanic(); extern void syncValuesFlashJson(); extern const String getChipId(); diff --git a/include/Global.h b/include/Global.h index 5823e68f..9d5f36a5 100644 --- a/include/Global.h +++ b/include/Global.h @@ -60,7 +60,7 @@ #include "utils/StringUtils.h" #include "PeriodicTasks.h" #include "classes/IoTGpio.h" - +#include "classes/IoTDiscovery.h" /********************************************************************************************************************* *****************************************глобальные объекты классов*************************************************** **********************************************************************************************************************/ diff --git a/include/classes/IoTItem.h b/include/classes/IoTItem.h index 23b63644..43c802d9 100644 --- a/include/classes/IoTItem.h +++ b/include/classes/IoTItem.h @@ -3,6 +3,7 @@ //#include "classes/IoTBench.h" class IoTBench; +class IoTDiscovery; struct IoTValue { float valD = 0; @@ -57,10 +58,10 @@ class IoTItem { //virtual IoTItem* getCAMDriver(); virtual IoTItem* getTlgrmDriver(); //virtual IoTBench* getBenchmark(); - virtual IoTBench*getBenchmarkTask(); - virtual IoTBench*getBenchmarkLoad(); - virtual IoTBench*getHADiscovery(); - virtual IoTBench*getHOMEdDiscovery(); + virtual IoTBench* getBenchmarkTask(); + virtual IoTBench* getBenchmarkLoad(); + virtual IoTDiscovery* getHADiscovery(); + virtual IoTDiscovery* getHOMEdDiscovery(); virtual unsigned long getRtcUnixTime(); // делаем доступным модулям отправку сообщений в телеграм diff --git a/lib/TickerScheduler/TickerScheduler.cpp b/lib/TickerScheduler/TickerScheduler.cpp index 0f19e78c..6821422a 100644 --- a/lib/TickerScheduler/TickerScheduler.cpp +++ b/lib/TickerScheduler/TickerScheduler.cpp @@ -105,9 +105,9 @@ void TickerScheduler::update() { if (this->items[i].is_used) { - //#ifdef ARDUINO_ARCH_AVR + #if defined ARDUINO_ARCH_AVR || defined LIBRETINY this->items[i].t.Tick(); - //#endif + #endif handleTicker(this->items[i].cb, this->items[i].cb_arg, &this->items[i].flag); } diff --git a/myProfile.json b/myProfile.json index 503f4aaa..fcd49a01 100644 --- a/myProfile.json +++ b/myProfile.json @@ -137,13 +137,21 @@ "path": "src/modules/virtual/Cron", "active": false }, + { + "path": "src/modules/virtual/DiscoveryHA", + "active": true + }, + { + "path": "src/modules/virtual/DiscoveryHomeD", + "active": true + }, { "path": "src/modules/virtual/GoogleSheet", "active": false }, { "path": "src/modules/virtual/Loging", - "active": false + "active": true }, { "path": "src/modules/virtual/LogingDaily", @@ -167,7 +175,7 @@ }, { "path": "src/modules/virtual/Variable", - "active": false + "active": true }, { "path": "src/modules/virtual/VButton", @@ -447,7 +455,7 @@ }, { "path": "src/modules/exec/SIM800", - "active": true + "active": false }, { "path": "src/modules/exec/SmartBoiler", diff --git a/platformio.ini b/platformio.ini index ff87dc80..e697c59f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,18 +9,20 @@ lib_deps_external = [env] extra_scripts = pre:tools/prebuildscript.py + +[common] build_flags = - ; библиотека OpenTherm EctoControl Adapter - -I./src/modules/exec/EctoControlAdapter/lib -L./src/modules/exec/EctoControlAdapter/lib - -lEctoControlAdapterLib + -lrsEctoControl + -I./src/modules/exec/EctoControlAdapter/lib [env:esp8266_1mb_ota] lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_1mb_ota_fromitems.lib_deps} ESPAsyncUDP -build_flags = -Desp8266_1mb_ota="esp8266_1mb_ota" +build_flags = ${common.build_flags} + -Desp8266_1mb_ota="esp8266_1mb_ota" framework = arduino board = nodemcuv2 board_build.ldscript = eagle.flash.1m64.ld @@ -41,7 +43,8 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_1mb_fromitems.lib_deps} ESPAsyncUDP -build_flags = -Desp8266_1mb="esp8266_1mb" +build_flags = ${common.build_flags} + -Desp8266_1mb="esp8266_1mb" framework = arduino board = nodemcuv2 board_build.ldscript = eagle.flash.1m256.ld @@ -62,7 +65,8 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8285_1mb_ota_fromitems.lib_deps} ESPAsyncUDP -build_flags = -Desp8266_1mb_ota="esp8266_1mb_ota" +build_flags = ${common.build_flags} + -Desp8266_1mb_ota="esp8266_1mb_ota" framework = arduino board = esp8285 board_build.ldscript = eagle.flash.1m64.ld @@ -83,7 +87,8 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_2mb_fromitems.lib_deps} ESPAsyncUDP -build_flags = -Desp8266_2mb="esp8266_2mb" +build_flags = ${common.build_flags} + -Desp8266_2mb="esp8266_2mb" framework = arduino board = d1_wroom_02 board_build.ldscript = eagle.flash.2m1m.ld @@ -104,7 +109,8 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_2mb_ota_fromitems.lib_deps} ESPAsyncUDP -build_flags = -Desp8266_2mb_ota="esp8266_2mb_ota" +build_flags = ${common.build_flags} + -Desp8266_2mb_ota="esp8266_2mb_ota" framework = arduino board = d1_wroom_02 board_build.ldscript = eagle.flash.2m256.ld @@ -125,7 +131,8 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8285_1mb_fromitems.lib_deps} ESPAsyncUDP -build_flags = -Desp8266_1mb="esp8266_1mb" +build_flags = ${common.build_flags} + -Desp8266_1mb="esp8266_1mb" framework = arduino board = esp8285 board_build.ldscript = eagle.flash.1m256.ld @@ -146,7 +153,8 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_4mb_fromitems.lib_deps} ESPAsyncUDP -build_flags = -Desp8266_4mb="esp8266_4mb" +build_flags = ${common.build_flags} + -Desp8266_4mb="esp8266_4mb" framework = arduino board = nodemcuv2 board_build.ldscript = eagle.flash.4m1m.ld @@ -168,7 +176,8 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_16mb_fromitems.lib_deps} ESPAsyncUDP -build_flags = -Desp8266_16mb="esp8266_16mb" +build_flags = ${common.build_flags} + -Desp8266_16mb="esp8266_16mb" framework = arduino board = nodemcuv2 platform = espressif8266 @4.0.1 @@ -189,7 +198,8 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_4mb_fromitems.lib_deps} -build_flags = -Desp32_4mb="esp32_4mb" +build_flags = ${common.build_flags} + -Desp32_4mb="esp32_4mb" -Wl,--wrap=esp_panic_handler framework = arduino board = esp32dev @@ -211,7 +221,8 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_4mb3f_fromitems.lib_deps} -build_flags = -Desp32_4mb="esp32_4mb" +build_flags = ${common.build_flags} + -Desp32_4mb="esp32_4mb" -Wl,--wrap=esp_panic_handler framework = arduino board = esp32dev @@ -234,7 +245,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32cam_4mb_fromitems.lib_deps} -build_flags = +build_flags = ${common.build_flags} -Desp32cam_4mb="esp32cam_4mb" -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue @@ -259,7 +270,8 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32s2_4mb_fromitems.lib_deps} -build_flags = -Desp32s2_4mb="esp32s2_4mb" +build_flags = ${common.build_flags} + -Desp32s2_4mb="esp32s2_4mb" -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=0 -Wl,--wrap=esp_panic_handler @@ -283,7 +295,8 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32c3m_4mb_fromitems.lib_deps} -build_flags = -Desp32c3m_4mb="esp32c3m_4mb" +build_flags = ${common.build_flags} + -Desp32c3m_4mb="esp32c3m_4mb" -Wl,--wrap=esp_panic_handler framework = arduino board = lolin_c3_mini @@ -306,7 +319,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32s3_16mb_fromitems.lib_deps} -build_flags = +build_flags = ${common.build_flags} -Desp32s3_16mb="esp32s3_16mb" -Wl,--wrap=esp_panic_handler framework = arduino @@ -332,7 +345,8 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_16mb_fromitems.lib_deps} -build_flags = -Desp32_16mb="esp32_16mb" +build_flags = ${common.build_flags} + -Desp32_16mb="esp32_16mb" -Wl,--wrap=esp_panic_handler framework = arduino board = esp32dev @@ -371,7 +385,6 @@ monitor_speed = 115200 build_flags = -DLT_LOGLEVEL=LT_LEVEL_DEBUG -DLT_DEBUG_ALL=1 - #-DLFS_THREADSAFE=1 -DPROJECT_DATA_DIR="data_svelte" -DLT_USE_TIME=1 -DDEBUG_ESP_PORT=Serial1 @@ -385,10 +398,6 @@ build_src_filter = + ${env:tiny_fromitems.build_src_filter} -[task_flash_fs] -description = Flash File System -cmd = echo "Flash FS Tiny board" && patch\ltchiptool.exe flash --start 0x1DB000 --skip 0x00000 --length 0x25000 -f lt_littlefs.bin -p %UPLOAD_PORT% && echo "Complete!" - [env:esp8266_1mb_ota_fromitems] lib_deps = adafruit/Adafruit BME280 Library @@ -713,62 +722,16 @@ build_src_filter = [env:esp32_4mb3f_fromitems] lib_deps = - https://github.com/enjoyneering/AHTxx.git - adafruit/Adafruit BME280 Library - adafruit/Adafruit BMP280 Library - beegee-tokyo/DHT sensor library for ESPx - https://github.com/milesburton/Arduino-Temperature-Control-Library - https://github.com/tremaru/iarduino_RTC - robtillaart/SHT2x@^0.1.1 - WEMOS SHT3x@1.0.0 - plerup/EspSoftwareSerial - gyverlibs/EncButton @ ^2.0 - https://github.com/RoboticsBrno/ServoESP32#v1.0.3 - adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 - adafruit/Adafruit BusIO @ ^1.13.2 - dfrobot/DFRobotDFPlayerMini @ ^1.0.5 - adafruit/Adafruit BusIO @ ^1.13.2 - https://github.com/robotclass/RobotClass_LiquidCrystal_I2C - marcoschwartz/LiquidCrystal_I2C@^1.1.4 - https://github.com/maxint-rd/TM16xx - adafruit/Adafruit GFX Library @ ^1.11.5 + gyverlibs/FastBot build_src_filter = - + + + + + + - + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + [env:esp32cam_4mb_fromitems] lib_deps = diff --git a/src/DebugTrace.cpp b/src/DebugTrace.cpp index 14b011a4..0f4112db 100644 --- a/src/DebugTrace.cpp +++ b/src/DebugTrace.cpp @@ -9,6 +9,7 @@ __NOINIT_ATTR static re_restart_debug_t _debug_info; #include "esp_err.h" #include "soc/soc_memory_layout.h" #include "soc/cpu.h" +#include "esp_ota_ops.h" // RU: Размер буфера для конвертации даты и времeни в строку #define CONFIG_FORMAT_STRFTIME_BUFFER_SIZE 32 diff --git a/src/EspFileSystem.cpp b/src/EspFileSystem.cpp index 2c73801d..753f5cff 100644 --- a/src/EspFileSystem.cpp +++ b/src/EspFileSystem.cpp @@ -49,13 +49,13 @@ void resetSettingsFlashByPanic() writeFile(F("/scenario_bak.txt"), update.scenarioTxt); writeFile(F("/layout_bak.json"), update.layoutJson); */ - update.configJson = "[]"; - update.scenarioTxt = ""; - update.layoutJson = "[]"; - writeFile(F("/config.json"), update.configJson); - writeFile(F("/scenario.txt"), update.scenarioTxt); - writeFile(F("/layout.json"), update.layoutJson); - ESP.reset(); + //update.configJson = "[]"; + //update.scenarioTxt = ""; + //update.layoutJson = "[]"; + writeFile(F("/config.json"), "[]"); + writeFile(F("/scenario.txt"), ""); + writeFile(F("/layout.json"), "[]"); + ESP.restart(); } void syncValuesFlashJson() diff --git a/src/Main.cpp b/src/Main.cpp index 441d76d3..4984cde1 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -158,7 +158,10 @@ void setup() { bootloop_panic_count = -1; } if (bootloop_panic_count == -1) + { SerialPrint("E", "CORE", F("CONFIG and SCENARIO reset !!!")); + bootloop_panic_count = 0; + } // настраиваем микроконтроллер configure("/config.json"); diff --git a/src/classes/IoTDiscovery.cpp b/src/classes/IoTDiscovery.cpp index 734bb560..9eb202c6 100644 --- a/src/classes/IoTDiscovery.cpp +++ b/src/classes/IoTDiscovery.cpp @@ -1,6 +1,5 @@ #include "Global.h" #include "classes/IoTDiscovery.h" -#include "IoTDiscovery.h" IoTDiscovery::IoTDiscovery(const String ¶meters) : IoTItem(parameters) { diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index b6cb26d5..60cadc34 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -258,11 +258,11 @@ IoTBench *IoTItem::getBenchmarkLoad() { return nullptr; } -IoTBench *IoTItem::getHOMEdDiscovery() +IoTDiscovery *IoTItem::getHOMEdDiscovery() { return nullptr; } -IoTBench *IoTItem::getHADiscovery() +IoTDiscovery *IoTItem::getHADiscovery() { return nullptr; } diff --git a/src/modules/exec/EctoControlAdapter/modinfo.json b/src/modules/exec/EctoControlAdapter/modinfo.json index dbd8c178..c52358aa 100644 --- a/src/modules/exec/EctoControlAdapter/modinfo.json +++ b/src/modules/exec/EctoControlAdapter/modinfo.json @@ -1,5 +1,5 @@ { - "menuSection": "sensors", + "menuSection": "executive_devices", "configItem": [ { "global": 0, @@ -37,7 +37,7 @@ "title": "EctoControlAdapter", "moduleDesc": "Управление отопительным котлом через адаптер EctoControl по протоколам OpenTherm, eBUS, Navien. Посредством Modbus RTU. Разъем 4P4C: 1-Желтый(красный)+12V; 2-Белый-GND; 3-Зелёный-A; 4-Коричневый(Синий)-B", "propInfo": { - "addr": "Адрес slav", + "addr": "Адрес slave", "int": "Количество секунд между опросами датчика.", "RX": "Пин RX", "TX": "Пин TX", diff --git a/src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp b/src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp index ff3b571c..86f8e069 100644 --- a/src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp +++ b/src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp @@ -219,7 +219,7 @@ class DiscoveryHA : public IoTDiscovery } } - IoTDiscovery *getBenchmarkTask() + IoTDiscovery *getHADiscovery() { if (HA) return this; diff --git a/src/modules/virtual/DiscoveryHA/modinfo.json b/src/modules/virtual/DiscoveryHA/modinfo.json index cf71635f..e06f37f9 100644 --- a/src/modules/virtual/DiscoveryHA/modinfo.json +++ b/src/modules/virtual/DiscoveryHA/modinfo.json @@ -1,5 +1,5 @@ { - "menuSection": "virtual", + "menuSection": "virtual_elments", "configItem": [ { "global": 0, diff --git a/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp b/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp index 07088ba6..a7c1703a 100644 --- a/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp +++ b/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp @@ -31,7 +31,7 @@ class DiscoveryHomeD : public IoTDiscovery if (!HOMEd) return; - if (msg.indexOf("HELLO") == -1) + if (payloadStr.indexOf("HELLO") == -1) { /* String dev = selectToMarkerLast(topic, "/"); dev.toUpperCase(); @@ -254,7 +254,7 @@ class DiscoveryHomeD : public IoTDiscovery } } } - IoTBench *getBenchmarkTask() + IoTDiscovery *getHOMEdDiscovery() { if (HOMEd) return this; diff --git a/src/modules/virtual/DiscoveryHomeD/modinfo.json b/src/modules/virtual/DiscoveryHomeD/modinfo.json index 049d3507..1f66c25a 100644 --- a/src/modules/virtual/DiscoveryHomeD/modinfo.json +++ b/src/modules/virtual/DiscoveryHomeD/modinfo.json @@ -1,5 +1,5 @@ { - "menuSection": "virtual", + "menuSection": "virtual_elments", "configItem": [ { "global": 0, From d63f1bb5bf8a5bbc2b74555f15df82dda2324830 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 21 Sep 2024 12:09:11 +0300 Subject: [PATCH 010/118] add IRremote --- include/utils/StringUtils.h | 2 +- myProfile.json | 90 ++++++----- platformio.ini | 93 ++++++++--- src/modules/exec/IRremote/IRremote.cpp | 215 +++++++++++++++++++++++++ src/modules/exec/IRremote/modinfo.json | 94 +++++++++++ src/modules/exec/Telegram/Telegram.cpp | 14 +- src/utils/I2CUtils.cpp | 4 +- src/utils/StringUtils.cpp | 2 +- 8 files changed, 440 insertions(+), 74 deletions(-) create mode 100644 src/modules/exec/IRremote/IRremote.cpp create mode 100644 src/modules/exec/IRremote/modinfo.json diff --git a/include/utils/StringUtils.h b/include/utils/StringUtils.h index ea403cfb..9fac0aa5 100644 --- a/include/utils/StringUtils.h +++ b/include/utils/StringUtils.h @@ -40,7 +40,7 @@ boolean isDigitDotCommaStr(const String& str); String prettyBytes(size_t size); -String uint64ToString(uint64_t input, uint8_t base = 10); +String uint64ToStringIoTM(uint64_t input, uint8_t base = 10); void cleanString(String& str); diff --git a/myProfile.json b/myProfile.json index fcd49a01..0e6bc051 100644 --- a/myProfile.json +++ b/myProfile.json @@ -135,15 +135,15 @@ }, { "path": "src/modules/virtual/Cron", - "active": false + "active": true }, { "path": "src/modules/virtual/DiscoveryHA", - "active": true + "active": false }, { "path": "src/modules/virtual/DiscoveryHomeD", - "active": true + "active": false }, { "path": "src/modules/virtual/GoogleSheet", @@ -155,19 +155,19 @@ }, { "path": "src/modules/virtual/LogingDaily", - "active": false + "active": true }, { "path": "src/modules/virtual/Math", - "active": false + "active": true }, { "path": "src/modules/virtual/owmWeather", - "active": false + "active": true }, { "path": "src/modules/virtual/Ping", - "active": false + "active": true }, { "path": "src/modules/virtual/Timer", @@ -193,11 +193,11 @@ }, { "path": "src/modules/sensors/A02Distance", - "active": false + "active": true }, { "path": "src/modules/sensors/Acs712", - "active": false + "active": true }, { "path": "src/modules/sensors/Ads1115", @@ -205,11 +205,11 @@ }, { "path": "src/modules/sensors/AhtXX", - "active": false + "active": true }, { "path": "src/modules/sensors/AnalogAdc", - "active": false + "active": true }, { "path": "src/modules/sensors/BH_1750", @@ -217,7 +217,7 @@ }, { "path": "src/modules/sensors/BL0937", - "active": false + "active": true }, { "path": "src/modules/sensors/Ble", @@ -233,19 +233,19 @@ }, { "path": "src/modules/sensors/Bme280", - "active": false + "active": true }, { "path": "src/modules/sensors/Bmp280", - "active": false + "active": true }, { "path": "src/modules/sensors/Dht1122", - "active": false + "active": true }, { "path": "src/modules/sensors/Ds18b20", - "active": false + "active": true }, { "path": "src/modules/sensors/DS2401", @@ -289,7 +289,7 @@ }, { "path": "src/modules/sensors/Impulse", - "active": false + "active": true }, { "path": "src/modules/sensors/Ina219", @@ -317,7 +317,7 @@ }, { "path": "src/modules/sensors/MQgas", - "active": false + "active": true }, { "path": "src/modules/sensors/Ntc", @@ -329,7 +329,7 @@ }, { "path": "src/modules/sensors/Pzem004t_v2", - "active": false + "active": true }, { "path": "src/modules/sensors/RCswitch", @@ -337,11 +337,11 @@ }, { "path": "src/modules/sensors/RTC", - "active": false + "active": true }, { "path": "src/modules/sensors/S8", - "active": false + "active": true }, { "path": "src/modules/sensors/Scd40", @@ -357,25 +357,25 @@ }, { "path": "src/modules/sensors/Sht20", - "active": false + "active": true }, { "path": "src/modules/sensors/Sht30", - "active": false + "active": true }, { "path": "src/modules/sensors/Sonar", - "active": false + "active": true }, { "path": "src/modules/sensors/UART", - "active": false + "active": true } ], "executive_devices": [ { "path": "src/modules/exec/AnalogBtn", - "active": false + "active": true }, { "path": "src/modules/exec/BrokerMQTT", @@ -383,23 +383,23 @@ }, { "path": "src/modules/exec/ButtonIn", - "active": false + "active": true }, { "path": "src/modules/exec/ButtonOut", - "active": false + "active": true }, { "path": "src/modules/exec/Buzzer", - "active": false + "active": true }, { "path": "src/modules/exec/EctoControlAdapter", - "active": true + "active": false }, { "path": "src/modules/exec/Enconder", - "active": false + "active": true }, { "path": "src/modules/exec/EspCam", @@ -415,6 +415,10 @@ }, { "path": "src/modules/exec/IoTServo", + "active": true + }, + { + "path": "src/modules/exec/IRremote", "active": false }, { @@ -423,15 +427,15 @@ }, { "path": "src/modules/exec/Mcp23017", - "active": false + "active": true }, { "path": "src/modules/exec/Mp3", - "active": false + "active": true }, { "path": "src/modules/exec/Multitouch", - "active": false + "active": true }, { "path": "src/modules/exec/MySensors", @@ -439,15 +443,15 @@ }, { "path": "src/modules/exec/Pcf8574", - "active": false + "active": true }, { "path": "src/modules/exec/Pwm32", - "active": false + "active": true }, { "path": "src/modules/exec/Pwm8266", - "active": false + "active": true }, { "path": "src/modules/exec/SDcard", @@ -471,11 +475,11 @@ }, { "path": "src/modules/exec/TelegramLT", - "active": false + "active": true }, { "path": "src/modules/exec/Telegram_v2", - "active": true + "active": false }, { "path": "src/modules/exec/Thermostat", @@ -489,11 +493,11 @@ "screens": [ { "path": "src/modules/display/DwinI", - "active": false + "active": true }, { "path": "src/modules/display/Lcd2004", - "active": false + "active": true }, { "path": "src/modules/display/Nextion", @@ -509,11 +513,11 @@ }, { "path": "src/modules/display/Oled64", - "active": false + "active": true }, { "path": "src/modules/display/Smi2_m", - "active": false + "active": true }, { "path": "src/modules/display/TM16XX", diff --git a/platformio.ini b/platformio.ini index e697c59f..6e651962 100644 --- a/platformio.ini +++ b/platformio.ini @@ -21,7 +21,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_1mb_ota_fromitems.lib_deps} ESPAsyncUDP -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp8266_1mb_ota="esp8266_1mb_ota" framework = arduino board = nodemcuv2 @@ -43,7 +43,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_1mb_fromitems.lib_deps} ESPAsyncUDP -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp8266_1mb="esp8266_1mb" framework = arduino board = nodemcuv2 @@ -65,7 +65,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8285_1mb_ota_fromitems.lib_deps} ESPAsyncUDP -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp8266_1mb_ota="esp8266_1mb_ota" framework = arduino board = esp8285 @@ -87,7 +87,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_2mb_fromitems.lib_deps} ESPAsyncUDP -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp8266_2mb="esp8266_2mb" framework = arduino board = d1_wroom_02 @@ -109,7 +109,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_2mb_ota_fromitems.lib_deps} ESPAsyncUDP -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp8266_2mb_ota="esp8266_2mb_ota" framework = arduino board = d1_wroom_02 @@ -131,7 +131,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8285_1mb_fromitems.lib_deps} ESPAsyncUDP -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp8266_1mb="esp8266_1mb" framework = arduino board = esp8285 @@ -153,7 +153,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_4mb_fromitems.lib_deps} ESPAsyncUDP -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp8266_4mb="esp8266_4mb" framework = arduino board = nodemcuv2 @@ -176,7 +176,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_16mb_fromitems.lib_deps} ESPAsyncUDP -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp8266_16mb="esp8266_16mb" framework = arduino board = nodemcuv2 @@ -198,7 +198,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_4mb_fromitems.lib_deps} -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp32_4mb="esp32_4mb" -Wl,--wrap=esp_panic_handler framework = arduino @@ -221,7 +221,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_4mb3f_fromitems.lib_deps} -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp32_4mb="esp32_4mb" -Wl,--wrap=esp_panic_handler framework = arduino @@ -245,7 +245,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32cam_4mb_fromitems.lib_deps} -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp32cam_4mb="esp32cam_4mb" -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue @@ -270,7 +270,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32s2_4mb_fromitems.lib_deps} -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp32s2_4mb="esp32s2_4mb" -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=0 @@ -295,7 +295,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32c3m_4mb_fromitems.lib_deps} -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp32c3m_4mb="esp32c3m_4mb" -Wl,--wrap=esp_panic_handler framework = arduino @@ -319,7 +319,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32s3_16mb_fromitems.lib_deps} -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp32s3_16mb="esp32s3_16mb" -Wl,--wrap=esp_panic_handler framework = arduino @@ -345,7 +345,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_16mb_fromitems.lib_deps} -build_flags = ${common.build_flags} +build_flags = ${common.build_flags} -Desp32_16mb="esp32_16mb" -Wl,--wrap=esp_panic_handler framework = arduino @@ -722,16 +722,69 @@ build_src_filter = [env:esp32_4mb3f_fromitems] lib_deps = - gyverlibs/FastBot + https://github.com/enjoyneering/AHTxx.git + adafruit/Adafruit BME280 Library + adafruit/Adafruit BMP280 Library + beegee-tokyo/DHT sensor library for ESPx + https://github.com/milesburton/Arduino-Temperature-Control-Library + robtillaart/SHT2x@^0.1.1 + WEMOS SHT3x@1.0.0 + plerup/EspSoftwareSerial + gyverlibs/EncButton @ ^2.0 + https://github.com/RoboticsBrno/ServoESP32#v1.0.3 + adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 + adafruit/Adafruit BusIO @ ^1.13.2 + dfrobot/DFRobotDFPlayerMini @ ^1.0.5 + adafruit/Adafruit BusIO @ ^1.13.2 + plerup/EspSoftwareSerial + https://github.com/robotclass/RobotClass_LiquidCrystal_I2C + marcoschwartz/LiquidCrystal_I2C@^1.1.4 + https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED + https://github.com/adafruit/Adafruit-GFX-Library build_src_filter = - + - + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [env:esp32cam_4mb_fromitems] lib_deps = diff --git a/src/modules/exec/IRremote/IRremote.cpp b/src/modules/exec/IRremote/IRremote.cpp new file mode 100644 index 00000000..a3487b4d --- /dev/null +++ b/src/modules/exec/IRremote/IRremote.cpp @@ -0,0 +1,215 @@ +#include "Global.h" +#include "classes/IoTItem.h" + +#include +#include +#include +#include + +IRac* ac; + +const uint16_t kIrLed = 4; // The ESP GPIO pin to use that controls the IR LED. + +class IRremote : public IoTItem { + private: + + String _set_id; // заданная температура + + //float pv_last = 0; // предыдущая температура + + //float sp, pv, pv2; + //String interim; + int enable = 1; + float _tmp; + + int _prot; // протокол + int _pinTx; // Выход модуля передатчика + + public: + IRremote(String parameters): IoTItem(parameters) { + jsonRead(parameters, "pinTx", _pinTx); //передатчик + jsonRead(parameters, "prot", _prot); // используемый протокол + jsonRead(parameters, "set_id", _set_id); // id установленной температуры + + + + + if (_pinTx >= 0) { + IoTgpio.pinMode(_pinTx, OUTPUT); + IoTgpio.digitalWrite(_pinTx, false); } + + // Set up what we want to send. + // See state_t, opmode_t, fanspeed_t, swingv_t, & swingh_t in IRsend.h for + // all the various options. + + ac = new IRac(kIrLed); + ac->next.protocol = (decode_type_t)_prot; + ac->next.model = 1; // Некоторые кондиционеры имеют разные модели. Попробуйте только первое. + ac->next.mode = stdAc::opmode_t::kCool; // Сначала запустите в прохладном режиме. + ac->next.celsius = true; // Используйте градусы Цельсия в качестве единиц измерения температуры. Ложь = Фаренгейт + ac->next.degrees = 20; // 20 degrees. + ac->next.fanspeed = stdAc::fanspeed_t::kMedium; // Запустите вентилятор на средней скорости. + ac->next.swingv = stdAc::swingv_t::kOff; // Не поворачивайте вентилятор вверх или вниз. + ac->next.swingh = stdAc::swingh_t::kOff; // Не поворачивайте вентилятор влево или вправо. + ac->next.light = false; // Выключите все светодиоды/световые приборы/дисплеи, которые сможем. + ac->next.beep = false; // Если есть возможность, выключите все звуковые сигналы кондиционера. + ac->next.econo = false; // Turn off any economy modes if we can. + ac->next.filter = false; // Turn off any Ion/Mold/Health filters if we can. + ac->next.turbo = false; // Don't use any turbo/powerful/etc modes. + ac->next.quiet = false; // Don't use any quiet/silent/etc modes. + ac->next.sleep = -1; // Don't set any sleep time or modes. + ac->next.clean = false; // Turn off any Cleaning options if we can. + ac->next.clock = -1; // Don't set any current time if we can avoid it. + ac->next.power = false; // Initially start with the unit off. + + Serial.println("Try to turn on & off every supported A/C type ..."); +} + + + void doByInterval() { + + + + // pv_last = pv; + } + + IoTValue execute(String command, std::vector ¶m) { + + if (command == "on") { + + ac->next.power = true; // Типа команда включить + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC on "); + } + + if (command == "off") { + + ac->next.power = false; + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC off "); + } + + if (command == "cool") { + + ac->next.mode = stdAc::opmode_t::kCool; + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC cool "); + } + + if (command == "heat") { + + ac->next.mode = stdAc::opmode_t::kHeat; + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC heat "); + } + + if (command == "dry") { + + ac->next.mode = stdAc::opmode_t::kDry; + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC dry "); + } + if (command == "auto") { + + ac->next.fanspeed = stdAc::fanspeed_t::kAuto; + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC speed1 "); + } + if (command == "speedmin") { + + ac->next.fanspeed = stdAc::fanspeed_t::kMin; + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC speed min "); + } + if (command == "speedlow") { + + ac->next.fanspeed = stdAc::fanspeed_t::kLow; + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC speed low "); + } + if (command == "speedmed") { + + ac->next.fanspeed = stdAc::fanspeed_t::kMedium; // Надо выбрать под конкретный кондиционер из 6-ти вариантов + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC speed medium "); + } + if (command == "speedhigh") { + + ac->next.fanspeed = stdAc::fanspeed_t::kHigh; // Надо выбрать под конкретный кондиционер из 6-ти вариантов + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC speed high"); + } + if (command == "speedmax") { + + ac->next.fanspeed = stdAc::fanspeed_t::kMax; // Надо выбрать под конкретный кондиционер из 6-ти вариантов + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC speed max"); + } + + if (command == "speedmh") { + + ac->next.fanspeed = stdAc::fanspeed_t::kMediumHigh; // Надо выбрать под конкретный кондиционер из 6-ти вариантов + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC speed mh"); + } + + //setTemp acc.setTemp(val) + + if (command == "setTemp") { + + // заданная температура + IoTItem *tmp = findIoTItem(_set_id); + if (tmp) + { + //interim = tmp->getValue(); + _tmp = ::atof(tmp->getValue().c_str()); + ac->next.degrees = _tmp; // set Temp 17 C - 30 C. + ac->sendAc(); // Send the message. + SerialPrint("i", F("IRremote"), "Ballu AC set temp -> " + String(_tmp) ); + } + else + { + // если не заполнены настройки кондиционера + setValue("ошибка настройки кондиционера"); + } + + //ac->next.degrees = _tmp; // set Temp 17 C - 30 C. + //ac->sendAc(); // Send the message. + + + } + //ac->next.swingv = stdAc::swingv_t::kOff; + + if (command == "swing") { + + ac->next.swingv = stdAc::swingv_t::kMiddle;; // Надо выбрать под конкретный кондиционер из 6-ти вариантов + ac->sendAc(); // Send the message. + + SerialPrint("i", F("IRremote"), "Ballu AC swing middle"); + } + + return {}; // команда поддерживает возвращаемое значения. Т.е. по итогу выполнения команды или общения с внешней системой, можно вернуть значение в сценарий для дальнейшей обработки + } + + ~IRremote() {}; +}; + +void* getAPI_IRremote(String subtype, String param) { + if (subtype == F("IRremote")) { + return new IRremote(param); + } else { + return nullptr; + } +} diff --git a/src/modules/exec/IRremote/modinfo.json b/src/modules/exec/IRremote/modinfo.json new file mode 100644 index 00000000..ce6869d7 --- /dev/null +++ b/src/modules/exec/IRremote/modinfo.json @@ -0,0 +1,94 @@ +{ + "menuSection": "executive_devices", + + "configItem": [{ + + "global": 0, + "name": "Управление кондиционером", + "type": "Reading", + "subtype": "IRremote", + "id": "ir", + "pinTx": 4, + "set_id": "", + "int": 1, + "prot": 15 + }], + + "about": { + "authorName": "Serghei Crasnicov", + "authorContact": "https://t.me/Serghei63", + "authorGit": "https://github.com/Serghei63", + "specialThanks": "Mikhail Bubnov https://t.me/Mit4bmw , Олег Астахов https://t.me/Threedreality , Valentin Khandriga @Valiuhaaa", + "moduleName": "IRremote", + "moduleVersion": "2.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "Эмулятор IR пульта", + "moduleDesc": "Позволяет управлять кондиционером и другой техникой по IR каналу", + "propInfo": { + "pinTx": "GPIO номер, к которому подключен инфракрасный приемник.", + "prot": " Цифровой код протокола . UNKNOWN = -1, UNUSED = 0, COOLIX - 15, SAMSUNG_AC - 46 ....", + "set_id": "id установленной температуры" + }, + "funcInfo": [ + { + "name": "on", + "descr": "Включить конциционер", + "params": [] + }, + { + "name": "off", + "descr": "Выключить конциционер", + "params": [] + }, + { + "name": "cool", + "descr": "Режим охлаждения", + "params": [] + }, + { + "name": "heat", + "descr": "Режим нагрева", + "params": [] + }, + { + "name": "dry", + "descr": "Режим осушения", + "params": [] + }, + { + "name": "speed1", + "descr": "Медленная скорость вентилятора", + "params": [] + }, + { + "name": "speed2", + "descr": "Средняя скорость вентилятора", + "params": [] + }, + { + "name": "speed3", + "descr": "Максимальная скорость вентилятора", + "params": [] + }, + { + "name": "setTemp", + "descr": "Установленная температура", + "params": [] + } + ] + }, + + "defActive": false, + + "usedLibs": { + "esp32*": [ + "https://github.com/crankyoldgit/IRremoteESP8266" + ], + "esp82*": [ + "https://github.com/crankyoldgit/IRremoteESP8266" + ] + } +} \ No newline at end of file diff --git a/src/modules/exec/Telegram/Telegram.cpp b/src/modules/exec/Telegram/Telegram.cpp index da7186af..3dfc3a9a 100644 --- a/src/modules/exec/Telegram/Telegram.cpp +++ b/src/modules/exec/Telegram/Telegram.cpp @@ -19,21 +19,21 @@ class Telegram : public IoTItem { msg = deleteBeforeDelimiter(msg, "_"); generateOrder(selectToMarker(msg, "_"), selectToMarkerLast(msg, "_")); _myBot.sendMessage(_chatID, "order done"); - SerialPrint("<-", F("Telegram"), "chat ID: " + uint64ToString(_chatID) + ", msg: " + String(msg)); + SerialPrint("<-", F("Telegram"), "chat ID: " + uint64ToStringIoTM(_chatID) + ", msg: " + String(msg)); } else if (msg.indexOf("get") != -1) { msg = deleteBeforeDelimiter(msg, "_"); IoTItem* item = findIoTItem(msg); if (item) { _myBot.sendMessage(_chatID, item->getValue()); - SerialPrint("<-", F("Telegram"), "chat ID: " + uint64ToString(_chatID) + ", msg: " + String(msg)); + SerialPrint("<-", F("Telegram"), "chat ID: " + uint64ToStringIoTM(_chatID) + ", msg: " + String(msg)); } } else if (msg.indexOf("all") != -1) { String list = returnListOfParams(); _myBot.sendMessage(_chatID, list); - SerialPrint("<-", F("Telegram"), "chat ID: " + uint64ToString(_chatID) + "\n" + list); + SerialPrint("<-", F("Telegram"), "chat ID: " + uint64ToStringIoTM(_chatID) + "\n" + list); } else if (msg.indexOf("help") != -1) { _myBot.sendMessage(_chatID, "ID: " + chipId); - _myBot.sendMessage(_chatID, "chatID: " + uint64ToString(_chatID)); + _myBot.sendMessage(_chatID, "chatID: " + uint64ToStringIoTM(_chatID)); _myBot.sendMessage(_chatID, F("Wrong order, use /all to get all values, /get_id to get value, or /set_id_value to set value")); } else { setValue(msg); @@ -70,7 +70,7 @@ class Telegram : public IoTItem { if (_receiveMsg) { TBMessage msg; if (_myBot.getNewMessage(msg)) { - SerialPrint("->", F("Telegram"), "chat ID: " + uint64ToString(msg.sender.id) + ", msg: " + msg.text); + SerialPrint("->", F("Telegram"), "chat ID: " + uint64ToStringIoTM(msg.sender.id) + ", msg: " + msg.text); if (_autos) { _chatID = msg.sender.id; } @@ -100,12 +100,12 @@ class Telegram : public IoTItem { void sendTelegramMsg(bool often, String msg) { if (often) { _myBot.sendMessage(_chatID, msg); - SerialPrint("<-", F("Telegram"), "chat ID: " + uint64ToString(_chatID) + ", msg: " + msg); + SerialPrint("<-", F("Telegram"), "chat ID: " + uint64ToStringIoTM(_chatID) + ", msg: " + msg); } else { if (_prevMsg != msg) { _prevMsg = msg; _myBot.sendMessage(_chatID, msg); - SerialPrint("<-", F("Telegram"), "chat ID: " + uint64ToString(_chatID) + ", msg: " + msg); + SerialPrint("<-", F("Telegram"), "chat ID: " + uint64ToStringIoTM(_chatID) + ", msg: " + msg); } } } diff --git a/src/utils/I2CUtils.cpp b/src/utils/I2CUtils.cpp index 077578f2..3d26fff4 100644 --- a/src/utils/I2CUtils.cpp +++ b/src/utils/I2CUtils.cpp @@ -14,14 +14,14 @@ void scanI2C() { if (error == 0){ message += "I2C device found at address 0x"; - message += uint64ToString(address, 16); + message += uint64ToStringIoTM(address, 16); message += " !"; nDevices++; } else if (error==4) { message += "Unknow error at address 0x"; - message += uint64ToString(address, 16); + message += uint64ToStringIoTM(address, 16); } } if (nDevices == 0) diff --git a/src/utils/StringUtils.cpp b/src/utils/StringUtils.cpp index f33db48c..bfb0ec1d 100644 --- a/src/utils/StringUtils.cpp +++ b/src/utils/StringUtils.cpp @@ -183,7 +183,7 @@ String prettyBytes(size_t size) { return String(size / 1024.0 / 1024.0 / 1024.0) + "GB"; } -String uint64ToString(uint64_t input, uint8_t base) { +String uint64ToStringIoTM(uint64_t input, uint8_t base) { String result = ""; do { From 7f18bcd6224167025d87b5511438d797ac71fd0c Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 21 Sep 2024 13:56:51 +0300 Subject: [PATCH 011/118] upd IRremote --- src/modules/exec/IRremote/IRremote.cpp | 54 ++++++++------------------ src/modules/exec/IRremote/modinfo.json | 25 +++++++++--- 2 files changed, 37 insertions(+), 42 deletions(-) diff --git a/src/modules/exec/IRremote/IRremote.cpp b/src/modules/exec/IRremote/IRremote.cpp index a3487b4d..cff41fd1 100644 --- a/src/modules/exec/IRremote/IRremote.cpp +++ b/src/modules/exec/IRremote/IRremote.cpp @@ -15,10 +15,6 @@ class IRremote : public IoTItem { String _set_id; // заданная температура - //float pv_last = 0; // предыдущая температура - - //float sp, pv, pv2; - //String interim; int enable = 1; float _tmp; @@ -31,9 +27,6 @@ class IRremote : public IoTItem { jsonRead(parameters, "prot", _prot); // используемый протокол jsonRead(parameters, "set_id", _set_id); // id установленной температуры - - - if (_pinTx >= 0) { IoTgpio.pinMode(_pinTx, OUTPUT); IoTgpio.digitalWrite(_pinTx, false); } @@ -66,12 +59,7 @@ class IRremote : public IoTItem { } - void doByInterval() { - - - - // pv_last = pv; - } + void doByInterval() {} IoTValue execute(String command, std::vector ¶m) { @@ -86,7 +74,7 @@ class IRremote : public IoTItem { if (command == "off") { ac->next.power = false; - ac->sendAc(); // Send the message. + ac->sendAc(); SerialPrint("i", F("IRremote"), "Ballu AC off "); } @@ -94,7 +82,7 @@ class IRremote : public IoTItem { if (command == "cool") { ac->next.mode = stdAc::opmode_t::kCool; - ac->sendAc(); // Send the message. + ac->sendAc(); SerialPrint("i", F("IRremote"), "Ballu AC cool "); } @@ -102,7 +90,7 @@ class IRremote : public IoTItem { if (command == "heat") { ac->next.mode = stdAc::opmode_t::kHeat; - ac->sendAc(); // Send the message. + ac->sendAc(); SerialPrint("i", F("IRremote"), "Ballu AC heat "); } @@ -110,70 +98,67 @@ class IRremote : public IoTItem { if (command == "dry") { ac->next.mode = stdAc::opmode_t::kDry; - ac->sendAc(); // Send the message. + ac->sendAc(); SerialPrint("i", F("IRremote"), "Ballu AC dry "); } if (command == "auto") { ac->next.fanspeed = stdAc::fanspeed_t::kAuto; - ac->sendAc(); // Send the message. + ac->sendAc(); SerialPrint("i", F("IRremote"), "Ballu AC speed1 "); } if (command == "speedmin") { ac->next.fanspeed = stdAc::fanspeed_t::kMin; - ac->sendAc(); // Send the message. + ac->sendAc(); SerialPrint("i", F("IRremote"), "Ballu AC speed min "); } if (command == "speedlow") { ac->next.fanspeed = stdAc::fanspeed_t::kLow; - ac->sendAc(); // Send the message. + ac->sendAc(); SerialPrint("i", F("IRremote"), "Ballu AC speed low "); } if (command == "speedmed") { ac->next.fanspeed = stdAc::fanspeed_t::kMedium; // Надо выбрать под конкретный кондиционер из 6-ти вариантов - ac->sendAc(); // Send the message. + ac->sendAc(); SerialPrint("i", F("IRremote"), "Ballu AC speed medium "); } if (command == "speedhigh") { ac->next.fanspeed = stdAc::fanspeed_t::kHigh; // Надо выбрать под конкретный кондиционер из 6-ти вариантов - ac->sendAc(); // Send the message. + ac->sendAc(); SerialPrint("i", F("IRremote"), "Ballu AC speed high"); } if (command == "speedmax") { ac->next.fanspeed = stdAc::fanspeed_t::kMax; // Надо выбрать под конкретный кондиционер из 6-ти вариантов - ac->sendAc(); // Send the message. + ac->sendAc(); SerialPrint("i", F("IRremote"), "Ballu AC speed max"); } if (command == "speedmh") { - ac->next.fanspeed = stdAc::fanspeed_t::kMediumHigh; // Надо выбрать под конкретный кондиционер из 6-ти вариантов - ac->sendAc(); // Send the message. + ac->next.fanspeed = stdAc::fanspeed_t::kMediumHigh; + ac->sendAc(); - SerialPrint("i", F("IRremote"), "Ballu AC speed mh"); + SerialPrint("i", F("IRremote"), "Ballu AC speed max"); } - //setTemp acc.setTemp(val) - if (command == "setTemp") { // заданная температура IoTItem *tmp = findIoTItem(_set_id); if (tmp) { - //interim = tmp->getValue(); _tmp = ::atof(tmp->getValue().c_str()); ac->next.degrees = _tmp; // set Temp 17 C - 30 C. ac->sendAc(); // Send the message. @@ -185,16 +170,11 @@ class IRremote : public IoTItem { setValue("ошибка настройки кондиционера"); } - //ac->next.degrees = _tmp; // set Temp 17 C - 30 C. - //ac->sendAc(); // Send the message. - - - } - //ac->next.swingv = stdAc::swingv_t::kOff; - + } + if (command == "swing") { - ac->next.swingv = stdAc::swingv_t::kMiddle;; // Надо выбрать под конкретный кондиционер из 6-ти вариантов + ac->next.swingv = stdAc::swingv_t::kMiddle;; // Надо выбрать под конкретный кондиционер из 6-ти вариантов ac->sendAc(); // Send the message. SerialPrint("i", F("IRremote"), "Ballu AC swing middle"); diff --git a/src/modules/exec/IRremote/modinfo.json b/src/modules/exec/IRremote/modinfo.json index ce6869d7..a19f6bd3 100644 --- a/src/modules/exec/IRremote/modinfo.json +++ b/src/modules/exec/IRremote/modinfo.json @@ -59,24 +59,39 @@ "params": [] }, { - "name": "speed1", - "descr": "Медленная скорость вентилятора", + "name": "speedmin", + "descr": "Минимальная скорость вентилятора", "params": [] }, { - "name": "speed2", + "name": "speedmed", "descr": "Средняя скорость вентилятора", "params": [] }, { - "name": "speed3", - "descr": "Максимальная скорость вентилятора", + "name": "speedmh", + "descr": "Средне - высокая скорость вентилятора", + "params": [] + }, + { + "name": "speedhigh", + "descr": "Высокая скорость вентилятора", "params": [] }, + { + "name": "speedmax", + "descr": "Максимальная скорость вентилятора", + "params": [] + }, { "name": "setTemp", "descr": "Установленная температура", "params": [] + }, + { + "name": "swing", + "descr": "Управление шторкой вентилятора", + "params": [] } ] }, From dc87331c4b21a7e610ab9ca6d1b3c74007fcc22e Mon Sep 17 00:00:00 2001 From: Mit4el Date: Thu, 26 Sep 2024 19:31:18 +0300 Subject: [PATCH 012/118] =?UTF-8?q?fix=20=D0=A1=D1=82=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D1=87=D0=B8=D1=81=D0=BB=D0=B0=20=D0=BE=D1=82?= =?UTF-8?q?=20MQTT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/ExternalMQTT/ExternalMQTT.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/sensors/ExternalMQTT/ExternalMQTT.cpp b/src/modules/sensors/ExternalMQTT/ExternalMQTT.cpp index 744381b6..72eff08b 100644 --- a/src/modules/sensors/ExternalMQTT/ExternalMQTT.cpp +++ b/src/modules/sensors/ExternalMQTT/ExternalMQTT.cpp @@ -75,7 +75,8 @@ class ExternalMQTT : public IoTItem for (JsonPair kv : jsonObject) { String key = kv.key().c_str(); - String val = kv.value(); + String val = kv.value().as(); + val.trim(); if (_debug) { SerialPrint("i", "ExternalMQTT", "Received MAC: " + dev + " key=" + key + " val=" + val); From dbad34b42c16829486f2376ab3a7fc6211b2b207 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 16 Nov 2024 15:00:04 +0300 Subject: [PATCH 013/118] add WDT 10s, fix 8266, tiny --- include/DebugTrace.h | 6 ++- platformio.ini | 6 +++ src/DebugTrace.cpp | 119 ++++++++++++++++++++++++----------------- src/DeviceList.cpp | 2 +- src/Main.cpp | 18 +++++-- src/NTP.cpp | 6 ++- src/StandWebServer.cpp | 87 ++++++++++++++---------------- src/modules/API.cpp | 56 ------------------- 8 files changed, 142 insertions(+), 158 deletions(-) diff --git a/include/DebugTrace.h b/include/DebugTrace.h index aff80087..64cea4be 100644 --- a/include/DebugTrace.h +++ b/include/DebugTrace.h @@ -17,15 +17,17 @@ typedef struct { time_t heap_min_time; uint32_t backtrace[CONFIG_RESTART_DEBUG_STACK_DEPTH]; } re_restart_debug_t; +__NOINIT_ATTR static int8_t bootloop_panic_count; +void IRAM_ATTR debugUpdate(); #endif // RESTART_DEBUG_INFO -__NOINIT_ATTR static int8_t bootloop_panic_count; + extern "C" void __real_esp_panic_handler(void*); void printDebugTrace(); void sendDebugTraceAndFreeMemory(bool); -void IRAM_ATTR debugUpdate(); +void startWatchDog(); extern "C" bool verifyRollbackLater(); void verifyFirmware(); \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 6e651962..deeeddc3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -869,6 +869,7 @@ build_src_filter = [env:tiny_fromitems] lib_deps = + plerup/EspSoftwareSerial build_src_filter = + + @@ -878,5 +879,10 @@ build_src_filter = + + + + + + + + + + + + + + diff --git a/src/DebugTrace.cpp b/src/DebugTrace.cpp index 0f4112db..e4e39adc 100644 --- a/src/DebugTrace.cpp +++ b/src/DebugTrace.cpp @@ -1,6 +1,6 @@ #include "DebugTrace.h" #if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) -//#ifdef RESTART_DEBUG_INFO +// #ifdef RESTART_DEBUG_INFO __NOINIT_ATTR static re_restart_debug_t _debug_info; #include "esp_debug_helpers.h" @@ -9,7 +9,6 @@ __NOINIT_ATTR static re_restart_debug_t _debug_info; #include "esp_err.h" #include "soc/soc_memory_layout.h" #include "soc/cpu.h" -#include "esp_ota_ops.h" // RU: Размер буфера для конвертации даты и времeни в строку #define CONFIG_FORMAT_STRFTIME_BUFFER_SIZE 32 @@ -213,12 +212,11 @@ void printDebugTrace() Serial.printf(CONFIG_MESSAGE_TG_VERSION_DEF, jsonReadStr(settingsFlashJson, F("name")), ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str()); } - - Serial.println(INFO_MESSAGE_DEBUG); + Serial.println(INFO_MESSAGE_DEBUG); } -void sendDebugTraceAndFreeMemory( bool postMsg) +void sendDebugTraceAndFreeMemory(bool postMsg) { // esp_register_shutdown_handler(debugUpdate); re_restart_debug_t debug = debugGet(); @@ -265,27 +263,25 @@ void sendDebugTraceAndFreeMemory( bool postMsg) } free(debug_heap); } -/* else - { - // Serial.println("DEVICE START"); - // Serial.printf(CONFIG_MESSAGE_TG_VERSION_DEF, - // FIRMWARE_VERSION, ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str()); - if (tlgrmItem && isNetworkActive()) + /* else { - char *msg; - msg = malloc_stringf(CONFIG_MESSAGE_TG_VERSION_DEF, - WiFi.localIP().toString(), FIRMWARE_VERSION, ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str()); - tlgrmItem->sendTelegramMsg(false, String(msg)); - free(msg); - } - };*/ - + // Serial.println("DEVICE START"); + // Serial.printf(CONFIG_MESSAGE_TG_VERSION_DEF, + // FIRMWARE_VERSION, ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str()); + if (tlgrmItem && isNetworkActive()) + { + char *msg; + msg = malloc_stringf(CONFIG_MESSAGE_TG_VERSION_DEF, + WiFi.localIP().toString(), FIRMWARE_VERSION, ESP_getResetReason().c_str(), ESP32GetResetReason(0).c_str(), ESP32GetResetReason(1).c_str()); + tlgrmItem->sendTelegramMsg(false, String(msg)); + free(msg); + } + };*/ } - -#else +#else // RESTART_DEBUG_INFO void printDebugTrace() {} void sendDebugTraceAndFreeMemory(bool) {} -void IRAM_ATTR debugUpdate() {} +//void IRAM_ATTR debugUpdate() {} extern "C" void __wrap_esp_panic_handler(void *info) { // Call the original panic handler function to finish processing this error (creating a core dump for example...) @@ -293,33 +289,60 @@ extern "C" void __wrap_esp_panic_handler(void *info) } #endif // RESTART_DEBUG_INFO +#if defined(ESP32) - extern "C" bool verifyRollbackLater(){ - Serial.printf("verifyRollbackLater OVERRIDDEN FUNCTION!"); - return true; - } +#include "esp_ota_ops.h" - void verifyFirmware(){ - Serial.printf("[SYSTEM] - Checking firmware...\n"); - const esp_partition_t *running = esp_ota_get_running_partition(); - esp_ota_img_states_t ota_state; - if (esp_ota_get_state_partition(running, &ota_state) == ESP_OK) { - const char* otaState = ota_state == ESP_OTA_IMG_NEW ? "ESP_OTA_IMG_NEW" - : ota_state == ESP_OTA_IMG_PENDING_VERIFY ? "ESP_OTA_IMG_PENDING_VERIFY" - : ota_state == ESP_OTA_IMG_VALID ? "ESP_OTA_IMG_VALID" - : ota_state == ESP_OTA_IMG_INVALID ? "ESP_OTA_IMG_INVALID" - : ota_state == ESP_OTA_IMG_ABORTED ? "ESP_OTA_IMG_ABORTED" - : "ESP_OTA_IMG_UNDEFINED"; - Serial.printf( "[System] - Ota state: %s\n",otaState); +#include +// 3 seconds WDT, reset in 1 seconds +#define WDT_TIMEOUT 10 - if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) { - if (esp_ota_mark_app_valid_cancel_rollback() == ESP_OK) { - Serial.printf( "[System] - App is valid, rollback cancelled successfully\n"); - } else { - Serial.printf("[System] - Failed to cancel rollback\n"); - } - } - }else{ - Serial.printf("[System] - OTA partition has no record in OTA data\n"); +void startWatchDog() +{ + esp_task_wdt_init(WDT_TIMEOUT, true); // enable panic so ESP32 restarts + esp_task_wdt_add(NULL); // add current thread to WDT watch +} + +extern "C" bool verifyRollbackLater() +{ + Serial.printf("verifyRollbackLater OVERRIDDEN FUNCTION!"); + return true; +} + +void verifyFirmware() +{ + Serial.printf("[SYSTEM] - Checking firmware...\n"); + const esp_partition_t *running = esp_ota_get_running_partition(); + esp_ota_img_states_t ota_state; + if (esp_ota_get_state_partition(running, &ota_state) == ESP_OK) + { + const char *otaState = ota_state == ESP_OTA_IMG_NEW ? "ESP_OTA_IMG_NEW" + : ota_state == ESP_OTA_IMG_PENDING_VERIFY ? "ESP_OTA_IMG_PENDING_VERIFY" + : ota_state == ESP_OTA_IMG_VALID ? "ESP_OTA_IMG_VALID" + : ota_state == ESP_OTA_IMG_INVALID ? "ESP_OTA_IMG_INVALID" + : ota_state == ESP_OTA_IMG_ABORTED ? "ESP_OTA_IMG_ABORTED" + : "ESP_OTA_IMG_UNDEFINED"; + Serial.printf("[System] - Ota state: %s\n", otaState); + + if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) + { + if (esp_ota_mark_app_valid_cancel_rollback() == ESP_OK) + { + Serial.printf("[System] - App is valid, rollback cancelled successfully\n"); + } + else + { + Serial.printf("[System] - Failed to cancel rollback\n"); } - } \ No newline at end of file + } + } + else + { + Serial.printf("[System] - OTA partition has no record in OTA data\n"); + } +} +#else //ESP32 +void startWatchDog() {} +//extern "C" bool verifyRollbackLater() {} +void verifyFirmware() {} +#endif \ No newline at end of file diff --git a/src/DeviceList.cpp b/src/DeviceList.cpp index 937ba315..eab59655 100644 --- a/src/DeviceList.cpp +++ b/src/DeviceList.cpp @@ -38,7 +38,7 @@ AsyncUDP asyncUdp; void udpListningInit() { #if defined(LIBRETINY) - if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210/* , WiFi.localIP() */)) { + if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210 , WiFi.localIP() )) { #else if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) { #endif diff --git a/src/Main.cpp b/src/Main.cpp index 4984cde1..5b42ddfc 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -7,6 +7,9 @@ #include #endif #include "DebugTrace.h" +#if defined(ESP32) +#include +#endif #if defined(esp32s2_4mb) || defined(esp32s3_16mb) #include #endif @@ -101,11 +104,13 @@ void setup() { Serial.begin(115200); Serial.flush(); //----------- Отладка EXCEPTION (функции с заглушками для отключения) --------- +#if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) //Привязка коллбэк функции для вызова при перезагрузке esp_register_shutdown_handler(debugUpdate); +#endif // RESTART_DEBUG_INFO // Печать или оправка отладочной информации printDebugTrace(); - + startWatchDog(); Serial.println(); Serial.println(F("--------------started----------------")); @@ -151,7 +156,7 @@ void setup() { #endif SerialPrint("i", "i2c", F("i2c pins overriding done")); } - +#if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) if (bootloop_panic_count >= 3) { resetSettingsFlashByPanic(); @@ -162,7 +167,7 @@ void setup() { SerialPrint("E", "CORE", F("CONFIG and SCENARIO reset !!!")); bootloop_panic_count = 0; } - +#endif // RESTART_DEBUG_INFO // настраиваем микроконтроллер configure("/config.json"); @@ -228,6 +233,11 @@ void setup() { // настраиваем секундные обслуживания системы ts.add( TIMES, 1000, [&](void *) { + // сброс WDT +#if defined(ESP32) + SerialPrint("i", "Task", "Resetting WDT..."); + esp_task_wdt_reset(); +#endif // сохраняем значения IoTItems в файл каждую секунду, если были изменения (установлены маркеры на сохранение) if (needSaveValues) { syncValuesFlashJson(); @@ -248,7 +258,9 @@ void setup() { Serial.println("--------test end---------"); stopErrorMarker(SETUPLAST_ERRORMARKER); +#if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) bootloop_panic_count = 0; +#endif // RESTART_DEBUG_INFO } void loop() { diff --git a/src/NTP.cpp b/src/NTP.cpp index 185c6269..fe5ba80f 100644 --- a/src/NTP.cpp +++ b/src/NTP.cpp @@ -8,7 +8,7 @@ #include "utils/SerialPrint.h" void ntpInit() { -#if defined(USE_LIBRETINY) +#if defined(LIBRETINY) if (sntp_enabled()) { sntp_stop(); } @@ -23,6 +23,7 @@ void ntpInit() { ts.add( TIME, 1000, [&](void*) { unixTime = getSystemTime(); + //SerialPrint("I", F("NTP"), "TIME " + String(unixTime)); if (unixTime < MIN_DATETIME) { isTimeSynch = false; // SerialPrint("E", "NTP", "Time not synched"); @@ -62,8 +63,9 @@ void synchTime() { // force resync if (sntp_enabled()) { sntp_stop(); + } sntp_init(); - } + #else configTime(0, 0, "pool.ntp.org", "ru.pool.ntp.org", jsonReadStr(settingsFlashJson, F("ntp")).c_str()); #endif diff --git a/src/StandWebServer.cpp b/src/StandWebServer.cpp index 1e97c246..759ae8fe 100644 --- a/src/StandWebServer.cpp +++ b/src/StandWebServer.cpp @@ -599,57 +599,52 @@ void handleFileList() { if (path != "/" && !FileFS.exists(path)) { return replyBadRequest("BAD PATH"); } - -lfs_dir_t dir; -struct lfs_info info; -int err = lfs_dir_open(&lfs, &dir, path); -if (err) { - HTTP.send(500, "text/plain", "FAIL OPEN DIR"); - return; -} -String output = "["; -while (true) { - int res = lfs_dir_read(&lfs, &dir, &info); - if (res < 0) { - lfs_dir_close(&lfs, &dir); - return err; - } - - if (!res) { - break; - } - - Serial.printf("%s %d", info.name, info.type); - - if (output != "[") { - output += ','; - } - output += "{\"type\":\""; - // output += (file.isDirectory()) ? "dir" : "file"; - if (info.type == LFS_TYPE_DIR) { - output += "dir"; - } else { - output += F("file\",\"size\":\""); - output += info.size; +FileFS.open(path.c_str()); + lfs_dir_t dir; + struct lfs_info info; + int err = lfs_dir_open(FileFS.getFS(), &dir, path.c_str()); + if (err) { + HTTP.send(500, "text/plain", "FAIL OPEN DIR"); + return; } + String output = "["; + while (true) { + int res = lfs_dir_read(FileFS.getFS(), &dir, &info); + if (res < 0) { + lfs_dir_close(FileFS.getFS(), &dir); + return ; + } + + if (!res) { + break; + } + + Serial.printf("%s %d", info.name, info.type); - output += "\",\"name\":\""; - output += String(info.name); - output += "\"}"; - //file = root.openNextFile(); - -} - -err = lfs_dir_close(&lfs, &dir); -if (err) { - HTTP.send(500, "text/plain", "FAIL CLOSE DIR"); - return; -} - + if (output != "[") { + output += ','; + } + output += "{\"type\":\""; + // output += (file.isDirectory()) ? "dir" : "file"; + if (info.type == LFS_TYPE_DIR) { + output += "dir"; + } else { + output += F("file\",\"size\":\""); + output += info.size; + } - + output += "\",\"name\":\""; + output += String(info.name); + output += "\"}"; + //file = root.openNextFile(); + } + err = lfs_dir_close(FileFS.getFS(), &dir); + if (err) { + HTTP.send(500, "text/plain", "FAIL CLOSE DIR"); + return; + } output += "]"; HTTP.send(200, "text/json", output); diff --git a/src/modules/API.cpp b/src/modules/API.cpp index 5dd27955..c37672b5 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -5,43 +5,15 @@ void* getAPI_Loging(String subtype, String params); void* getAPI_LogingDaily(String subtype, String params); void* getAPI_IoTMath(String subtype, String params); void* getAPI_owmWeather(String subtype, String params); -void* getAPI_Ping(String subtype, String params); void* getAPI_Timer(String subtype, String params); void* getAPI_Variable(String subtype, String params); void* getAPI_VButton(String subtype, String params); -void* getAPI_A02Distance(String subtype, String params); -void* getAPI_Acs712(String subtype, String params); -void* getAPI_AhtXX(String subtype, String params); void* getAPI_AnalogAdc(String subtype, String params); void* getAPI_BL0937(String subtype, String params); -void* getAPI_Bme280(String subtype, String params); -void* getAPI_Bmp280(String subtype, String params); -void* getAPI_Dht1122(String subtype, String params); -void* getAPI_Ds18b20(String subtype, String params); -void* getAPI_Impulse(String subtype, String params); -void* getAPI_MQgas(String subtype, String params); -void* getAPI_Pzem004_v2(String subtype, String params); -void* getAPI_RTC(String subtype, String params); -void* getAPI_S8(String subtype, String params); -void* getAPI_Sht20(String subtype, String params); -void* getAPI_Sht30(String subtype, String params); -void* getAPI_Sonar(String subtype, String params); void* getAPI_UART(String subtype, String params); void* getAPI_AnalogBtn(String subtype, String params); void* getAPI_ButtonIn(String subtype, String params); void* getAPI_ButtonOut(String subtype, String params); -void* getAPI_Buzzer(String subtype, String params); -void* getAPI_Encoder(String subtype, String params); -void* getAPI_IoTServo(String subtype, String params); -void* getAPI_Mcp23017(String subtype, String params); -void* getAPI_Mp3(String subtype, String params); -void* getAPI_Multitouch(String subtype, String params); -void* getAPI_Pcf8574(String subtype, String params); -void* getAPI_Pwm8266(String subtype, String params); -void* getAPI_TelegramLT(String subtype, String params); -void* getAPI_DwinI(String subtype, String params); -void* getAPI_Lcd2004(String subtype, String params); -void* getAPI_Oled64(String subtype, String params); void* getAPI(String subtype, String params) { void* tmpAPI; @@ -50,42 +22,14 @@ if ((tmpAPI = getAPI_Loging(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_LogingDaily(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_IoTMath(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_owmWeather(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Ping(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Timer(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Variable(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_VButton(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_A02Distance(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Acs712(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_AhtXX(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_BL0937(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Bme280(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Bmp280(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Dht1122(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Ds18b20(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Impulse(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_MQgas(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Pzem004_v2(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_RTC(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_S8(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Sht20(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Sht30(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Sonar(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_UART(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_AnalogBtn(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_ButtonIn(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_ButtonOut(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Buzzer(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Encoder(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_IoTServo(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Mcp23017(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Mp3(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Multitouch(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Pcf8574(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Pwm8266(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_TelegramLT(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_DwinI(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Oled64(subtype, params)) != nullptr) return tmpAPI; return nullptr; } \ No newline at end of file From 509363fc4d1a24b70c02851f1bf9f88f8d9264ba Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sun, 17 Nov 2024 17:15:49 +0300 Subject: [PATCH 014/118] fix reset_config_bootloop --- src/Main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Main.cpp b/src/Main.cpp index 5b42ddfc..c270fb37 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -166,6 +166,7 @@ void setup() { { SerialPrint("E", "CORE", F("CONFIG and SCENARIO reset !!!")); bootloop_panic_count = 0; + ESP.restart(); } #endif // RESTART_DEBUG_INFO // настраиваем микроконтроллер From e9403b275cca018a885ac5548fe813419925c990 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sun, 17 Nov 2024 22:35:32 +0300 Subject: [PATCH 015/118] fix wdt --- include/DebugTrace.h | 2 +- src/DebugTrace.cpp | 12 ++++++------ src/EspFileSystem.cpp | 1 - src/Main.cpp | 2 +- src/utils/WiFiUtils.cpp | 7 +++++++ 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/include/DebugTrace.h b/include/DebugTrace.h index 64cea4be..f73bce0d 100644 --- a/include/DebugTrace.h +++ b/include/DebugTrace.h @@ -29,5 +29,5 @@ void printDebugTrace(); void sendDebugTraceAndFreeMemory(bool); void startWatchDog(); -extern "C" bool verifyRollbackLater(); +//extern "C" bool verifyRollbackLater(); void verifyFirmware(); \ No newline at end of file diff --git a/src/DebugTrace.cpp b/src/DebugTrace.cpp index e4e39adc..597fe050 100644 --- a/src/DebugTrace.cpp +++ b/src/DebugTrace.cpp @@ -305,7 +305,7 @@ void startWatchDog() extern "C" bool verifyRollbackLater() { - Serial.printf("verifyRollbackLater OVERRIDDEN FUNCTION!"); + ets_printf("[SYSTEM] - verifyRollbackLater OVERRIDDEN FUNCTION!\n"); return true; } @@ -322,25 +322,25 @@ void verifyFirmware() : ota_state == ESP_OTA_IMG_INVALID ? "ESP_OTA_IMG_INVALID" : ota_state == ESP_OTA_IMG_ABORTED ? "ESP_OTA_IMG_ABORTED" : "ESP_OTA_IMG_UNDEFINED"; - Serial.printf("[System] - Ota state: %s\n", otaState); + Serial.printf("[SYSTEM] - Ota state: %s\n", otaState); if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) { if (esp_ota_mark_app_valid_cancel_rollback() == ESP_OK) { - Serial.printf("[System] - App is valid, rollback cancelled successfully\n"); + Serial.printf("[SYSTEM] - App is valid, rollback cancelled successfully\n"); } else { - Serial.printf("[System] - Failed to cancel rollback\n"); + Serial.printf("[SYSTEM] - Failed to cancel rollback\n"); } } } else { - Serial.printf("[System] - OTA partition has no record in OTA data\n"); + Serial.printf("[SYSTEM] - OTA partition has no record in OTA data\n"); } -} +} #else //ESP32 void startWatchDog() {} //extern "C" bool verifyRollbackLater() {} diff --git a/src/EspFileSystem.cpp b/src/EspFileSystem.cpp index 753f5cff..1ff8090b 100644 --- a/src/EspFileSystem.cpp +++ b/src/EspFileSystem.cpp @@ -55,7 +55,6 @@ void resetSettingsFlashByPanic() writeFile(F("/config.json"), "[]"); writeFile(F("/scenario.txt"), ""); writeFile(F("/layout.json"), "[]"); - ESP.restart(); } void syncValuesFlashJson() diff --git a/src/Main.cpp b/src/Main.cpp index c270fb37..a3ed3ac8 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -236,7 +236,7 @@ void setup() { TIMES, 1000, [&](void *) { // сброс WDT #if defined(ESP32) - SerialPrint("i", "Task", "Resetting WDT..."); + SerialPrint("i", "Task", "reset wdt"); esp_task_wdt_reset(); #endif // сохраняем значения IoTItems в файл каждую секунду, если были изменения (установлены маркеры на сохранение) diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index f69a7ae5..2973fde0 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -1,5 +1,8 @@ #include "utils/WiFiUtils.h" #include +#if defined(ESP32) +#include +#endif #define TRIESONE 25 // количество попыток подключения к одной сети из несколких #define TRIES 40 // количество попыток подключения сети если она одна /* @@ -87,6 +90,10 @@ void routerConnect() jsonWriteInt(errorsHeapJson, "passer", 1); break; } +#if defined(ESP32) + //SerialPrint("i", "Task", "Resetting WDT..."); + esp_task_wdt_reset(); +#endif Serial.print("."); delay(1000); } From cfe1f04bdd4c3fd3f7a69ddf484a846d6307c87b Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 19 Nov 2024 21:37:18 +0300 Subject: [PATCH 016/118] lib tiny ignore --- platformio.ini | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/platformio.ini b/platformio.ini index deeeddc3..1dbb02b8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -21,6 +21,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_1mb_ota_fromitems.lib_deps} ESPAsyncUDP +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp8266_1mb_ota="esp8266_1mb_ota" framework = arduino @@ -43,6 +44,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_1mb_fromitems.lib_deps} ESPAsyncUDP +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp8266_1mb="esp8266_1mb" framework = arduino @@ -65,6 +67,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8285_1mb_ota_fromitems.lib_deps} ESPAsyncUDP +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp8266_1mb_ota="esp8266_1mb_ota" framework = arduino @@ -87,6 +90,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_2mb_fromitems.lib_deps} ESPAsyncUDP +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp8266_2mb="esp8266_2mb" framework = arduino @@ -109,6 +113,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_2mb_ota_fromitems.lib_deps} ESPAsyncUDP +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp8266_2mb_ota="esp8266_2mb_ota" framework = arduino @@ -131,6 +136,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8285_1mb_fromitems.lib_deps} ESPAsyncUDP +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp8266_1mb="esp8266_1mb" framework = arduino @@ -153,6 +159,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_4mb_fromitems.lib_deps} ESPAsyncUDP +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp8266_4mb="esp8266_4mb" framework = arduino @@ -176,6 +183,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_16mb_fromitems.lib_deps} ESPAsyncUDP +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp8266_16mb="esp8266_16mb" framework = arduino @@ -198,6 +206,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_4mb_fromitems.lib_deps} +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp32_4mb="esp32_4mb" -Wl,--wrap=esp_panic_handler @@ -221,6 +230,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_4mb3f_fromitems.lib_deps} +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp32_4mb="esp32_4mb" -Wl,--wrap=esp_panic_handler @@ -245,6 +255,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32cam_4mb_fromitems.lib_deps} +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp32cam_4mb="esp32cam_4mb" -DBOARD_HAS_PSRAM @@ -270,6 +281,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32s2_4mb_fromitems.lib_deps} +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp32s2_4mb="esp32s2_4mb" -DARDUINO_USB_CDC_ON_BOOT=1 @@ -295,6 +307,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32c3m_4mb_fromitems.lib_deps} +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp32c3m_4mb="esp32c3m_4mb" -Wl,--wrap=esp_panic_handler @@ -319,6 +332,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32s3_16mb_fromitems.lib_deps} +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp32s3_16mb="esp32s3_16mb" -Wl,--wrap=esp_panic_handler @@ -345,6 +359,7 @@ extra_scripts = pre:tools/patch32_ws.py lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_16mb_fromitems.lib_deps} +lib_ignore = LT_WebSockets build_flags = ${common.build_flags} -Desp32_16mb="esp32_16mb" -Wl,--wrap=esp_panic_handler From 8136d47cbd2d1be5b94cf54b6add4a66cd43cbc6 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 20 Nov 2024 00:22:55 +0300 Subject: [PATCH 017/118] undo WDT --- src/DebugTrace.cpp | 2 +- src/Main.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/DebugTrace.cpp b/src/DebugTrace.cpp index 597fe050..e4a8e160 100644 --- a/src/DebugTrace.cpp +++ b/src/DebugTrace.cpp @@ -295,7 +295,7 @@ extern "C" void __wrap_esp_panic_handler(void *info) #include // 3 seconds WDT, reset in 1 seconds -#define WDT_TIMEOUT 10 +#define WDT_TIMEOUT 180 void startWatchDog() { diff --git a/src/Main.cpp b/src/Main.cpp index a3ed3ac8..f3c0e942 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -110,7 +110,7 @@ void setup() { #endif // RESTART_DEBUG_INFO // Печать или оправка отладочной информации printDebugTrace(); - startWatchDog(); + //startWatchDog(); Serial.println(); Serial.println(F("--------------started----------------")); @@ -236,7 +236,7 @@ void setup() { TIMES, 1000, [&](void *) { // сброс WDT #if defined(ESP32) - SerialPrint("i", "Task", "reset wdt"); + //SerialPrint("i", "Task", "reset wdt"); esp_task_wdt_reset(); #endif // сохраняем значения IoTItems в файл каждую секунду, если были изменения (установлены маркеры на сохранение) From d6e4ac232fdee1052b098f6072dd86ed1ddfb2c4 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 20 Nov 2024 21:11:50 +0300 Subject: [PATCH 018/118] tiny->bk7231, WS ping? fix clear config --- PrepareProject.py | 3 +- data_full/build/bundle.js.gz | Bin 55880 -> 61085 bytes data_svelte/build/bundle.js.gz | Bin 55880 -> 61085 bytes include/Const.h | 1 + include/Global.h | 2 + include/WsServer.h | 2 +- platformio.ini | 15 +++----- src/Global.cpp | 2 +- src/Main.cpp | 36 +++++++++++++++++- src/WsServer.cpp | 20 +++++++++- src/modules/exec/AnalogBtn/modinfo.json | 3 +- src/modules/exec/ButtonIn/modinfo.json | 3 +- src/modules/exec/ButtonOut/modinfo.json | 3 +- src/modules/exec/TelegramLT/TelegramLT.cpp | 2 +- src/modules/exec/TelegramLT/modinfo.json | 3 +- src/modules/sensors/AnalogAdc/modinfo.json | 3 +- src/modules/sensors/BL0937/modinfo.json | 3 +- src/modules/virtual/Cron/modinfo.json | 3 +- src/modules/virtual/DiscoveryHA/modinfo.json | 3 +- .../virtual/DiscoveryHomeD/modinfo.json | 3 +- src/modules/virtual/Math/modinfo.json | 3 +- src/modules/virtual/Timer/modinfo.json | 3 +- src/modules/virtual/VButton/modinfo.json | 3 +- src/modules/virtual/Variable/modinfo.json | 3 +- src/modules/virtual/owmWeather/modinfo.json | 3 +- 25 files changed, 93 insertions(+), 32 deletions(-) diff --git a/PrepareProject.py b/PrepareProject.py index d746f2f6..8a1c3635 100644 --- a/PrepareProject.py +++ b/PrepareProject.py @@ -134,7 +134,8 @@ def updateModulesInProfile(profJson): deviceType = 'esp32*' if not 'esp32' in deviceName: deviceType = 'esp82*' - +if 'bk72' in deviceName: + deviceType = 'bk72*' # генерируем файлы проекта на основе подготовленного профиля # заполняем конфигурационный файл прошивки параметрами из профиля with open("data_svelte/settings.json", "r", encoding='utf-8') as read_file: diff --git a/data_full/build/bundle.js.gz b/data_full/build/bundle.js.gz index 24f6ab8b01e980c6755bcfc5df93631dd80a4ea6..105e6deb7d6686f39d3c82ab47860d03069bbc2e 100644 GIT binary patch literal 61085 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 z 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 K8`yqIIs*VF5Tlv^ literal 55880 zcmV(lK=i*KiwFoVbS-590Ah7+WNc+FYI6XTTZww(G!TB3)RbUT#Z9`L4kjP>ax7Q5 zL)di_wK411!B%=~5}uuZMv^6`|T*dQRW=e+TrYO914FOQ`WmSKa&6lC{rg8^6u!BLGs=KwUE_=!? ztV1QFL*pn_6PczmK`WKJo$B|4igECE?{@zTGYh4N?|^_o=1 z&E}$+*ZGAEdG**VY2r=UPEEoneYZ0bMoHt&stA8k5+9C_5if=620!*6%kHyF@b+0tq!-2m*4B)U=$X z5`VR@_hA{&)ot7q`5Y7p0u(k7VH71i<4)alQJ$XBi4JiL&`wY}#`JZSFM7i?1$P&D zt?n$_bDF#-$=rfb>2xN_^hu_c@hZCw&F;96<&|2B+%%#wkyc0&-*DW#Q;wUHbOiF6 znLQBAU5>vTrKVx#clp79BXnU26}hOH*cQJG^5H2=j8(i2GtrUEI#ilF#5#lQyN}N7 zcB#qpXHOrUwZte8qd<&0If>*{&C!U(auXEJhzb^msJPejft&`K!o12^X=22YLSEpyg;qbJ%z6yj7?e_1X zeJ5|3=+5ak*3Z(`pci;k$DJvE=J|am5NC_UN7p#)i@Z^?ly#^V2=ZOZ@cE$y4(eA{ zuG(Fe6T9s_rQq~7N`lRaim#;dM~<+Rq}uqyfa5`a>O}%rKKwf!k(_w``U5R+nFhg$ z6e?b1Dg$KbOQ<`kFXAt(j$UWQMy7Hy2?96!onwz9rBQc<)wi$fYAs>+M30>T`fivu zPl9~4u44}O~PBT@O{KK1X@_@`#vV)S!LqBxg| zPx?L`x`TeuG8@90zBg(%wh{Myyr{OSzGF=ufB(*BR&`xa{%rdFZ2bMni6CtdpM=Ch zguQvDz$0Ly6~S&yhXRKSwI_g2bh0SAljFzjA&=vAwGN{&ItYU=>1wap&E zJS4ewb_IXV5pA=EQWv<>R%x0&(m$448=TwCa#muy#(bOnvLt-t_eSn=aKk4{XAZ~ zX{EHSFkU(Q?oaVT;s8l<$4DrB?UbsM67r^sn?JFDRAhDSCzcXm;83l#A;qMv55B>1 z97Go32t5*KM2A)s*k#ek9#%A+`-wT<`B%2>HC%Wzg-L6V39%7qp1P=z5>b{|ijqf& z-{|{PHGpb3F!xW(F%DX5k(u+hR&Yrrd}$@co)H;W{eBg%LhOk|w%h$^h<1+1_i(Fh z9ZGnfyZ|I*oa2Lw#N@$?1z%VaO1nh|9DERQukba;-L=$xk2p3OUV5q-y6Z$YgC%G8 z!a2z%eRnWQ$vSchMqeSWMH9&gqLq}k1%%43YYl1aMJnkU;W$% zrAI(YBniI70AY{*Od-1GBuP<;Ld?a6&C=4ifJ=N5wl=&@CHRv%X){;=CF^2cOA28m z4+W{zQ~AdxE1(ptZAl3SVZ}mQ9Im#PH#n)3bDr+_5gK5=czqM*60-j%P@3EZK6t~$ zWZ@zqfdhNnP{)|C7fLpwd7iJIY6Ri_>Z(#n9;>Xrl7PcNXly^8_xtm3%^e-VmK4EY z;%nw>J*kP8+U9n3W{pd}z|(Hk*_->@yHpiG~K(E^H&sBPig}I(CTm z`)h5$nD*N+7P0L2yLVrskf4Jp#;E}JnT?nNkyp4`vbrK1M*i4To<17whO=EddgmSa z@}tongep>D7#54(`Tr%w?*>G4gMe5&T|7F<`u$AP841g3eY=d8cZ(VuT)_1W&#>yf zy3T+ovI>e4bXlT%1akMV1vXxLM&jCWK@_|C%*wda2UoMx8|ScOXefN33Q7ChS)h)Q z7JoFda=xr;H0GN|RV#B{iUd-Q{gZHkq#Lb}m4-LccT|Gxjzts1kme-B-T9_FRMik`{XX0kfxu61$`~7hv zIVxOdbx)4XK^TKhA;b%cF{VQHT;5S;V$%*RFsnU9CT(#rNH`Cz8MU##P~>o3`9~3h zQlP^X5W|+dO$eNyGs#QMnrm=vBBy3YMSGogwIbEyiVRnR5J7D2E#MG!sj8c&70OH0 z&Z0uWBB^3Ujgt|$UnrN9?M)eD3%ZlcdQD&3fiou=!q(Zm=~`4owP8v+MZc}@j-OvWg<~VRfK-MdMama*FtUV%pDRW)G zFRVc|Kjvx~2B$9t(c~2&ZnhuML`->bZ2XeYF|^lD^Y)=0S6#CZTL?@@y)FHu4@ zOT@+ef)9qny5GB{eoDU>R4emPhd(^ws+$I zHKB_?2F>L{K+Qgsm)WLJp#@~hs!*Gzo}-{gCZUJoqMCCh1NBU`EVGrI_y;E3(U|V{ z;+70r+<4(#YZ`f$I~DsU!@rl%HRyJD%nnhom2OSMiG(@7Dsj%)Htg1=_BVfg}yFEWs8=R9sb|A{n^L zgK4l1%+W~)6Ro_j+auU>XU1W2KLL2ETIgWF}D42yvE5SJIGq@{8u?cV0 z30Pw~&t5v-%KbCb2jvt-BG5_b2tr%1*9DSWOo~R2P!(XS*@Pj@Butoq&jJKVp|ZAZ z13i+O{HhE!(aO0a)`SxnfgjZ#HaKM+=M*fO!QSNLh%6XNlsr4$s(pIA)oEYe@Gp*< zNcOC3^a;pKI97FBwldzA{T6Okx&Vm4G6^Ceh5?eP2oR{i9|hm27->+wl4@Bk8mIY| z2&H0j-dyD9Jtg$@P{Vi#c51f%~FqjLj&G2N- zMR1{y*&2;WN^eC;E38VY2~I~slHdohjAv@X5XKdjm`M3u4iIe}f@dXWCEqgiaF05= z_=kTuqr;YqtdVpG%vxbI8oR2!3nGV(0^I5-ad-~aRo8AH3Zv3UK6jlWOw>oIQ?z%((EJ(C&{l9bf_IosP|GBQ}g(= zRp|>@huCiF0(_?XM*^=*XeA9o0DuQZ90;Aw^o&O$0eon|Bku0mpFclzd|Q{}LD!Mi z-Wb^nHaGON!5W7l)BD;eUC1?85)|^PMm7kG*>qXU%UQsbhLT0-MJ@4=;{^=N z9A=f12DKMDr9I;?YE^Z9m6te^Roe>u-ZN4#hhjYsgvp?Fw)J;Q_AJKAst-1>D7B{* zGQ>fVo%A&TkwaAp?}d8R*{VstQi52Xe4)gqk&mHLUuM_&72{5phs7&?Oq;-_I4{7j ziM^5F=%k%X7`eq}X(UYS=}!9l#0M(<4(<}R2G?FDFf=w_iIUB5??L{;LB@7*@EigLw5Lrz44*1}W^x4+ zp+*?>+*9oaH>(TTt2gw;0KeU2|7yxbWb;=Tv2J=Rb>m=Xt(uO`GZj z(OceTb47(FOACivMuS`WHCVSV&Gnt@QWCWoskdI{b)%R8)VruYaP;2^( zQ)h>@rc?=2mZn*Ykzp81oX>?Za>t(A6{6?ZI;k5MMT9gl1}#%<`C6qEm$$|To%M|q zdaX~_r}w(ER3*{V3Zc(8%5!H4Yv6jj_zYr3<2>jNd;`%?&bftA=M-lhzui6?n4~FHazRydB{jFEZj}$P zteZ+V%&7dppK?Cja^x9puwqS}tHr1jEyi63Gfu#maUIN9pNPPDMVXnt5``8Am=c#s z^GJs~R(x;L7Dh2|M>|2xpLfo@-}gG9+v+^DAdk$bfbOb1M-S_caxbbrd>$hUa+c5& zxBoGE;lH71gF@m{YO(~_0;!0$I4QiVO>OQn**?t=qmii6?i-UL5i1IXLQ+$rX>|_| zL~P0{m|5Ei~+aH=WKbx2jk-y!Q>Pv+aGy zx&hiAaUVA8$(Bk3iNA+Xw`7pvam7V%hs9O9o#Q?V-~YsK3|YdQ_i@x(TbkhclI<}G z$u^(hp!U4OwPXvq$rmF*vcI3Jwc@MO{NO6XwAjm09f{xd2Nij2y`8Q!jp-Uy??W$u z3hQ*XCA4#6VmUh!H#WkUAwbdK8A7F^${_{LwUL{Tq0$d{T$l}r??H}1Dv>^7lc%9b zw4tY+eNALuY{Ckwy6uYBMdbwptZ))&*SsN$PGG<)rv~k+H^saYB(Tb49qp30M2;n9 z6g;4|dD~9eZ=O9m>$`{Xet&6ZLzA)ymzM}XArXEivIpepMl8hI`|u(c&CEOy|E_uv zF@h<-6?1-4Z|I9fPOvs>lCH?iyD=`gN<2}3q)~X}ZjG-wY+m=VdBex%OS-*!gKIDt2K&ANj(Zs9EGC*M_|IS4bs;+fg8b(Ob5AN8LBt$uqxqcjlJXm~=~P zx6#b`OS?Nu5isvCvK+k8yTKnalK~hocx^cB%{O&Z)q^$S1&qUPxz6Ry`_(Nr4SR#L z-q~yT&(6_z5SS>dQraPUmwzrX2xw%>A5=wEcP9ro`9dwRtiO}df7Hq785895`WgYnO67wN0_!{jw|IFYcB|aoGFjx#bdi}V2EpwkdS^O&cW&lTqTm2oAfug3b&*0_+Yrjk{ z!eEhKLwKcYHq=~>xOjRS((Q~4;)ZbZ7OAlEKOSM_cRHIDtHE+nAFA@rU^F@%X;sSH z@MR%yd%vSTm0#Wsz#pi4yG$M|%avR;gSjNNw^}vVS|!ndI)Ndca)C8^u+~2mx_~>F zr9WOR+RG^XM0ix}cB8(8ntc%Ff@!xme7ah_)|d1pqn2$-yo?0cK(VW|_ewwr)d6>e z!a@Em^Wpi?-cwKsu47q8J74(Ttn0_D%$oF;ZN+ik7l`GUw00;ht6Cm_e4@V5)IV%G zK2D$B*F?jzES1XkZp1w2u zMI-G+S504YrI%}zUY1-Rc{I}^c6{n+d|R=|S+}q86+XIFP^&+2F(O>3 z2Em7D-O3FZH(I+=M={e}x=hP4(?mv>rk9fz7%eN1Yk5_SYI-^I3K`V(YZ-*e#PCHl zlg5E?tZGXq2elKCQ^ACx8ML|7RPT0g^$RXEU5l2HH405j-7J_iE;XSWanI_0-PTl; z!gd7)+^elfH`CR3kF5(Uki%-!$N#n9qHKln6V-CmTP${eSV}VjP*vvmE6ix6>Mma=~Q-IFiUSKh%`kFiR9w+!5@A2%+#x5~@Ga)2w4 zl=OYj;I-cRmj1dJoDDgpu?w43a)Imkb84&y!{FV{8TqYTP*F*$!LWC6HMqi)`Cv5U zcD2stxw;#?`Fc;)846ECksS?sS)FGC++!B9OapLC0`w_hzuWt@?BSn#v{-ZxN%2EZ z7roUW`-{12Z*H6h;$NkBO0gRyO;R|(J(J=6W_Xlmr*q>by2jwz!B*OagYV97S5G@B z^vW@Fe>ApaX(jEhc2_HDyH>Ty^8qUeCO1W=((G=N=Hy8uj!;dNc zx_!AQ*ODwfn{Mk8hk)3af(iH(lMdTA1?*orY*$5P$F%+XT1OEWO#Xo;9Xhe$*E}uj zo8g9sVU;%Ht;{bZ-S@fJpf2{w@^Z-RWD7Ml-UV1BFYC)rO)eY>#`w0{A$^moJCuvz z_aC2+-+8a-cjovGYrof5P{xP-GxDtxX^?m9l}HXH(y;8C{<9J(u+C+zQLz%CbHLk5 zWZpRYx3Nm3(RF(Yq%t6UZtE0CZ9L@#R^>XK!tcX_5V{Wr8pJw4$A!LZQLuzJa9P6R zRNU(aHB0zhxKXx{@Qr@00|`IvN%)o}JSvh_31z#_>q~VW=fYyAFVTMvsnfx-GifSk zhW63wO`1?YTU_={no2N~Zui2zeBa;e;H%f~z0kdmNq4Vf+TZJV?`7TV_~C)7m;J-E zD0_&KrOG`WOIbVA=yZn~4Sf(FKc6u9L5c4>%9DpN=?IpeLUv)hx6i&swOXs*GN#HD zyHi2SSyVtHHr2wc?TgE$GV-1m`frTKQM#+l(;6r8Q&Y027R6;vg>6f%k}L87j3zdR zPMad9f`h~^n<_nHDm`PqKq=iXm8&%}3b0I*o&83&`HUdylcAjm$}%GpyadALqhE8k zG~HTI1UtL&|2o!#gAQ5~!R zKH4JZn=ctT4KZH?Eq{5*X-RI^yJz!Ezp zY@*G(&Z9Lav5&IhKfLCx*D$9>TZ9bcddffIP;)XFk_h(DK~a@++Dc;3?&KO7(e)eYlMP^|(q-RqjN(>LFd-6X|HA zL)1igK310PX3N=fq?aOTyv*2a6qK-U0ttpQzIKs-l6K%3dd0or7&8HHw9O^XEpZ2)Ma0c|WG%&0D){n@?)w4br; z7Mj^T`2cGlu=X{qeTKE$v1~ZUyZ`KDTG(l{=x*0Y>4Fsvu)MHgqZT!tgKUFaa+TEA z997opH_;9TCXfWKc-ni6?h;&8Lu&HQm2Zq;SRohOh?joXn78}&x&3h`L{58W-GMZ1 z?*bBnC}g+*!@e9{glKt|YC?cTQE+S2?1;BUvS(7##^W#&Q}FgE z8o2bNmmVjAR2mkpH!Z5et5wYLvWW5l`9`3(@&EqbFCalUx`rmqF*WQhMuC;d|g_0nFEe=icJjwl~C5 zT#Jp^{};RCNyd2`hXLuXWw6^E*hg1ct=C9MUJ;j^o+JIl>im^ARJ(eA{eS5FKzRo) zb^f$+pI~F*^w-s}AyagZe}}CEH5PfZ*}Ks`AJ$`IzLXU#LDMWVl~Knw-UR5_|E?l3e>>aS%NMz z9vsjwpQ)Tn0lmEdpUh?dC^Qa@QlP{(+Z}J13*8akK+R%YK(T=`lU}?+m843C6b&qT z7mG#5g?Nv+05IP#3qbf56=S!62dPp?1RKOI7N>nN!D>d3b#+;u)+^r)L>F3Y{0Hc7 z`BVWAJ^mHa7bw&R<-dgXNq9TlM66Jw`sq`OM9Et@zG!>@LGST^-^p+nP4`&8q9aPx zSC2Du57cbdOSpf~-8;uL=LU4KgupcP)`RjR9Rd7TAY5v9c<4Q|p`+Uw(3#-|cT?G} zL~4~UXt130^_!r+ufa6(RX81(guObx6_+xI>NV?=u0X%frM$%C*U3Qi-`z`}WTf_c z9j2Qu&@upuUB6a-RMsR}(9@4-`#zo~$yUf{%|LDDPD8pF#RmsATAu$1MR;%!rcP*& zu*zDt5mI%geC(2hB!me~Kvzt=e7@6$C2=DcVDH~HJ{)#<1qoVyP z|0<@#^FAI6&e^-KA5j2Q$pz@*=i_lO;-&A6t}H71(wY~Jz(i*<6s#PQogYALd-uf+ zr(+fmr|`l+|Aq0k$ujfZngtR+Er}55l$AjirsA8YEt*8Hy0Iu!GCMn`%e^Y8G77yd zB!04GKxPoC8&R5vw>2tT95O}Dz+ZBx@C}TCcW8FJ%LH5F*r)aIE(3Vm#GCFU-t>GH zCQ=uANA^qnQivM973R?K~AVo_H$Y6c0$suQ-k~8HW>9^Go$O zo7$?9tF~d)>gX7Toz7X|QpE&}Iy^pXlS3>5k2={&;>6L!afLVBP-c8sBu97*A{hT? zQ6!?z@%JVE-oxK%bbc06{lbR?N4Ly1D-HqgNC=l*Vs25LIj(f#$;AkQp=)v|%Op+Y zrlG=*Xz@P5yPxIHbQ4C%{NAY84YnfRkxR8mB?7CSQtHAv=Ia#M6`&~}(jq@GlZ56F3n+bM7v0R-^A7^5#EYt& zCpZ_>K$;BYfwnO6fB3Hh^bL=y1F+FC1|mK!*)p)1Rc2YJ%!J(M)5=OJY#keKyF^?!SP9Qofm;2-KkdHhiXL5llSXN(b}*`t4`p1-t%(q?y48E z-!byOzCDyTA2<1ejN?c=)99r$kBd}_+X+^Lw^RIVCiFAKx^O#Izi2~{6lNs^#3N0S z?T(mY;#EQ~G0+Boapz#uHf-RD(@_uAu+ENo=Fp2i@gZ0852g3Ex@KVl)6Io+(048L zaLG&n3c$!!()q6fA%ggxp78y7cpt>V;ukk(^qr>kfq2q4t^`@h>Ah|9S&*>gTb?1L$2cQIO@%*I`I>bH>|}@+$=U}Y~cgI zVl$(kv^k=UxfNYmWcPCmpi$azmd0E$!ULD8-c@FELq{c!@PU%=ate_b_`ZE4oH*~w zyLVsM_z^%^&qJ)2?Q8Zm)T?GHBl#t$X07gjAVx2|KE z{5v60ulNIa?UQnV{ldImN;Zvrb2F36rX-QOB67D*@sICM?&@(nBPypvZ;*bhX?-*u zPVY%?1`){$z0ot~xd}fOdrbSpDI{-VOgt|z(GXU39N~p8_iD?`(kE&zFYmA84N$V?PoPCMp*p%08H= zBG-2eD@hcIDR52Q%ke9~GFSo5t&?h=d8&{ED`yW|X-4K=+NmdT`rjZ$S|+by;*c~H9q3U!YE+oA1X*6zO-mjaqI-1DiL4*`<5Vq-h5S>JW zg@AeW-3lZ{)+g*{LI$~9Thu+7L;^Z|{v}YFM#QykV6>*NfwkGjP{iiHyKor51{vfbF&GE`id@GVZiSZRf3Xoy` zgFyJt6**9Khl9x3*6OW-daYt}IqYAcw0$TXXIp&O+1LCuc4U-26jj<7qR6ov--`~) zG-@~}W2vb4L{iV665U>v6{g@n$bq{mrMH-TzwNC0H+xsY-8c<||4K0Mus2GY-mQb_ z1D5+{xk~|WqPB+ADYgSGCI6joMz`Z+%d+s`J=jNM-O^|zjb=tO+sDVpTPiuxOm6Go zmN`yzs5`pnw`PgHhb*gFl*#}P1H#~htA#bgoQH~#R|e|R*6uxCcRUv-&v6138si5= zi2>HJ9A3CUGLS~<1F}ho6Dr!5IGR}R3b&k=>_GPrj7=_HQ1l2!41->(9@k;`CoWLR{U;R%wm(*&-rEZ;OEBh zV&4SP4G4hAR=JEzo6QUr-w1#?@t-^Ky;4Iau{C_dPJPzI>-mOThGns^A) zmtI3(g~XB1eE6bqX6ecJyK`Y7l|}e3aBz})iEi_(g-{AKIe?T(p_0$aJ^FjCpX_$@%4MP29V;NWn7fA{!!Z*P0Fzkj&5C*+N?Y@8k+?kvZ8 zvAi;3LnCax&d6}Ps@vNi?d~5RAM70N9**{o4<5)?eNASBZ79A;D2HTw3y}}vrY%;( z{lR;*<|g|onVH0*bqfvn5(xYxzYrhP#MQx>3pfzP85b|^JeQ5=BkT8(oKX4}DR}Lm z0Az?r$`J!5-Cm+y?J&!3pDJ;L=A2IY8Kii#mvMT}AitYyk0t&5!OSrZyysufWWevK zfu1)ky~7X*88HURfF8<|P?%XIC^gT%!Eg&J)r6!dcRh5L9Up`xlO*)9=;=nuwn+06 z)vc0*kEJ3}Pz6E#WjU?@ouZ%7!LumY@_dZ7TR8UYtpRiOU#g7#dAuHv4d8FntcWVRVK{c>N>1vQDpF>cC zsN6>7q9*(KV4Br3cC1c7q#=;oc3#f7p-i_l_gfM(7ee3Oi|4xfSaln!hv+t9*R|wC zJyqZu)1BjucbvIb9is#=I`PA7*a&+KYNf9&nc~aWvO!cocEOe_%)lEw%dlN~9j3cF z+8K+`d(SMEmJu*$9)SM9#YTPr=6r!`jjVjHl3_{d@BQ*+fJwLM`(ZSv3|kPXGxI?P zGu7^BqjX^)sB#63bEy`-x>2c>j65P73?*D3?)1$KT$w~LVeT10S83+-GU0KZp`^=e z&JPkdCw3sOlqa=4r^_Ur5Is1sJ;mkP)R)x?7j3wJcTXmJHQ&(-Wm5Y+y@hpFKnYAo z``zw6sL7X=5m}3DryMJE?Acgke42mrG+w?w^jL4Qy^f= zm`O_Qe7W9hyQPu6RhL0g3yai)3)^{jtLXNFy!uJ8WNQ7 zut9EsrB$Y0TE!6Oc$@jZcT00}8v*vK>|U))f!44z41$^P@KWYePh0Xr8b!(awcF3~ z3t~*f5oL-JJ_6PV^vy+uJT_93>JjYLgkO1(BsgOdul8;!Cv|v-DTJSzq;+sjVN1{4 z#-mFqn-f1UL^I^iK5NqOZnNI!J*&UGG;H1Y?yl#`9#dM$Sx&Z`$IPNW&##KvZ91UC zMh@!Rx{+7nHM+5VkWU_Q@J-|skL1N%_C9|{d^(3-=3IPqa|<<0@%iIL*(}8CIhsMm zGx26o<-JE>JBWuB=2U&YE#aM;WG=lA2|BS>zfS~a#i=pPx&AYo-eMSLF)vyp%SE+wked;)|Kvy-8B<3pmII1 znB}B6FD3)tL+(6@NXq-f=F+$H8$-g2-&YM2Vjm2a9F!F20~{(1J7Xm+ki=r^qBq|Ydzz1dvtv>wi2Rrdj~4cV9s@6sG%7iEdfNYKCGQ8G4$2O#cW)afoJE$mirJ`=5& z#q3V^WxzW3c&S@}hl&{-Fz=C`AKkb(SX-kP>wX-Cmn*e0YAR#60DIj4Tkb&0YJ57T zVS5d5r9e8=Z$9!fFDl^1~G1J>IQCgC*j~*&*@pROqe*=n{ zC@rKE3UwOVl(DBw!FlH7#%)`3t*L7DX$T)bC|K0<(o9D>@~58WW~}=>U|&=IGC@S{+b7zC&oW54d@P3C#q;lGF-Oei`pENip27#IgYypwhh&5YI2-|lbqdalUsj| zB)fG1>R1$YL@*$ry*SBkJbFYA<9gtfRkE(F8!`#67>Ir>c_6)cEEgWl`}60&%1iZip%D(P$b*={nH2cs@QcHwZ$VS4+o%KJpLE7Dba0jV{(J7l z_jpfEE=|G}*La}$RGv$0*%JdFdM((48#m=PN0MtcoDexSE;;QDdiq^qkb@>kPOb2P zoI`2F*TAUMq0)QI958}%LzL{!NtrtXjx)Q z0MKslr~~99dOlQrcVBU0GZ9l+&seo|s=ms8NGFoNQ=&^4A^8)zx^8;Syf>AMh$t(8 z&*h+K6bjnCm-f#K+^^P5f`yaJh@YwAos|;l9z{rc6hZFr8~ky+Lj9pCCMh^-U5?Gl z$zuNCC%2GfFFOly6H_78%^LM6T3(mxyvYneNVy6pg_@o_;0kt3lCo6z;5 zx}H(Ks~nwZazDc@0#opA)c2XV0f-*w72J3VqOa)px==r|no#Kr4qXBRF*WIF^t^m5 zr{^Qo^ZevM?j1d*ufxZajTn zP!>gA%oo_vToh5Q978G+?ObmXKPMZh=o|BKYd(NZ<`alyGuFV?>)2u~JG45z!%9da zPSV`E)B}=s#Q2l^Y(57|m`X2&DpJXF9Oswo3NaT^1A}yBKGwG$uLf6dSJP_Wqw-^} z#9oy{`MY}y;lW*a+M3}_%u)Nk&f`ljl7>#9ka z7c(!bZx`IV`$fha_fkQIJu7`iVD)A=3y0f!85F5ZkuE_U`52Y6quwW#Z1+0A)#0jF z;H&wfM(O+)8EM19()DimME4?3KB3IKGIl^H7ewBDr!D#ZvDSr!_R(uq~5QDQq^( zn;w!b6%iNUD|>+x?>m*+^iuAvky(KyVw8(LgY;1v?OHwpRG63Hdf>qtGxp|I+*9}A z=#`iHEQp87eRaZiY#e~xD!@N78>B#WqJJqfDcXdP3Qza|xBSgx4UV-DUmI9pV+3Qn zBdR@e(3w@8oP&LD(^Pxw0D9F%OTeuazkxv`$|o&6e+%Hto^1xgQT2hG-Ay;8}tf^>dlW2dB+8i(8S z@eJNXe0U1r1k0v{lNwgFn@$GR7tlrc7>~18s zm*2*x-%dsEtp9DYbx~Xm8_Bu>CtKe>?8o0uA0+Kx&LwZ;1iAQ7GJ;WBF!ID$9|)g0 zqYqJ%1TW7~BBDnj*@}fw(fOBv!;P4Ia z`}*ev&eQ*av<65^@qu0rfenkzOQL)l7}a12+|X4Y{~KqIN*WWLjhSU)R9j-uYNqPi z>3?DhYp4I&@X<+XwnpeGr-{dGk-@-qcEQ8olTxY3fHNo8L#Rx6g@vGLA<(k}&V-;d zx&2o|!&_4SL&ZRao_l4x`y=tA`gz!7ACg&m=jlx1EL zFDZ2yd?b>;8M$ErNBPJ5>td*|lhmD?yq$DeXp`@h4K$a0mcG$)e&&95Apvyx1 zOD($ewOX{0_QQGa2UX^Wp5$CCs6_-2rAJ1)a_scg{1@!O~(HCwCE+>78H7)w@?H~7yg&xg4H3)p%)@vm41tzT83IV)KMq) z3w0P90bOrhd^6@%*_t8fm4*5zI^QXcG_^64mn#7QtK@pxDelV#c zfKzUAjKUE;67a3KW}^TWLpONJsgIIYR;(o*Qw}e+Io*2bM6#TVjYX6CxC+g$3IA&w zF3Q3@#LW&zqo5BC%0!NH3i)HjvLoqV&|i!*E<0s-9$slK9cz^t2409$-FZSZGC9J# z#HrCQ0F@pC4(OjT?|MVp2T4K#i8u1erT3&;S?e3yC!X%H%2xc{xAlW0em;rgll1h} z!JGNud^9*dyW3sDh`xY_;up3G=3=o`Rg)iE`R|wYEQ#}zThEJ0-*DC3N(M3h;p6H8*<%~K6bPywO*$j5#Hi|EV%tBlv^!Aa=@RKif zXpqOja!7xLZG!enjppJh~tYD@BUltzwinD=yT1=V%5>1H?-acV)? zW`X>QIe?`T4U-JeSP>_7pJJTVnYQ`TnU94Akf(1}5|H;*JK$=N#OvUNCcaYxNW zOw%-z%uNo);n(L^>cwyoB+;Dbm>?>z=*rXy9g7K)6o2RR8iLJY5+5=rT{_&=-GFXz@z24J13ix#d$pysz zk7$u7BLJSEcxf!lvrB@0SIVb!kXR0PV8eeN1&%^uU0d6lR0c#u`g&tP$1%zm)JDUv+pCEGGebx^UuY8Us$``O2_R#Ot8!vPU^Jn-rfcg9>J zG?fGOKyA3_`2+qhf;G8z4r2~Sl38eVC$ei2{#EQHqaXQD8c>!&PIDg`Eut$NnGIyy zph>ij9H#@IpLrzDs(%J5X-Ib68GXE{xF42zDh~}`$TkR381omOxkK9{2;$>b!4@DU2@ua z`)&M_W8>EDgVWqIyEbMA85RA^PSg`WkhXgV_xbU?k64_c!5O>uA{g8Qo#_crSvuS) z6TM88QLXS6R%f-jrP)KTO!y|_#(on2*4q6ns*AeAl2q76!-sxMhqP$|gNf---5ZU_ zw8Q%RXvHt$rqM=r%;e@9G}r!-f?n*=W}g!`-*3W4pzag9b_xBs`59hkXf){K0tAG>@c`qVdLjDk<5MwJpw-M8Z#giaYk|u$-DYTh4WaY~aj)@;Xw`{tcgunmo1q?$;F| z3^lLBDdfG`1jKGA1hB-fCkVLIpRshW=YIcv-NVO(-zKUORH0>qUK1M>)P!M&Zsxk7 zXH);p=Y86CnG@kxO??Tv6;OU!HCtc&zs}fu7k_`m++py+VQr+9E2sd5njT?FC0O6~ z8>Mze?Of{o;?;w^tr#xRx|(i2!yEuDK+?ZM8^ld#hsKg^x`36^5!m)z7Hll1ggpp_PchB!zZVAdERhxw9-{EzPB505E7o;VKKj zrfTcBAZo2k&y^CiW943y;O_uG%UBOZwPI>&h`wBMG-P_^lv~MyCfhojq_8QhOoV0D zbVG3W{jD8b7QAcN*3Pn%cDg@Gja&Dfz}rd`2`^doIT(SNqm4_zsQ!)EeN?MLic`-4=-zcs*2H6LPYZEvckE|l1zUM3DFRLV zadB^x)*$2j5Jp`Pjz+x<4CjXh+v*~bpbDt` z^u`#?*LL-HSFP%A!+BSiWqoH)pL_6XDxe0f#s}o>G>jilL@oA( zeyzyJ0jt(2DxMOHbliALFDQKt?CkfKi9ONZX&^MBH={o{8SG?>FPrS>0GB!O8oeQX zH!q=UNGhXm%Ey)dgr%;@C4OJMu8J9lDfZn(Dfwr1OKFRXMcv@zk-TmsZFKnl2*Q2- zf{^|f6Zue1)aRM_nwosHD5=gl{r!v|t$rz|^nJOYZd3(Tnm5S)dAB-3iGdY6#oY z??qh$SiV0u0 z_(JT)P;EMKGb0I7XMfD`W+@pLc0B=)u&Z0`xo*M>W5?mvW>@*D9Pppcvti?(#FuKq z2d{3fRwg_SkfnWex{@LPN8@tHbtFo`$Ao(p+068F=l*l?y*VM^iTS~CfGC>z>@*Lw zU(7B<_hy1s6NKcwtfAY<7hrwz<8Vd5rgshn(uflVHK#`?{g!7!pNft4d%{8kXU5Vu#?N|io)3oJaJL>uqNbT@4K?i`8{PB=eSC=Da0uv? z;)z@rvI`uD{;R-16&e&g`~V{Vmcd)21Fz*(3j!`}@ED097}hLYcdfZGPgV_ll(`{O z>>0U%`K5V!Zy{<@OpmR2yFPejz#HwK-=9)#k$ zUuua=sebCVgS&z})d6}Vq3LRR94*|bOL8~u;=CRE5Y)w`!@8O$eFc%U@fB-R{0w+; z`|3^6LWkR4j<`RG1=pQO@JtDAc)q%hSuW4&YBjZq0RLtYi3B6WYS9l8^ry~z1qLZ1 z)khYQ!2{0DbHFLSE3MkOxk8c`!pURIUE#^{_rOYB7bqoFH=L7w-=yZ=A2r}oxkT70 zVnZhs!yRXv<0wHDm5ESZ!is*TJCA7Z+n}52s;6t>bx{~kT!=KEBJ}=+lrTbJp0R%0 z#yiGFaYqA4{dkHH7(@_>aM)Uy+-}z)>PBR92qv5*Wze!d4dUe~f&`Pj$}Zws_->%a zwQ>U`*$tHPw}MQCD4l~9=k`MRSt;4iN+83#vn^wbP>r#5|CN2Z;eDDNY0+uv_UD_` zb$IiiT!%_r{m-t%vfsH7d4ZC36^(AbsurTC{=%Zui;9K5?{_XNb*$Wf zWj*bBab39on&Be<eGPX!=Pp+<0%Zxj1w4%BLh2V9^+lJS?@n3o0 zwRREv>qfA48diX$72v0k-*zK9h#U5b;W+PZEX=fb$fZYy*vgBwV?lf#tlO>{EfoE= zmj@OQV()1ZRNJ)y`GP)mOKF7w!K8C(N`0)=R01{V1!oM@w-;Q+(a&bV{pGs_JNaz} z5|He?96UzlcrI2%mh9(SfOhG*b0m5@yLbq5pzV)n&$>F1myw( zA03NcFPe>u{~uo7s;~E2+-{7#y1Q5XJXrNz4b6faowbks4PoBe5KOjoMr&GCo6gs4 z4!PbOjF881u-0rAcav;l^t9HkXE`WE)qaz2d`X>xG}G&)=vrk}>!H88W$Qb5u@n!T zx7JfgsMv{Zsl2Ze#bNGPE zt!*JK@3RR4>B6$)S4ou@+M1eD(5(=FCXD72e13fm z*yZGd$Wz!oWA&R2^bb{0MK ziyksDfeTQKwdT2vYv}MYS$yLLYX{A}B(>ATLShAVF7(A;eLc4`^ z=z7_*R)PhG4z^=KQRseNbQ3eKFM4UCC*{_T?+*UKVEgI)|FgLI%1|qvL*FdJo`z)1 zRY0{s4I+%VK!gzoUM^#gf6m+iy2@Z?)Lt$XLpR{d)xy|he$g+gsT8A&C4gi!#^>a46Z{iNf*es(=*n%jaQ=tExrd*ji_uoV^Liv`R>< zFIs66W42Y7p>ry< z$WE1Q*{LaXfkJa~cy&dEE~wBvyP`q`enKIK8!m9^+P&mL4=P<4pPQVi4aYQ^X3-@n6A?LTFQ zW8E4~qnkW7W>+qNX*eLKF6&{{i13~J9bDU2fDL3_AWISXCe(3^-;WZAlvM0?4qAFl z9oL+CjvLJA0~|(0MESeyA46YemWfg{BuJS=A(_BGkQ?(9x^C{qbj-kYkg}U3Ww%~VBM*3rnPN58k{z$HxI3>g z3^61kch&>mb8n zXYvp{h5C>vdijVd;3N7t4AYXjt&sk0g}$bc_|e)SX0HDm2em9{eczT4bg43O3=IaAy7?7UA3BTRTEw8w%3|5Pr`KGU@JnS%9# zk9jjPD{b2FSH;aqN;ExRiSJqTLW{ZLqctIFqba8P<~);zq}N32!Qc_amm$Sx%CXF* zrndRWe2@=j_CxwBOE0{!2Mr#rBfEhnq9)pHHrc|@C0XdOllxw<8g{4CLFHsh(x?p{ zD!DUF9K{huc5X$Qok}CUN~cp?DS~oJqMRk%LNXLsswH{d-C}y9n(;%2U0GgpJ%GYR}-MWP=y_o%Z>m>E`-E^Lg;C+8QNm z_{Eu~XeIif7+EHT-jMc(WTr$4HyQtu-=!;z%vo$#Tm!LbWZTEm^GNZ%+`PCGn`Q@l z2Rpj8q|a8l-|E0wu*hsWjoP|i*l4WYP#TQSTtFKYqA*|eXeHLTb)Sy;v|C9BC`~e(-&stV!=^XYBxM@`U&E3h{1_EpJI~-(a0+lp}nJU z9(Jq5MA<4#5PGDMmU_#`mQ>X#eU{Bth=>LM46J+Wo;!mC;-)3)kbA`i{e}E4Zd^1H zrM0lV9VU79=4)Bg9LDtwH&6+alCbdtIEm7s17|!c{fTeb$AOJa0nTJ8R2=dXGn=E~ zaOaZb>~9uNQ|qF$Ae7Fd->&;y;0lyMnf)W%Ck9| z^j>V}jTw2g{HmytZJ#;#=--ZH(xc{TeZMF#J6pYpXT`VoB=z5}HFA25h$3r4Kvc%k zuGW!C3$iw4cM`q=HPh>`przb-hG=WM-BZv-(t)H4qdPv&auA|6N#A)49sySbFQeJX zC>??l6qDUqIuqwvKFBU1lst*)qDq|M;hY{WvWC~k_I5R096=zdx5s1sFjm=<_$s@Y zT&Vt;O(H!-F-irG;?j~7WhqB{BD&7dt1QcAlLrO9?+1%4bDxPJ~)Be;}eL~5W#APWqE?0ul4gVagm_7 zeS&O9x3q+W@AHkEq-7t^@(rxacTtuzIz}72nGCUzS|Bv>L-mlE$-&SF?xp8NZIQuT zAMEniySZX%DGaMl`vz&mxgu$naUI8temB>wYnU9cubtWGVd@RQBpNPunK2jYO1S-y zi#@VA{_630Rz|&m*Tq$t=5=R!PL_tXMd5(EVZ0lcf#9S=mm z;ouW+iJ>>o&9Ny%&e1I;)8M8Bq|Z)z^@N8mOGVsytJVdV75N&vQrUcJ6h&7SVSMRM zWiqh=lPdA=D=vicXW7wUCPiNlvPy&vNm1eMNHluh16X;svo5h?F2h#WJJ8=L zjH7j&dT+Cr80Q{FbFBAt5;HdEC>>Nd5;V)pvf(3VR(da_ajo^p+14ETP;73_4@ck! zywi25=&IFhN+w}SYMQVIx}X39_^>YZhyekSp1a%yC{i0PX=`| zSfKe$&Q(K3q5s1zCnb}hA!IsdUqd}gbZ1b z8?)z=?1i09>UX6FyB-zcGs@f|z-`U)vRpJ<$8zh8JyKO57>JCFYMhUd2(EpIea#cI zKNyx2I)TvmO~lRqM&?y)($2iJWOu|Hx$?WuzqS#iyYR4e=Dn~~+67+oFLL}+37M3? zJdy`yDL|CnTh>^;JK17wdlHvBKQ>^Jr=P~)`uv_Kw?sitrCGDh9c2gZY;OShqqAUF zDH=$A2E9}ADf#jzZ2ZhrwN)IVW?z|P(U^)rewOC3y>;6Unu+yavL_sJtE2f>dez)3 z7Vqd$Ea`%!AW=X?YO;rNTnz?B;#ls)^-h(HwZEj?UNRM{IJhP?qw?oO9B?;zZNA1b z1Whl1LVCrpY3 z(@p|*yZ5YPK;p-Txc$5{h@i401uq|CwKW`n)3|jQORM8N9f`-{;Krv z+)}6BeO?s8cXd2s9fcPKX&}6!f=ESJ1EegV-HL}ka6qk#0Z2JI_b|?F*}?u@eZy}= z-QRYTAOS%C4xy9GX_mIgq<4i-J7^b{SuKJ~08gtt5qWnuLCsyy?nZPX`zE&3n~Wr} z4S+jkvkW&fYU@=nWyEZ}#y-hERWTT5S<#!f%xuGEFg^Dcq-U&dI_CT{SmHcLb~yp44;U0zaptm6#rN-#jGA zZ}+cui%T^vOCD;1*GF+W7nKyCT+#cot|NbCjc8@PgoPyOQaAW~u%vt+dG>z(AZbxl zjc1?7hELZ%yjk@Ty%>xRb_(js2%`}71~*n!vND9Fb3B6=4hD~TP#*yKy9c#tJcXMd zw;ip`j@wE@(Uivy;b_4D6goL1QmBziWkzDD&|b?sxL=VI!fIHps0Nj+(SUf;0+n|$ z2|4Z63!hDxgYeD|tMS}y+_Q`uBr5RKtMNi}3@Q%_B@6%4i{P{4S@uQDdO%C|LYS+q z-)-A&he69Tti!kBnHUjKm|1-+3)!GX?aS!T`oo3)NRGti8HQ+UG4!oh? z;VewxQa%LO^~wiO!E3kX(lJTwBA`|4x~JCl##&F_sXvodA%mW~bSw$Kf^nDg4YjI# z<^)x{N}!Q`-^^dHK_tlEyfBfgzHov49a!AI z18wcJ`-{dp11q5AudN~&C<(+@HiPlxP+h4i-weJwRF_;*Bq2bu_r1#Oy*UKRHQj|_Jcf`0KBG|%)xis zguDeY;z6fkuP(FpuaIwsI9Rp`-?qjSe;gPSOqXQ;tQHo56Ha;PzCdznFgNXl41_+2 zisGT;-QmKBWZXyLD=y!rW@`oA5MpV)@nnRvjCBrkh1^>h?gW`Gpe}OQ-o|TM^*rc< zNzK*@`hBq4U+9B*^ZNiM&}QQKuHAE>_4kop*b3{>BDzuq=@8z7eaQ`q`IxT+JU%u# zFm$37^d+qdbIP}$4-@TZ0D5+az$3K-SKa<5g&L0(4uF&@T zgI~7aG=m_Ev2r4xt)Ak3HI$b&S+V<=)Q+qO74HdT(R+J)QR<~44JlX}&Au4r&+rL%-D0K|=w=V4fA0*$nFsx88UUfT4X3O%0#1dAqt%t>;{VY5O#9SbP3Je6ozQTLZiK zqkW)%fxU5_&0YFnu~S=zShsRN!b(I%Mj0DQfX}U8*8g?ZT}lzxYy+eASe;~1PEJDiNYB92e~Gh^WR^u zZIXY(;=B7gV@Tlry1fb@b2tnqY|>R~ZCb~jhJ@{Uz4*i9aOmxjr}oXGThKXK(8U*| za?b^rlM}n5nXP+LeA7yxKrJ(AjDg9aaBd8v{m;5R=g6_E6jsr4U2KZdtBY-S0x>sbnoa5T$Y@W<4Vny2+|5n62Hoz`o(b0X4Ot2ko|v4%2c{axL+MzZb4IR5eR07v>a=V&;(w z;Ddj(K8MrVaKXq#9@=uk+N7oOzFWmL?bM~O^o~1U!&3~3xCU0vU#8y)`xrEsV4xl^ zz9)aaM`IV2>O+Jm7g5GteH_j*xkwI_>!%!}v8H3IxK$)SCdc$<`|#0qqw zNx*+w&D=UkYw{EjA_rfc^67xW5bF5}*C24TOJ~1kyW~L-og3CcwFS#s=CxKSsRP4V z4e$uGxHja!>{R~0N9;b`c)+<|Ji6*K3u0nvDrSm|WnVCM$zr7S=CW=!#vPnu6+O7IPS}L5pK3OQ(rca1?wW-SO6M_M zGZj&p=?~UtPfpe+CEOi#bv|T}r0T@9>1Y}Zo~fLD)=bsK{t+=bJ&KpMIL~qzjN9)< z$87)cbJ^P6?~Hc3$&Rg^6(nmp=T)RaG&g&#!P;#$3@E<&qy6Z`Gskn*O6ceuN0H`k zxw#G%JVP&Cv~W8@dB-J&q5ir3C}esze;kt(RQjD=ksZjt0R1}LXcw<)^qberB))Hrn*67A3EAeN{W+U(oHaq7+v>nGDjT3E>#yLKI#6DHW zs_zA?WBu#9v;GtRCGFeR?&+t)?{$Y7mXM^mxfcJtzGS(4EyxH{+;#!4@3Z`B9IwaG zPer%l4&@oOY5f^1GGG?Q;h>#j9pu0F0=gYkKivCa-iT2@#Ch`zpp6O}03GffT2JG_ zb(4o3ce7JzE?%>yyL&yot2f%M^c>6@r8OY!CpTiCvF>H{(@*{?^;0U7sSvFHyG!~D z+$C|gAK?}S+#CD>J|6z#Ju2;nV|=vVcCyq_;D5hM|NC9q->C-+>+I(N-1?}55AN$# zDb}4$`g{a=Yy5BKV#$MMtbw1j$Ml0#Y1H8LY#*Xg$nN1dTx=Setys}b7XI(-ir zg-pM01kXeINwX4CW}4qVt)%=}#y4y?Zu`2`#D2ixSz`|}4<&Wbrhu|_UKV9b`eP_8 zS%B?c(Bfs4ze!xGQ=x8ywvKOAhm*9Ckoiq0iJv%C-?6N8Jwa(J@v(&#kDWmFaiO09 zthXKbNQ%el0P-pc!VTngU7VHi4G`eNS3YY+qt-uq~A4{%@*$tMmjo+NniXJ%d5DG z(B1_Fa!hW{@KfSJz_|QHzM0{ms@V^58OZWb;DsY(XHN}L{W5Jtf&UBqKcTe^ZvP@K zZ96ca=CUJE@O`uG-nmq4qv~QUZs;RvVGVF_xY5!GJm2t|pv2XY7opk)&*hvI)}~e+ zsj?{ISH3>W^^_yU#=~5|RCCA)I`T$3$ACD&vm8uk*^O$~=|`qZlSYl2#1oU)HvUU5 zO}b`$DDniquW6v2X6o|=?t!n0v-}w2I0N7~5gNvd5~i>*rIf3TK>Lwt3+otoQ8?u;0-uG9kZ}e33{&fe3_^<|$-lF{OMADvo&D^^i45ozHZ4_b)JEZdBi6BzP!YE@b1FbQbh=>Pi zv-UZTE2kk319w@ESqWE5GZZXr-g9DsJe7!C4IrC+z>2v#75N^tY?;~}V|B(ezrW2%Cq>m&{}#ghD+}yvwBCv^+h-uwN@df$t^=nhEJl>(Q`tRB$sp`6ctii z@924~+%xPje!W056;n5Bo=iv29dSw1;^x8!s<8W3U%}_GGdVha212N|JQkTa9Kl(L z6h%Q-X4S+!rV+(swoW5+CYYxZvFLF)!xmVakdjkFXK|jkhWH_+Gy(-EJ%>@$nvVud zQfuxSh+nLZ(&%6q3GLS)jfSL9bOH9NDAfz`8_YyV%R~s~Cob_&<4`y!P4k~(yfkr6 zP&lpfGvdt<5{sA#MoiMl!V=?nddDO;*(#bGbG&5~fVS{C6OFH1;%o?2{gv-u4+X8w&$UZP6dvK$n;ppE%8^2%m7T2TFnM{P#|c(yZ%fo)stfm<2yY<*(dbX>apH5dO}u2vI2xY)g_JK*2;%ZeH$k zwxzhSX-r)^*iPF3mAFCTlK28b;uK$zxbH*a7nFa*Gqbziwd1tqM!c^Y@6O)G%+Aiv z&R(el^<}~sCY>U>9INlFjc|B|Pu#-{)sYbnLGudu*i! zGJ0~SxHSs3Qr6@ut`@FflG`5SBzczY;CHbt`+?X2!WH<}MuiNPj?FH(mLJ;(FE%5# z#5u7h?hsdtyTz@p6BxQ3ROxp8K3asvnd;Th!)kadrXR0{eG_3sPVQlNd;=enGmM9$ z9G-nnH8!DJ3^->1w>xP;u@e_ITILqbDxuedpt2qWC$0yqP`sT)K4%}Awen!Dd&vR= zhv26DCOC4=3CmE}XRz9`Aju%;?`|iDGPcPgOXrd}8Z&rYfM?vMT;{m0(0yob?_l8@ z1#`>oc5{V%R73XBNz4HR$Bn_sx1??xtmmm+4mMtC`kzKQxs6dX1l9c6j=$aoIeLS3WAC^oVBsXrIy zdvn7q)=W;Or9GMCZbJG1H|PTdk-$iP`t$*|&<7|(AK(q9>O2o~;IlD8hVIM2vHWbw z&$*Vk8q59N?)omzg#iviNPY)~vn48^rA^!{zM7c;!&Na~bSv>ix1NEY@&xdWlO&X+ ziWPs5OEOr2LP}Vt3L8*i*rOJsig*T7T0(MArq76pQqUPnY9m4ZS0Dk3w{c8WbB)R} zD3SkDD1qA8IH_uL2i4||N~akdX&u$e6){1;1T8^%*KwVu|`+8gyp&IIM!F3&QXkd#lY=(_bS@cX6934@q zXa`*;QYS;@L?(w6U(LMf)&1c2t?q|`7?)OeVGn3WsFCcJ7X2Ap^nJpzzkBjhFSca3 z?ljA-W1LelyhlKxd&YS(vyd5QsF{Tn%)%}X0K0G;|-(<}dHV zHHPb4dD-^<4z3`p;|k2WN?Oh6*9yD!N$8qcT?; zwlS){B#LzdHoib7lP-|fWUzXs3@$SnTn;C`-F79TbM}&=lg7Lszbh}Ku}a)}{O0i| z$DjZD)UVGTe|`Mj@h3QQGjdaiMPpmEWhhUG5CNAwTvcbQ+qm@{;cNSIM&@kt@%2WD*|0}ZwwqBtpxSg;=?}8 zXH+brYd0PImnRnFRcB>-6ec9f#_56d%_CT3So!RYc2TDsb;_@dbe(dp6Uv}eSClCJ z4k&&HXAhl*I>eY8j-o6uyIm7)fudDK#(U$rMZHucT2`DWS+T0>9txz!NoXcN;iUHiVkW(E}kLi4RWHc zb_9l*hPRGTKG!&QO~L3fyAFK^rJ~|TN~laW>Y>I!9Z>D+q}0{9oQ|q{Epan(U6HmC za!ry%fft`VYJthBBAHfG!ABeRov4C$ci4ER=D!kB-!Mr^-Z=i`*O!hzX&nCyn)2iE zm&f1#`bqz0Y0^qab?~lI(_?ur}Zvgb{uTTH_%<(6pfq);8@I^#HgvRj~$3Go^ zO7VYv1rfe%AoM4AUWW76S2>R#D4$=S`SoR_ZGdR~1mAPV-++ugOC=%IPxyX$eu6bF=aT~{g+&m@8#bo%S91cE+ZH!HZUyJY(-Af>@V3Y_X^AAeE z-k81p+1b8D|3u^}%+rH^oJMH3CDGrF08PrG_$N8yLgE+1tPj4lcw7hH!9E zHZUcJR}d+$^+bKA_mZBI%p;2AE@c-M)Y=0>n)W8A~iOmXyiZ zlyU7vpib2~M2a}Ma?E9?D>!^0p>`c&#EncHB6~qA*J0Y!>GgX~zgmgDtVG|H(@GAt zf(sg%%&tU+xP4QJzEz2Sxf1oWvp4EFqiPjKvI-+t&RjXY6dXPfX1fX@;*LxeMphL@ zcW+P$Gv|_OWaxeq~HUju^?vB{bD%3^R~ep_hSV3bza-RET9DX^FtyT_$j59}yBm zny)XDvLg3y>xg2du4btjs01YNKw)9xaS)DTwgRc#NR+@WA(y7K&^bu40NiLPKG79n zy)B{Haq{vI7t2Fj@VO3aujg)NA3JwuL#~o+4cCcIo;8%41?Uoh=f|_NGCD0LqOKX@ z8dX`AZJ|--P}*j(gA-Zoy6_WMr&~`Myvxoyc$faU!8`bm4&J5z<-xn{l)=0F#KHS> z19tm=W5E8iWAo@KW7FxJ6|*|+KQ~g*e`BPosD*a@m&fng)5fp+HzL>ee`Co0vx9S8 zd2nQn`0|!y<(8xeiaOPu40=A3I~lVZ2^CnnMWJ68s}AFSoKi$D>w*83am2!G%)DYI zdBx1-;)N_w!r`miI%I}d%q(6ptMH2UHZ`kmOc`Rjjhkfies%}mT-T&-}TTC=nCJ1=8jA%`%l z3?U>ikRd5)xW_H!ma7NcOk+JuhLpOhwUF9`>mFoC^otQsMNEUrULJ39ardMx0VlV@ zL{PBm*jutB&ovc53+=k3jyEAoimUyYRi#KFi+*BDiWItGjr?f(U<5i7YhLX;p{So! zH~tQ>k-;E=bA>3$5#k4rc%vv^S-%-KUkTh#pd}0w9I%yi^aq4G7TSZ2XS4Bnznys$|;#{!FZ)4gAHkj^4 zx0~z>wV^#(i~z!^NRQAr#SeMqiLVmd%s6Jj@H8I9THFFhXf%n#OL%ve%48xhadt?Ds3!?R$$IPPV%h)kB&#?9FVlt3m^KKy8wCr^%?%Z>Z4CRum63go;L;J zaXR(1=YCtrDc=!1-Me~gvQRn+y~{p-Gzu+c1(UJU#Ql3#FoAREMXBr>ngw`Pk!8OcUmn zqk4AKL`S_`d+n%+idt3WAZ54%{8=aai|uxu1|<@)DIX;2E-Hw=Q)h$r!{FeWglf`m z%yk>x#fA>keKc3(Q-%YgZ1S<{g$^Y9yQW+1d`SPk?+p>i%5*iMkD>u4SS}_bt*SDz zR8?ZFqv92+DiH{GpYQP&#x!kxF4hHdNdG}Pq}>dju;xWRzWf+js+lpCDJ=0*bo3&k zSV&Z6fOI8?MkJ3 z6~Ar^8r-5Q^u(8o5POgC%2-d&P*2a4O?m1hF0T%$Qjh7h=85Pq_=-Fos|U9y$Hhsh z)7ZWYjC`??ea{C;PiX92H)(AHuzS=eQ=!xcMUUk@va<@-??~O@TpiRXS*KSTh zSM&ujAS=yFnn#vZihItYkhN$ux)zt=q;FNT>)tbEq%^zM+nm?s%GV*^QX4+{b}BjF zaF(2xx-u_2;r(YysM=Q7rd!UG!KITWKluOCPP=p3MQPD5`eK^S%-i+aE6o~V$RlyR zFeIIp_XoeeK$O)t5_m|!jsy-0j^L8PeWMYlQ6wh8 z)1`|Gml6949%5nnvP;{Sce?O)h+M{1X;V;0n=&bFinW+Eq^vIMT)r?Rt8jW&smvr@!umE6*5nh^1gwA<9DZMn4IvM6W*xU@&L{pa|$uJm^J9;+G4^k~e)AK3@U?^pim(9wD-eXe# zuB4isEoIp%x5BPt5KoXCl@(omg|c~Fy^)ad5!UduiWV8Dm1jAjPCwcMRKkkT=_Uv8 z$tD|@Qse9zY4vyB^yye3#j?sp49BX_WHnCckht6-rGCXx3_@A<{1 z8^LI*VzFDF5v4M&4Ma=1UpR$bEDnmYd4}`JkgOV)I{ie5&Tl$2W|Fv+vI`mCIXsl% zD`77zN(kM6OOOo-YgEOi9TRbr45V_UAhSE%?=yhsP?9d?aP;OWYku|?3C-T8b<8S>hRw})F_^^b1=Kme(6ZBt8mDP)KWmdt{XAr{PT0#MoM$O*?o`};0@0_ZjwN> zH;PyK@sTv6LV2#w(WV?-=er|RVghgSRP*k+-!wN`v_ECPSNIe7r7~=V0he}r8uS@@ zg+w^g7!_483ZDYaQu*=ZCt>YcIJn`(q3*~9Dxpd20~+}~f1ZO#N0$ahw@{E8E?3ab zr&U2LL1{{3)Q_j`?p*F~V7M8skwdHf!osFBlI97HLch!W3pK){iLUmmhN=2`XOtG< zp0T*Wd!KR-hq*UlGip1U+xEwE*`7RV;5TnMl4l}?!<-@<@SS*$2d|2xtz;0CL1}&F zRohg3;bV013E-&OrUEzwm>nq`+K|IJ6v()|&K-t%neYqTyMU`^ixGfYu+O3gNNfd8 z@);xgL{im=7@Jk-$YmA5lOz?ebFwCyCK@*EjWn$HBMvnlDBoHQ+kt<5-$n&($)?KA5-eI`M!mnX5Ya~7H#8Ttyw#JSW$Bimb{ z`EB{K7krs$l`~*+B4$&Y|0G zpKup$Gz6x*rth!;mQ5ErHG_9)0m?<#a8ZS!h>OWZHo>u9}Sfz)nFJy(| zy6tYvk}$@G*v1BK&{Q?Xfi)oY*0aW9ORPz&S>iVFsJK>KCvFxuipRxG;(9qH=2bV8 zDD+*7Gu{D-(NIzwim*uvnD3eGQ*JpTjW8ehqyBYSzXWY&mV> zg6h&Q2RAoElu4Cw>Hh|(n;(HgKEI+mX;`hadyq%{?ZiM-t?}fNf+9 zusuNjK@ofpdDjZ>y|B&pxXsqFMFKZ~_1YVsd{VM^VBoGN{;op#HES1&>&?a?F^q#6 zquJT=h%ItVwf^u>sWqWy888Q?#X4{WtqeWf%_Oj8GTQ;WM3+s9HQWrY0n^F3pW2OZ%{7EfIW0tLZ10Bj)Rn*6Lv4WGEW;!)!nL? z>Z&XAfePZ4U;xnZhd4$5`N~W10!(8gZj}DjM8C;DbJXKEkn>odP6(RVP1 z@d*+_Gve&Y-a(SDk3S<59Vqq7GbY4hdntP5cSpugdew!ZFU1c$65EMCo*3)Z(paz7 zn#9SXKCSyUH^P?(i4EZi2b$Z_d)rovMOLS!?vzq%v0W-t2a^g0-Dbspn{9$p^H3(} zU;ueYl}ke>O=T2L#R1fpe(4-fuk>(nKjMyC%H7R)m1;nOlc1mPXfG9H_Co5!ams<1A@(h_W;2DV66SBFHTZCgW9okCeQ z`p74--vvBg6X+J9M9$#W%z7*tsK; zT6{I!)x{stowN3Wmfsg+))GvKdo#TmTJO008CQ~JNzttFYpq~Bof#?uaCHLEZ7*J? zbJfF(8;A?-g*Jn2OG#U{rKGKTOG%2jVa1!I9FpS$*-P1ZB=i#(d@&dvu?Mox~rAjZ70v-z+_UhnjeZ>A(HP@)ki3N zmBNQ|9Uqj|@tv|LuDS&BUIlziA-YeKgRDs-xUg9vKf^;P_G?nJ)YcN!t}R+6L8`WK z%R)5?y%bP%0lkqimy;Y7CKdazi$zn0pPmcIfif~CDG?=bemodl(}^^S{) zSIBR1;lqUH9N&Sa`Aj$AGItk#&5#2d7b(DCE_iZiFKK3Qvh5ueQsi10lvwt5`4xru z#7D%8L_D6S&VeFrPS$dp$M2Fgs^d?wmVU#=q_8x?xYR3kmZe^R^{Urkk&2C6k)9s3 z_1J7xv%EvcsT*xj_wu>Lnup75$t82aY-PG#eyPl~H?EgK?w`se?z7NqRoThgL;Pu6 z*vTFA0b2Sz+Rq#VcMbP|G~osKPsiVq3mu1kFx;8RFs)?x9vB@M=mHyJv^zQDx;%es z8m7+5GpXeH@$q-RKCK6(cI;RO(#VI5UHg$O!qLJX*s48#>-dM$bA)_|ldNJLWE!|n z5}UgDAP>=Mp-C+iyoA^92g4j-y6Y15JsSE;Zod2W+f)QC_5isHG$`~5kfeLpYhb^c zedW4QLo(7#3z}0npUzaC<)lN~dT|DSeEAtl{$qgbxDRcqz&<&~z?Lm{-JlColqJm| z7|=3<5*q}8qb)jM*kugs+tDs3&SG5REZBtMYHzhzl~-NHARz~ts=06PLie#GqWaFN zT%A{^pX3ZwJIy|DAB~h0ZL5Uh+ws)vzjp@W!BemQF8z(yf5ZRZvhKTIbKW?T+qv`Q~dZaz1^bn&fTKA5Msdy_q< zb&(Uy;pO2%bDjfvB}c8zbU27BR($1a`E)f?S@M9JG09n5-S< zD+xnJS&;I3T#>oR+$ZPAZ3`cNLmn%Hc>BRBm$)*pZ^H>pxa}m#ugiujkCXy-NaSM{ z=m|w4&v0QEt9kBDJUZ$zX9iY~G(7^=6NM5wA_ooj3GLA;T%qsM&&BBVw!pRw<1X!{ z1kyrqNT18aA$_`SF=l9+n%la9Zvd56Stp-va{{$y(IV=FiHF-s>LuMyeL*UF8^ImW zQoIY4?z+t|$@iLKXI>7f8(ty%i6085TTQu3WPe^BL&I3O!(QM(#-xG4e)Zgg?YYZ0pIAJ4 za${rtq0#1(>kn;gG&frpAxd`9N~`ze#IR6>@gMFIJorUzk25k|rh+-pTH{^}r%eB#;k^#N7rJ$Ic`Sx8)g-^tJ! z^Mf>a#EnHhk63Y(c)$ap?w~rQYxxpKt?bfZKiM_e5v?rONM3u>HNx3n8w8W?zR5=g z=ehG*M|dpN%f@kElKBHK%p133Nl{YAu_PpimG@u|fCRu31-D8DDN~(v&G;tYu~-@@ zc&3+g>4xrJ;*TQqy$_|5nF*^4s{3|bQ!|NKPmrbcog^L8ql2u6ig(CHrkQfEXWnH~y$e27#GH`7~Tlp=jXkI&yRDA;Xfj~YUo}=sIElSjt z7Z}w#A^Y!qUUCWbwinG)Y%hj1KAlg}olCr7c!{jqDCOClUE=xR0;y|I zp+3D)D)xeWkoYUjJ8r*wttq7TI1X)_iie(CBTljgC&bkwBuvA{8MgB9HG!9cWt@2; zIC}U<(DYcT;3j5>k^0MK#5_eH(TnGkU9yyv2H7YAo$v4B`fe0p-NLbonvw~o|0zvY z&CPnDkDIPVc43^+bw&Rs|KjE>cPv6{J6bfiwj(dzg)2x?bdbCL#9oGHB$M5(Yy_?w z%r71zUr~Wj%?AXf+t)+I?bf8iz-d&UGPJye{K;WOwiwpGVDNGpyt?Ue!*y#!1_O+f zdV6-L>Kv#sY}tKa@OVqT77)6_b$?T>WAY)IM1nNZ)EhZ5+)U+>854j}vsj$!Lo+4> z@e0PL@-#8QbsUQsQn9$Qh-HN!o@SA(my9Ds(%`Cjl_k+P=2Z;WWIbX$K)4A&tb&6w zPZ;w9!37*~EHY=kU_66ZR!FVMmiFT1?aMB+47adw(+?NCaHp)JWU}v6Qg1g5G58x!MP`yEE%LJe}$cUTF?%OVF8+5HY-0x9Ma!6h$?5j^ ze`g8cH}5=AHn44E_sMJ_Jo) zM=*@vO6@#Ycww);SkJnd^Z0<+*kh?!005~YVsOp@y61XdGzd0f@i`kj3wDCt;Boh5Rx*Wo+HHpSIAwfJzluOd4i8hK!LJkfvvN^(*HB&ZmEoIBafeEYFFQy_Bb{mjoogZM1 z)`HcS(FJo&-X+HF_@Ryd==d3qGhe2?0LP4C8W3xW>$VnWw)Cp4+k_^yZ)^S4{bM`1 z3uv(<cYUet!mIEWMArz?c2Gx8;n==!+HTHz2AbWHkVzUY zxt3*H%c4ueCck|$H1vd(qo@3HHf4h_d!3<#XBOgISO_h&BJ=AzlWgi!8+q85xsNRQ zEv3UO6qdJZB7J(lt#_LoRh7#_pGL zRAr8^g(YCFnDL{Qx>9yd5A2gE&!Emj`&E16439ba*mmxjVMl%aW(D_aq%HcEHjYQi zTc5^Ee$Bh8#*cY=V9!qUEx1`NjVto8Bp;XZu}lx_@G0M-%!e&F{2bJkf!k(qBDWK+ zf!nE0%u?bR8P4zE46{q-ZlPm9D{a=Q4&)I-1|3Lgj6qwjv0JI6VAj~JG|r#}H|GR{ z7G2OJgJ#`~_sB|a$G5+Sw83?*q2~>N-ZWywsztQZ1*rb~VdOy{nZ^Lf{=}I~#{MR9;%2Tp>e`<~1r;7N&=PlI4@Jf*rJk4C|c9i}!RXUK=eE*`-~ z1O3@)o4#P1Zr{u1XUl z7q4+PY=qaglaaAP3;$Fb8RcKm#PwYF5UgZuqql6#+LD~Qmdpduy#dXwPELiGUV|}K zRGLTwx0+LCM{c1r&8ZFP_H3_=Lg@s*R}{A;6f>Je3`JW0z+xc${f5@E{M8>>mP2HV z$!6WFtQH)K6I_+LC2?j8yKt*I=eL87l&sIH z=t2qGN#Gg?SLlh>d{-SCzEo_czY1|Tgag@2p%yw?T^ypY_j+KrxQ;bPYUWVji@=b4 zJDHmD9J1m_&D`p&w95*xmTxG)>Mirp2Qi7MoMRk>NknHR?H`K#jOpY_m6MDEk7Le{ z^M>UqPr)~^7X`EW>0MY z*Y-q)$D6r)Ju#En6YKxAJ+a>16KnZ;Vm`Acmj1h?OH19|v2vTzrR5t-muAgP_FQ)a zSJ_R?nB2&1@xfK1WQv#0=z*Ok<-4%?HsZFhf+su%yX8!C+QE^{)kfeWm0`p4b!0_H z*uzr3b(?PoCuvWb#E%6>aD@FXb`8^<2j2N|D88I#_(}OYCoTr8@JvdfuDr+<(dv~u7SjOZQ#Js zec{{%X#hoofuVcFxeZbQh6eYz3(|4#f^a}dPtxKTB_}Lz_YItrOgrdA3EXpIv&20o zwv}odD|;WEh9CZmv$FM3kr8Wq_?D0sguc3_?O;3n z>{v_mmHsTz7n;F5S)!-;$XMX;kWygy$G9{&p9n19m<$Z7xEJUNpSD6z1rlEB$J9JP z@}3u@?(%=n!hAW)!u%TBa&l!c+NrjZX-Ie=v3f%{fnfICy)!5j$&Ql*mj&8Quma&v z!vj;-=c9guT=UNabMt1ImG50?xW0LnS^4Z;nw59ijF)=ajH~gFwSYYCWf~qC)9^^a z!d|xD_m$B%4_f)(I%x3m`JgoR@X@2O8yTW=X2j#oYlp74JYgS}gIV zFfuSqFP9Z62YJWLh&k{AhB`hxa0#27CiO18C153r_g`PG&+ed1|j!yyGP-LF&e zJuk^&Hbp0!CmE2-*K8CNED8s4fe<~0$B1FDkV0G`M9T>^S|?bsXs{O|tjuW#YcKBu0 zylgoytxlR>UL9s3>=Azeh8H;u) z2x)qCn&EZTx~6ZsuIZcoxu*Bst^ebT-_7ZsJ?9<1{GRSN3gm{KEpR@cpN8+rE2MN$ zO&ad#;P?Hwz=zfY2V9s^<;;|2oRvE(v@CCsb+=;(A*kYoukf4dzxvK}PZU9#d@~n3E?SOY4SC<}uQ0 zwMQnca@{kGRF+1r>C`u+yacXxe#z7C%QSQ81}9%!#)~)fGlNuqTiBW3=xyL-{R+Rd z@OgLF;oE6-Uql4w?HysDof%=kKVy@Pf*+BoGNEADMW*ZHK@aNhbM{>Unf325#pwx3 zciXy5d{EXnuUsTkW(hF6qe?BR93RBzzIjN}9>EU(!n3AWDi0hq;>t1a+bucTeEL3G zJ!OUuzi8VHrck23zn|{3q!z+?658q8SX5(CaArUuJV@dO^dki_1Q{t6MBKvPSD61b z{7aQ7;9oYW)92L|?}xc+M~zU_&mwI}19qf(#8UBAmJU!30&3hTSzc>MFA}?Ku6c&$Ax^H z%g3P1Gp94J%EDKrr3tn+^0CDaYiWYVx-=`no`;M@d9FrPyAb%*g2Y&nk4yQG<_2TI zCbnv)v@5=F@Aa6gL=18aL*~8E9o?{T+A44QSAt3tW9b_?dv4r`z3dw}Y8M7c@+`-l zm`%r>nALG7I8|O$v9b6%j*GxB9>*{hbi&q(IpGrUOb4By4cqk2^p5fPy;GJOJNePw zapQ1cvJ`iu9n4OdVK{!nUS~p{zq7fh9w=;>xvpIlvMUSOm4!_0PVbuPcgv?-z5HZj zYVm|p6-jNuKArRPutLz3;-15SQa5BwBc}!>Nx2(72bxmMbl8ddvFN*s-t(h=%(7eP zMJMXVYRZEe7LfcKAkjNXP668}qj|z_+bnoK94-9qC!SJDx7e!!J4@YEmry!V zC>Jy?u>oqOF0w6mY4|NXcbFqFyhNB&5%(wnJ&#GF?^Bv!eISl9PQ32eKkID_wcHFY zuQi4mduI%FLu05N*BFW|o0Jh$H9CV)!D>Ab+6W5omT9xDte~I?n`fLU@{|RTX9E#4 z2=)@ReNle&;eQ!mNw`H z^~U_1!dr%Ax;%D`&A212v6-Edo;jO+0W337J$p6-2acJ%o>iNH1IL}so^_jNW+x}P zZ{Mb%cyFh@OZgbvxH<2%C0rV<#CC2P?wivoZ`4)Kp3Ykvj$K^~nEq?z@Ry5I`UHDs z?n3Yl?pkm~dlZ}~;be`xpkn2uY|BF52v0kqO(WG?*P~RkP-uCpS=Jslj%`6mu~i)S zptPv^%s|(o`&Lg8OhLL4#;Y%2o%uo>icLvh)q!E#O0&F~KE00&c;YAukF2rTZhyvR zJI&x38=Eno9t#{ET?#CJ9uF*Uo(NJ*c{0!p`CgD>#+Z$U0b|M;ri;1N#c1yb-ORN# zk+M>IoXbk>k+D*nD0xQ9Nu@-50g(aw~)H9NqDTo@qf{`wnP zR%PuZzdKaFDw^8LdA3~{v{lZksM4dNxK~9#pl?W4N!8>It=U2ikFT+Eo4C%(t)dMX zD!Cn?GAv|RY+#KZmT&iE{7TYYLrQQ1d$WlLC9i~jouB#?guU~}p8L~Af9_9XAJ({u z`_t@ldKro>zhI* z|BFc$Nq;2&MRqOw=LgxplZuIdG0{$x|08axS}2OkdvNB}V+NCZB1 z;Ics|f>;C%fe%K|fgDH#EfLg2a43Q!5uAwNOauoaxDdfPy!(q_Pz1*!_?QUxMKC9V zRS|59U_%5mBG?kanh4fK@KOZxB3KZ?iU^iOa4CXi5iE*eQv|0Fnu}mo1kbQ(7QrsO zSc%}N2%d=Gxd=Wk0ucpK#D)r^2Tig7ZXzs<{3)i@(^v;58WUGy=yzTHex-i5)o+1F zVu;&BpiqH2EkQqH`}2f;H|%dluc+TJdSL74j{1Fwc`$n+qJ)4|4Q$Y_mipCBxP}@e z7v-`BCH0{pe9Exnh{~lj_~Qgd#EkJYSR?@BY&MYwM+82L%9CkulfVa2`Cb~F5cnc0 z-%o?{}$_Tj!Y0#m#IitAB^zvW9Oc}o=Q8PGfEkfe5* zX<4)cY-(yxL2Vn63Wk5-x5KKTM9JV7gk%<76F{rFdthR#{rqXvtDLE>al*W>VhEs3F zP}(6%8=$l*v04sR%}w79rGNWABmmfKX(LDuzT%x8B-MwKo+FnA=u2x6t6fgy+e1JO zCFD%u19BuG2NH4u$ccnpNXQu=XA*KQAqRjQNXRP*xd7xsLIx$|SUC1WZu*vb=11Ho z(CM+nesg9`u|rw=oKxef8NF>9J(4hQNURwLYs*dF35|y+q$a6cll8AVb-pxI&J&d# zP`MznRvfG)H+@S~exFniBRsuW!pe#TV%f|ZU9vAFLCX#ii-zn?BD)H*PbJo#gEi}> zZ;5Pa2fUMyq=X*Wl?TBr%D#Bty`eAnwQo_ZdwPkXx+XAT37SZdXbyfwJciaZ-LgA zd1>9sP3vVAt(&(%>tbG7mvYnkEQ{91w?OM|URq~!)B5o&TASh)h>b*EYM6@Lt`(`hH-#i!Dm&8tj z1Bhtxh>&niwcQKQb>~hX;l{w_L<0$9ag9fZALj0#Hm_#fGo9%|W`aCdKKA*Mx(E#! zuf(0vnYNHHccSrF=ZCViw&5TccSUDfl9?bKmXBrmSfmGp#q@y0SmN&KOtUf*gvj!- zBOkl;fJ~Vl5G+gFCpyz}nF+FH`4B=rBYu+XnG-C5mO1J|=WPp_nWfSy5$i;Q6C|hR z1WT)BwyG(hr3zpPwn`l8#E~#Z-V<kUzug-)y1pBWJggFiSuP%f+7W=Qx zg*hMluU-jrP`0nQVS}cL$Et}egI9@totWbUN#!}gvU!{hNGVz~eZ8=2d5m|>@?Sj4PPhw?_)nu$*S_hq{7Brna z3Fq;&5sbGHBo1Dk@vN4@;w=Pq2d~X|p7uhco(63PHDpvrtD(`J2BCu%Gn%LEV7vs2 z%t350qNfI7#10lA5L3#G=~{$QfQo~48cLd^SJ;VwZ6Pf=Ajo?IK$MfZlq%$q3V}j| zH6Tg=rPtya6+(*>2(pkvUC4NJ!$ND4CUBwFguPEn^_aLXLDH6RAQ@s1PVy zSi7RcTzY+9P$9J7fglSx(S=N=3OS=f&hU;3QIavu3C^hyVhuo$g`DX^?xhMjphBR? zVa<&arfHt>iV7hn0t8vefiC2Js*npR1Ztl;6{6&CE_XpO#BhKjivcQu?QE#W@yOU zetAmZ>Up7_GwQjeo-69Pq@H`~Ijf#e)bqJ|)`d#6b)u>hE&Fk-T0wBtN`R|Y z^jozu->Mb%R*jU`UMv~Z#UJa$hEB}r#DY$&=)|c`>D?@La^`Tdtvh%N4Mei#DM^F4`o+=3KOU3gn{Qr#rLTsSR~WeRubZ%E!zw zzQ0ai4Gnd5p3TzovvB_)i{D{3%bd;P_6hQMy_D;-TC<ovt{i zfmT+B3pUw~`R5@0d`PD*{QTEhV*P?XwtSK7FUo@mOq)LcpRqrIvnR|veZ%25G!d1% z9njlz!{ScpR#%+FFUzYFYQp{twlshHHZPIC;{RE;Lu!B1U%;;|CwV(WeoI@%>vjG| zy7?iA>x!WN(z=St9|%9gI*I|O7O>|eZ>L$T_$T8nz8*=py=mzAf;FyG^1%ECE&fu^ zftdx3DJ!iV+jifI%C`Nf48ZT0O))?S3yB1Snhq#&)3;^$pm;Ux9>^xpyCn{8#Ldh$ zrgB>vJ8v4oZEHnl?KlW6394C;wmCWn3qKc99wQ;I0C^=`%cDU+28Fgf8Z7>=@9))T z5~Tl2cj?=2y-UB<4LK49*_ACkFi7A3G|s-n@QAbXONfybr0&&`%(0=f&d97d zlF7#!KaATjUzxpN+&*bG&Tm#E!jgO}%g3UuVN+LiDyza7Pd;Y(A(h%V^0B(nQEET7 zRavgXFP}=BC-U)e`4B?Z5(!;j6DgzOR*AY!v_(q69cl%4%nEM&Gqvm0B41WCR!1jV zI#E*;9HL&c+2TpTa6XypEtd;F0bFmqT=*Ho4+LqBM3+nAv2J-&sl>3B>!WSFJH+3F z0=YRS8Mcsu-Sc49>+$0h?12ZfVFVi@1$^WIwa2(mqLI18T6Vb%4P~q#naz*uhdB>y zy8tX+v3oY#m+a&HPWCNBL#eHiLr>5w`i@v=Q}3zV95TGBw41->!`LY_1|DDa;t5K^WF7pP8Hyxz~;0;QIncma@QfrGNZ zekH2>-0&2Zn_9D{o{>EG5CEG@T7ueb_bb%%{z&Id`igY;&~L3%>Y z+A!Xao65CawnWu;vzVmZEGF8Cb?UfZ8+mlU5W`;QknY)EjD#H#cVF$kzGMsl{+a+L zY7pz}Me^ZL9YZ7=-R6>1!`mpVZQI&*{E&ua)mV6vOR)%co=iM%I<2Iq%fKhi;OVt410UR>%fR~ou*1Mw z;yMiEFo$mJ)Joir)}kZ{kKib(-t85zo%ZP$rhWQV$U*69e1wqSy~3k5%nKWfwZcg> zIXp>bVKFnuJFx0h2W_HPRXj5zsY>#_*r$mfAJuJ><1elbJognadqie!doJU$oVZN} zVcLhA=?llLTnrQg&y0$CpIy%xxF5UqK~S;o^tw9Cph=%|UGK@|TRZ5`YBM^pYE}@@ zw%NFr_lwq18%H`d!8f@Ynul2dPutkcmTgWi<3k$KF)stQufEeYzcN3M+Fz!!<*5q$ zvwrg^9ktgVIrGiW^qo&DtMg>!U&Rn3pt`9v?7(Pj8I|D1b=_gom+QJ(610+_oeHiz z9=OZLcU3oLozP7NmNDFOBBS1y;Zz?4-Af<5jJRm4Zl?Nh_%Q5w#eN`2&a}dn>IY0^p5H`Ww~6!+q{sKj*Jy zKXVeQHS3)Y9myFx3A&~k3)4M6L(zX=m9y{8lr!RYLAvew6?*KCObY9bv%M=Ru^`XR7%E8cLy&>wR>cBaS-(Md~O?9-8t9A45~Qk@B}%8D!`*ts)zpp%Om z)GG&1R41;Co*>+QdY4TlMi)OYWHPvnEXFo%AA2rQOV4=BMM_8)m)uu04R|CAll-z! z8pD8a8-C5G=rVV1>+!@=`5LO{B>=Za8RKZz5XMmO>Y{$7xi|1Sh?@D<>joZl<*jS2 zuF~_}LVdST-!0U;T&Ss6&M?EVF;8h4Zy`Kie$E(;Xaq zr#gU5M>y2LUw9pl>10a4xp28LdJ?vZMLOJ|oDfg;Cf=cwmI$gt<EV5@$nOmH06j39uh9SeXIFh){5gy8~yQ6q4$#qQ`JskG|{(Nskg&*FNuFa{mS zr~$wJ5baeuuZws+(C!QjGb!jyatw+RP51IaOvZ+YhDEI%zbcTo)dkvO6$hGe;W)Y| zV93tukU&C1RTvb-VMrz@gXqfeDP&+(RU?#+(c?B3FfjP(==H#-WOTQrd_=MZ^a_`f za8CAq6YDsVghw5 zDL80F8BN-T^bbtmPA=Caa>_e$ z-S>8!^or@<^t~PXkvvSi<~oWE5_NsFou0C7*->?WO19l@%X;s*>umxAv{VPaG98$0 zjLVKI)26ss*NDyTZX%^)$9et2?jsq#kb?7H`CZ^=@;wlu&=aIX3yxh|xdt=_P+M1|U7WF%%L;2)bMsxuFzthkwD0EICXm;b zC9f??RBdfVtrhGR1$t*w20L$9SH=Q)6X#Cb4_b>twlt7N5Zcs%_EWSA^W*bLrC9+! z=c5oGmP$0zgkY&4jmNZpO~>}Fk>0I!J~H7E0Qo@`qJ6G|Pg;!#vceNa3^U^W)o$E@X;gjagZ+MdzxkhU-w3MiGi;{I=J7<}Rgb`sS`7=QDMmeuB%1xO z&_cdK>i{V;HubJ3k0;^zh%w@6dL}frk)%S`HW6leoZPpZz#OP?gvUc=RFjCXEj*hX zPXVU_;x~PN5cB}QqX(Ft{8f>U4jIC9f`~4h>ZvMoRpq1QMBl6F=zD|mu}_)zWo9)P zD%bY)%mMMxx?=}!$m}!5{$>rIgmp6X=xB2dR3|Mi_8rIrhRitkH6D@;#hM>YPX=Op zNqWYYWs%9=SuNQhGoMMq?O4MJr;qT0x-A8gao}utfA1S%3%>~FRpI-#aJLUpI9eyt z-8w#*jsv(t`Zpa1a3wnqAn#yTNcXoyaR8TW7{I9_e(=WzQ-Cie5?; z4Gg7x)9|vc`?YNT0yTdj)qMVI+rJeo(AEfF{n)=qa|SCAfl-&*^7Yggd@#NBlr@mm z4{L#`^h`h6P?w{PS2%ocjf`Q@d1mXZ9j=QI)9E@bH%5iVMys!Vx{Rj#N|o|)?|t<} z5*#G&LYdvw&iZ4nX0nich!}2q50!i!ygju3pvi^@KspH2QdwgTTA^xtbE8BxSXqlAxLUNjmX zPZw1yKaF`mHQOsJTy_ zGd@6!;#iCx#Ue(SCM9B`-EJ(Kf^&W&4y%~wAIcFgtZo&Y?#No*CaYuJSESaICy54D zOeGa*%6t^k%Ea(E9u^t7j{qM<>)_Z^V z=9A#%wcovaclh1=UzR7md?!zOJ9*N4#%^?I2zz$=%hrqw{erd&!i3?FI%6LU-8qhC^%&@mk)Z*LH!FFld~m0Wx5 z|B${L8cGeQcS>e%9E54-8cXi1W#0S3HvE&*wEeEG)(;Xu#{g`{q%hn7V;O~zP>{I1 z9*-)1vL7|i5_HLm&##-<_xt=hQD9DMex2|j^2^&GWm@kN65b^+U4f*enZ?7K%uV=W zMAN+&!Ibvo#Fzi3h5x`V{E0{J7XG`1-`B!lzJrB-`5(IQFYjjIFaDbr{zGTsKYX|F z-!1&U7XIcPEd0g)(1pKvHw*u?R|L;nn{{^SS5iy=k+bw4^t1GN$-FB5S26(Q-5>-X zh*Nx^0$@)*(4b{{dn2OwK;yrX4}`=A;xr%Fy8}LO`X9;%PVa^f%yx;cN@Ki0C;$DL z)YACFv7yM`2KK1StxtWH&FfUO+X?u=@6;Pmw42|D$@Bo3WV18LuW&H-DFj`%w(4G= zc>F5MSEUS}M}=DRdWcO~c={U{So387RAjCLz|ekbKnI!C#kRY5Km*Pq>g{_iJJuSm zPF~dqz60^8)CejO=c}-oCQh$hkIS{;WUddn&)-yDnI=G>iJJ{im3G2suw#3p~5t zrhvnw&)j{X!?N#z%7Q=bbnI(E)&X6v3gVQBSFG(nQ;f@Tg{AqDZ)WE+5YWSRggJS} z^;Cg7MU1sDc6>X%&P|#x{9lR%$lTm zaNDAUSCO2lV)HpXD&kdGhcqJTFodtk1fQl$=g+aL#SOs@s)|0iTaTK}aNsrXgyh)n zmtQj=M1-P~pal_KGA7iaA^)xU!uasR#8qln%cz8mv{zqL zKUv<#ANuLA=eFU^RdsB-7}l1bg z@KA=o(o{AlULz--UHjh0M00?a<^V14$d&0=j(^4S(Qq8dMQr3K5sBzaA}x>80RK?hU@~Ps>|p0%Rt3=mX}}bf3kduKOUc}dMbUet{E*K z3JpeVF&e>nzxmoOFt(0F9 zD9o9)WwT=9&l9McBkQ$-DFU~(wMmGCcRhf>9sRzFgdZmo;0ppTxn?WJl%Sz=f!mbW zz%q7aU0`e*lCiZVW1AtymSY8KMv76lMOdL0jSMin;qq{SutmsMtYv!%V5_U53gxA7 z1co=b-4(47axbo6gY~U-)pAA|X~==$%>(jdkC(gx>Gjg|67$(Mne>w=NG(e|AROW; z&Es_J%8rheNi$q@?SDwEyL}WJPV)eAd6wfZzX)B9kDo5b*DE$yonAFLy+yogIR0u- z!cWk%?b5Stm_NFqNNAWfF7wwApZW8%t)8KJcGR2<@z@`GOAN9-L3z!bbb%u8#2f2-lXyG*!*tr?~3^ii@6+eeT}f; zE_QKoPP|GEyxvxQ^t&EJidX4Gs1vbHG<2eZ1Y7=P-z(u~-JdT#JVsVh)8UDo4%rg` zeSDL)X2g+kt9_o{!r1R=J@xsYG@pM7^FEhRcF+dURBtpOQ205!Y51j*Lb59mj=zxa z19z2%z*Q&|YUG`8%7Dhl#?*3Od{|>zNyUq*$et0C-t!szf z@R7Ua+%nk#Ut5vFU{16IhPYIPxaG$bA$5O6Yq`YxVOb7h!zEwVF{#t;xF5rLCmG3c zyT2dziK#QOKB=XDIj5yxCoMg;GO~ln%Oci7*>)an77sAUX5w@b-F6P$DWSs#DRx}h zw&?b9=szZ;(=ScZwUNyK|O#A}2Y8!*_lX3rviGoX|Gmou?5iSErDx*b9X zJ1)EYylK(x@^NEgW3u>euJ{HOhYgcmj&^PFM-c>GHv5T9Qq`hUum$BNvt2?#4(u}0 zKvO_pv;x?)=)CJWRp`1=d5;UCBb?^4o|>%Pf~;$~tZOFgupsMBF6)lT+AGMqk;}Sa zvZ|%;Y%V;*K0f{xi0S<35solci(yV~KKbM(C#S`Ac>nj?Ds6m&+ZVaX%oxg`{G2xP z=WLPL$%;!h;CAmNTX4Vkl1noeeJ@$7&(uS}QG2L;|7VK=3p8A8faeRJUwdH2Ag9=j zty8}{8-s5;xVe!@vGYk;Kswg-9z*cW9E+V2ljXWMvMKbQ|q{*=xxsVz>}xvrnowEgSl zV*8h#$Y3&BC;QjBA8!B&p6nnmFuYUd8`ZpH7jIxahkD({8!+(5y!#3@S3rN^>}lxU zE~Z=0n4tTV=sxx7Mgp@c(|u~_J~ecA9o?rn)Tfqi1CO?^r~8I!+I+!Y@fYZ+8DFqQ zU$EwX0VSes{(?301#9LDhVBd2a;Vqr7Z`Z7cl{R>$^(Y(H;d`kG63k_A-Z>bx+xLu zG2J_cZrr#5!I8d`!@grlH}L39k96K+6cVqb4^8ZDF|k_W0I?fH?1oP)C89MZcEb?M zH_$)%a`&YpdL#Fi4NJ6vN4th-?$&S~vmN^t>ey4ITGPe%#Vc-qOZj>^7do=LkM2IQ z=W;xXlq{v@{znBGyOl>k`iMxzb92B4tx!ZzJ?5aAV!_=-A$i}dZBV*QWMDM+*ESjwu1iB@5zO4{ zLek|_UDniPM@XHgN68JFywulOeZ8;eA73HKlaGRgrPP(`6R-Xs zm+x=#qfU}*qKDL~VfYYzw!tBUzuuN&OYeMxRJJ+Q=2W}irzjuE;4oe3Gek4;N@p?v z$(TW7z%T@~SGt^3@=7A}&iOMV^#OpW;<8@S4e|Oju#6BD1gGYDh!#MI-28*_haB^cD6Y>05_R>-E zKEqbtU5mj7Dx~PUSE49}%EpTiOIIqK3GJ;dFN?z<)QO9i&trlfK9L!dpKsah^zpKn zX$^y*9_6FT$`RP@D9U1KfhVFCH!9#qgnG@#J~^*yNSn zDb2}wuHcuue@O+$*H>_b>(?=o|LvC^Pbng2I`jL9IxV5&BCB-mEo^VA*K;1#;UDKd zu9$0s?)(Kc29_)iyVJQv*qtTOn+&_d0e5U2S5`RNv}ijQUag}JNAU@C_CYnea62jv zQDLwhajr2*5fidoMBl0T(RaeJ(dMdi1fK9QO6XzJJ7cAdjDYIr-au;eH2A<1?@7f* zskV8*ZOEgc)8Ya(#W;uygq&s^_Rd%7B9{Rphc`5Pr>qQ-$vxqNQ#wM&7_vIjLy?IO zsuUTaMxnG#0Q!$9U^sTgep3?l6|z45P!bFIaO)J;2@By1aW3@sdzz)Hh?bWbPmt(w zsqfIK{*7G7aEW;yOmbdy8LCcubDuSJT`<5gqJy$jZ@Vbl_)4SXcg0sq5|Je~zEVw0 z%<6SvX7mN&&*lxGnJNs*)D(6GZwY_)UJTDAaS}*73Cz`blh z%Cd9(E6tHOt{aX7~jlyOaHr3Ca561>?SK@>Px0zX4Hi~Z0iC+?5ccs zxiaFr!XcWAxWSMQxMCQFuZv*pz5whp7^yF5_+pMU{j2}``d6BWHuWz}d{tbalU=UV zDRLPX{@^?rbm<^3NYy>Jwize4iQ8Vc0k^z^{rpvw&a30e@4+nVMbC;0qGx3sJu3#~ z+Dhh|&VnLB28Oi4=YHg@I6TR2(wG*J(($(5A-$wLPK~ZtzF*2 z9TOqYE`nBvBhu*(+}XTLR7C`^CZE@vOvIY4HkO);z9T`#G?`|~Kv(8kCi7HHNu--5 zBToYO1>%R6$_cAxkl^OS*un5lnQ!=0e7zX3r#bA%q*Y7?9<^=o)`e!h)mo@Fw7SMt zMx}65zeto8Vw6ASFVsTNK)_vXUaOub7%d%AN#$J#Y}(Bvp5Nc+Scp+#5S(X#DwutG z%}&RhZ>DYv-oD_*T1S}kDFg+6W;2RAB9O1_Q8!7`H6C4ue)UY$L_aY-u07#R=uQp` zf}_QQ@%}yqh_=(}C_XF+Euc?#xSUSp(Vrmlb0QG|;cyPjtqIkl&>tc7B)NH;_hEh* zf6wi%Az5gpbf+l5*uj(lW7!lO=(UH*Q4yxgDVRpnF%4q=x*}{BQ?R8|u=SHn7U4Oc zf~PYDPj;E1<%%%PPQlbI#AI8$2-WcvRJ}q}n!}3_y;g*1>f9{`7;%aM#3cqk%EQ|R zp620w1MlSFV*~Hz;X?!O7041NMwY;xU_p~^0LmOF(V&q7wKXVppuPrm9B8aTT?ZO! zP)~sl-8LpSCvhmd<;CWL+H~~cLLJuznHG{TmfgU{vWwOJu*9e^+JvT2uQy?Y3DLBt zqsbJSw)JCWYU;}^ln$`;r(+o@EPaDz%vf5>&DvshaRSkJI-*n|8XH7ILeyMXtS+>g zjYf!QI2}<(AsQM)hlHpFM74TjDa3O)9Zy%`IW%~V2+zVo6Vy!B(9v`}J%#7U=*SPJ z$gY581+Y;8EG>X_3Siv=STBSf-XJprmKDH81+cUL)+vB>Ct!tig|fQvLWgEHop5?& z(``s&Kj&!{}-EL0*POntwN;t?3 z=^qd`_;;>+!m%SGZZvU9(LhW|^hYSM14>r;TUS>H(`$4+wl&I%AJ~n_3oq-5e)}>V zOIG->ZCRHG$_opeH#qAVV6 z3O7-?p7REl^Fj-*HYXd-OUy=a$9amFifB}qz2{zgMBE<4oQ)-y!8VWblS290as%s7 zm&4RHaW0jA9R7(*wdK0WL5wIy6ICtNbUp9^)F_6%$+gzPlEs{f)U596mksPBF#dUbnmh60Mg)idm=WHb(MVeR3%YOx#P1@ z0q6mI+O`EODvT!C`dh~@_gNLOP+x3$gOpEb#DroLTc|;Db9o%)5mOHJY7+vh%RpaZ z9=HCn(e8YDqu0(*^+`9TEC`d~ z**&+JCYlASe=FxuomuUT%iwBJ>D_L{R`u3WW1-pbUu3H);;O=%yob6*@Tl>R@zm^e zHzS@X7n^pX9QhNaTFi%i{3h;NtmV0Dv7Vne7Z;GGbK?5X_uHcrf`B=|6d6d$H1mKl z{ImOs>6VM9Pvd6POVbQQ?J7L{#LkX~ndv#B!r3t>3}eghn*K7&ep!AE+%&qua-!MK zRjV11Y>se5GW=&V6!KrQ=3($Fkv$vme4(|pSY7sW`4t;c#p;=o_r+!2OqmqcYA{{8 zg?r%G6<_PvRrLH?CO)1%FpiSRfzepwCvB}1U^W!Yd=n}$BnCX+49n3ItSOeADf8x7 zcG9ypT#94)w+>*M5*mH#wMN5b2|qTXk9Crg%NR;ZOAAX&t*STHd7n>t7I+w2TwJVs zgPEa&GSFydv7wmO+Z_@8hyeM7~FNycDr+-~+i&L?Nz1llsS8Rw!Vp9y{>RuUB9(Ykj z6OiO;fN$<5WRjv(6DhV-dQqWeu=fn9pJ~SXx z(vcBfL&{efb)*YY(v{KMXV9A_==U6?B@TpwLsx1mRkJ^KE$T7$ zH>06^d+nX5OTPpN4XAC2U2akZ@O1Ih)NV069=V(;a;B8iMFH>+FX{X3o;%8S(55V1 zcRH`qEC)yV_B==M(zDsHJwRMHz96OqXTPNEW6FDB4L!5Q&@&qtdcNRIM_; zpYhzYrSF^4_k+@(LGAO?uOFe**ND;xJn%tBSi6#TG25~jo;Mht4=@xeju4=S%fD*N zKQQGVgt0l{>kiL%iUkNtKB2PjaoHDa*%wXO7sGF-lC`aF#%{$Ot zTx5Aqy3%tHX5)T3L`dF)%b6EW5^Ry2SxZL=mH@};vv=?k4g-*SR`))9*oGtgkmWsy z8o{K5@8-3=PFOOr#0X>m(fPq9rhpeBaE8JL9QJYMZhI_KbN=p$D&FCsU?RuAmC!JS^*IX*})f+Li55jf;|CnOhPnw@IaoONbRPT!xJ^S;SxjE8|= zV3_}Tm*1_B`N@N+WgfUP5KayB#i{vUwE5X^$guZ=2Bsf!c$@(J7;0Ant8 z8NS3+_c)J_VW+tukR57t!ptX1H#o<3h>p4uKUud=cA^p!S94r*srY6HRHeD{<9ca< zVI8A8rjnCBcxHtz3pn(duxJ4rcC2uE0cmDNdzy1xTurW4EUspC(#_M%6G0@p zK@bL4&k^>>WEbHMmz2$SeUUl@F3ue;nD5C-#JnGOxgHogR1bUVa;7eqbb(wz7YGL` zwXZJs=mJ?mr5>uw7F{4ZsMH(k@+w^*NvPC&>hc0zAXuo>D?DbN;Et(g*h}j2z9Rl* zby=qiWDvSQ5UB{Bcv14y``%r3*&u%;$ak9%sRoj^@N_WNjN&YLU+v*p;ypaw+#a4< z0jy5@dNzT|kMa#6q%H5Z%$iEVC@JA+vVu#*a*v+x%>!ZD6+5u0nXRXb^!;39-lK^R zHcTb{Y&dX;Q!GdcEhT71XagBn-Ztw& zVHcfwc7jwQX|s%xy((lvWulxIh8u?B3vA23WP(wp(b}q!tkytSdY2p7)PSit08`&b zh|^y6S+PvKdG}3QI1ts4$@&SsDQZYsUSfx`M{uLnpSeRH^`}P{)JAT!GIBp&RAyFT zQu+lp&^N)({vtqSjter!Ds$+uW`~z<*^D84I|2%{f=Y1h@ZF}`*)`ym1hvb(1dvtb zkm3$}%{e}~Etav6)}t`d?g}b0R#~}W4A^%eVkZZW4Y>+P zc}S#~Ji##CUct8x%r4e;VcfF{acE-eW^Va*Lmu8Zx zf$j6+h<;8e?-@Co9blUQkgp)EWF5M5QVgX?-k__JQ*cLWWn9P`=mR*X5SnxPnWdlO zs5FE9W%Oj9e(urFefoJwKU=i0!_Nmq(Msu=XQ27(>g#Z&2U9He603@&SG>b6aBmRe zSLx>gez+QV`Ad+O=;wVx{W6a;VqIOf)#a4FbT9hA85)uH>|XA}P0BMlA(_*>BJHd# zxK9S17pw-GE5@cw7N=oEN`073QS?MdRH#S-%&NCg6C4Q!qbHy{QB~~H7jNWN$&bjV zpuAAU>L^o3jmT6-n*}SWCv#EhL(CTk=tDxSpQ9J=miJ}(Mat16?qD}yb+2U24~e7k zd=qHA&}(>`RSNH50F~t(NDf!Wk`G1cjFN-6{HP)doEK@Xcte)yjl{djbIa8#7NUSK zi}EyaE`1NjxBgyN#`Z8_pOiZ>WY_*b=fz0gVf8u~H}qlzxJj&AMO(OgH~bn{4by;Q zfY;F^TWE%Gd-ayvUOiVq(W=;@&DG}^WJoxCyoMHJ2(u?Fv8G*pD5k=gXa5YpJ|jr2 zoY|VkTVHI0z;Z@`s(_ya7*eun6j3a|nBYh7FH1L>!)?&%udAV7zhq*amt!1@0CY5o zvqvV&DrLT}XvR^W<&hOjH*XAB%T(gNNGu=Yg%tHfIS<4KZ={`LVxx0n5%{&tl~$H$ z4ZSvhkYFshq{fd*2mSP*+tP-TpYNJ19I zD=0A!tKf@gU_TmBVkjACOLh#V0~%mOKHd#~sKbRwadqP-CHi%QDh5qM~ko*sfxNs;~JlchTnkN5=!G;4@b0L+Y;gyo4!t)c$#d76N{ zoS;|;W4$M>R7Fcqd7-F6`9?P1qNvrhj#FnGnT!bzVB(SgJ)$u&tp%xDWxQ{kET|{e zYM9GZAFPNyZ|?&>XC;@eT@hk6i`)irU7UM}RXK;+LVV z1jne^NvI)?b-g`g#1(Ljn)Pn;`lfizz24c&903mGNT5lypWFt0OYHmTQO=>}q>olj zwzomMDDHV^xtycf0UT=XQa7V!k>nMP8klnu0+0(;B4B=ql6U*y*OiW*18ZhH1B$#% z0UV@D(4!umDM8-D!HW#h!x0G+x2caMao?+tP!!=>3Bj&zAf>>VcbnHNi-+E8P|jkv zDc1quwVdk!c_v-G$8x-aC6X#a4LNSi`v(UZp2u!r53Dl%SuXDc_L6e~o2vlhOBC2b zro*HIoKoGHnGuho=M&B%WQBAx7EU3RsQCe0Js8F9ct&Jg;pV!nW#yIhTD_<|1<3%vAprfZ!@Nk|(LCEg)_ zNzvJUiCt4m{v6Xxz~uxV*B*L~hAL|$GfdG}qy%6F=89o>+vg-P2snQbmEJDR4LrK4 zVxWn5riLIo@055oANvdWffXN(9qr0gyGV51KVCFC6{`|3r^SDt62UaS0`HMpJ7Sg?5lbXct-98IK3&S1M_f7g#%Wk4W>>HSv?{EwfI&c;{2_&#$Rjdxz`4>L zS{>d&VqUHA@=Hl6KDc>R$1e*Pbqad<_PzN7D1`)vAZkZQ;Z>N!by}^xyv`cHuWU7` ziqRG2ob^mih4Xb-%R0N}E=w@w6q*PmEEQv1v`=|Njak!0G7{gQer*0& z-(a-mzpGG9-lq{)3EB~iU0Vr7a?|>es-3$ZM{;7Y?s!Ef#7iA49-A{k%t?F5-yyN= zH^!7KdYc3ofuGnaIgsb^0cm>6I;&MZXIJGdSmT&NU&S$It-(v7D!dy*`}S4Wz%hdH6UK`4q-^N+Kre|hw)}vj;Dbi^EBMc~fsGvV0psHjI}_gA z9|TM?nDBW#X`Y4D({m6{7ouGOo>Krzd7T7Yp(QC6B}tMB8>#CQG-yQTJNw8C8kI{>aq1~-ccPwFH8dVRZ^+$|?uH;Eu&1DhBVQDU?_cP@2!=r_#56=2JLLJ#_7QKF}@dMc)?M&jI zt=KGSGHPS)&yeX@tC}}`i%yTo^+R30Rx!=eyj%8qlXgA|mrBxGDp|19>udbfj0*M>v!g*GWt>ga1HJ{Vs6wA$LuU-u z&P92e;hkCEVP_M(=#ccqmzgrQEB#Cl@%t?u`!RzboK5o;HbMP}P*U3Sj!&(b(Houk z02_)gRVfwK^&ud7w$_!=hBS9HC__!LRaw2JVo{@R2&}Cd_R5k;=F01Xk34SVP3Y*E z?&%4h@)#+jLKaxP9Un`u%FS(YZBv-~(r8XjrOZ)!W~**8WXtRX3l4(%#j0u+HOOHJ zv~12kNCBer93pTh>CDejkoiub9!;XA9ISX4@wgZb_##GXfJc(ANb|r2>6X533;TzX z3&^*nx!2~CF5e7rBT9p$Pc|Otr={AcKdJ~`Ke493_=!Q^d(a*sBOs&*Hbbj6iaAZK$&>Sl$?UZt|95O{ua(r62emLo;( zl=^Y(sVm|lHA-yMD5_~aa?b6Tu__Z-YDN#+*)av{e3+cXDWsrtDQfXTMFpXJ<{8>s zHO6@pw3|iE*e$krSJ-T>az%X>BpR5c%bjP+lG0COrB!{VTDeoMJ|io0Fk*C`jjF(s zUrMf3rp43;AFN`ov~Lhwc~SQ98c7q@=%to)9_TKc*eH;V$n*_tv9GCH9(~!SGphmk zBGx2$Zb#BaIKuB6Y)|4?r>3R|giW~0(DZe2HT}+3XR|Zpdp{^swL}^ z*mcqbZ3fgZyweax&{x!;jk}JvZ;&z3+j^tdU1As|&n{Q}N3VKvN7f0%jtBH`Olvuv zgWcu0H%S19`^+#=HLajWjG7%W{DWXoxp{=joe2Y-oQkPlgy{vM?Dr4Y?iCZ=DGd9{ z{VLb3US#Ukv_dGW;+~d+p1K3&+9>|;gVIxTa_*@T+$x^(3ce!q+Tafo_-+YEa4WIk z09z}AD35WfgO#+S?s+b79AqBXJ_mIR0syBcRTTWAU2j_VSW(aSaz_LqoPrFbC4ds4gr!?zT#NPqQ1k!X{slc>%6dlas+ za^+{(iJs?JhunsXV#jSU;K-!Z9sTUxh%%c!muhE=&dOU|RJ|c(r$~N=rJK4rGB*!$ zxow5#Y#p>eCPQVS7y;IQH5RddrbHzy&)Wqw|&fUZ1>GUU)a>YJMvrWZfb z#fi=GgtsH9^`4*)Ik+3Wa|Nw~a+>&EAt+x>#6E|h^y9DcpAE!X{y?@zB#PQyaTLT^ zCGYdJ3P>~&BI4ujQS~BIaT%E~jCC+$Ay@#fYj8}zg8ii5%uu&66iLA#e5r0-79S#rU zvUok?QdQ+TUasUkL`;gvqf4&4GfB7sjWjkQow^2#h8p)Kp@??%%XJ?|uW^6UZp)GF zqKOF$5^A`x5U|dX8W)q4!w(007Z&kUUB@yPQQPr=1Lg4mN30RY z3V0J{IfUlRQp{St6bK&AM5Wf2>;fBatfa7DR63rpB7L5zdA!K3L-Tf=^Ws9ynJ^F0 z5T}-NT)y5=J}8E=llEbHa$*OB$E|=L^-Rr!Y2S*yih80mJ5eTBMU!>-Ww1WFsfvaw zUWOTKtjrRZ5~)K()yO_P9@y8po}S-&bUbjAQ7{<=lTn>c#K&rqcKa56Zm{k4cN)|@ z4OYdBpNoRef&)v)D^bkKtC9Yd+}7hFFVC|4)m+F?{g~*-p_|9KW*`-3%Ox*nkLMzv zHRSrDW_M9YUa3bMX2Fp-+wGouSZMXI%qm`}7v+q%+kPpo_@cbzdJN^gcUf~WQl|jw z6c3c4+py3pUH}*3&$x--S*>?kvvRsxz+gsueVKDCHHKRMVfPoOVK7%}nH(KmU0uaj z$8lL*91VKC-jTe#2$&D;`u)&e@oSoNWAv+9&t8W?EAW~Q8%=)8+feN*fjFDZzPyCN zz7bOKf>)YXBZj(589LwAp@#a>uB%p;#mK()xl*9?R-pWOl&JWEE58Pmbb+fX8`S`( zhWxrFN&u1%`W=TzI-b6MtQVZ8LD1n$#j{LhsQ%mSP#02viC5~o=tVoAZmm+c+fcdYXCUL(pea1uKCcZ5harDk z@oIfa-2vAina=t2E$9SiVSvEgBC^A|oYtD)Il?+ky;XVOZbGtKgx&syb5NipNCX$e#;fbYNz2_>>zyvxXHI}}c9_`l+aFo?0Ei*g0hLsrz6 znJ;Q~YMIV3V+G=cyxHjbrDhak2~#rAh~QZ^eJjU2M$I@G0)-1}2AwMtDij>-94gS0 z4DF&(z+a&*e+oZ_NU?YLpc|fH!;=&kX(1$Xn=JE7080J7OAq=raeo6+eg~@wwLSJE zR&!p2|MA^~A8?lMZqEJ@)<1Lgdf=Z@T#8e!Xr%9fA6@_d=r!wsG<|Q_Y-la+>2OwV zRJA5f9)ADeE6ci(Gs<6$zn=`h?{pY)1N&EqBm}cJ&D3;G%AFX&zL@qH49=Pw_P8Sp^=@^9G^+Wehq_0*D7rZk1i2K1ao~TF%fLju<$= z@fjJw*SanmPM!FXcQG`-({Z;yVKo?3n)Vso3Gxhp%b-Vgu6Sj@Iez>BsZNl8Y%KQI z^-}*Amip^-Qzbn%O@I@Z$=9BP@^5U7tL;{XU&qskeVu+CFY9Kdj8a9s1nAu#;~6Lp zh4uz4qY58g7v-VWRQ5 z$N>^~oI~4e0*TRHS(A|hmIU2yrhIUqgOGZ;&pB=;mAa`Bhlaz8xMt1JzTw*w@?b&P zy>p;LnLh0H(WHYf2*&6o*tKZHHG&f32=fF874=)FT0^XRmvRh4d=ldN7v5y)MTb}Y zOkN-JdwLT{aY~G$7(m#Yf2P2?3tUN7vYbuXip0{+aRw^!dFW(#2_ePdVOp;?fd!x> zUC3)m&dkaKgOutu|814!z!b!72}IG%E(^X=<7!Jn!bk;}XRK)G5v=g(f@Ndo5|sbv zz%;@dKG24<(af`i&>P6>OdVlDS}0jD`Bp4nYXm|4Rb{CX5v!~MusK>V5b-6^wHl!hDYVROx0@XcNlJh(WzFj%wf@jZLNuEc*6b4ykP;0IR6DZ| zsfd6950-I_XuG{M0<0$fGYAWtx7+8AS&_F5L&7|CIM{<%z#15f$$krs!07lAq%IG8 zkzY6FN5}nbZ?aAM4<7J;9QSuHQH3lFf<;ST>;F00ZwZrVEM5d%EYqY12U)wF>3K%X zl3GWX@q9h2@C9dZ&pp92r24$7GC&l(3bYa!EMXi0zI*6^4VRvf)X#CQwYQbLg;A%= z+k1o38w!wQ;84(kASy@_+X|?Y@R%XtAuFcyvVw={N~&^U!lj6T%dvYN&cHdzGbvl8 z+8i3T$B;&8e+m>m{*G-E_?d?=YtrfHV+zbC*zm?>Z1gJ)CvJj1@h#OT_?FqEUj0JH zLyp$cX{{m}cKc}M!Op~TNxq;09Cy1zNj~M~GOJpAXa<5h;3+Wi3~h|bkiF$=^h~VV zfriJRRWmYjOAUh-=axQwXX|rR=e32O;tGJ)jy9A58Cn^$4uR{K8Rw-U&NaA#8g^4Z z$Xz&H=ZaK|GBT720t;e&ZxE`XPE|Giv>F6BYJ(_OAd#4{!iNqh)uHPEPT9_+F*Y#o zB(qxc+~an@nVbyf@@#c;#mdxKqC6c#+2wZxc^KemqTGvEigy?`%CrbGa1(*V69W9RuzD>9k5C`KN^d?^zyVDy+(O8y|!JPeLL38K*eye}2= zVrDDvKxKE3Xpba{nr{T?$f^_`I)EtrN{I)tDgei}-9Bi*3W%#Z*gs-kU^a8^5a!qr zNKwlURuSL=7ROc>L!CpTC^7GQYag|L4D0n=;+R1JY?$%N=Wdnt!HJxVU) zevU$dnx?2f6(gRAUBqDJ%o_)=&O{xt-NOIDY8~`z?B*orI41h;h9>R6OwlJ)8i4as zW2+~>(Ww9qL`ISycq^bueE|B@)O z{+P?x!36_0`+}cmt6bHoH=R!fwvp9zR!&hQbXA;}Q_5t-%S_FSY{5tVfC&{ern?=x zMuBEmo_W`thMHwf4DLn-{aygC0dI$gq!1ZN>Bd-`h?()r0s^i1beeT zquo9s={F1oah2ArAoK}Lm!grVp|X|JzM!`-vZ4ea7?u&x6c8&gIG?is3>DA^c_A9-}}%2_5k4gzAWpf;)>?sPMR)dLwhcQ$(+9NhI zf?D8sSYX!@buc}hRns{c=#xn& z3P;J$BPif=G{Vv+VT_N5M|OEyXCNJHv#N5SGsYhYXk|nzkzfJVjZH7zZsCfSsx;|C+DCR>vS7nR(1| zWuD|*oZ~aOSQ;c{oDKy1t3Y8IKOLywaA5+(E{NQcAN}(4(I-c^>_dF~`DpvgC);1f zS@+%N-TzKH$x*CuS`wW_;ERgmMow)o6mA(by~+`U{4tK=#@J)VxU9s5C~!<_aX$EhTDNOw;ZlfVQIVaR68jRVMT zM#_>`imfDn3M};^yA&6MJ4zmOUeIRR2xN-<0{pFQZ^XztY2|`Q*v_Uau&A~@HyYjh zFwL9I+L~MOhX(x3EJd-xDbc1|(659E#(KUaC9lCr&~5CoO1}Yh39<&N zy#ODIk@)gia?sm(kY9O__x3_C4Qq!QeG$G^dcXvHumB&z$f@|&0s{Ef8E=7dYKek2 zZn9$Cdh_7B68QDun-*mqyv>}l$k+a!*f*Zq+f?{cm4NBy*V$BImdQ?pY%QTdPkJj@ zKcAb}osv>~CMvF9Jr|W!G(@T5wqRo zx|p`)yu5m1+srN(IRN$raA2~l3|wwZA3ZT)yB?8Z$cMdlyJvh$e`IRhZf%qI1~_>B z02WMS97F1_w=R0L`_Sk&j4&Wi?PfaIahq?~`wFh}xtDX*#}h1V?Q+d1@?#cMY?g|7 zJ%?{mG*t;674Aq<3JJs-Xcl6oerMe)<232@k5`4w%(#ja06DqWIQbo{D5Z+oT^DRM z7#V_TJBH(;*P;s=%HAT@TCM4~VMc^;V_@LPq*}gJ=(eEDkpddDjRrbtW9;;KvlUY$ zx)~3@_!4ya@%I3c#n+S+t!D)`JK_o6W4G z`ns+U{t>xGI369+@KPhs>$zg|l`6`$5(RFX6~H^Ra}(a&1UPLJDhLdI>?9$2g>?mp zBRK*Cx70-Fw+l*5VgfNrAQYz2n1*la8G_~BITQ5XFv<)6i%3u>_@CaA(J3F?G5I&{ zJ88lchATMn@OB;NhEHt2NDvf0C6k76xLrj{>GW zVsdE#B1GnD-XcV)#~X3ta3e&ksdPnz5_|fToMA_iH~4~G*0ff&P+Ko8PQ(?UrCwlYsSD6zbs`wf z3v|nLJQP|SFcE|~Qjjk)cP1BFH<}Pg=xGqz4I}2aJ7wN(dxg+@)nWsJ2pXACfq9q3 zDH#lQARL_$#BJkgWOv}Ffgk7Ie+s4W4^cEmA@OHwyae38LSZC{gSD;Wn#u$+*)A3P z)`*p!xX>1PN;zRr44~0gN?S$4d*cZs5f_;0uj)MFQ8SO|dFu(dXQA0BRW6Q$m>puX zpMO4r=nSI4Irm=VP}r&|?BM!0+^bgE4xB zC^%oiWiN?&4AY|( z6ISP#2i!lW2j>sX^zKtrsyr!jleW$Zt4gg#?kjSH)QP!?HbaJpzRPhU=yEgFfWk!@93~xPXh&y z(k=RRkhl`*YN@~79{e7?vC2%W);|7hwJeQ9JSTZfLX^$t7*W{q_WPnN2;(nCjMn~! zujZDoN(I{sWpFMwGO8l>t3FMEORu$^PBRTLhN^a+LeH30I-3Hxb7gF~Q6#pmPjxf_ zH2vWKOr^rKAsWu5SvMa;rFZWrD;pr)0|AwoA3Y|Kr;HkNrpL9OfEd;`26|Z5bv^Fl zHdoEj0K=_->vNCg4Z{GvYBq4aK4sH}k$_&t>u_B@V}iEHsTOEJ8{pdBQL1ky?f~+5#b#{jow^WAPR#D`ui$)KD>SCKQB3|xwW8yS z=wPjuxVkJeo5qU0Q0%z^NE(G>7trB8fW_vnkIg+Fn@@NCk?k)iAxwH3k98woC9*zL-UV$6ORTF;qXl1XnV+?guRBe`bqoEZ(!F>w#Zd59+R!dGnqvtsAB5W>^2s zf(1l7sF`=~wXWbFib)p;&^_t(TGLe}%c{EsdjY~>U%3?g>QQ+OFZEj8L2GaV|F>;; z2m%_4(##5~a8v#*hf08kvi!Kr%c|Mfy%IBEeijV&>XACrYzZwDZfM`qingq7)*(S2 zZ7>Wd;DMcobb9&RouCTK^sSya<(ldgJ2++`?o@@iL!lq==z6}^9FtWSbO>A0k+Mu{ z02f~HRDtSE6f5B$x%A}77u2&4UVp=*|FYrH6DHu#>o5WsE9JK;2#v87x*mo}G1Z}9 zI5GI@&82AbkOmv9JKvCnnlO668BKPz3EDUDi zGQfz(JxY9>_bGFF9b$Bb0)bv#=5lUPy(eDc zzIO&cu*L)_#2V zarWbhV$aBaXj=4`CPJU-*$*1_Z_57RkpAVp}MOdZ2T1MS% z^|)5it%WGM^Dcxyoa5o3?n!HTjX%!1gPwM2Oh>s$&LA9rix10gFL>A(LtOJ2CY8AA z_F88b-HR$)cl$khE|=LJb(?D<0%~q;3b@Z`O8l08Yj8|P%F1u6os}jOZ2Tg%}5e!`q#)BWG z`-y!x%U7H{JyVutE@mxqroaU}2cc_ag#iDTcjXcsEiuDI%L3GQrGmanooUP&AMLEmzt`-W@sVZ}HAZH@W%ZtE&lR85aQT(Ra0j&r| z?Hfc6QT zv=Bza6I{~pa=Sfgm!#n{=4L5D!&myT^fdfnPs2;C;WO0WvZ>o`-M&_*dCn|#_BHxX z{_5PIGPyK`b3^yZ>bo?)eb%(xcWDai()j54xP0&9LVF$f-Swltbg!e|-0K+Z?{z%- zyY6-T=TDkm$`4~u_GgSNz8o}dELPoOMhCZvLXCS28g@MKKc> zC3Q9FfG5?CS{O{jT-@CC~{r=x)z54AxDP43?giTG==}7$i z5;q1?N=ku)4WZSje#BcBIzhnZskKcheO*Cc?YG-M((&udRO`7$)7R9rPPN!Hn*K{o zhpAqwM$^Bs$!91pz?Jo*z{h2PNs8-m8A1Gx-hEzonBz_fx@gm8@@PfHb-TT$;*5%i z?e?LG3WTF|mIg}<_rMD&rZ5G)T=?CMBMznGM|D$6BaGcPR_&Tzi4rjnt~psnr4^68e=J@+`vKg*G{+W=(F) zuU#2pHEU;vX0FzF(0pQi`6UVl@RV}28L54qq8x6;mdMla3SKo5zL)5#N#v3GP@yT}3LN?3wHK5DUr2}-Cl5@f| z<7vXK0MI3VhoJ#oT0lldYC!AJ+5uXpWEq)eS-loB00avYt~H>w1!N?u26Q+&bbt<1 z(%nomySIE%0?Qd5YFLML(^U9dnCB?;y1wF3Rs0J{=1{0c%+jCCcyUCDVO($I9VSxr!2K~QJjGqWQujb=}Q zeiaM40UH2s$3e%H`+MbHgfcH6aJ`c7x+<4q>cB)hhq@QnX$*rpu)|$3T?w3|Q4Z?Z z4#PKH8Qro^-EZtthjwIUr)IykN^Q#!L&7R027#H-1iLgLUGDFddk`#Bz&y6ri;h`v+jNunD1Rz6wNo@2meSMmF}Y_(#Rw z0=y57vA5yz9y9#i48Jqa6*aDIxnk5w?bF6 zML)Ze!)na3Y7L$M<&@{$L2KFVxkPh*(XzN{5A^JUT+L&0HEkjuOMsd2Gs~62{r@f= zHE7`#a~TXa)n$v5ai$3iTeraT0-PcpUCyqtd^~Ap_}r-h-}?|~d+}GPf93kuRHx!* z_zFHOwWq#h+;eZ)C3xy<^wgKNr_O0}m#U1T?$y+t?xE{`S-bAFk8+3($KeP0D8N$v zdpbv1nj{N>c#R-lYiny+lwO&#*QUz~yS$gDRFj8B>O*;|>DH{wU~?Soe_$i^7qSsz z=qU!-%E6YRZS{U*3U+{7tgrBGop82J-~|!_ZJjW-PPlnmBbI-h5i4PN-*3b|{O-=%dVc6V zpa#yZJ@8A$b{l`vnaU|=V7F($CsY4JOgai3^J}~%QKlY^?PE)Y-eHa#cN?ft$hTX2 zOJ=lpS)qy&rSB81Wr@z=(?u-$Qiw;$1pxDLE&#%J@M37)?F}qd!g0Ymp&cT&59X$t z7<65k=da3TjYfP{&enAU*l&KW5_H4Q)gMCo20Gmi3R`^t#Q!wh>}WjYn2zb-q1oy} z6y#WS@G$8Nr%1*6ec5>5zClQOuVA@;N8I|39>tc^baR(8BiqQ-9S5{mS{&Qk zH9=RoMz93!wqF|JCRve6GLnfJ+mH~i4kHoKSMcaB^+`cxXLOaazFx|^Sb9Wvc1;ms zynNI=3lHPm7n)F^SvRBI;dQUZIjPNcLW4>HFWf0rbceIGu9}w8R(b5Vss$FhdC8A3cBJ(TwpoyhzPyxl zcXrymh(Sf8@dQ6^RS~9NUDtqf>cA0T@Hz#EWdyw)Guov&**MYznnAh!c zcm~TfE^wdH!JGT=vi-Fi+`4vy$;dAxHmT6HY-|xJ9`;5mMUg3@gr_C#lry@bqQ<~n z5KR|C*$LS3`AE5ML3sBV^8|4mB%btM=(mx&dJgo#4Bq5zfedA*6PfQ}#*V&D&a^x; zx*y2Y5J*$h7w~jZPLY1Vsa;jG>qZY@q~*6tX<=QKR}eA`qK+#`D1pT;E^@9rXTW#^ z{JauB1VFo`@VaX{s)iS#LBCEYN7VJ(XGss^z<6*+GzmOLv^q{MtLRRKDSlIh(u-9S z``xOYm}*?kVm`fmo?S7xRF!Kv%kUCAHEMVKL@-`6&JxO!NUefvfDQJMarX zVlt-sF@TX4G>SU`u53+ZYm}|QSu#4m zcdztm2mEL&_$1KRSD`PN7Vax4eaysg1{s5A1zzURzlT#?grRu&5S}|6*FzUSYs1J` zV~H$B0G(p45PCpkTVV4xd+^}1ZS~**ybq?u+_nLQ8rw5p2mb}`&Dx*6eeq-OA|G1O z(#k6`LV_|xDp7xYiI-r>=nM=` zp=xuu4+I6`xbt(o(S}Z7K#M(rm`MKut*h|;cKO3}yEC90M-RY>ju&ENo@D!A-)HVe zegQA>vPMFma@W&E0|g|w2pak9Lr>VDmA;T-9zNNh#evN%ePy!IUz6Mf_F;6=-?}h# z&u)TvpHn#U3l@a^tVMqea}(Ift-wxvU?-Dgu=Dxgt*;5PeTeUyq3@yLslAj)-^Dp% z4rPWx5~j5&xsBIu<>*=S3bda&+(`LMi-oVh(0bgJDA&$Mq>krrX zv>s42OQ|`~#p6DU@3DAbEiqo+hdbc$2~;xN_rAuYQtuxD<`>4U;;yaf+nRpQR$&sy z`#UTzt#smnJFT#?ebU{#m2~&~#kfb#UDgz!>jXXOg3%%;lFcd7frsik5%1xmySI*Y z*B|Sy(D7Dt@5*dgg%TDVe;tHV8ZW|?k-uX zVa)`z?Z|GW&1{{74!($I>klIhltjeqOM;}*RYW;KQPOsMu1tzrUo0Eo zwZu^ToJ!kmKwnJ<%<1x`?tJ{0&3}jq9+YYPdfGgub2>_kGVluQJGIyX-PK8-v{qnG zbjTy=w!U*GN>;7c;f%K#Y#fG&r>eHUH~a~LsG*}{^uiCk@PabyUJbR{AfNI)FYzXR ze9X&>eypryf`HgD2Kx*+0xGBp45`@&Y zxf2GnOwKv^E%geGY%ThEsHqCnRMKgx-o90_%Z{JJWoga#*GcgJ+=uQ=B}HeZfbV23sSD09>RXxyjO?oP!=}oWjI_yA)U!yXxGj0$E|8$tUd0 z|C0{i?xULhITeBDkeA@@hS~o6AExs+yC{CgtMVIQPvkF%Stsf^;%6Bl4b86-M~>ai0myDVG!YUuQr75 zLWDKuEGIHfk}{t!m}=XNM>Z9exs2z(dZ1lz6db!u1eBQta(zmOR31Vkyl0pY_I z)p*XgI1L}VsQNRn9PBy$ohQ5>q};D@;aTp5XH#nyrm43opuzIdp9=#6^ZCy!2P{hd zH%Nij$t&I~}4E&$dB`&EJ_Sb0jl<^0K5eNvVj~GMYBSy*XQs=aXodHMHCm?B1ws_RKw<6at>8f}`X{r)s7V_5G^4)FKrB_*x|H2O|DDgI)40-Kj zl8b`pC1_h2*x8Tuhgg?Z#0F)0YCf{JDNW4P;9-XXzn>mNL!RacLclM~FzIxjz|U25 zVvn1n{BAe3L7apS$rMq>U(t!F?oDhFCffdL(ih>Eue<1!?MOOic znk>JDjwpO@z(Ttgc-JLeN`$-nmFnWfBpI+B9;4XH9R$~lyr8QY-Y-?}c`3ODR(^Zy ztNr`;?;q*r$T(?MkVBnZp?J)C5r=ArxHqyh69142-itxB@hEJd&~X+^VG%deLQK?O zc-DmbqV{X+9K3@;e^l+cC}4u%Zlc1lg{aGIrXHL){*qE7cofOw)h}z<`hIK#9?_pr zL`bjz^Dyf4oiBm4PgZ&Ulm1&yVe#<(C;$%&PYr;j=3bFcjIYu4udw{e%UTq-?I_e; zpZaq2oi}Bj+T|jz@2Bv3zEXD{+gK|60+_Cg1dNV~9i9`9j$Zq|$~)h9w){!sHPK!X z?|W>_-L}^?HPmO}`x8v>%fk3+1(fCV8~j5LcFKHIIDg?dO1x~@lg11jNkK_<`pn<| z`L0F^7XfdT)+@da8@_DOZvO_acl&pW2CMw$)T&_1z0~_Nl5b(x&UG z-KG0n-(h_UW(X9Bn|Je0Nx}54e+EPXe@G9X0X1MYxG~t=;-kOehJTdJ+j0VTRsZ1t zyOU<>Hw%C%q|B1;y-)AnJ-&bc5cpYnU|I@*4XoTfqk8VfMS8mn& zZa2W4-0dCTy?_7S;M3zzdnfnr-Qj!iRO*6775#2dsoafYV}2)8`(Yt?cnxznNG?1twc+0=W?Jq!~mUTkKqYQlpQFJBdQ2-fO z3Unbu@sGhl+QWym(}8B%g*n25F*pMV!|{$;s0pj|Br<=Wgpy=;5lHPh;)NMtX?w%` z0hr^w(}_y+XC6A)9rrbItK7jr!iD7bz}nVr&gQE-O*;8%?t4!oD!r4|^H%ad4f)PM z#oL&stL}jE2Oo_;U*$@GhsG-p?!Ou@a$oNF1H9=@uf@*pe{I|@0jC@Y{v8WzuCq7m)y<sz)!z`HJ8YQw}dj+MIaE#MA=W65^Vi@KX$4lswrorCB z75kV!Jxkk{|BUzCn9Z`(HzOn!2j5m)@*!n0&a;Kc*GU(BJ>HdTsrZ6DLO0}jHa(@{ z6X?fI`9;ZF-#=sDm1m_Y*~{zo1uxk5XRAW3*ke#R;6~;-dm^f=bqby-`=Y`%rN^f{ zzvN0xv(^i~;!Hwa7sw;dcl&7mKla|Xxosp(5d3}-_aA7qTLqX&ilijJfQA{iT-8<8 zcG+Eabyqdb@jxUbp$q|R0F8s_qI1wTL8mZyeRxFoHVOjtt=6> zltpqT`_iH4x886TgP9F8*kSXuvzMJzX-7q8KZ#DvG<>grXOR$U^09OPcD%?dKEoqm z7@zLou#FE;qkwd(eRxzq7s9!Pc$XfWNs!I@r+A^~Ij5TA#Xj+J2bFMV6}RfSE9+9_MB#``n=` zAqt|~_3gAcYVS-<6P>AJFeDYMLIXPo-9ui6(s50tWldb=I#1{O$lWfm@H$ZNAe zuHsfSy!5aY@~J_s5dNp{bwE%0ujN5j^`P7;0t+uMkE%<{+e%f6@TT&j8>OI1d}R#-MWw!RWru<5K2%LfTBMr0MI{OK1jcFx(U*-Da)| za-v&->Bp#430ovI!^#7z+K z9K&?*gQ!|oaVlzQxvKe8HEM15lO4!MT-8SxKb@tAimC=u>}iJ!rBSyqQXbk>Emii& zDC7&t3r~8hm!d39#HsL8E5HB&d6z=ej785dJiP^`Umk%io5{;SqPRSSPD-FuSdu(?WMQ!@(%n`#kkh~#Px>P+yb{tXWbNpkqh?P47j#OVL@bvhH6&@4m_2dg%EJa z@p{$u@#>iLC2#})+9};ekJmJ2UG97Jgl;TZ2)!h7#`0wqr{(f4-Xt^6N|=pKgr|50Lu@< zwefxh?yD<@IS-k zV{sWs9i;GSZ%DrINIgYaguPnop!r^bmTOx&X3dVHy8XgYt zEJFC@%Ia;t$mewQ-cbmjE<>}xDV-*hzvAbK2mvsAA?Tu|K!pl_=Q008Ia(Lc1il>t z+QEeQW9KK)UNqb9K|4R0-i)?y@8Q#}z3H8s`}j22x)W|uTK~??{@@mT1Ng(DghrMk zlTO8_pKbPU18B;|eM5SmPg>n@q=M!t>=|W}pVD?W(xeN`!3g8V6F(mQoOfGA@~$Rs zCMe|1O;jt$`Hf}-JwA9zXO;3x8dj? zsTg+TDK?HvhL_c>_u4|$?&@89N7-vc$#&Tl&~k*j$eOlZBfuhxh$RmL&2QNw%~ z*{f77*OVi3Ye^~@#kj!BEcX(;%>h^qxuWs9lq1w9W^_@KdKnqdzC58!p8v}01ush6ug{Et7ey!Lb#@=iv8Wp`T}{86vaDPGeD)mYp4gXEJN;l$(QL#flWI z7$4}A62mVbJd*|R-S+A;cYB`PUBF+Z;krA$pMt9Iv^)J9x+F&Sd5+1{wJxR8?nTO& zuG(qSZg*7zH!V{`L+i7J(Qd>S?%CbKxM)2kFm%S@mHBv|FmgLk{tT4h)w)*;${J7J zKOC#mAJ$}Z+QnOM>XH|dna1iux=_NnRKj?rE=z6M0KJ@__YCe9#QY*ft05{S*L6g* zur*jINBRJ|JH5GLo%L*<()Ib$0}n-vIX}!^zhe&+<#9}Exwa=3iaVEdsSjPk_?ji2 zass-fsmJ=D7fxq4_d$2XcX-{2Zf@^`n#hVR=5KFB(ZIpWTi|Vff9LkjZAY-8O9^4G z2l^{3yqFM0`?sJxsk-n!xEdUD4r%SLs%7$_9 zO5Go2By^OO-AGRRYU-(^q?rS+)e(9_W8t;8S7XLl$&0-v;M}|#aL}lGS^Q=JLiA5S zikpG76i1RA?0v=;l0+K32aLe5ba1l(n&|3kC0=oHCPV2P;W$|r6g1UzQ3Wo+6c$zB zQc3cX;=|;^YBci`p{J6tiK5BjRr*N0UA4j;0BVMgtNx^vcc;Bs-LsB}c$XXRy*|J$y8_!nHEfLpT zqp}&Pg3e00G-<}H$VJ#Mveut-oj-3yTnZOrAp!8Dg~wln!07YrIG#nbuH&%-C=Xxn zBFDL(9~41q`sGvp#hcY-GR7aI^iw6~QJ7#bzVsL75q1F+T=sbyj(e*J`GcsO)r@B? zAki}|Er(@9=VlhJavE2C(seMHA)s4tscF;?LNE(VC;{ot!)Ley+*`BR@YZ63-1s-q@W$ z8v3}plQum4bmYNbam6(FtdWc<-e~MijIZLUQXX3A6j~zf4b$_j@J~aG&QR5>6>8p` zilPT(&iR9c?wfdUW6 zr4TK*QUi`ZGLzhTyPjyM*v*m&dQ?7cM%b9Xf?2^Uz`u5djwG52weNdYEj9xzWmjMf9jkK{G zEf6fd+7dxMARxMGh=CLzbE1O;ucxK~_;&Mx#j9_~Vbz5_=-_H(gpu0JByb*_OZdae zGFGo~8LMY)m+awo$(5S@D{ZtKf;3uX*($D7EqOjA2rVtb#|!<|AR(8rHYqiC-KKYB>n$o4zD^WyBP`e!B zP|9)OH&Fjlb8U!p`;)9sSmR*I}JdB8-jf!)PUUK3X~yHPl>Zm3|I zti*^gSLFZ!RfrYEvQbeyKCliJTRBA!51TNL`Pt7g1ffF=t3`h?Ku8`q#w;n-$8ga> zV>XkJI-UlBs7Z8%9>)g{qx~Xipfu>!46=-XCjA*4>#DM=u$t07eiXcPW$2Qy4?h;x z>B~kt;!K^o<;w$>RhXbW-r^@W>7RpV4%JGiLleLNLTyjW7o6ANwd@$!B5lWnX$OmR zLYjN)Xbar)+s4Cq@VGe7S*Nw5plAn%YP5P*w2EZF;<7VR3~|~eA8v%RnglCM#e{t| zyQ@Vsr&>Fv^>wRZSc3j}JeP+U6hz~^(bD22y2uKV@#b|Y`XpNq&Q5$hT`F4IN=U_+ zoi(&tv09R%kHdMbBP$h4S##ECB$uY-xR|w@;FRWQBV#r~7BSfo-;?AWnJ<35cWH3V zy|O3<8EVO5b7+>mNEymptaeqKG1C^O^t3fiN3U4cS`ifbaBwB`P+WN!Wv#|Oa&0!s z2MLffK!%>nh@&rf^NM*lFsKd4qpTj`6xCwFy;UJxT+&KWZzaNhi&H%GzRsByb>R-4 zl@HkDs_5k25mZ_Wqgd#D0un@cd8yrhskFy?|1z%X_fIr8933i7->G0JqntrU8wk~~PVJs0nS2W`}MVhqT`Q?c47 zN6C=1Qq+GI<$mWjx)x$(Onvp`Bl$fJbAWf;zm#?l^JqVaMcPH02jgiLl)}D)rFNDT z9_kfOU%3t9$F65exXPb|9m%8P?3K}x7)8<+h@=2HK*qnNp@yEHJG*SSjLV5vg-Jds zEpwy3SR+|bwO|v;i-SPe>0ONH=j%40db~%JYG8ZXU0s#{bx`Mi?P|C6lqACQC&c_cozKn{}ndtdOSKS!uO#L!Mz2M|)jAyT$Lrbl%+Xqxb3mkFgh#UyL z;q+>EDhjb9O2w1_ITmflhlXe9q1MPtq-WNi19rCCz&?~Xe+A;~Wf|NOyJgUiw#4%? zxP23hQ}GBl^?n|vi!cY>(fK6W%jM(aFrOa6@BMimC-jb~pDz$A;3vVi`-_7G@J``8 zi{@p7j1HckOv{X)z5u;MCO(X&{5TO$@srOMDYl6=rSp7&P5z2D4?jO#U^ns@8x4Ui zi~EKiVyGdYCMZP@iRU!RcM&gywFB320Ec2#;JKPBVeP|(Lcl(t5D*tkI^ZizuRPna z3lz(qMm1ZQ#}I2O%ez%?1gl${0Q(cy?5>;+cjKrM`=FAl~~tf1VT7;ZqDW znbwpf8v>{w(VC4Q<Jh_I^HSetge_PJjC7?ku4*Vph$zmm|Gt@y2?EAoCBl3CYi4%+yG=OSfM*qMp?601 zQ%K*7)IN+dv7I4{=fR;%E;xNh%McI|K#%qOcPc=9ij1ovo7<%cCgCZ9SLc5eFVS|Tj7 zxlMvZ$k4yGjYvwwnbdIAOw~HkpCSrrSPwAWMXO-4z=A>Ahlvw_W*o?^S1BveCb4@~<)XdEby@*!j^_F1eDXes8^*pEsNK z#1KXP0nAS^H}nEOYGiOM+24V~y)WOYx^QLQWmNfL_*eD8i+EU_rO0nQN7EM6mx&lh z_;;`LmaE+E^l_NKis~BZY3GQO-;w7jNAv#o%;lt+_*Akt^%6)4uDDO5!)=NyMZCol z6-m}ih~cPaMnr)LDC;|3$GUs&>Q~Px-`ff;<^gIFU?2B@ht(p=;6&x|mX=fCwqT za#EydaWirN+N8LE&^1DRP3MyLfS(@1ovfhK$U9*mvi#>LU7-MtVGy$B9>XJ z_8HhXt)n=N9WC!Tj55cKh=ajx(Hd-RlKMxjghIlk?ON`RIfjjtSeEqJ~SCZR$~aNn4cg`bF+T7hB<_a zImkse!-v?+EY7CE6z2`Y6xY#n)JX|2Q$zra86=;jbRdjDHIwubH&I!RZfoNx33hZy zH%Pn$4MCig6G4hYPZV_1XG)601T_cbcFfH(;%4X@n*v9}gE<~%M`4^=Jk4;*O4T0= zc4kzv#XlX;MXhCqZVZ4wSzd(+8nFR#38V;8t}o;PgXHZ*bH1BrucfO7u(Hdih+uFx zAPr>FPIc7Mx+l*SK?1q<>NwX!dNe$K&Po3;a@HX=G=8T*|?KG;@9YrR&I1 zr@)gyyoyeLAU*><@>b!*bbR|Iz6ezwdG8Xy^#uBci)D$Jicn;Nn+LqZNQ;Jn^N3<^Ic*0y zAwtj-Njr$OU%#o=@=89iJ-Q2hes~EssTI@(hPk!W8#+w&%LiarRmnmE{1~c4fkS>t zorYmAr$30}6{OR9dtQ5h{VP?kc5{0VC}pMUt;VXi%&NCYnMi^;h=)wyV}0lVq26NCa6IcFOi?koTf9H)|UAvRD0rRmYbsyU zKt??5UrDR+>5MC%eZxdAa}4k35E215m0sz?x~?)?(#e-@+(yU9`FX6uFV6OH)0Dx0 zf#A^3QA<6+RO;tJvod4!g-IKFl2W9MzBBtqr+;OAWz~&<;Q~iWTWK76d4XfWX&>5Z z%#o$F>_gjD!T}_x_1JyXXQ~wp^bVjY12eEW? zJ~hVALL-wORfx6J`aBW#@(K!(*=2GrRIGr`W0SojMMpb8Emg#*Uo&2erfLd~YBg!} zuuefu%h5xzKuVjE^C4KUhhm{T6f-CkqK9IRg=SbN4Cd^bn5#njP$R95&9r{cu;<(oVT&4=F=Qz)6|;z z)hsLIS;?o=C6n6TMfw>Ydk=zYFW6K1*;7c1#yP+V{}>2b;CmAaE?HsP0|AG2_4`XW zto?&XIErneG+aw9@W=-~6&r`6w!(7O_w4Tx?=2n4aJ3g<%W*mZw&dV(o$`9xM_??% z49^jiAZGI5fK+hCgfO`7I*-8^73}=wLu7b4IrTWu6E#`P^kn$nEA%JxhDR(D%B5xL zVs;jJ;{L>GXT%n-DQ&0T_%Y_>#$kZkk+8WYkAUq@#Hwl zIlOnIgTo6#fPy@LGIpPH4BqG|kx^mim7FY>=@k5-`VxgvCts^a)HDp)60cT7=4ypp zrif^nLb@?ft4JHPinOj(6b)KML0ZLHT_84fft-W8a2@0l4S;9N&g8VE()TOjF6ZeL zUWH@M5>pOHgZ*HCofk&P3w&~9J?Ka|lP(s@*|yHm>Svb8A5DTt@$>?jJ!p8y@}oM-C)TmRZ*Xn(m82cEr`4C_XBL{v z=Su?~G+sl0u4x&}wrxdOL(oW4@S&R@)&f>5Jdzax*W`mxkp+#$=#MIEt}D$G9FICv zx{m93fLl5~AK-xtU($c&kH;nOwG&{Qz&lesHWi^T;T18Ye2UUR0ke-g3?8r9Nkl#N z&SdOts(>xd38?v!ljP0)8dG4$W|C9d{iHDC;I0vsgEWj`=Evtm%xMrLp~XqPG^SQPS4F$3RF?wU3AA^H(U^ zl2dv2mnZ-UH7<=y;@lH!>*=MNuZF*X33!LCX{o(6jhd%nR2Z&8XsbCHMh1LXiDTGQ z`?z}c1}`3XDhD2`T`o7$O>?W!P_?6+lfwKECxTEa*h^`}Sfj{zaQYc(91=dXYf%@% z396lR)CfT3ls2{+>FvY~`>E;PA>0b-2)8hXSIs^`+^r+9$JQx`c;FbIQ$}=QVcgZH zPv;(YDhy(_2w|=;s3VB1{mr;h0Mn;ILYuKW8U65aIiF!*L-UG(w>ba_li*fvr~-e* z47V5Z7N0Vjam)hlh^{5+VC>OK);OH_CBv=SSme>x5!540bbyS_)SP%cv1N{Y@|UcA zO~pc-p_AR8soCuJdN=0iW#>!#`_S@FaZyfIJ?~$o=x2sD$5-0lx$L)nIr=!AE!jS5SLjDS8O?^DjZY!`*Jx z%lUb?Z*9t>#k%|HL4vw;^@8Vpaxpyd^;dC$+4>nT-~F+%OV*Z2pXFqhQTOPXD3Z6o z@czlJ+&(GaP9udWwVTssWanIHuDi z>Y|43I-+-3hy-&h~pigq-#bq=CNLfuw1`b+jJ(G9k5d zW1}%yv4Y;HF&ld58w1dZ9&50RfHcth5Q#>x*rt(FQIDywGU}D6tZF?s6N%Jwr*cjf zO0Cs}wPp+biCQ=T*3{#j0Wi%*4Roke4IAG1QlkP=#Cl^$X#i|vTx|4ES$apUPv)HGWFE+J(G zsquoL)Dhp#ECcQ%60}d<>TzFiB8#&6GXbP86Wa&T`@nwjsrE;`IkN zUY70Hl`|;`Y!;TGqM`by`vbo>lsdr7ItCjXb3av37bz;|Uc2zxxoglnZw99dj<`ro zX!@`)ZLMyaJ=y@(@(n6REx8tJGZu8u}pWdc*kc&MC})`?_w2Ll&u8)tby&p9NHa_4hqz1gL`8VAza?U zBddXJ`^>6N&|)Ay;P(eY#~9;F6=LjzuF0ypk2Y9!=Z;k1(IHiZ9Yft4_1^5uL&s>c zf_u^3*fZnkp%030bkM2Te8$$2FSf6>J&q@yv~WC7vDex+3MAa*86(T3Hcs2=IBftu zSvpe0_J&W(iu!0-G@uyZabIkSorxi9rOH&`dEdoik2@}dr#m;nkd2HuX@K(V)W0pt z=me~u>0y@p4q!eg!$4*;c``M2I8w0yz@y_fFz}^U7bQ-Ec-5%Oc+_-~Gk(RD&xVd{ zpzp<+bA`IYt0}^)M7wwvYiX*mP0UTIu`%E}tG;BCRnU&Lf*K>~-LIVfIA|IC;fb(0 zo1o^YrPz*xR@i5*=GnL<5|}^5F(pB1jO?KKxLB~x;z}ttN*H!O+qht2?syhQm3a2VRm!%zV`&;s`_@i-iw5;L!*zG);Y=}+`t9{Q4mogTC*ggls-(Z+@gtstlqdrsu%kOO-d z2Z#d-5@F2(lvxG7tskyT!Ju&p2G&uEgNd^Im@r~QOi#!ts@^cX`?4H{?KS`a$X?=L zhVjNp5Z?<5W!S`b;Tdr@#Zbp;I^ol}aF>iS4Xxl~pj|)H(AL(s#7dYr832_T0Z;}k zY89NdNck}i#V~SBYayD*89P(`@*|<=%1@CIQ@E$WG{--4Q(+jNrrPdJmgG^9rz1XG z<57uu)}%)zR(81dsKl3hRO0oE)2R^-6GX-fnQ3VkBg3j}<4xw1TPC8P^K%NZ2Kr?0 ze;*!{CnPmIAu)SG;;VQ<3{8#xKv{*XcLQJ;u2QXNh4N6{O%h1KrtJ3>zsFY3@YPdo zTKQf@i(deI=L(cpfV90PT(ykdu_gi87M??+fNQ-Ga6!dj<+3VbCvYhP0Cd>R<7^h$ ztySqTMSK{5S?hF7tNl5E{l==w_U@Bo6*C-^D@j*$5J@Vq8M4|&6sQMUt(We$uC-txlrIGd z0R%PkV^r++I*fzqNXgK?$6q9{Zg5hHJb95icTk)zJ#* z`%=%f-UFrIRXUMm;H+sWy=PpeCXN+JZt5zrqy_IhSo4NA{}lQ>&_;2j7?zTG~`-1+(#( zkCOrRTj&>sXnv3PdchZ#6MG)9w0wcmG%x6}O=q<_#fQ&}cQxN8MRk?;8&vQLG7LJ>Na%s?+8@SuqhSs@ecTR! zjX{Ts!+5`RJAL$pDrIT8MsHqcx|nFwN4@z1k8CV6@tA9|h-Nuf>(!Jg^n5s0`V zaw``lKm>)rQh(Y zp|_4!?K$Rd(?l7?-NvQzz5<4z+j9ww7iR7&__>j))nRU+vx;ttuQ$Rm!qaBt)06S>&8Y2GuO4>ehIALPEpd7ot)b-Zls8gz_X8EdXSgt(Ud4Xahsgd-tXcJT)l4EzNQoF^ej!p*zq_s%yq z4+KKc*#HJzj+~9~Xg+j&=dOHBN_^WmfFC4Y@+_py;!{c5!rTxQp?l5jogbU8P!Nj5 z>{zt;p_+*+Kvpep>irIoI(-$*025DDGlo7nF6%ZHdLwF`a?QGxa#9l!QdPMF|I`9o zHC^c8j*KmAmSi}K?iybhrxP^ttOV8&>)}=!8?Ou(LL@_%F-c1)HLC^n5Zp)~Ko$VX zGSX?p6_Gm22-I8s9GopZw7yl89JgF4NM;w5rnFkn?1BpAqb{g5Lfr)p?4vx^im%o= z({)lQEb9O(H4Nab4kNll3(U=^=bb?@6Yb3_uOuo}Kxo3Lo;SRJ4;UWl$SyLDC(69R zP2_<#aP-O=9*M+meD*=F`%KB(&?_fO*?>;5;jwE#AX@9A?yN(Ga?QMx^}~(Vj2$wZ zAb&jZ&~lxIrPL%!R3l>Vy%%1`V}}sOktcaJdJlMSlwYZh_0x(kaRxMmced)%&Whg@ zW9MXDue8TQ9phq1ZR7>}a1qv3oL~(1D2DqwxMg~T5qsRk>IhUVCapH!XvDU*Pi)!GPwyUc# z;0D=r6#X>6M%}_SEYNj=xU)sugp{cX?_S$!b-P{1H&P)DQh*+i3AqL;sp(*4r`ZwZ zsZw<;In|QkYz0Swh5Pcz!OIX(wqnN+TU*2`KCxfjEQSXWk&Ra=1QdU9Sv74NTJ`WO zG=jhGYoxq45v!MK$sWJ^Gdk@8w-s}MgSi5d<$kHW)Wt+d{_K|xOk32wT~xEtH71VK z$vb`z?7AyZ9Ey*MNf#5PVmEXnU(K0=!uBQJ4SRmx-4UT_klt|nog7!G!c7XTPZf64 zqBY~w+}1&m20G#90MI`M(U=5DmEO*76e{pxda33EXg|Ejg$T4U4Prc0j;4fz`0C2n zD6;fdU!7jSomgDjiOLs?#9aR%mQ3{z&^sp?8Hmg>@Q)37uI+EC1)`+cnGyNn3fW4!r&#jxSrO?Ha-L zE>^GHSmYvPYRm%jvz5%5RNCrSz?mwg3)f2}hd5f@fTAP;X!+MNBk+7ocN~@6!!f>2 zRQOnQK`2+X;zvzX4OZlXN6ysplmr0_7meiAF|Zn%;@J%7OH1udFl+W=H{xgoC0RO< zXBISt{WY!Ve63^p8#2EcMwS90nV&ofjJ2b(E{rX!lvOK*q2pXT66gwBKwb18$N}=f zCl-q1Iby54NN+pwixGOu{20xB>G6cCZepHfHD3k?_ z-O|Q%KC%1@f1H4}SX*SJUXT^E$){>!b)QcM_r2G5`V5o1N~dV2E?()K+{51y9jU4? zK|$TkK=rhD!7MHGT&dx#^)4G00;tpm43${2m-N>7i3eAWuZXI+PewrPMNK=UcUQkf z@HR^Q$itvC?WP_@+S6Egeu0kD739F!5wZ^MDaWnhYEZbBPMS6<6?70oTj#L&@1BT4 zgJmW2RL0a5wUYuQz#ZVlg<}6{J_kua)Xe|qX0 zcbgigiS_?^?>yzBVsj58;moWM5|*^FFBMMD5%45TZY_Dd*1l@j>Ru4oSa>UP5tX(C zw0BIh8zkog4yL~w>$|77ty<=gv-|JWW;GpE6Nexz1P z8aiKBkRtBHxNK+|&q*Dq-bMW~Svl|VwUH;MM(vt31M>}q^ zL9`>dJGgBVsfczVoWY!$gLPLvizriE;iK!&i&qScQ^+`BwR6)1FQk&)Qghu9;XX%u zNghgwgbVny%Q)~*1^mH`%b;%0kVh9OJu4r_NwO=wXIJcrw19mDsAgPJqLPN60uO<8 zTsD%zkwE~$LUi4mEPVv(+WkDwUN`iGI?yyE&RF>*(67<*mne$9ucq5Z(=ZRZyt591 zTATu3N8W-9>ddk%$=eu&vif7zKlaG|Q$0 z%ZpXPm{_@E2xi>AS|E+MUL4c-?83Bs6lt zz~^z}N7Zbi`wA?O6k%d!+o%YGrt=`>YL-I(E;UW^7-?~11Gm1|(4%rab-B}St@3Gd!T2srUX%;EPRuL-}GRQ+?Fv_IC_ zaCG6fBbb%_>2x?%ln$%-GMxRg%`j^R1pnPh1Li#6{ZHhk=-y zuR)j5&63pg$Zl~?W`q46J(Cg7)*_!2)jjFdhqyWL%>t(l1tgLipAvFa?oY?eVgH_H z1$oi@eetjOn7N{zNj`;Vn}u!MJe#TG$=>}GGfvPgP2aO6S9aE0cO;rY;^N13qMQLu zR|4O&$MnuHapi;=?L=3GO^sA}HRsf8pjXa1t0TXO_CKzJ<4B-Bqft2GY`MD7_l`%$ z34=fSb%wdDtq{t3s?)}@9x<`XhqJm+S8Cm0jB&vtnk-H8W4e0Mnj?-cGVkQX%ayZA zhKhgf=gRT?1jp{5PL|8W4|1}cgm}KRe1CF{%~_>fCHB`k)QnX`Tc`BI)#@gE5?W2o ztjI|>=&UEAE>Ot9`m^OsM&ot)SPrQd_-6Kzt2PV#F9WRm-YaHJe z136t&hN9hI5Q%j?2y#(x2y{7gm6USsYtV9Q;QAp>m;1a7@Kk^QVJQ-rU;LfxL(~1o zrNH1E;HCbzkP%1z7p0(i@INk>;?pva`u2VvMc+m4*)9gq>Ato~G8d&BX#HH9F)Ko4 zMb2N%-#{@Hj)*K%S)`WRM={v&BrZBfNV^p4H*)2cYS{)#j)&Y|&;Ps}my;1D(G#W0 z#g(P3N3NWuc&dTLLkEaGjpZ}I>eC8(=)U9hhh?>9CgB$rMSPIDAU@B&xc~TL-}xlR zg^w0h0J-|hkH38O*^@7Pr{BHV9XJSj&^+M#F#U@tIEzl^85H!-mcVKjQCGfuLp>F9 zz&`IRiOLoU2jv!>!W5*z9#B_&>_B@*z>ae7?0|$w4hqV+f18$MFn~P{UV&L)d;Xxn ztqDe1Uh6^ixnGJH{-44BXXHoN*f_%KvYkbeP}#nS5!;u#dxw#7O=1@dafTo9V;PW9 zU?i_{MEK(~>8u@3mJ{P9e&dpG$XNnu%9xQna2$SxiSt7_<&+}VV6$MW*Q11xZy53u z7!W6%=zY`vG&tjS_jF*Szfft|s7jov#FBZkN}sEAsrMX$c}DL%B3x-8CsyI_2mJZC z_#!-x55hed#{mG25|6?YW`zDxu!Skd0fM%g?LCCOL@`Zl-EKD`rQq08o()c0E`h%n zC74fpnyrxE|K4T$zb;WgEN%@An$~W_^D_3$z zf15>JLVH(ZfsoTEc>dJFc_#E^DLoSOTywgFIZwixAW@$gu{s690=_Vy&T8}*uGhVO zy_=;kL70F@K4s-y4+f@$v~4I<;1*6uCE{^n0R6^B>h@7ev4;$l034*w8i<_Mv>*-h zVBk7yOJEF@bY?Itbl$cg2M#5oKbirgvv&kW;2_aupnPv0I=* znIX(_lWo1&Z83vlMh=d~0=+JJN6c|tRwjAGaB3@<^#uBkI2E$%(^eJii~T@3%d32- zVoYmQdLRzaKT%~tK|SMDu`P0A=nUX_IK2|91Dg541|`knygc35xbDVKXbe0TLl^~W zh*Pl;c=*+!*cX6S;#8c7*OgENBK^4L#x%?-AnZ@a<;Yp21@4=5dKxdm3t*ksFiq98QP@}NPVgX_wG|aG6A3cmf6M!x=4fZ7s z4wweF6b)``8r-o+@1{w5w=B}TT_?Reih5yc>$8OiPMK5)(^QcmOoqv#{QkD6u_V90 zBbW=Z=Y+JM;tr98~-#OTUNO!<7+Et2B%!*J14`QE` zK=?_?r-^D3CdV);fhB?Og2Eu?kb#@q&fII+`FVdM!pKR`Vckn+6pHPFzyoNhiW?g- z*8ArG40Oht8*j+^L5`uq1MHfclhg_jzdUhUCXqgkh~|lHnPebZfQSYhri;SR%>l+S zB0r4QEo-=eHbTZ4Wrk&<=KTKBP%_a}#a~cbbD9)OzdVX6Lz7f})Is{u){SZtc_i1O z!47LXT>u^>$g{HAeNLpb>IAgv1IKj*_H{giqJE6(SzhU}VBA}(EIA8eo)Z;>K!t#J zgPaGY76BpT(P-nzun3$USTJ#y!dbo~r_%^n4Jy8$U^HJ}pu^x{hRjoKm*_8jyNHbH z2S%<-46)-2sT?b-2?H1LV>q=NxU(geiif4t@L08w?2%f-iA@5sZwW}l7zEukyoR4c zzssW7*tnK$Y|y?N5X`*)M&)^2T9>8E?_(6qyLcX@(r~FWvIv4O_9{>cRKVVIYGg>= zYV#B^L1tFa8>V+vrnGB^X}j$u<8%^8$Oen^bL@FK0t{7!A-{X#`JgXbDPZSH_oWLc z0QgzQWDk+^(`=C!pmVc7%k2!%;RU6!3S)E(_IqR(@x&B6H8#I@+Mf(<2ql+6XNr&^ zl>=yDNEC`j>KMgZ0ZPvq1+n06Q6JP@4B^sy3VlFw^95RBon5DKF7y6oi9pwIi^~tRqjhlcwQwuadXYFv%s0>o$X3WD0vXocJdnM@X_au`it?PVvbv}&TrJ6W2X zQu3)zz7BLjVvhRSpNyQn0}y><73Ld@$yPMi_LhP}0g{A1kVC~StNp%gKin&_1gND&8zuTJ@>IiDx8bAP z_D9KwOA9o$@6W11=TSoY{wRHcq1w44p4MQusLID>bW|vrJ_WkYa*kp|9R-R`tD^f! zbkh2EQIzriX$PnUK_lm=lH|@bpLOE$s5388rQ{UK+f%T1L%I&`*MT40b47^>|4i`* zs0Dw3Wbg;*22iz2(;V@UUzB>xnWy~ol7F6i;y#G`XTkUt;lg2<;$5u~D4d?CCGAYS ziMTJ_N=mCDz34IOMUStbPlW>LjjCi=Wi3^_o0eoy1?ou#)yaW;7t!5R=DN6AK zYfu%;Sc#(4>sZw!g7W(y0{px|W3ro%@LLs0ls^p|=A+?E=U|4qtp-0FY=(HLyHSN%z<9 zCf!dWacW6-VNPgY$eA2iLjSt$`d%ycUtKKfLF7ug!9X*fRf*@aM7R$edQ?4LtSl5Y zylDz@bV#hE%8Jpr&x*KDVWI82k~Gf}%+&sKnAN za9$sjop1(*Wtmi;*5aM|aF9n)ij6x6C~V=-)Ck_Ih2(n>jgbM-gZS#>kJo#E-p{{gc>V zu3$g)aDk$pMA-~0T`>RU+S$WS7$_t=@f_QGE<3>lR@MoOx^RkWh9ynkuL}kau8}^b z%z1T@{m;ugevZ!}u+vJeWF%MmlzK(65u0Lz8m>tLO1pwE(57=`Z|k&c0lq;eWQeSr z2~Y<-A^Y0%kZo1AIN5li$Q4_E@@{PXRV1$4Y@GpS^YND&#O#hj`Ndk+B^LKB4i%0Qjw`ozjspS>boF}HJV`M!AdlqqNmB7aiv$XCID{O~ZQ@(PT+r7}}M)*Z_H7y|3-PSKrAg0Hf(b)QP;Q+YR0eJZ(6pUZRh(&8F?AK#gy2fpInGt2`SqSxN z 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 K8`yqIIs*VF5Tlv^ literal 55880 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 ${env:esp32_16mb_fromitems.build_src_filter} -[env:tiny] +[env:bk7231n] extra_scripts = pre:tools/lt_fsbuildscript.py lib_compat_mode = off lib_deps = LT_WebSockets https://github.com/Mit4el/ESPAsyncUDP#master ${common_env_data.lib_deps_external} - ${env:tiny_fromitems.lib_deps} + ${env:bk7231n_fromitems.lib_deps} lib_ignore = EspSoftwareSerial, HTTPUpdate, WebSockets platform = https://github.com/Mit4el/libretiny#master framework = arduino @@ -411,7 +411,7 @@ build_src_filter = + + + - ${env:tiny_fromitems.build_src_filter} + ${env:bk7231n_fromitems.build_src_filter} [env:esp8266_1mb_ota_fromitems] lib_deps = @@ -882,9 +882,8 @@ build_src_filter = + + -[env:tiny_fromitems] +[env:bk7231n_fromitems] lib_deps = - plerup/EspSoftwareSerial build_src_filter = + + @@ -894,10 +893,6 @@ build_src_filter = + + + - + + - + - + - + - + + + diff --git a/src/Global.cpp b/src/Global.cpp index 7145d956..afbb6e0f 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -83,7 +83,7 @@ String prevDate = ""; bool firstTimeInit = true; // unsigned long loopPeriod; - +int8_t ws_clients[WEBSOCKETS_CLIENT_MAX]; bool isTimeSynch = false; Time_t _time_local; Time_t _time_utc; diff --git a/src/Main.cpp b/src/Main.cpp index f3c0e942..223f1470 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -110,7 +110,7 @@ void setup() { #endif // RESTART_DEBUG_INFO // Печать или оправка отладочной информации printDebugTrace(); - //startWatchDog(); + startWatchDog(); Serial.println(); Serial.println(F("--------------started----------------")); @@ -157,6 +157,19 @@ void setup() { SerialPrint("i", "i2c", F("i2c pins overriding done")); } #if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) + esp_reset_reason_t esp_reason = esp_reset_reason(); + if (esp_reason == ESP_RST_UNKNOWN || esp_reason == ESP_RST_POWERON) + bootloop_panic_count = 0; +/* else if (bootloop_panic_count == 3 || bootloop_panic_count == 0 ) bootloop_panic_count = 1; + else if (bootloop_panic_count == 2) bootloop_panic_count = 3; + else if (bootloop_panic_count == 1) bootloop_panic_count = 2; + else bootloop_panic_count = 0; */ + Serial.println("bootloop_panic_count " + String(bootloop_panic_count)); + if (bootloop_panic_count >3 ) + { + //resetSettingsFlashByPanic(); + bootloop_panic_count = 0; + } if (bootloop_panic_count >= 3) { resetSettingsFlashByPanic(); @@ -167,7 +180,7 @@ void setup() { SerialPrint("E", "CORE", F("CONFIG and SCENARIO reset !!!")); bootloop_panic_count = 0; ESP.restart(); - } + } #endif // RESTART_DEBUG_INFO // настраиваем микроконтроллер configure("/config.json"); @@ -254,6 +267,25 @@ void setup() { }, nullptr, true); + // ловим пинги от WS (5сек) и дисконнектим если их нет (20сек) + ts.add( + PiWS, 6000, [&](void*) { + if (isNetworkActive()) { + for (size_t i = 0; i < WEBSOCKETS_CLIENT_MAX; i++) + { + if (ws_clients[i] == 0) { + disconnectWSClient(i); + ws_clients[i]=-1; + } + if (ws_clients[i] > 0) { + ws_clients[i]=0; + } + + } + } + }, + nullptr, true); + // test Serial.println("-------test start--------"); Serial.println("--------test end---------"); diff --git a/src/WsServer.cpp b/src/WsServer.cpp index a80ed967..18cfe1e4 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -7,6 +7,10 @@ void standWebSocketsInit() { standWebSocket.begin(); standWebSocket.onEvent(webSocketEvent); SerialPrint("i", "WS", "WS server initialized"); + for (size_t i = 0; i < WEBSOCKETS_CLIENT_MAX; i++) + { + ws_clients[i] = -1; + } } void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) { @@ -17,6 +21,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) case WStype_DISCONNECTED: { Serial.printf("[%u] Disconnected!\n", num); + standWebSocket.disconnect(num); } break; case WStype_CONNECTED: { @@ -54,7 +59,11 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) //----------------------------------------------------------------------// // Страница веб интерфейса dashboard //----------------------------------------------------------------------// - + if (headerStr == "p|") { + standWebSocket.sendTXT(num, "p|"); + Serial.printf("Ping client: %u\n", num); + ws_clients[num]=1; + } // публикация всех виджетов if (headerStr == "/|") { sendFileToWsByFrames("/layout.json", "layout", "", num, WEB_SOCKETS_FRAME_SIZE); @@ -490,7 +499,14 @@ void sendStringToWs(const String& header, String& payload, int client_id) { #endif } -void sendDeviceList(uint8_t num) { +void disconnectWSClient(uint8_t client_id) +{ + standWebSocket.disconnect(client_id); + Serial.printf("[WS] Client %u -disconnected\n", client_id); +} + +void sendDeviceList(uint8_t num) +{ if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { // если включен автопоиск то отдаем список из оперативной памяти SerialPrint("i", "FS", "heap list"); diff --git a/src/modules/exec/AnalogBtn/modinfo.json b/src/modules/exec/AnalogBtn/modinfo.json index ca3d11d2..3b5c7940 100644 --- a/src/modules/exec/AnalogBtn/modinfo.json +++ b/src/modules/exec/AnalogBtn/modinfo.json @@ -38,6 +38,7 @@ "defActive": true, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/exec/ButtonIn/modinfo.json b/src/modules/exec/ButtonIn/modinfo.json index 07fcc87c..e9c11793 100644 --- a/src/modules/exec/ButtonIn/modinfo.json +++ b/src/modules/exec/ButtonIn/modinfo.json @@ -46,6 +46,7 @@ "defActive": true, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/exec/ButtonOut/modinfo.json b/src/modules/exec/ButtonOut/modinfo.json index d655bed9..7a033c18 100644 --- a/src/modules/exec/ButtonOut/modinfo.json +++ b/src/modules/exec/ButtonOut/modinfo.json @@ -50,6 +50,7 @@ "defActive": true, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/exec/TelegramLT/TelegramLT.cpp b/src/modules/exec/TelegramLT/TelegramLT.cpp index 44a7828d..517fa6d4 100644 --- a/src/modules/exec/TelegramLT/TelegramLT.cpp +++ b/src/modules/exec/TelegramLT/TelegramLT.cpp @@ -41,7 +41,7 @@ class TelegramLT : public IoTItem { if (param.size() == 1) { String strTmp; if (param[0].isDecimal && param[0].valS == "") - strTmp = param[0].valD; + strTmp = String(param[0].valD); else strTmp = param[0].valS; diff --git a/src/modules/exec/TelegramLT/modinfo.json b/src/modules/exec/TelegramLT/modinfo.json index b8cf7ba5..a0d79d33 100644 --- a/src/modules/exec/TelegramLT/modinfo.json +++ b/src/modules/exec/TelegramLT/modinfo.json @@ -52,6 +52,7 @@ "defActive": true, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/sensors/AnalogAdc/modinfo.json b/src/modules/sensors/AnalogAdc/modinfo.json index ee41ed63..67102aa2 100644 --- a/src/modules/sensors/AnalogAdc/modinfo.json +++ b/src/modules/sensors/AnalogAdc/modinfo.json @@ -42,6 +42,7 @@ "defActive": true, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/sensors/BL0937/modinfo.json b/src/modules/sensors/BL0937/modinfo.json index b458c34b..f6dea0d2 100644 --- a/src/modules/sensors/BL0937/modinfo.json +++ b/src/modules/sensors/BL0937/modinfo.json @@ -132,6 +132,7 @@ "defActive": true, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/virtual/Cron/modinfo.json b/src/modules/virtual/Cron/modinfo.json index 26f9fbab..b061e458 100644 --- a/src/modules/virtual/Cron/modinfo.json +++ b/src/modules/virtual/Cron/modinfo.json @@ -50,6 +50,7 @@ "defActive": true, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/virtual/DiscoveryHA/modinfo.json b/src/modules/virtual/DiscoveryHA/modinfo.json index e06f37f9..300a8f90 100644 --- a/src/modules/virtual/DiscoveryHA/modinfo.json +++ b/src/modules/virtual/DiscoveryHA/modinfo.json @@ -34,6 +34,7 @@ "defActive": false, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/virtual/DiscoveryHomeD/modinfo.json b/src/modules/virtual/DiscoveryHomeD/modinfo.json index 1f66c25a..800a7816 100644 --- a/src/modules/virtual/DiscoveryHomeD/modinfo.json +++ b/src/modules/virtual/DiscoveryHomeD/modinfo.json @@ -34,6 +34,7 @@ "defActive": false, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/virtual/Math/modinfo.json b/src/modules/virtual/Math/modinfo.json index 6ae5c83a..e0cf20a9 100644 --- a/src/modules/virtual/Math/modinfo.json +++ b/src/modules/virtual/Math/modinfo.json @@ -56,6 +56,7 @@ "defActive": true, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } diff --git a/src/modules/virtual/Timer/modinfo.json b/src/modules/virtual/Timer/modinfo.json index 7e3ee204..941235a2 100644 --- a/src/modules/virtual/Timer/modinfo.json +++ b/src/modules/virtual/Timer/modinfo.json @@ -74,6 +74,7 @@ "defActive": true, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/virtual/VButton/modinfo.json b/src/modules/virtual/VButton/modinfo.json index 8a61b2d1..68824a83 100644 --- a/src/modules/virtual/VButton/modinfo.json +++ b/src/modules/virtual/VButton/modinfo.json @@ -36,6 +36,7 @@ "defActive": true, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/virtual/Variable/modinfo.json b/src/modules/virtual/Variable/modinfo.json index bf91bb7a..77ed8a83 100644 --- a/src/modules/virtual/Variable/modinfo.json +++ b/src/modules/virtual/Variable/modinfo.json @@ -96,6 +96,7 @@ "defActive": true, "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } \ No newline at end of file diff --git a/src/modules/virtual/owmWeather/modinfo.json b/src/modules/virtual/owmWeather/modinfo.json index 5940d5db..46502d0d 100644 --- a/src/modules/virtual/owmWeather/modinfo.json +++ b/src/modules/virtual/owmWeather/modinfo.json @@ -88,6 +88,7 @@ "usedLibs": { "esp32*": [], - "esp82*": [] + "esp82*": [], + "bk72*": [] } } From 6820460915613af46ab8d928d62df15048142627 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 20 Nov 2024 21:13:12 +0300 Subject: [PATCH 019/118] update Thermostat and Loging --- src/modules/exec/Thermostat/GyverPID.h | 171 +++++++++ src/modules/exec/Thermostat/Thermostat.cpp | 192 +++++++--- src/modules/exec/Thermostat/modinfo.json | 37 +- src/modules/virtual/Loging/Loging.cpp | 274 ++++++++++---- src/modules/virtual/Loging/modinfo.json | 111 +++--- src/modules/virtual/LogingDaily/modinfo.json | 91 ++--- .../virtual/LogingHourly/LogingHourly.cpp | 339 ++++++++++++++++++ src/modules/virtual/LogingHourly/modinfo.json | 50 +++ 8 files changed, 1043 insertions(+), 222 deletions(-) create mode 100644 src/modules/exec/Thermostat/GyverPID.h create mode 100644 src/modules/virtual/LogingHourly/LogingHourly.cpp create mode 100644 src/modules/virtual/LogingHourly/modinfo.json diff --git a/src/modules/exec/Thermostat/GyverPID.h b/src/modules/exec/Thermostat/GyverPID.h new file mode 100644 index 00000000..5adddeea --- /dev/null +++ b/src/modules/exec/Thermostat/GyverPID.h @@ -0,0 +1,171 @@ +/* + GyverPID - библиотека PID регулятора для Arduino + Документация: https://alexgyver.ru/gyverpid/ + GitHub: https://github.com/GyverLibs/GyverPID + Возможности: + - Время одного расчёта около 70 мкс + - Режим работы по величине или по её изменению (для интегрирующих процессов) + - Возвращает результат по встроенному таймеру или в ручном режиме + - Встроенные калибровщики коэффициентов + - Режим работы по ошибке и по ошибке измерения + - Встроенные оптимизаторы интегральной суммы + + AlexGyver, alex@alexgyver.ru + https://alexgyver.ru/ + MIT License + + Версии: + v1.1 - убраны дефайны + v1.2 - возвращены дефайны + v1.3 - вычисления ускорены, библиотека облегчена + v2.0 - логика работы чуть переосмыслена, код улучшен, упрощён и облегчён + v2.1 - integral вынесен в public + v2.2 - оптимизация вычислений + v2.3 - добавлен режим PID_INTEGRAL_WINDOW + v2.4 - реализация внесена в класс + v3.0 + - Добавлен режим оптимизации интегральной составляющей (см. доку) + - Добавлены автоматические калибровщики коэффициентов (см. примеры и доку) + v3.1 - исправлен режиме ON_RATE, добавлено автоограничение инт. суммы + v3.2 - чуть оптимизации, добавлена getResultNow + v3.3 - в тюнерах можно передать другой обработчик класса Stream для отладки +*/ + +#ifndef GyverPID_h +#define GyverPID_h +#include + +#if defined(PID_INTEGER) // расчёты с целыми числами +typedef int datatype; +#else // расчёты с float числами +typedef float datatype; +#endif + +#define NORMAL 0 +#define REVERSE 1 +#define ON_ERROR 0 +#define ON_RATE 1 + +class GyverPID +{ +public: + // ==== datatype это float или int, в зависимости от выбранного (см. пример integer_calc) ==== + GyverPID() {} + + // kp, ki, kd, dt + GyverPID(float new_kp, float new_ki, float new_kd, int new_dt = 60) + { + setDt(new_dt); + Kp = new_kp; + Ki = new_ki; + Kd = new_kd; + prevInput = 0; + integral = 0; + output = 0; + } + + // направление регулирования: NORMAL (0) или REVERSE (1) + void setDirection(boolean direction) + { + _direction = direction; + } + + // режим: работа по входной ошибке ON_ERROR (0) или по изменению ON_RATE (1) + void setMode(boolean mode) + { + _mode = mode; + } + + // лимит выходной величины (например для ШИМ ставим 0-255) + void setLimits(int min_output, int max_output) + { + _minOut = min_output; + _maxOut = max_output; + } + + // установка времени дискретизации (для getResultTimer) + void setDt(int new_dt) + { + _dt_s = new_dt; + _dt = new_dt * 1000; + } + + datatype setpoint = 0; // заданная величина, которую должен поддерживать регулятор + datatype input = 0; // сигнал с датчика (например температура, которую мы регулируем) + datatype output = 0; // выход с регулятора на управляющее устройство (например величина ШИМ или угол поворота серво) + float Kp = 0.0; // коэффициент P + float Ki = 0.0; // коэффициент I + float Kd = 0.0; // коэффициент D + float integral = 0.0; // интегральная сумма + + // возвращает новое значение при вызове (если используем свой таймер с периодом dt!) + datatype getResult() + { + datatype error = setpoint - input; // ошибка регулирования + datatype delta_input = prevInput - input; // изменение входного сигнала за dt + prevInput = input; // запомнили предыдущее + if (_direction) + { // смена направления + error = -error; + delta_input = -delta_input; + } + output = _mode ? 0 : (error * Kp); // пропорциональая составляющая + output += delta_input * Kd / _dt_s; // дифференциальная составляющая +#if (PID_INTEGRAL_WINDOW > 0) + // ЭКСПЕРИМЕНТАЛЬНЫЙ РЕЖИМ ИНТЕГРАЛЬНОГО ОКНА + if (++t >= PID_INTEGRAL_WINDOW) + t = 0; // перемотка t + integral -= errors[t]; // вычитаем старое + errors[t] = error * Ki * _dt_s; // запоминаем в массив + integral += errors[t]; // прибавляем новое +#else + integral += error * Ki * _dt_s; // обычное суммирование инт. суммы +#endif + +#ifdef PID_OPTIMIZED_I + // ЭКСПЕРИМЕНТАЛЬНЫЙ РЕЖИМ ОГРАНИЧЕНИЯ ИНТЕГРАЛЬНОЙ СУММЫ + output = constrain(output, _minOut, _maxOut); + if (Ki != 0) + integral = constrain(integral, (_minOut - output) / (Ki * _dt_s), (_maxOut - output) / (Ki * _dt_s)); +#endif + + if (_mode) + integral += delta_input * Kp; // режим пропорционально скорости + integral = constrain(integral, _minOut, _maxOut); // ограничиваем инт. сумму + output += integral; // интегральная составляющая + output = constrain(output, _minOut, _maxOut); // ограничиваем выход + return output; + } + + // возвращает новое значение не ранее, чем через dt миллисекунд (встроенный таймер с периодом dt) + datatype getResultTimer() + { + if (millis() - pidTimer >= _dt) + { + pidTimer = millis(); + getResult(); + } + return output; + } + + // посчитает выход по реальному прошедшему времени между вызовами функции + datatype getResultNow() + { + setDt(millis() - pidTimer); + pidTimer = millis(); + return getResult(); + } + +private: + int16_t _dt = 100; // время итерации в мс + float _dt_s = 0.1; // время итерации в с + boolean _mode = 0, _direction = 0; + int _minOut = 0, _maxOut = 255; + datatype prevInput = 0; + uint32_t pidTimer = 0; +#if (PID_INTEGRAL_WINDOW > 0) + datatype errors[PID_INTEGRAL_WINDOW]; + int t = 0; +#endif +}; +#endif \ No newline at end of file diff --git a/src/modules/exec/Thermostat/Thermostat.cpp b/src/modules/exec/Thermostat/Thermostat.cpp index 8d3c9260..d91000ab 100644 --- a/src/modules/exec/Thermostat/Thermostat.cpp +++ b/src/modules/exec/Thermostat/Thermostat.cpp @@ -1,5 +1,6 @@ #include "Global.h" #include "classes/IoTItem.h" +#include "GyverPID.h" extern IoTGpio IoTgpio; @@ -15,6 +16,7 @@ class ThermostatGIST : public IoTItem float sp, pv, pv2; String interim; int enable = 1; + int _direction = 0; public: ThermostatGIST(String parameters) : IoTItem(parameters) @@ -24,6 +26,7 @@ class ThermostatGIST : public IoTItem jsonRead(parameters, "term_rezerv_id", _term_rezerv_id); jsonRead(parameters, "gist", _gist); jsonRead(parameters, "rele", _rele); + jsonRead(parameters, "direction", _direction); } void doByInterval() @@ -55,13 +58,31 @@ class ThermostatGIST : public IoTItem { tmp = findIoTItem(_rele); if (tmp) - tmp->setValue("0", true); + { + if (_direction) + { + tmp->setValue("0", true); + } + else + { + tmp->setValue("1", true); + } + } } if (pv <= sp - _gist && enable) { tmp = findIoTItem(_rele); if (tmp) - tmp->setValue("1", true); + { + if (_direction) + { + tmp->setValue("1", true); + } + else + { + tmp->setValue("0", true); + } + } } } else @@ -86,13 +107,31 @@ class ThermostatGIST : public IoTItem { tmp = findIoTItem(_rele); if (tmp) - tmp->setValue("0", true); + { + if (_direction) + { + tmp->setValue("0", true); + } + else + { + tmp->setValue("1", true); + } + } } if (pv2 <= sp - _gist && enable) { tmp = findIoTItem(_rele); if (tmp) - tmp->setValue("1", true); + { + if (_direction) + { + tmp->setValue("1", true); + } + else + { + tmp->setValue("0", true); + } + } } } else @@ -144,23 +183,40 @@ class ThermostatGIST : public IoTItem return {}; } - ~ThermostatGIST(){}; + ~ThermostatGIST() {}; }; +GyverPID *regulator = nullptr; +GyverPID *instanceregulator(float _KP, float _KI, float _KD, int interval, boolean setDirection, int setLimitsMIN, int setLimitsMAX) +{ + if (!regulator) + { // Если библиотека ранее инициализировалась, то просто вернем указатель + // Инициализируем библиотеку + regulator = new GyverPID(_KP, _KI, _KD, interval); // коэф. П, коэф. И, коэф. Д, период дискретизации dt (с) + regulator->setDirection(setDirection); // направление регулирования (NORMAL/REVERSE). ПО УМОЛЧАНИЮ СТОИТ NORMAL + regulator->setLimits(setLimitsMIN, setLimitsMAX); // пределы. ПО УМОЛЧАНИЮ СТОЯТ 0 И 100 + SerialPrint("i", F("ThermostatPID"), " _KP:" + String(_KP) + " _KI:" + String(_KI) + " _KD:" + String(_KD) + " interval:" + String(interval) + " _setLimitsMIN:" + String(setLimitsMIN) + " _setLimitsMAX:" + String(setLimitsMAX) + " Direction:" + String(setDirection)); + // GyverPID regulator(_KP, _KI, _KD, interval); + } + return regulator; +} + class ThermostatPID : public IoTItem { private: - String _set_id; // заданная температура - String _term_id; // термометр - String _term_rezerv_id; // резервный термометр - float _int, _KP, _KI, _KD, sp, pv, + String _set_id; // заданная температура + String _term_id; // термометр + boolean _setDirection; + + float _int, _KP, _KI, _KD, + sp, pv, pv_last = 0, // предыдущая температура ierr = 0, // интегральная погрешность dt = 0; // время между измерениями String _rele; // реле String interim; int enable = 1; - long interval; + int interval, _setLimitsMIN, _setLimitsMAX; IoTItem *tmp; int releState = 0; @@ -169,20 +225,29 @@ class ThermostatPID : public IoTItem { jsonRead(parameters, "set_id", _set_id); jsonRead(parameters, "term_id", _term_id); - jsonRead(parameters, "term_rezerv_id", _term_rezerv_id); jsonRead(parameters, "int", _int); jsonRead(parameters, "KP", _KP); jsonRead(parameters, "KI", _KI); jsonRead(parameters, "KD", _KD); jsonRead(parameters, F("int"), interval); - interval = interval * 1000; // интервал проверки в сек jsonRead(parameters, "rele", _rele); + + // GyverPID + jsonRead(parameters, "setDirection", _setDirection); + jsonRead(parameters, "setLimitsMIN", _setLimitsMIN); + jsonRead(parameters, "setLimitsMAX", _setLimitsMAX); + + // в процессе работы можно менять коэффициенты + // instanceregulator(_KP, _KI, _KD, interval)->Kp = _KP; + // instanceregulator(_KP, _KI, _KD, interval)->Ki = _KI; + // instanceregulator(_KP, _KI, _KD, interval)->Kd = _KD; } protected: //=============================================================== // Вычисляем температуру контура отпления, коэффициенты ПИД регулятора //=============================================================== + /* float pid(float sp, float pv, float pv_last, float &ierr, float dt) { float Kc = _KP; // K / %Heater 5 @@ -217,11 +282,10 @@ class ThermostatPID : public IoTItem // выход регулятора, он же уставка для ID-1 (температура теплоносителя контура СО котла) op = constrain(op, oplo, ophi); } - ierr = I; return op; } - +*/ void doByInterval() { @@ -239,32 +303,24 @@ class ThermostatPID : public IoTItem interim = tmp->getValue(); pv = ::atof(interim.c_str()); } - if (pv < -40 && pv > 120 && !pv) // Решаем что ошибка датчика + if (enable) { - if (_term_rezerv_id != "") - { - tmp = findIoTItem(_term_rezerv_id); // используем резервный - if (tmp) - { - interim = tmp->getValue(); - pv = ::atof(interim.c_str()); - if (pv < -40 && pv > 120 && !pv) - pv = 0; - } - else - pv = 0; - } - else - pv = 0; + // regEvent(pid(sp, pv, pv_last, ierr, _int), "ThermostatPID", false, true); + // instanceregulator(_KP, _KI, _KD, interval,_setDirection,_setLimitsMIN,_setLimitsMAX)->setDirection(_setDirection); // направление регулирования (NORMAL/REVERSE). ПО УМОЛЧАНИЮ СТОИТ NORMAL + // instanceregulator(_KP, _KI, _KD, interval,_setDirection,_setLimitsMIN,_setLimitsMAX)->setLimits(_setLimitsMIN, _setLimitsMAX); // пределы. ПО УМОЛЧАНИЮ СТОЯТ 0 И 100 + // instanceregulator(_KP, _KI, _KD, interval)->setMode(1); + instanceregulator(_KP, _KI, _KD, interval, _setDirection, _setLimitsMIN, _setLimitsMAX)->setpoint = sp; + instanceregulator(_KP, _KI, _KD, interval, _setDirection, _setLimitsMIN, _setLimitsMAX)->input = pv; + value.valD = instanceregulator(_KP, _KI, _KD, interval, _setDirection, _setLimitsMIN, _setLimitsMAX)->getResult(); + SerialPrint("i", F("ThermostatPID"), " _KP:" + String(_KP) + " _KI:" + String(_KI) + " _KD:" + String(_KD) + " interval:" + String(interval) + " _setLimitsMIN:" + String(_setLimitsMIN) + " _setLimitsMAX:" + String(_setLimitsMAX) + " Direction:" + String(_setDirection)); + SerialPrint("i", F("ThermostatPID"), "setpoint: " + String(sp) + " input: " + String(pv)); + regEvent(value.valD, "ThermostatPID", false, true); } - if (sp && pv) + else { - // value.valD = pid(sp, pv, pv_last, ierr, _int); - // value.valS = (String)(int)value.valD; - regEvent(pid(sp, pv, pv_last, ierr, _int), "ThermostatPID", false, true); + value.valD = 0; + regEvent(value.valD, "ThermostatPID", false, true); } - else - regEvent(0, "ThermostatPID", false, true); pv_last = pv; } @@ -280,14 +336,14 @@ class ThermostatPID : public IoTItem currentMillis = millis(); difference = currentMillis - prevMillis; - if (_rele != "" && enable && value.valD * interval / 100000 > difference / 1000 && releState == 0) + if (_rele != "" && enable && value.valD * interval / 100 > difference / 1000 && releState == 0) { releState = 1; tmp = findIoTItem(_rele); if (tmp) tmp->setValue("1", true); } - if (_rele != "" && enable && value.valD * interval / 100000 < difference / 1000 && releState == 1) + if (_rele != "" && enable && value.valD * interval / 100 < difference / 1000 && releState == 1) { releState = 0; tmp = findIoTItem(_rele); @@ -295,7 +351,7 @@ class ThermostatPID : public IoTItem tmp->setValue("0", true); } - if (difference >= interval) + if (difference >= interval * 1000) { prevMillis = millis(); this->doByInterval(); @@ -311,6 +367,32 @@ class ThermostatPID : public IoTItem if (param.size()) { enable = param[0].valD; + if (enable == 0) + { + delete regulator; + regulator = nullptr; + // instanceregulator(_KP, _KI, _KD, interval, _setDirection, _setLimitsMIN, _setLimitsMAX); + } + } + } + if (command == "setLimitsMIN") + { + if (param.size()) + { + _setLimitsMIN = param[0].valD; + // delete regulator; + // regulator = nullptr; + // instanceregulator(_KP, _KI, _KD, interval, _setDirection, _setLimitsMIN, _setLimitsMAX); + } + } + if (command == "setLimitsMAX") + { + if (param.size()) + { + _setLimitsMAX = param[0].valD; + // delete regulator; + // regulator = nullptr; + // instanceregulator(_KP, _KI, _KD, interval, _setDirection, _setLimitsMIN, _setLimitsMAX); } } if (command == "KP") @@ -318,6 +400,9 @@ class ThermostatPID : public IoTItem if (param.size()) { _KP = param[0].valD; + delete regulator; + regulator = nullptr; + instanceregulator(_KP, _KI, _KD, interval, _setDirection, _setLimitsMIN, _setLimitsMAX); } } if (command == "KI") @@ -325,6 +410,9 @@ class ThermostatPID : public IoTItem if (param.size()) { _KI = param[0].valD; + delete regulator; + regulator = nullptr; + instanceregulator(_KP, _KI, _KD, interval, _setDirection, _setLimitsMIN, _setLimitsMAX); } } if (command == "KD") @@ -332,12 +420,30 @@ class ThermostatPID : public IoTItem if (param.size()) { _KD = param[0].valD; + delete regulator; + regulator = nullptr; + instanceregulator(_KP, _KI, _KD, interval, _setDirection, _setLimitsMIN, _setLimitsMAX); + } + } + + if (command == "setDirection") + { + if (param.size()) + { + _setDirection = param[0].valD; + delete regulator; + regulator = nullptr; + instanceregulator(_KP, _KI, _KD, interval, _setDirection, _setLimitsMIN, _setLimitsMAX); } } } return {}; } - ~ThermostatPID(){}; + ~ThermostatPID() + { + delete regulator; + regulator = nullptr; + }; }; class ThermostatETK : public IoTItem @@ -395,7 +501,7 @@ class ThermostatETK : public IoTItem } } - ~ThermostatETK(){}; + ~ThermostatETK() {}; }; class ThermostatETK2 : public IoTItem @@ -471,7 +577,7 @@ class ThermostatETK2 : public IoTItem } } - ~ThermostatETK2(){}; + ~ThermostatETK2() {}; }; void *getAPI_Thermostat(String subtype, String param) @@ -495,4 +601,4 @@ void *getAPI_Thermostat(String subtype, String param) //} return nullptr; -} +} \ No newline at end of file diff --git a/src/modules/exec/Thermostat/modinfo.json b/src/modules/exec/Thermostat/modinfo.json index fa0a274c..fe3ab759 100644 --- a/src/modules/exec/Thermostat/modinfo.json +++ b/src/modules/exec/Thermostat/modinfo.json @@ -16,8 +16,9 @@ "set_id": "", "term_id": "", "term_rezerv_id": "", - "gist": 0.3, - "rele": "" + "gist": 0.1, + "rele": "", + "direction": 0 }, { "global": 0, @@ -31,14 +32,16 @@ "descr": "термостат", "int": 60, "round": 1, - "map": "1,100,1,100", + "map": "1024,1024,1,100", "set_id": "", "term_id": "", - "term_rezerv_id": "", "rele": "", - "KP": 5.0, - "KI": 50, - "KD": 1.0 + "setDirection": 0, + "setLimitsMIN": 0, + "setLimitsMAX": 100, + "KP": 10, + "KI": 0.02, + "KD": 8 }, { "global": 0, @@ -75,11 +78,11 @@ ], "about": { "authorName": "AVAKS", - "authorContact": "https://t.me/@avaks_dev", + "authorContact": "https://t.me/@avaks", "authorGit": "https://github.com/avaksru", "specialThanks": "@Serghei63 за работу PID с обычным реле, Serg помощь в тестировании и устранении ошибок", "moduleName": "Thermostat", - "moduleVersion": "1", + "moduleVersion": "3", "usedRam": { "esp32_4mb": 15, "esp8266_4mb": 15 @@ -129,10 +132,24 @@ "params": [ "thermostat.KD(1) - задает значение коэффициента" ] + }, + { + "name": "setLimitsMIN / setLimitsMAX", + "descr": " лимит выходной величины (например для ШИМ ставим 0-255).", + "params": [ + "thermostat.setLimitsMIN(1) - задает минимальное значение PID" + ] + }, + { + "name": "setDirection", + "descr": "направление регулирования: NORMAL (0) или REVERSE (1).", + "params": [ + "thermostat.setDirection(1) - задает реверсное регулирование" + ] } ] }, - "defActive": false, + "defActive": true, "usedLibs": { "esp32*": [], "esp82*": [] diff --git a/src/modules/virtual/Loging/Loging.cpp b/src/modules/virtual/Loging/Loging.cpp index 513cf241..9196c5cb 100644 --- a/src/modules/virtual/Loging/Loging.cpp +++ b/src/modules/virtual/Loging/Loging.cpp @@ -5,8 +5,9 @@ void *getAPI_Date(String params); -class Loging : public IoTItem { - private: +class Loging : public IoTItem +{ +private: String logid; String id; String tmpValue; @@ -14,6 +15,8 @@ class Loging : public IoTItem { int _publishType = -2; int _wsNum = -1; + int days = 1; + int daysShow = 1; int points; // int keepdays; @@ -25,45 +28,58 @@ class Loging : public IoTItem { // long interval; - public: - Loging(String parameters) : IoTItem(parameters) { +public: + Loging(String parameters) : IoTItem(parameters) + { jsonRead(parameters, F("logid"), logid); jsonRead(parameters, F("id"), id); jsonRead(parameters, F("points"), points); - if (points > 300) { + if (points > 300) + { points = 300; SerialPrint("E", F("Loging"), "'" + id + "' user set more points than allowed, value reset to 300"); } long interval; - jsonRead(parameters, F("int"), interval); // в минутах + jsonRead(parameters, F("int"), interval); // в минутах setInterval(interval * 60); // jsonRead(parameters, F("keepdays"), keepdays, false); + jsonRead(parameters, F("daysSave"), days); + days = days * 86400; + jsonRead(parameters, F("daysShow"), daysShow); + daysShow = daysShow * 86400; + // создадим экземпляр класса даты dateIoTItem = (IoTItem *)getAPI_Date("{\"id\": \"" + id + "-date\",\"int\":\"20\",\"subtype\":\"date\"}"); IoTItems.push_back(dateIoTItem); SerialPrint("I", F("Loging"), "created date instance " + id); } - void doByInterval() { + void doByInterval() + { // если объект логгирования не был создан - if (!isItemExist(logid)) { + if (!isItemExist(logid)) + { SerialPrint("E", F("Loging"), "'" + id + "' loging object not exist, return"); return; } String value = getItemValue(logid); // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging"), "'" + id + "' loging value is empty, return"); return; } // если время не было получено из интернета - if (!isTimeSynch) { + if (!isTimeSynch) + { SerialPrint("E", F("Loging"), "'" + id + "' Сant loging - time not synchronized, return"); return; } + if (hasDayChanged()) + deleteOldFile(); regEvent(value, F("Loging")); @@ -76,13 +92,17 @@ class Loging : public IoTItem { String filePath = readDataDB(id); // если данные о файле отсутствуют, создадим новый - if (filePath == "failed" || filePath == "") { + if (filePath == "failed" || filePath == "") + { SerialPrint("E", F("Loging"), "'" + id + "' file path not found, start create new file"); createNewFileWithData(logData); return; - } else { + } + else + { // если файл все же есть но был создан не сегодня, то создаем сегодняшний - if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) + { SerialPrint("E", F("Loging"), "'" + id + "' file too old, start create new file"); createNewFileWithData(logData); return; @@ -95,29 +115,38 @@ class Loging : public IoTItem { SerialPrint("i", F("Loging"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); // если количество строк до заданной величины и дата не менялась - if (lines <= points && !hasDayChanged()) { + if (lines <= points && !hasDayChanged()) + { // просто добавим в существующий файл новые данные addNewDataToExistingFile(filePath, logData); // если больше или поменялась дата то создадим следующий файл - } else { + } + else + { createNewFileWithData(logData); } // запускаем процедуру удаления старых файлов если память переполняется deleteLastFile(); } - void SetDoByInterval(String valse) { + void SetDoByInterval(String valse) + { String value = valse; // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("LogingEvent"), "'" + id + "' loging value is empty, return"); return; } // если время не было получено из интернета - if (!isTimeSynch) { + if (!isTimeSynch) + { SerialPrint("E", F("LogingEvent"), "'" + id + "' Сant loging - time not synchronized, return"); return; } + if (hasDayChanged()) + deleteOldFile(); + regEvent(value, F("LogingEvent")); String logData; jsonWriteInt(logData, "x", unixTime, false); @@ -126,13 +155,17 @@ class Loging : public IoTItem { String filePath = readDataDB(id); // если данные о файле отсутствуют, создадим новый - if (filePath == "failed" || filePath == "") { + if (filePath == "failed" || filePath == "") + { SerialPrint("E", F("LogingEvent"), "'" + id + "' file path not found, start create new file"); createNewFileWithData(logData); return; - } else { + } + else + { // если файл все же есть но был создан не сегодня, то создаем сегодняшний - if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) + { SerialPrint("E", F("LogingEvent"), "'" + id + "' file too old, start create new file"); createNewFileWithData(logData); return; @@ -145,32 +178,39 @@ class Loging : public IoTItem { SerialPrint("i", F("LogingEvent"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); // если количество строк до заданной величины и дата не менялась - if (lines <= points && !hasDayChanged()) { + if (lines <= points && !hasDayChanged()) + { // просто добавим в существующий файл новые данные addNewDataToExistingFile(filePath, logData); // если больше или поменялась дата то создадим следующий файл - } else { + } + else + { createNewFileWithData(logData); } // запускаем процедуру удаления старых файлов если память переполняется deleteLastFile(); } - void createNewFileWithData(String &logData) { + void createNewFileWithData(String &logData) + { logData = logData + ","; - String path = "/lg/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt + String path = "/lg/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt // создадим пустой файл - if (writeEmptyFile(path) != "success") { + if (writeEmptyFile(path) != "success") + { SerialPrint("E", F("Loging"), "'" + id + "' file writing error, return"); return; } // запишем в него данные - if (addFile(path, logData) != "success") { + if (addFile(path, logData) != "success") + { SerialPrint("E", F("Loging"), "'" + id + "' data writing error, return"); return; } // запишем путь к нему в базу данных - if (saveDataDB(id, path) != "success") { + if (saveDataDB(id, path) != "success") + { SerialPrint("E", F("Loging"), "'" + id + "' db file writing error, return"); return; } @@ -181,9 +221,11 @@ class Loging : public IoTItem { #endif } - void addNewDataToExistingFile(String &path, String &logData) { + void addNewDataToExistingFile(String &path, String &logData) + { logData = logData + ","; - if (addFile(path, logData) != "success") { + if (addFile(path, logData) != "success") + { SerialPrint("i", F("Loging"), "'" + id + "' file writing error, return"); return; }; @@ -195,11 +237,14 @@ class Loging : public IoTItem { } // данная функция уже перенесена в ядро и будет удалена в последствии - bool hasDayChanged() { + bool hasDayChanged() + { bool changed = false; String currentDate = getTodayDateDotFormated(); - if (!firstTimeInit) { - if (prevDate != currentDate) { + if (!firstTimeInit) + { + if (prevDate != currentDate) + { changed = true; SerialPrint("i", F("NTP"), F("Change day event")); #if defined(ESP8266) @@ -214,7 +259,8 @@ class Loging : public IoTItem { return changed; } - void publishValue() { + void publishValue() + { String dir = "/lg/" + id; filesList = getFilesList(dir); @@ -224,75 +270,111 @@ class Loging : public IoTItem { bool noData = true; - while (filesList.length()) { + while (filesList.length()) + { String path = selectToMarker(filesList, ";"); - - path = "/lg/" + id + path; + path = dir + path; f++; unsigned long fileUnixTimeLocal = getFileUnixLocalTime(path); unsigned long reqUnixTime = strDateToUnix(getItemValue(id + "-date")); - if (fileUnixTimeLocal > reqUnixTime && fileUnixTimeLocal < reqUnixTime + 86400) { + + if (fileUnixTimeLocal > reqUnixTime - daysShow && fileUnixTimeLocal < reqUnixTime + 86400) + { noData = false; String json = getAdditionalJson(); - if (_publishType == TO_MQTT) { + if (_publishType == TO_MQTT) + { publishChartFileToMqtt(path, id, calculateMaxCount()); - } else if (_publishType == TO_WS) { + } + else if (_publishType == TO_WS) + { sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); - } else if (_publishType == TO_MQTT_WS) { + } + else if (_publishType == TO_MQTT_WS) + { sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); publishChartFileToMqtt(path, id, calculateMaxCount()); } SerialPrint("i", F("Loging"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", sent"); - } else { + } + else + { SerialPrint("i", F("Loging"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", skipped"); } + /* + //------------ delete old files ---------------- + String pathTodel = path; + pathTodel.replace("/", ""); + pathTodel.replace(".txt", ""); + int pathTodel_ = pathTodel.toInt(); + if (pathTodel_ < unixTimeShort - days) + { + removeFile(path); + SerialPrint("i", "Loging!!!!!!", path + " => old files been clean"); + } + if (pathTodel_ < unixTimeShort - 5184000) + { + removeFile(path); + SerialPrint("i", "Loging!!!!!!", path + " => > 2 month files been clean"); + } + //------------ delete old files ---------------- + */ filesList = deleteBeforeDelimiter(filesList, ";"); } // если данных нет отправляем пустой грфик - if (noData) { + if (noData) + { clearValue(); } } - String getAdditionalJson() { + String getAdditionalJson() + { String topic = mqttRootDevice + "/" + id; String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\"}"; return json; } - void publishChartToWsSinglePoint(String value) { + void publishChartToWsSinglePoint(String value) + { String topic = mqttRootDevice + "/" + id; String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + "}]}"; sendStringToWs("chartb", json, -1); } - void clearValue() { + void clearValue() + { String topic = mqttRootDevice + "/" + id; String json = "{\"maxCount\":0,\"topic\":\"" + topic + "\",\"status\":[]}"; sendStringToWs("chartb", json, -1); } - void clearHistory() { + void clearHistory() + { String dir = "/lg/" + id; cleanDirectory(dir); } - void deleteLastFile() { + void deleteLastFile() + { IoTFSInfo tmp = getFSInfo(); SerialPrint("i", "Loging", String(tmp.freePer) + " % free flash remaining"); - if (tmp.freePer <= 50.00) { + if (tmp.freePer <= 10.00) + { String dir = "/lg/" + id; filesList = getFilesList(dir); int i = 0; - while (filesList.length()) { + while (filesList.length()) + { String path = selectToMarker(filesList, ";"); path = dir + path; i++; - if (i == 1) { + if (i == 1) + { removeFile(path); SerialPrint("!", "Loging", String(i) + ") " + path + " => oldest files been deleted"); return; @@ -303,7 +385,37 @@ class Loging : public IoTItem { } } - void setPublishDestination(int publishType, int wsNum) { + void deleteOldFile() + { + String dir = "/lg/" + id; + filesList = getFilesList(dir); + int i = 0; + while (filesList.length()) + { + String path = selectToMarker(filesList, ";"); + String pathTodel = path; + pathTodel.replace("/", ""); + pathTodel.replace(".txt", ""); + int pathTodel_ = pathTodel.toInt(); + path = dir + path; + i++; + if (pathTodel_ < unixTimeShort - days) + { + removeFile(path); + SerialPrint("i", "Loging!!!!!!", String(i) + ") " + path + " => old files been clean"); + } + if (pathTodel_ < unixTimeShort - 5184000) + { + removeFile(path); + SerialPrint("i", "Loging!!!!!!", String(i) + ") " + path + " => > 2 month files been clean"); + } + + filesList = deleteBeforeDelimiter(filesList, ";"); + } + } + + void setPublishDestination(int publishType, int wsNum) + { _publishType = publishType; _wsNum = wsNum; } @@ -323,11 +435,13 @@ class Loging : public IoTItem { // } // } - void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) { + void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) + { String userDate = getItemValue(id + "-date"); String currentDate = getTodayDateDotFormated(); // отправляем в график данные только когда выбран сегодняшний день - if (userDate == currentDate) { + if (userDate == currentDate) + { // generateEvent(_id, value); // publishStatusMqtt(_id, value); @@ -341,7 +455,8 @@ class Loging : public IoTItem { // путь вида: /lg/log/1231231.txt unsigned long getFileUnixLocalTime(String path) { return gmtTimeToLocal(selectToMarkerLast(deleteToMarkerLast(path, "."), "/").toInt() + START_DATETIME); } - void setValue(const IoTValue &Value, bool genEvent = true) { + void setValue(const IoTValue &Value, bool genEvent = true) + { value = Value; this->SetDoByInterval(String(value.valD)); SerialPrint("i", "Loging", "setValue:" + String(value.valD)); @@ -349,37 +464,48 @@ class Loging : public IoTItem { } }; -void *getAPI_Loging(String subtype, String param) { - if (subtype == F("Loging")) { +void *getAPI_Loging(String subtype, String param) +{ + if (subtype == F("Loging")) + { return new Loging(param); - } else { + } + else + { return nullptr; } } -class Date : public IoTItem { - private: +class Date : public IoTItem +{ +private: bool firstTime = true; - public: +public: String id; - Date(String parameters) : IoTItem(parameters) { + Date(String parameters) : IoTItem(parameters) + { jsonRead(parameters, F("id"), id); value.isDecimal = false; } - void setValue(const String &valStr, bool genEvent = true) { + void setValue(const String &valStr, bool genEvent = true) + { value.valS = valStr; setValue(value, genEvent); } - void setValue(const IoTValue &Value, bool genEvent = true) { + void setValue(const IoTValue &Value, bool genEvent = true) + { value = Value; regEvent(value.valS, "", false, genEvent); // отправка данных при изменении даты - for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { - if ((*it)->getSubtype() == "Loging") { - if ((*it)->getID() == selectToMarker(id, "-")) { + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) + { + if ((*it)->getSubtype() == "Loging") + { + if ((*it)->getID() == selectToMarker(id, "-")) + { (*it)->setPublishDestination(TO_MQTT_WS, -1); (*it)->publishValue(); } @@ -387,14 +513,18 @@ class Date : public IoTItem { } } - void setTodayDate() { + void setTodayDate() + { setValue(getTodayDateDotFormated()); - SerialPrint("E", F("Loging"), "today date set " + getTodayDateDotFormated()); + SerialPrint("i", F("Loging"), "today date set " + getTodayDateDotFormated()); } - void doByInterval() { - if (isTimeSynch) { - if (firstTime) { + void doByInterval() + { + if (isTimeSynch) + { + if (firstTime) + { setTodayDate(); firstTime = false; } diff --git a/src/modules/virtual/Loging/modinfo.json b/src/modules/virtual/Loging/modinfo.json index 61b2ad2d..65b5fef8 100644 --- a/src/modules/virtual/Loging/modinfo.json +++ b/src/modules/virtual/Loging/modinfo.json @@ -1,56 +1,63 @@ { - "menuSection": "virtual_elments", - "configItem": [ - { - "global": 0, - "name": "График", - "type": "Writing", - "subtype": "Loging", - "id": "log", - "widget": "chart2", - "page": "Графики", - "descr": "Температура", - "num": 1, - "int": 5, - "logid": "t", - "points": 300 - }, - { - "global": 0, - "name": "График по событию", - "type": "Writing", - "subtype": "Loging", - "id": "log", - "widget": "chart2", - "page": "Графики", - "descr": "Температура", - "int": 0, - "num": 1, - "points": 300 - } - ], - "about": { - "authorName": "Dmitry Borisenko", - "authorContact": "https://t.me/Dmitry_Borisenko", - "authorGit": "https://github.com/DmitryBorisenko33", - "specialThanks": "@itsid1 @Valiuhaaa Serg", - "moduleName": "Loging", - "moduleVersion": "3.0", - "usedRam": { - "esp32_4mb": 15, - "esp8266_4mb": 15 - }, - "title": "Логирование в график", - "moduleDesc": "Расширение позволяющее логировать любую величину в график. Графики доступны в мобильном приложении и в веб интерфейсе. Данные графиков хранятся в встроенной памяти esp. В окне ввода даты можно выбирать день, историю которого вы хотите посмотреть. Старые файлы будут удаляться автоматически после того как объем оставшейся flesh памяти устройства будет менее 20 процентов", - "propInfo": { - "int": "Интервал логирования в мнутах, рекомендуется для esp8266 использоать интервал не менее 5-ти минут", - "logid": "ID величины которую будем логировать", - "points": "Максимальное количество точек в одном файле, может быть не более 300. Не рекомендуется менять этот параметр" - } + "menuSection": "virtual_elments", + "configItem": [ + { + "global": 0, + "name": "График", + "type": "Writing", + "subtype": "Loging", + "id": "log", + "widget": "chart2", + "page": "Графики", + "descr": "Температура", + "num": 1, + "int": 5, + "logid": "t", + "daysSave": 5, + "daysShow": 0, + "points": 300 }, - "defActive": true, - "usedLibs": { - "esp32*": [], - "esp82*": [] + { + "global": 0, + "name": "График по событию", + "type": "Writing", + "subtype": "Loging", + "id": "log", + "widget": "chart2", + "page": "Графики", + "descr": "Температура", + "int": 0, + "num": 1, + "daysSave": 5, + "daysShow": 0, + "points": 300 } + ], + "about": { + "authorName": "Dmitry Borisenko", + "authorContact": "https://t.me/Dmitry_Borisenko", + "authorGit": "https://github.com/DmitryBorisenko33", + "specialThanks": "@itsid1 @Valiuhaaa Serg", + "moduleName": "Loging", + "moduleVersion": "4.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "Логирование в график", + "moduleDesc": "Расширение позволяющее логировать любую величину в график. Графики доступны в мобильном приложении и в веб интерфейсе. Данные графиков хранятся в встроенной памяти esp. В окне ввода даты можно выбирать день, историю которого вы хотите посмотреть. Старые файлы будут удаляться автоматически после того как объем оставшейся flesh памяти устройства будет менее 20 процентов", + "propInfo": { + "int": "Интервал логирования в мнутах, рекомендуется для esp8266 использоать интервал не менее 5-ти минут", + "logid": "ID величины которую будем логировать", + "points": "Максимальное количество точек в одном файле, может быть не более 300. Не рекомендуется менять этот параметр", + "daysSave": "Количество дней за которое надо хранить график", + "daysShow": "За какое количество дней отображать график при открытии" + } + }, + "defActive": true, + "usedLibs": { + "esp32*": [], + "esp82*": [], + "bk72*": [] + } } \ No newline at end of file diff --git a/src/modules/virtual/LogingDaily/modinfo.json b/src/modules/virtual/LogingDaily/modinfo.json index 1bfbc10d..3fd3e1ea 100644 --- a/src/modules/virtual/LogingDaily/modinfo.json +++ b/src/modules/virtual/LogingDaily/modinfo.json @@ -1,49 +1,50 @@ { - "menuSection": "virtual_elments", - "configItem": [ - { - "global": 0, - "name": "График дневного расхода", - "type": "Writing", - "subtype": "LogingDaily", - "id": "log", - "widget": "chart3", - "page": "Графики", - "descr": "Температура", - "num": 1, - "int": 1, - "logid": "t", - "points": 200, - "telegram": 0, - "test": 0, - "btn-defvalue": 0, - "btn-reset": "nil" - } - ], - "about": { - "authorName": "Dmitry Borisenko", - "authorContact": "https://t.me/Dmitry_Borisenko", - "authorGit": "https://github.com/DmitryBorisenko33", - "specialThanks": "@itsid1 @Valiuhaaa Serg", - "moduleName": "LogingDaily", - "moduleVersion": "3.1", - "usedRam": { - "esp32_4mb": 15, - "esp8266_4mb": 15 - }, - "title": "График дневного расхода", - "moduleDesc": "Расширение позволяющее логировать накопительные величины и видеть их дневное изменение. Графики доступны в мобильном приложении и в веб интерфейсе. Данные графиков хранятся в встроенной памяти esp", - "propInfo": { - "int": "Интервал логирования в мнутах, частота проверки смены суток в минутах. Не рекомендуется менять", - "logid": "ID накопительной величины которую будем логировать", - "points": "Максимальное количество точек", - "telegram": "График будет отправлять в телеграм репорт с расходами каждый день", - "test": "Параметр необходим для разработчиков. Режим тестирования. График будет обновляться не раз в сутки, а кадый заданный в int интервал." - } + "menuSection": "virtual_elments", + "configItem": [ + { + "global": 0, + "name": "График дневного расхода", + "type": "Writing", + "subtype": "LogingDaily", + "id": "log", + "widget": "chart3", + "page": "Графики", + "descr": "Температура", + "num": 1, + "int": 1, + "logid": "t", + "points": 365, + "telegram": 0, + "test": 0, + "btn-defvalue": 0, + "btn-reset": "nil" + } + ], + "about": { + "authorName": "Dmitry Borisenko", + "authorContact": "https://t.me/Dmitry_Borisenko", + "authorGit": "https://github.com/DmitryBorisenko33", + "specialThanks": "@itsid1 @Valiuhaaa Serg", + "moduleName": "LogingDaily", + "moduleVersion": "3.1", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 }, - "defActive": true, - "usedLibs": { - "esp32*": [], - "esp82*": [] + "title": "График дневного расхода", + "moduleDesc": "Расширение позволяющее логировать накопительные величины и видеть их дневное изменение. Графики доступны в мобильном приложении и в веб интерфейсе. Данные графиков хранятся в встроенной памяти esp", + "propInfo": { + "int": "Интервал логирования в мнутах, частота проверки смены суток в минутах. Не рекомендуется менять", + "logid": "ID накопительной величины которую будем логировать", + "points": "Максимальное количество точек", + "telegram": "График будет отправлять в телеграм репорт с расходами каждый день", + "test": "Параметр необходим для разработчиков. Режим тестирования. График будет обновляться не раз в сутки, а кадый заданный в int интервал." } + }, + "defActive": true, + "usedLibs": { + "esp32*": [], + "esp82*": [], + "bk72*": [] + } } \ No newline at end of file diff --git a/src/modules/virtual/LogingHourly/LogingHourly.cpp b/src/modules/virtual/LogingHourly/LogingHourly.cpp new file mode 100644 index 00000000..4d4ed935 --- /dev/null +++ b/src/modules/virtual/LogingHourly/LogingHourly.cpp @@ -0,0 +1,339 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include "ESPConfiguration.h" +#include "NTP.h" + +class LogingHourly : public IoTItem +{ +private: + String logid; + String id; + String filesList = ""; + + String descr; + + int _publishType = -2; + int _wsNum = -1; + + int points; + + int testMode; + + int telegram; + + IoTItem *dateIoTItem; + + // String prevDate = ""; + String prevHourly = ""; + bool firstTimeInit = true; + + // long interval; + +public: + LogingHourly(String parameters) : IoTItem(parameters) + { + jsonRead(parameters, F("logid"), logid); + jsonRead(parameters, F("id"), id); + jsonRead(parameters, F("points"), points); + jsonRead(parameters, F("test"), testMode); + jsonRead(parameters, F("telegram"), telegram); + jsonRead(parameters, F("descr"), descr); + + long interval; + + jsonRead(parameters, F("int"), interval); + interval = interval * 1000 * 60; // приводим к милисекундам + } + + void doByInterval() + { + if (hasHourlyChanged() || testMode == 1) + { + execute(); + } + } + + void execute() + { + // если объект логгирования не был создан + if (!isItemExist(logid)) + { + SerialPrint("E", F("LogingHourly"), "'" + id + "' LogingHourly object not exist, return"); + return; + } + + String value = getItemValue(logid); + + // если значение логгирования пустое + if (value == "") + { + SerialPrint("E", F("LogingHourly"), "'" + id + "' LogingHourly value is empty, return"); + return; + } + + // если время не было получено из интернета + if (!isTimeSynch) + { + SerialPrint("E", F("LogingHourly"), "'" + id + "' Cant LogingHourly - time not synchronized, return"); + return; + } + + String logData; + + float currentValue = value.toFloat(); + // прочитаем предудущее значение + float prevValue = readDataDB(id + "-v").toFloat(); + // сохраним в базу данных текущее значение, понадобится в следующие час + saveDataDB(id + "-v", value); + + float difference = currentValue - prevValue; + + if (telegram == 1) + { + String msg = descr + ": total " + String(currentValue) + ", consumed " + String(difference); + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) + { + if ((*it)->getSubtype() == "TelegramLT" || "Telegram") + { + (*it)->sendTelegramMsg(false, msg); + } + } + } + + // jsonWriteInt(logData, "x", unixTime - 120); + jsonWriteInt(logData, "x", unixTime - 120); + jsonWriteFloat(logData, "y1", difference); + + // прочитаем путь к файлу последнего сохранения + String filePath = readDataDB(id); + + // если данные о файле отсутствуют, создадим новый + if (filePath == "failed" || filePath == "") + { + SerialPrint("E", F("LogingHourly"), "'" + id + "' file path not found, start create new file"); + createNewFileWithData(logData); + return; + } + + // считаем количество строк и определяем размер файла + size_t size = 0; + int lines = countJsonObj(filePath, size); + SerialPrint("i", F("LogingHourly"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); + + // если количество строк до заданной величины и час и дата не менялась + // if (lines <= points && !hasHourlyChanged()) { + if (lines <= points) + { + // просто добавим в существующий файл новые данные + addNewDataToExistingFile(filePath, logData); + } + else + { + String file = readFile(filePath, 2000); + file = deleteBeforeDelimiter(file, "},"); + writeFile(filePath, file); + addNewDataToExistingFile(filePath, logData); + } + } + + void createNewFileWithData(String &logData) + { + logData = logData + ","; + + String path = "/lgh/" + id + "/" + id + ".txt"; // создадим путь вида /lgd/id/id.txt + // создадим пустой файл + if (writeEmptyFile(path) != "success") + { + SerialPrint("E", F("LogingHourly"), "'" + id + "' file writing error, return"); + return; + } + + // запишем в него данные + if (addFile(path, logData) != "success") + { + SerialPrint("E", F("LogingHourly"), "'" + id + "' data writing error, return"); + return; + } + // запишем путь к нему в базу данных + if (saveDataDB(id, path) != "success") + { + SerialPrint("E", F("LogingHourly"), "'" + id + "' db file writing error, return"); + return; + } + SerialPrint("i", F("LogingHourly"), "'" + id + "' file created http://" + WiFi.localIP().toString() + path); + } + + void addNewDataToExistingFile(String &path, String &logData) + { + logData = logData + ","; + if (addFile(path, logData) != "success") + { + SerialPrint("i", F("LogingHourly"), "'" + id + "' file writing error, return"); + return; + }; + SerialPrint("i", F("LogingHourly"), "'" + id + "' LogingHourly in file http://" + WiFi.localIP().toString() + path); + } + const String getTimeLocal_hh() + { + char buf[32]; + sprintf(buf, "%02d", _time_local.hour); + return String(buf); + } + + bool hasHourlyChanged() + { + bool changed = false; + String currentHourly = getTimeLocal_hh(); + if (!firstTimeInit) + { + if (prevHourly != currentHourly) + { + changed = true; + SerialPrint("i", F("NTP"), F("Change hourly event")); +#if defined(ESP8266) + FileFS.gc(); +#endif +#if defined(ESP32) +#endif + } + } + if (isTimeSynch) + firstTimeInit = false; + prevHourly = currentHourly; + return changed; + } + + bool hasDayChanged() + { + bool changed = false; + String currentDate = getTodayDateDotFormated(); + if (!firstTimeInit) + { + if (prevDate != currentDate) + { + changed = true; + SerialPrint("i", F("NTP"), F("Change day event")); +#if defined(ESP8266) + FileFS.gc(); +#endif +#if defined(ESP32) +#endif + } + } + if (isTimeSynch) + firstTimeInit = false; + prevDate = currentDate; + return changed; + } + + void publishValue() + { + String dir = "/lgh/" + id; + filesList = getFilesList(dir); + + SerialPrint("i", F("LogingHourly"), "file list: " + filesList); + + int f = 0; + + while (filesList.length()) + { + String path = selectToMarker(filesList, ";"); + + path = "/lgh/" + id + path; + + f++; + String json = getAdditionalJson(); + if (_publishType == TO_MQTT) + { + publishChartFileToMqtt(path, id, calculateMaxCount()); + } + else if (_publishType == TO_WS) + { + sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); + } + else if (_publishType == TO_MQTT_WS) + { + publishChartFileToMqtt(path, id, calculateMaxCount()); + sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); + } + SerialPrint("i", F("LogingHourly"), String(f) + ") " + path + ", sent"); + + filesList = deleteBeforeDelimiter(filesList, ";"); + } + } + + String getAdditionalJson() + { + String topic = mqttRootDevice + "/" + id; + String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\"}"; + return json; + } + + void clearHistory() + { + String dir = "/lgh/" + id; + cleanDirectory(dir); + } + + // void publishChartToWsSinglePoint(String value) { + // String topic = mqttRootDevice + "/" + id; + // String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + "}]}"; + // String pk = "/string/chart.json|" + json; + // standWebSocket.broadcastTXT(pk); + // } + + void setPublishDestination(int publishType, int wsNum = -1) + { + _publishType = publishType; + _wsNum = wsNum; + } + + String getValue() + { + return ""; + } + /* + void loop() { + if (enableDoByInt) { + currentMillis = millis(); + difference = currentMillis - prevMillis; + if (difference >= interval) { + prevMillis = millis(); + this->doByInterval(); + } + } + } + */ + // просто максимальное количество точек + int calculateMaxCount() + { + // return 1440;//1440 + return 3600; // 1440 + } + + void onModuleOrder(String &key, String &value) + { + if (key == "defvalue") + { + saveDataDB(id + "-v", value); + SerialPrint("i", F("LogingHourly"), "User set default value: " + value); + } + else if (key == "reset") + { + clearHistory(); + SerialPrint("i", F("LogingHourly"), F("User clean chart history")); + } + } +}; + +void *getAPI_LogingHourly(String subtype, String param) +{ + if (subtype == F("LogingHourly")) + { + return new LogingHourly(param); + } + else + { + return nullptr; + } +} diff --git a/src/modules/virtual/LogingHourly/modinfo.json b/src/modules/virtual/LogingHourly/modinfo.json new file mode 100644 index 00000000..bcb18142 --- /dev/null +++ b/src/modules/virtual/LogingHourly/modinfo.json @@ -0,0 +1,50 @@ +{ + "menuSection": "virtual_elments", + "configItem": [ + { + "global": 0, + "name": "График часового расхода", + "type": "Writing", + "subtype": "LogingHourly", + "id": "logh", + "widget": "chart3", + "page": "Графики", + "descr": "Расход в час", + "num": 1, + "int": 1, + "logid": "", + "points": 24, + "telegram": 0, + "test": 0, + "btn-defvalue": 0, + "btn-reset": "nil" + } + ], + "about": { + "authorName": "AVAKS", + "authorContact": "https://t.me/avaks", + "authorGit": "https://github.com/avaksru", + "specialThanks": "@itsid1 @Valiuhaaa Serg @Serghei63", + "moduleName": "LogingHourly", + "moduleVersion": "2", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "График часового расхода", + "moduleDesc": "Расширение позволяющее логировать накопительные величины и видеть их часовое изменение. Графики доступны в мобильном приложении и в веб интерфейсе. Данные графиков хранятся в встроенной памяти esp", + "propInfo": { + "int": "Интервал логирования в мнутах, частота проверки смены часа в минутах. Не рекомендуется менять", + "logid": "ID накопительной величины которую будем логировать", + "points": "Максимальное количество точек", + "telegram": "График будет отправлять в телеграм репорт с расходами каждый час", + "test": "Параметр необходим для разработчиков. Режим тестирования. График будет обновляться не раз в час, а кадый заданный в int интервал." + } + }, + "defActive": true, + "usedLibs": { + "esp32*": [], + "esp82*": [], + "bk72*": [] + } +} \ No newline at end of file From d392858cb1f8e08c4348d06cbb52faf529b93d7c Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 22 Nov 2024 22:45:10 +0300 Subject: [PATCH 020/118] add board ESP32-C6 4mb and 8mb --- include/Const.h | 12 +- include/DebugTrace.h | 5 +- myProfile.json | 20 ++- platformio.ini | 179 +++++++++++++++++++++++ src/DebugTrace.cpp | 8 +- src/EspFileSystem.cpp | 5 +- src/Main.cpp | 6 +- src/PeriodicTasks.cpp | 6 +- src/modules/exec/Mp3/modinfo.json | 6 + src/modules/exec/Pwm32/Pwm32.cpp | 16 +- src/modules/sensors/Ds18b20/modinfo.json | 6 + src/utils/WiFiUtils.cpp | 4 + tools/patch32c6.py | 32 ++++ 13 files changed, 284 insertions(+), 21 deletions(-) create mode 100644 tools/patch32c6.py diff --git a/include/Const.h b/include/Const.h index bc84800d..b04cccf2 100644 --- a/include/Const.h +++ b/include/Const.h @@ -52,8 +52,16 @@ #define FIRMWARE_NAME "esp32s3_16mb" #endif -#ifdef LIBRETINY -#define FIRMWARE_NAME "libretiny" +#ifdef bk7231n +#define FIRMWARE_NAME "bk7231n" +#endif + +#ifdef esp32c6_4mb +#define FIRMWARE_NAME "esp32c6_4mb" +#endif + +#ifdef esp32c6_8mb +#define FIRMWARE_NAME "esp32c6_8mb" #endif // Размер буфера json diff --git a/include/DebugTrace.h b/include/DebugTrace.h index f73bce0d..26daa463 100644 --- a/include/DebugTrace.h +++ b/include/DebugTrace.h @@ -6,9 +6,10 @@ // xtensa-esp32-elf-addr2line.exe -pfiaC -e Путь_к_файлу/firmware.elf Стэк_адресов_из_сообщения // %%USERPROFILE%/.platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin xtensa-esp32-elf-addr2line.exe -pfiaC -e .pio/build/esp32_4mb3f/firmware.elf Стэк_адресов #include "Global.h" - +#if defined(ESP32) && !defined(esp32c3m_4mb) && !defined(esp32c6_4mb) && !defined(esp32c6_8mb) #define RESTART_DEBUG_INFO -#if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) +#endif +#if defined(RESTART_DEBUG_INFO) #define CONFIG_RESTART_DEBUG_STACK_DEPTH 15 typedef struct { size_t heap_total; diff --git a/myProfile.json b/myProfile.json index 0e6bc051..2ec4b43e 100644 --- a/myProfile.json +++ b/myProfile.json @@ -21,12 +21,12 @@ "pinSDA": 0, "i2cFreq": 100000, "wg": "group1", - "debugTrace": 1 + "debugTrace": 1 }, "projectProp": { "platformio": { "default_envs": "esp32_4mb3f", - "comments_default_envs": "choose from: esp8266_4mb, esp32_4mb, esp32_4mb3f, esp8266_16mb, esp32_16mb, esp32cam_4mb, esp32s2_4mb, esp32s3_16mb, esp32c3m_4mb, esp8266_1mb, esp8266_1mb_ota, esp8266_2mb, esp8266_2mb_ota, esp8285_1mb, esp8285_1mb_ota", + "comments_default_envs": "choose from: esp8266_4mb, esp32_4mb, esp32_4mb3f, esp8266_16mb, esp32_16mb, esp32cam_4mb, esp32s2_4mb, esp32s3_16mb, esp32c3m_4mb, esp8266_1mb, esp8266_1mb_ota, esp8266_2mb, esp8266_2mb_ota, esp8285_1mb, esp8285_1mb_ota, esp32c6_4mb, esp32c6_8mb, bk7231n", "envs": [ { "name": "esp8266_4mb", @@ -123,6 +123,22 @@ "firmware": "0x10000", "partitions": "0x8000", "littlefs": "0x910000" + }, + { + "name": "esp32c6_4mb", + "boot_app0": "0xe000", + "bootloader_qio_80m": "0x1000", + "firmware": "0x10000", + "partitions": "0x8000", + "littlefs": "0x310000" + }, + { + "name": "esp32c6_8mb", + "boot_app0": "0xe000", + "bootloader_qio_80m": "0x1000", + "firmware": "0x10000", + "partitions": "0x8000", + "littlefs": "0x670000" } ] } diff --git a/platformio.ini b/platformio.ini index 80839aa4..4e18d664 100644 --- a/platformio.ini +++ b/platformio.ini @@ -381,6 +381,65 @@ build_src_filter = + ${env:esp32_16mb_fromitems.build_src_filter} +[env:esp32c6_4mb] +extra_scripts = pre:tools/patch32c6.py +lib_deps = + ${common_env_data.lib_deps_external} + ${env:esp32c6_4mb_fromitems.lib_deps} +lib_ignore = LT_WebSockets +build_flags = + -Desp32c6_4mb="esp32c6_4mb" + -DARDUINO_USB_CDC_ON_BOOT=0 + -DARDUINO_USB_MODE=0 + -Wl,--wrap=esp_panic_handler +framework = arduino +board = esp32-c6-devkitm-1 +platform = espressif32 @6.9.0 +platform_packages = + platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git + platformio/framework-arduinoespressif32-libs @ https://github.com/espressif/esp32-arduino-libs.git#idf-release/v5.1 +monitor_filters = esp32_exception_decoder +upload_speed = 921600 +monitor_speed = 115200 +debug_tool = esp-prog +board_build.partitions = tools/partitions_custom.csv +board_build.filesystem = littlefs +build_src_filter = + +<*.cpp> + + + + + + + ${env:esp32c6_4mb_fromitems.build_src_filter} + +[env:esp32c6_8mb] +extra_scripts = pre:tools/patch32c6.py +lib_deps = + ${common_env_data.lib_deps_external} + ${env:esp32c6_8mb_fromitems.lib_deps} +lib_ignore = LT_WebSockets +build_flags = + -Desp32c6_4mb="esp32c6_4mb" + -DARDUINO_USB_CDC_ON_BOOT=0 + -DARDUINO_USB_MODE=0 + -Wl,--wrap=esp_panic_handler +framework = arduino +board = esp32-c6-devkitc-1 +platform = espressif32 @6.9.0 +platform_packages = + platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git + platformio/framework-arduinoespressif32-libs @ https://github.com/espressif/esp32-arduino-libs.git#idf-release/v5.1 +monitor_filters = esp32_exception_decoder +upload_speed = 921600 +monitor_speed = 115200 +debug_tool = esp-prog +board_build.filesystem = littlefs +build_src_filter = + +<*.cpp> + + + + + + + ${env:esp32c6_8mb_fromitems.build_src_filter} + [env:bk7231n] extra_scripts = pre:tools/lt_fsbuildscript.py lib_compat_mode = off @@ -882,6 +941,126 @@ build_src_filter = + + +[env:esp32c6_4mb_fromitems] +lib_deps = + https://github.com/enjoyneering/AHTxx.git + adafruit/Adafruit BME280 Library + adafruit/Adafruit BMP280 Library + beegee-tokyo/DHT sensor library for ESPx + https://github.com/pstolarz/Arduino-Temperature-Control-Library.git#OneWireNg + robtillaart/SHT2x@^0.1.1 + WEMOS SHT3x@1.0.0 + plerup/EspSoftwareSerial + gyverlibs/EncButton @ ^2.0 + https://github.com/RoboticsBrno/ServoESP32#v1.0.3 + adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 + adafruit/Adafruit BusIO @ ^1.13.2 + adafruit/Adafruit BusIO @ ^1.13.2 + https://github.com/robotclass/RobotClass_LiquidCrystal_I2C + marcoschwartz/LiquidCrystal_I2C@^1.1.4 + https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED + https://github.com/adafruit/Adafruit-GFX-Library +build_src_filter = + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[env:esp32c6_8mb_fromitems] +lib_deps = + https://github.com/enjoyneering/AHTxx.git + adafruit/Adafruit BME280 Library + adafruit/Adafruit BMP280 Library + beegee-tokyo/DHT sensor library for ESPx + https://github.com/pstolarz/Arduino-Temperature-Control-Library.git#OneWireNg + robtillaart/SHT2x@^0.1.1 + WEMOS SHT3x@1.0.0 + plerup/EspSoftwareSerial + gyverlibs/EncButton @ ^2.0 + https://github.com/RoboticsBrno/ServoESP32#v1.0.3 + adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 + adafruit/Adafruit BusIO @ ^1.13.2 + adafruit/Adafruit BusIO @ ^1.13.2 + https://github.com/robotclass/RobotClass_LiquidCrystal_I2C + marcoschwartz/LiquidCrystal_I2C@^1.1.4 + https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED + https://github.com/adafruit/Adafruit-GFX-Library +build_src_filter = + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [env:bk7231n_fromitems] lib_deps = build_src_filter = diff --git a/src/DebugTrace.cpp b/src/DebugTrace.cpp index e4a8e160..49cb0239 100644 --- a/src/DebugTrace.cpp +++ b/src/DebugTrace.cpp @@ -1,5 +1,5 @@ #include "DebugTrace.h" -#if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) +#if defined(RESTART_DEBUG_INFO) // #ifdef RESTART_DEBUG_INFO __NOINIT_ATTR static re_restart_debug_t _debug_info; @@ -282,12 +282,14 @@ void sendDebugTraceAndFreeMemory(bool postMsg) void printDebugTrace() {} void sendDebugTraceAndFreeMemory(bool) {} //void IRAM_ATTR debugUpdate() {} +#if !defined(esp32c6_4mb) && !defined(esp32c6_8mb) extern "C" void __wrap_esp_panic_handler(void *info) { // Call the original panic handler function to finish processing this error (creating a core dump for example...) __real_esp_panic_handler(info); } -#endif // RESTART_DEBUG_INFO +#endif //esp32c6 +#endif // !RESTART_DEBUG_INFO #if defined(ESP32) @@ -299,8 +301,10 @@ extern "C" void __wrap_esp_panic_handler(void *info) void startWatchDog() { +#if !defined(esp32c6_4mb) && !defined(esp32c6_8mb) //TODO esp32-c6 переписать esp_task_wdt_init esp_task_wdt_init(WDT_TIMEOUT, true); // enable panic so ESP32 restarts esp_task_wdt_add(NULL); // add current thread to WDT watch +#endif } extern "C" bool verifyRollbackLater() diff --git a/src/EspFileSystem.cpp b/src/EspFileSystem.cpp index 1ff8090b..cebead18 100644 --- a/src/EspFileSystem.cpp +++ b/src/EspFileSystem.cpp @@ -1,5 +1,8 @@ #include "EspFileSystem.h" #include "Global.h" +#if defined(esp32c6_4mb) || defined(esp32c6_8mb) +#include "esp_mac.h" +#endif bool fileSystemInit() { @@ -149,7 +152,7 @@ const String getMacAddress() char buf[13] = { 0 }; #if defined(ESP8266) WiFi.macAddress(mac); - sprintf(buf, MACSTR, MAC2STR(mac)); + sprintf(buf, MACSTR, MAC2STR(mac)); #elif defined(ESP32) esp_read_mac(mac, ESP_MAC_WIFI_STA); sprintf(buf, MACSTR, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); diff --git a/src/Main.cpp b/src/Main.cpp index 223f1470..bcfe6d9e 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -104,7 +104,7 @@ void setup() { Serial.begin(115200); Serial.flush(); //----------- Отладка EXCEPTION (функции с заглушками для отключения) --------- -#if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) +#if defined(RESTART_DEBUG_INFO) //Привязка коллбэк функции для вызова при перезагрузке esp_register_shutdown_handler(debugUpdate); #endif // RESTART_DEBUG_INFO @@ -156,7 +156,7 @@ void setup() { #endif SerialPrint("i", "i2c", F("i2c pins overriding done")); } -#if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) +#if defined(RESTART_DEBUG_INFO) esp_reset_reason_t esp_reason = esp_reset_reason(); if (esp_reason == ESP_RST_UNKNOWN || esp_reason == ESP_RST_POWERON) bootloop_panic_count = 0; @@ -291,7 +291,7 @@ void setup() { Serial.println("--------test end---------"); stopErrorMarker(SETUPLAST_ERRORMARKER); -#if defined(RESTART_DEBUG_INFO) && defined(ESP32) && !defined(esp32c3m_4mb) +#if defined(RESTART_DEBUG_INFO) bootloop_panic_count = 0; #endif // RESTART_DEBUG_INFO } diff --git a/src/PeriodicTasks.cpp b/src/PeriodicTasks.cpp index c4979963..9427a623 100644 --- a/src/PeriodicTasks.cpp +++ b/src/PeriodicTasks.cpp @@ -64,7 +64,7 @@ String ESP_getResetReason(void) { return ESP.getResetReason(); } #endif -#if defined(esp32s2_4mb) || defined(esp32s3_16mb) || defined(esp32c3m_4mb) +#if defined(esp32s2_4mb) || defined(esp32s3_16mb) || defined(esp32c3m_4mb) || defined(esp32c6_4mb) || defined(esp32c6_8mb) String ESP_getResetReason(void) { // return ESP32GetResetReason(0); // CPU 0 esp_reset_reason_t esp_reason = esp_reset_reason(); @@ -102,8 +102,8 @@ String ESP32GetResetReason(uint32_t cpu_no) { return F("Timer Group1 Watchdog reset digital core"); // 8 case RTCWDT_SYS_RESET: return F("RTC Watchdog Reset digital core"); // 9 - case INTRUSION_RESET: - return F("Instrusion tested to reset CPU"); // 10 +// case INTRUSION_RESET: +// return F("Instrusion tested to reset CPU"); // 10 case TG0WDT_CPU_RESET: return F("Time Group reset CPU"); // 11 case RTC_SW_CPU_RESET: diff --git a/src/modules/exec/Mp3/modinfo.json b/src/modules/exec/Mp3/modinfo.json index 631ba050..e64d1460 100644 --- a/src/modules/exec/Mp3/modinfo.json +++ b/src/modules/exec/Mp3/modinfo.json @@ -92,6 +92,12 @@ "esp32*": [ "dfrobot/DFRobotDFPlayerMini @ ^1.0.5" ], + "esp32c6_4mb": [ + "exclude" + ], + "esp32c6_8mb": [ + "exclude" + ], "esp82*": [ "dfrobot/DFRobotDFPlayerMini @ ^1.0.5" ] diff --git a/src/modules/exec/Pwm32/Pwm32.cpp b/src/modules/exec/Pwm32/Pwm32.cpp index 79f6eedf..875595fe 100644 --- a/src/modules/exec/Pwm32/Pwm32.cpp +++ b/src/modules/exec/Pwm32/Pwm32.cpp @@ -8,15 +8,15 @@ extern IoTGpio IoTgpio; class Pwm32 : public IoTItem { - private: +private: int _pin; - int _freq; + int _freq; int _apin, _oldValue; bool _freezVal = true; - int _ledChannel; + int _ledChannel; int _resolution; - public: +public: Pwm32(String parameters): IoTItem(parameters) { _interval = _interval / 1000; // корректируем величину интервала int, теперь он в миллисекундах @@ -24,10 +24,14 @@ class Pwm32 : public IoTItem { jsonRead(parameters, "freq", _freq); jsonRead(parameters, "ledChannel", _ledChannel); jsonRead(parameters, "PWM_resolution", _resolution); - + pinMode(_pin, OUTPUT); +#if defined(esp32c6_4mb) || defined(esp32c6_8mb) + ledcAttachChannel(_pin, _freq, _resolution, _ledChannel); +#else ledcSetup(_ledChannel, _freq, _resolution); ledcAttachPin(_pin, _ledChannel); +#endif ledcWrite(_ledChannel, value.valD); _resolution = pow(2, _resolution); // переводим биты в значение @@ -53,7 +57,7 @@ class Pwm32 : public IoTItem { } } } - + void setValue(const IoTValue& Value, bool genEvent = true) { value = Value; ledcWrite(_ledChannel, value.valD); diff --git a/src/modules/sensors/Ds18b20/modinfo.json b/src/modules/sensors/Ds18b20/modinfo.json index 85bd3c96..39639737 100644 --- a/src/modules/sensors/Ds18b20/modinfo.json +++ b/src/modules/sensors/Ds18b20/modinfo.json @@ -42,6 +42,12 @@ "esp32*": [ "https://github.com/milesburton/Arduino-Temperature-Control-Library" ], + "esp32c6_4mb": [ + "https://github.com/pstolarz/Arduino-Temperature-Control-Library.git#OneWireNg" + ], + "esp32c6_8mb": [ + "https://github.com/pstolarz/Arduino-Temperature-Control-Library.git#OneWireNg" + ], "esp82*": [ "https://github.com/milesburton/Arduino-Temperature-Control-Library" ] diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index 2973fde0..bd44849d 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -17,7 +17,11 @@ IPAddress stringToIp(String strIp) void routerConnect() { #if !defined LIBRETINY +#if defined(esp32c6_4mb) || defined(esp32c6_8mb) + WiFi.setAutoReconnect(false); +#else WiFi.setAutoConnect(false); +#endif WiFi.persistent(false); #endif /* String s_staip = "192.168.2.62"; diff --git a/tools/patch32c6.py b/tools/patch32c6.py new file mode 100644 index 00000000..7ab88d88 --- /dev/null +++ b/tools/patch32c6.py @@ -0,0 +1,32 @@ +import json +import os +import shutil +from sys import platform + +if platform == "linux" or platform == "linux2": + # linux + devkitm = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitm-1.json' + devkitc = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitc-1.json' +else: + # windows + devkitm = os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif32\\boards\\esp32-c6-devkitm-1.json' + devkitc = os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif32\\boards\\esp32-c6-devkitc-1.json' + +def add_arduino_to_frameworks(file_name): + with open(file_name, 'r+') as f: + data = json.load(f) + frameworks = data['frameworks'] + if 'arduino' not in frameworks: + frameworks.insert(frameworks.index('espidf') + 1, 'arduino') + data['frameworks'] = frameworks + f.seek(0) + json.dump(data, f, indent=4) + f.truncate() + else: + print(f"Arduino already exists in {file_name}") + +if os.path.exists(devkitm) and os.path.exists(devkitc): + add_arduino_to_frameworks(devkitm) + add_arduino_to_frameworks(devkitc) +else: + print("One or both files do not exist.") \ No newline at end of file From 3a17e0c57c38f60004bbe5aeb837f5914118b5ed Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 23 Nov 2024 20:31:16 +0300 Subject: [PATCH 021/118] fix bk7231n --- platformio.ini | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 4e18d664..d43eff2e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -391,7 +391,7 @@ build_flags = -Desp32c6_4mb="esp32c6_4mb" -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MODE=0 - -Wl,--wrap=esp_panic_handler + -Wl,--wrap=esp_panic_handler framework = arduino board = esp32-c6-devkitm-1 platform = espressif32 @6.9.0 @@ -421,7 +421,7 @@ build_flags = -Desp32c6_4mb="esp32c6_4mb" -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MODE=0 - -Wl,--wrap=esp_panic_handler + -Wl,--wrap=esp_panic_handler framework = arduino board = esp32-c6-devkitc-1 platform = espressif32 @6.9.0 @@ -457,6 +457,7 @@ custom_fw_version = 0.0.1 upload_speed = 115200 monitor_speed = 115200 build_flags = + -Dbk7231n="bk7231n" -DLT_LOGLEVEL=LT_LEVEL_DEBUG -DLT_DEBUG_ALL=1 -DPROJECT_DATA_DIR="data_svelte" @@ -1072,6 +1073,10 @@ build_src_filter = + + + + + + + + + + + + + From 13d0b514a353dfbb88d9f9a3067a1a44dfd6e62c Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 25 Nov 2024 00:20:16 +0300 Subject: [PATCH 022/118] easy build and flash bk7231n --- platformio.ini | 4 +++- tools/lt_fsbuild.py | 38 ++++++++++++++++++++++++++++++++++++++ tools/lt_fsflash.py | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 tools/lt_fsbuild.py create mode 100644 tools/lt_fsflash.py diff --git a/platformio.ini b/platformio.ini index d43eff2e..5ad878c4 100644 --- a/platformio.ini +++ b/platformio.ini @@ -441,7 +441,9 @@ build_src_filter = ${env:esp32c6_8mb_fromitems.build_src_filter} [env:bk7231n] -extra_scripts = pre:tools/lt_fsbuildscript.py +extra_scripts = + pre:tools/lt_fsbuild.py + pre:tools/lt_fsflash.py lib_compat_mode = off lib_deps = LT_WebSockets diff --git a/tools/lt_fsbuild.py b/tools/lt_fsbuild.py new file mode 100644 index 00000000..4eb04226 --- /dev/null +++ b/tools/lt_fsbuild.py @@ -0,0 +1,38 @@ + +# c:\Users\bmw\.platformio\penv\Scripts\pio run -t buildfs +#c:\Users\bmw\.platformio\penv\.libretiny\Scripts\ltchiptool -v flash write lt_littlefs.bin --start 0x1db000 -f BK7231N + + + +Import("env") + +# Определите имя таргета +target_name = "buildfs" + +# Получите путь к директории с данными из переменной среды env +data_dir = env.subst("$PROJECT_DIR") + "/data_svelte" + +# Получите путь к выходному файлу LittleFS из переменной среды env +output_file = env.subst("$PROJECT_DIR") + "/lt_littlefs.bin" + +# Получите путь к mklittlefs.exe из переменной среды env +mklittlefs_path = env.subst("$PROJECT_DIR") + "/tools/mklittlefs.exe" + +# Определите команду, которая будет выполнена при вызове таргета +command = "{} -c {} -s 0x25000 -p 0x100 -b 0x1000 {}".format(mklittlefs_path, data_dir, output_file) + +# Добавьте кастомный таргет +env.AddCustomTarget( + name=target_name, + dependencies=None, + actions=[command], + title="Build LittleFS", + description="Build LittleFS file system" +) + + +# Определите путь к исполняемому файлу ltchiptool +ltchiptool_path = "${LTCHIPTOOL}" + + +print("Custom target '{}' added!".format(target_name)) \ No newline at end of file diff --git a/tools/lt_fsflash.py b/tools/lt_fsflash.py new file mode 100644 index 00000000..1f71fa6b --- /dev/null +++ b/tools/lt_fsflash.py @@ -0,0 +1,34 @@ + +# c:\Users\bmw\.platformio\penv\Scripts\pio run -t buildfs +#c:\Users\bmw\.platformio\penv\.libretiny\Scripts\ltchiptool -v flash write lt_littlefs.bin --start 0x1db000 -f BK7231N -c + + + +Import("env") + +# Определите имя таргета +target_name = "flashfs" + +# Получите путь к выходному файлу LittleFS из переменной среды env +output_file = env.subst("$PROJECT_DIR") + "/lt_littlefs.bin" + +# Получите путь к mklittlefs.exe из переменной среды env +ltchiptool_path = "${LTCHIPTOOL}" +# Определите команду, которая будет выполнена при вызове таргета +command = "{} flash write {} -s 0x1db000 -c -f BK7231N ".format(ltchiptool_path, output_file) + +# Добавьте кастомный таргет +env.AddCustomTarget( + name=target_name, + dependencies=None, + actions=[command], + title="Flash LittleFS", + description="Flash LittleFS file system" +) + + +# Определите путь к исполняемому файлу ltchiptool + + + +print("Custom target '{}' added!".format(target_name)) \ No newline at end of file From 3aaeb760da63d1122e701cebbedc41c28f100fc4 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 26 Nov 2024 21:04:22 +0300 Subject: [PATCH 023/118] fix HomeD --- include/Global.h | 1 + src/Global.cpp | 1 + src/MqttClient.cpp | 5 +++-- .../virtual/DiscoveryHomeD/DiscoveryHomeD.cpp | 18 +++++++++--------- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/include/Global.h b/include/Global.h index d4a79336..0df14fe3 100644 --- a/include/Global.h +++ b/include/Global.h @@ -124,6 +124,7 @@ extern int mqttPort; extern String mqttPrefix; extern String mqttUser; extern String mqttPass; +extern String nameId; extern unsigned long mqttUptime; extern unsigned long flashWriteNumber; diff --git a/src/Global.cpp b/src/Global.cpp index afbb6e0f..0e00c731 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -62,6 +62,7 @@ int mqttPort = 0; String mqttPrefix = ""; String mqttUser = ""; String mqttPass = ""; +String nameId = ""; unsigned long mqttUptime = 0; unsigned long flashWriteNumber = 0; diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index a2b31747..b3a26a56 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -62,7 +62,7 @@ boolean mqttConnect() { if (mqttUser != "" && mqttPass != "") { if (HOMEdDiscovery) { - connected = mqtt.connect(chipId.c_str(), mqttUser.c_str(), mqttPass.c_str(), (HOMEdDiscovery->HOMEdTopic + "/device/custom/" + chipId).c_str(), 1, true, "{\"status\":\"offline\"}"); + connected = mqtt.connect(chipId.c_str(), mqttUser.c_str(), mqttPass.c_str(), (HOMEdDiscovery->HOMEdTopic + "/device/custom/" + nameId).c_str(), 1, true, "{\"status\":\"offline\"}"); } else { @@ -72,7 +72,7 @@ boolean mqttConnect() { } else if (mqttUser == "" && mqttPass == "") { if (HOMEdDiscovery) { - connected = mqtt.connect(chipId.c_str(), (HOMEdDiscovery->HOMEdTopic + "/device/custom/" + chipId).c_str(), 1, true, "{\"status\":\"offline\"}"); + connected = mqtt.connect(chipId.c_str(), (HOMEdDiscovery->HOMEdTopic + "/device/custom/" + nameId).c_str(), 1, true, "{\"status\":\"offline\"}"); } else { @@ -120,6 +120,7 @@ void getMqttData() { mqttUser = jsonReadStr(settingsFlashJson, F("mqttUser")); mqttPass = jsonReadStr(settingsFlashJson, F("mqttPass")); mqttPrefix = jsonReadStr(settingsFlashJson, F("mqttPrefix")); + nameId = jsonReadStr(settingsFlashJson, F("name")); mqttRootDevice = mqttPrefix + "/" + chipId; } diff --git a/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp b/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp index a7c1703a..0fa8be96 100644 --- a/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp +++ b/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp @@ -90,8 +90,8 @@ class DiscoveryHomeD : public IoTDiscovery if (mqttIsConnect() && !sendOk && topicOk) { sendOk = true; - publishRetain(_topic + "/device/custom/" + chipId, "{\"status\":\"online\"}"); - String HOMEdsubscribeTopic = _topic + "/td/custom/" + chipId; + publishRetain(_topic + "/device/custom/" + nameId, "{\"status\":\"online\"}"); + String HOMEdsubscribeTopic = _topic + "/td/custom/" + nameId; // mqtt.subscribe(HOMEdsubscribeTopic.c_str()); mqttSubscribeExternal(HOMEdsubscribeTopic); } @@ -103,7 +103,7 @@ class DiscoveryHomeD : public IoTDiscovery void publishStatusHOMEd(const String &topic, const String &data) { - String path_h = HOMEdTopic + "/fd/custom/" + chipId; + String path_h = HOMEdTopic + "/fd/custom/" + nameId; String json_h = "{}"; if (topic != "onStart") { @@ -133,8 +133,8 @@ class DiscoveryHomeD : public IoTDiscovery { deleteFromHOMEd(); getlayoutHOMEd(); - publishRetain(HOMEdTopic + "/device/custom/" + chipId, "{\"status\":\"online\"}"); - String HOMEdsubscribeTopic = HOMEdTopic + "/td/custom/" + chipId; + publishRetain(HOMEdTopic + "/device/custom/" + nameId, "{\"status\":\"online\"}"); + String HOMEdsubscribeTopic = HOMEdTopic + "/td/custom/" + nameId; mqtt.subscribe(HOMEdsubscribeTopic.c_str()); } } @@ -164,7 +164,7 @@ class DiscoveryHomeD : public IoTDiscovery JsonArray arr = doc.as(); String HOMEdJSON = ""; HOMEdJSON = "{\"action\":\"updateDevice\","; - HOMEdJSON = HOMEdJSON + "\"device\":\"" + chipId + "\","; + HOMEdJSON = HOMEdJSON + "\"device\":\"" + nameId + "\","; HOMEdJSON = HOMEdJSON + "\"data\":{"; HOMEdJSON = HOMEdJSON + "\"active\": true,"; HOMEdJSON = HOMEdJSON + "\"cloud\": false,"; @@ -178,7 +178,7 @@ class DiscoveryHomeD : public IoTDiscovery { String name = value["descr"]; String device = selectToMarkerLast(value["topic"].as(), "/"); - String id = chipId + "-" + device; + //String id = chipId + "-" + device; String expose = value["name"]; if (value["name"].as() == "toggle") { @@ -219,7 +219,7 @@ class DiscoveryHomeD : public IoTDiscovery file.close(); - publishRetain(HOMEdTopic + "/device/custom/" + chipId, "{\"status\":\"online\"}"); + publishRetain(HOMEdTopic + "/device/custom/" + nameId, "{\"status\":\"online\"}"); for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { @@ -243,7 +243,7 @@ class DiscoveryHomeD : public IoTDiscovery String HOMEdjson = ""; HOMEdjson = "{\"action\":\"removeDevice\","; HOMEdjson = HOMEdjson + "\"device\":\""; - HOMEdjson = HOMEdjson + chipId; + HOMEdjson = HOMEdjson + nameId; HOMEdjson = HOMEdjson + "\"}"; String topic = (HOMEdTopic + "/command/custom").c_str(); if (!publish(topic, HOMEdjson)) From 247cb5116947113c4285cf26c0d728ec57358158 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 26 Nov 2024 21:17:12 +0300 Subject: [PATCH 024/118] speed bk7231 --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 5ad878c4..c32924c8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -456,7 +456,7 @@ framework = arduino board = generic-bk7231n-qfn32-tuya custom_fw_name = iotm_tiny custom_fw_version = 0.0.1 -upload_speed = 115200 +upload_speed = 921600 monitor_speed = 115200 build_flags = -Dbk7231n="bk7231n" From d726e661c03f6dc11a9364b508e55bc9edcc6eaf Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 26 Nov 2024 23:30:16 +0300 Subject: [PATCH 025/118] local sever ota --- data_svelte/settings.json | 1 + include/Const.h | 4 ++++ include/StandWebServer.h | 1 + include/UpgradeFirm.h | 2 +- platformio.ini | 2 +- src/Main.cpp | 8 +++---- src/PeriodicTasks.cpp | 2 +- src/StandWebServer.cpp | 6 +++++ src/UpgradeFirm.cpp | 46 ++++++++++++++++++++++++--------------- 9 files changed, 47 insertions(+), 25 deletions(-) diff --git a/data_svelte/settings.json b/data_svelte/settings.json index 19bfee24..b08c5c80 100644 --- a/data_svelte/settings.json +++ b/data_svelte/settings.json @@ -14,6 +14,7 @@ "mqttUser": "rise", "mqttPass": "3hostel3", "serverip": "http://iotmanager.org", + "serverlocal": "http://192.168.1.2:5500", "log": 0, "mqttin": 0, "i2c": 0, diff --git a/include/Const.h b/include/Const.h index b04cccf2..9a18ea18 100644 --- a/include/Const.h +++ b/include/Const.h @@ -32,6 +32,10 @@ #define FIRMWARE_NAME "esp32_4mb" #endif +#ifdef esp32_4mb3f +#define FIRMWARE_NAME "esp32_4mb3f" +#endif + #ifdef esp32cam_4mb #define FIRMWARE_NAME "esp32cam_4mb" #endif diff --git a/include/StandWebServer.h b/include/StandWebServer.h index de8fa3d7..40898c46 100644 --- a/include/StandWebServer.h +++ b/include/StandWebServer.h @@ -9,6 +9,7 @@ extern bool handleFileRead(String path); extern void handleFileUpload(); extern void handleFileDelete(); extern void handleFileCreate(); +extern void handleLocalOTA(); extern void handleFileList(); //void printDirectory(File dir, String& out); extern void handleStatus(); diff --git a/include/UpgradeFirm.h b/include/UpgradeFirm.h index 2c5c5c3f..92a52c97 100644 --- a/include/UpgradeFirm.h +++ b/include/UpgradeFirm.h @@ -22,7 +22,7 @@ extern bool upgradeFS(String path); extern bool upgradeBuild(String path); extern void restartEsp(); -extern const String getBinPath(String file); +extern const String getBinPath(); extern void putUserDataToRam(); extern void saveUserDataToFlash(); extern void saveUpdeteStatus(String key, int val); \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index c32924c8..6dfdc42f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -232,7 +232,7 @@ lib_deps = ${env:esp32_4mb3f_fromitems.lib_deps} lib_ignore = LT_WebSockets build_flags = ${common.build_flags} - -Desp32_4mb="esp32_4mb" + -Desp32_4mb3f="esp32_4mb3f" -Wl,--wrap=esp_panic_handler framework = arduino board = esp32dev diff --git a/src/Main.cpp b/src/Main.cpp index bcfe6d9e..bf22d2d5 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -52,7 +52,7 @@ void elementsLoop() { #define COUNTER_ERRORMARKER 4 // количество шагов счетчика #define STEPPER_ERRORMARKER 100000 // размер шага счетчика интервала доверия выполнения блока кода мкс -#if defined(esp32_4mb) || defined(esp32_16mb) || defined(esp32cam_4mb) +#if defined(esp32_4mb) || defined(esp32_4mb3f) || defined(esp32_16mb) || defined(esp32cam_4mb) static int IRAM_ATTR initErrorMarkerId = 0; // ИД маркера static int IRAM_ATTR errorMarkerId = 0; @@ -71,14 +71,14 @@ void IRAM_ATTR onTimer() { #endif void initErrorMarker(int id) { -#if defined(esp32_4mb) || defined(esp32_16mb) || defined(esp32cam_4mb) +#if defined(esp32_4mb) || defined(esp32_4mb3f) || defined(esp32_16mb) || defined(esp32cam_4mb) initErrorMarkerId = id; errorMarkerCounter = 0; #endif } void stopErrorMarker(int id) { -#if defined(esp32_4mb) || defined(esp32_16mb) || defined(esp32cam_4mb) +#if defined(esp32_4mb) || defined(esp32_4mb3f) || defined(esp32_16mb) || defined(esp32cam_4mb) errorMarkerCounter = -1; if (errorMarkerId) SerialPrint("I", "WARNING!", "A lazy (freezing loop more than " + (String)(COUNTER_ERRORMARKER * STEPPER_ERRORMARKER / 1000) + " ms) section has been found! With ID=" + (String)errorMarkerId); @@ -91,7 +91,7 @@ void setup() { #if defined(esp32s2_4mb) || defined(esp32s3_16mb) USB.begin(); #endif -#if defined(esp32_4mb) || defined(esp32_16mb) || defined(esp32cam_4mb) +#if defined(esp32_4mb) || defined(esp32_4mb3f) || defined(esp32_16mb) || defined(esp32cam_4mb) My_timer = timerBegin(0, 80, true); timerAttachInterrupt(My_timer, &onTimer, true); timerAlarmWrite(My_timer, STEPPER_ERRORMARKER, true); diff --git a/src/PeriodicTasks.cpp b/src/PeriodicTasks.cpp index 9427a623..4455d088 100644 --- a/src/PeriodicTasks.cpp +++ b/src/PeriodicTasks.cpp @@ -121,7 +121,7 @@ String ESP32GetResetReason(uint32_t cpu_no) { } } #endif -#if defined(esp32_4mb) || defined(esp32_16mb) || defined(esp32cam_4mb) +#if defined(esp32_4mb) || defined(esp32_4mb3f) || defined(esp32_16mb) || defined(esp32cam_4mb) String ESP_getResetReason(void) { // return ESP32GetResetReason(0); // CPU 0 esp_reset_reason_t esp_reason = esp_reset_reason(); diff --git a/src/StandWebServer.cpp b/src/StandWebServer.cpp index 759ae8fe..8a2453c3 100644 --- a/src/StandWebServer.cpp +++ b/src/StandWebServer.cpp @@ -89,6 +89,8 @@ void standWebServerInit() { // - second callback handles file upload at that location HTTP.on("/edit", HTTP_POST, replyOK, handleFileUpload); + HTTP.on("/localota", HTTP_GET, handleLocalOTA); + // Default handler for all URIs not defined above // Use it to read files from filesystem HTTP.onNotFound(handleNotFound); @@ -156,6 +158,10 @@ void handleStatus() { HTTP.send(200, "application/json", json); } +void handleLocalOTA() { + upgrade_firmware(3, "local"); +} + #ifdef ESP32 String getContentType(String filename) { if (HTTP.hasArg("download")) { diff --git a/src/UpgradeFirm.cpp b/src/UpgradeFirm.cpp index eaa44b6c..a258865a 100644 --- a/src/UpgradeFirm.cpp +++ b/src/UpgradeFirm.cpp @@ -44,6 +44,8 @@ bool upgradeFS(String path) { SerialPrint("E", F("Update"), F("FS Path error")); saveUpdeteStatus("fs", PATH_ERROR); return ret; + } else if (path == "local"){ + path = getBinPath(); } #ifdef ESP8266 ESPhttpUpdate.rebootOnUpdate(false); @@ -58,14 +60,17 @@ bool upgradeFS(String path) { // если FS обновилась успешно if (retFS == HTTP_UPDATE_OK) { SerialPrint("!!!", F("Update"), F("FS upgrade done!")); + //HTTP.send(200, "text/plain", "FS upgrade done!"); saveUpdeteStatus("fs", UPDATE_COMPLETED); ret = true; } else { saveUpdeteStatus("fs", UPDATE_FAILED); if (retFS == HTTP_UPDATE_FAILED) { SerialPrint("E", F("Update"), "HTTP_UPDATE_FAILED"); + HTTP.send(200, "text/plain", "FS UPDATE_FAILED! DELETE /localota !!!"); } else if (retFS == HTTP_UPDATE_NO_UPDATES) { - SerialPrint("E", F("Update"), "HTTP_UPDATE_NO_UPDATES"); + SerialPrint("E", F("Update"), "HTTP_UPDATE_NO_UPDATES! DELETE /localota !!!"); + //HTTP.send(200, "text/plain", "NO_UPDATES"); } } #endif @@ -82,6 +87,8 @@ bool upgradeBuild(String path) { SerialPrint("E", F("Update"), F("Build Path error")); saveUpdeteStatus("build", PATH_ERROR); return ret; + } else if (path == "local"){ + path = getBinPath(); } #if defined(esp8266_4mb) || defined(esp8266_16mb) || defined(esp8266_1mb) || defined(esp8266_1mb_ota) || defined(esp8266_2mb) || defined(esp8266_2mb_ota) ESPhttpUpdate.rebootOnUpdate(false); @@ -95,14 +102,17 @@ bool upgradeBuild(String path) { // если BUILD обновился успешно if (retBuild == HTTP_UPDATE_OK) { SerialPrint("!!!", F("Update"), F("BUILD upgrade done!")); + HTTP.send(200, "text/plain", "BUILD upgrade done! DELETE /localota !!!"); saveUpdeteStatus("build", UPDATE_COMPLETED); ret = true; } else { saveUpdeteStatus("build", UPDATE_FAILED); if (retBuild == HTTP_UPDATE_FAILED) { SerialPrint("E", F("Update"), "HTTP_UPDATE_FAILED"); + HTTP.send(200, "text/plain", "UPDATE_FAILED! DELETE /localota !!!"); } else if (retBuild == HTTP_UPDATE_NO_UPDATES) { SerialPrint("E", F("Update"), "HTTP_UPDATE_NO_UPDATES"); + HTTP.send(200, "text/plain", "NO_UPDATES! DELETE /localota !!!"); } } #endif @@ -115,23 +125,23 @@ void restartEsp() { ESP.restart(); } -// теперь путь к обнавленю прошивки мы получаем из веб интерфейса -// const String getBinPath(String file) { -// String path = "error"; -// int targetVersion = 0; -// String serverip; -// if (jsonRead(errorsHeapJson, F("chver"), targetVersion)) { -// if (targetVersion >= 400) { -// if (jsonRead(settingsFlashJson, F("serverip"), serverip)) { -// if (serverip != "") { -// path = jsonReadStr(settingsFlashJson, F("serverip")) + "/iotm/" + String(FIRMWARE_NAME) + "/" + String(targetVersion) + "/" + file; -// } -// } -// } -// } -// SerialPrint("i", F("Update"), "path: " + path); -// return path; -// } +//теперь путь к обнавленю прошивки мы получаем из веб интерфейса +const String getBinPath() { + String path = "error"; + int targetVersion = 400; //HACKFUCK local OTA version in PrepareServer.py + String serverip; +// if (jsonRead(errorsHeapJson, F("chver"), targetVersion)) { + if (targetVersion >= 400) { + if (jsonRead(settingsFlashJson, F("serverlocal"), serverip)) { + if (serverip != "") { + path = jsonReadStr(settingsFlashJson, F("serverlocal")) + "/iotm/" + String(FIRMWARE_NAME) + "/" + String(targetVersion) + "/"; + } + } + } +// } + SerialPrint("i", F("Update"), "server local: " + path); + return path; +} // https://t.me/IoTmanager/128814/164752 - убрал ограничение void putUserDataToRam() { From 5f3845457a66aacbebc4b24f564f78fc62825059 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 26 Nov 2024 23:30:41 +0300 Subject: [PATCH 026/118] build pipline --- .github/workflows/build_iotm.yml | 63 ++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .github/workflows/build_iotm.yml diff --git a/.github/workflows/build_iotm.yml b/.github/workflows/build_iotm.yml new file mode 100644 index 00000000..285c7178 --- /dev/null +++ b/.github/workflows/build_iotm.yml @@ -0,0 +1,63 @@ +env: + BOARDS: '["esp8266_4mb", "esp32_4bm3f", "esp32c3m_4mb", "esp32s2_4mb", "esp32s3_16mb"]' + +name: Build Firmware + +on: + workflow_dispatch: + + +jobs: + generate-matrix: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set_matrix.outputs.json }} + steps: + - name: Prepare matrix JSON Object + id: set_matrix + uses: nickofthyme/object-remap@v2.0.0 + with: + __case: kebab + board: ${{ env.BOARDS }} + + build: + needs: [ generate-matrix ] + runs-on: ubuntu-latest + strategy: + matrix: ${{ fromJSON(needs.generate-matrix.outputs.matrix) }} + + steps: + - uses: actions/checkout@v2 + with: + ref: 'ver4dev' + - name: Run PrepareProject.py -b ${{ matrix.board }} + run: python3 ./PrepareProject.py -b ${{ matrix.board }} + - name: Set up Python + uses: actions/setup-python@v4 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install platformio + - name: Run PlatformIO + run: platformio run + - name: Build FS + run: platformio run -t buildfs --disable-auto-clean + - name: Attach artifact + uses: actions/upload-artifact@v4 + with: + name: firmware + path: | + .pio/build/esp8266_4mb/firmware.bin + .pio/build/esp8266_4mb/littlefs.bin + .pio/build/esp32_4mb3f/firmware.bin + .pio/build/esp32_4mb3f/littlefs.bin + .pio/build/esp32_4mb3f/partitions.bin + .pio/build/esp32s2_4mb/firmware.bin + .pio/build/esp32s2_4mb/littlefs.bin + .pio/build/esp32s2_4mb/partitions.bin + .pio/build/esp32s3_16mb/firmware.bin + .pio/build/esp32s3_16mb/littlefs.bin + .pio/build/esp32s3_16mb/partitions.bin + .pio/build/esp32c3m_4mb/firmware.bin + .pio/build/esp32c3m_4mb/littlefs.bin + .pio/build/esp32c3m_4mb/partitions.bin From 1a2de8521cca0baead624fcd47c0f0ff0ace1123 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 26 Nov 2024 23:41:48 +0300 Subject: [PATCH 027/118] build pipline select boards --- PrepareProject.py | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/PrepareProject.py b/PrepareProject.py index 8a1c3635..53037698 100644 --- a/PrepareProject.py +++ b/PrepareProject.py @@ -41,7 +41,22 @@ def printHelp(): PrepareProject.py -p --profile -u --update - -h --help''') + -h --help + -b --board ''') + with open('myProfile.json', "r", encoding='utf-8') as read_file: + profJson = json.load(read_file) + print ('') + print ('Choose a board from the list:') + # print(profJson['projectProp']['platformio']['comments_default_envs']) + print (' ', end='') + cnt = 0 + for envs in profJson['projectProp']['platformio']['envs']: + if cnt == 5: + cnt = 0 + print('') + print(' ', end='') + print(envs['name'] + ', ', end='') + cnt = cnt + 1 def updateModulesInProfile(profJson): @@ -68,10 +83,11 @@ def updateModulesInProfile(profJson): update = False # признак необходимости обновить список модулей profile = 'myProfile.json' # имя профиля. Будет заменено из консоли, если указано при старте - +selectDevice = '' # имя платы для которой хотим собрать, если её указали к командной строке -b + argv = sys.argv[1:] try: - opts, args = getopt.getopt(argv, 'hp:u', ['help', 'profile=', 'update']) + opts, args = getopt.getopt(argv, 'hp:ub:', ['help', 'profile=', 'update', 'board=']) except getopt.GetoptError: print('Ошибка обработки параметров!') printHelp() @@ -85,7 +101,8 @@ def updateModulesInProfile(profJson): profile = arg elif opt in ("-u", "--update"): update = True - + elif opt in ("-b", "--board"): + selectDevice = arg if Path(profile).is_file(): # подтягиваем уже существующий профиль @@ -121,9 +138,17 @@ def updateModulesInProfile(profJson): with open(profile, "w", encoding='utf-8') as write_file: json.dump(profJson, write_file, ensure_ascii=False, indent=4, sort_keys=False) - -# определяем какое устройство используется в профиле -deviceName = profJson['projectProp']['platformio']['default_envs'] +deviceName = '' +if selectDevice == '': + # определяем какое устройство используется в профиле + deviceName = profJson['projectProp']['platformio']['default_envs'] +else: + for envs in profJson['projectProp']['platformio']['envs']: + if envs['name'] == selectDevice: + deviceName = selectDevice + if deviceName == '': + deviceName = profJson['projectProp']['platformio']['default_envs'] + print(f"\x1b[1;31;31m Board ", selectDevice, " not found in ",profile,"!!! Use ",deviceName," \x1b[0m") # заполняем папку /data файлами прошивки в зависимости от устройства if deviceName == 'esp8266_1mb_ota' or deviceName == 'esp8285_1mb_ota' or deviceName == 'esp8266_2mb_ota': From 64ce8b052d321a4da45838fda8ab705654338fa5 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 27 Nov 2024 00:26:15 +0300 Subject: [PATCH 028/118] fix esp32_c3m --- .github/workflows/build_iotm.yml | 4 +++- platformio.ini | 2 +- src/modules/display/Smi2_m/modinfo.json | 2 +- src/modules/exec/EctoControlAdapter/modinfo.json | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_iotm.yml b/.github/workflows/build_iotm.yml index 285c7178..cd4500fe 100644 --- a/.github/workflows/build_iotm.yml +++ b/.github/workflows/build_iotm.yml @@ -1,5 +1,5 @@ env: - BOARDS: '["esp8266_4mb", "esp32_4bm3f", "esp32c3m_4mb", "esp32s2_4mb", "esp32s3_16mb"]' + BOARDS: '["esp8266_4mb", "esp32_4mb3f", "esp32c3m_4mb", "esp32s2_4mb", "esp32s3_16mb"]' name: Build Firmware @@ -39,8 +39,10 @@ jobs: python -m pip install --upgrade pip pip install platformio - name: Run PlatformIO + if: always() run: platformio run - name: Build FS + if: always() run: platformio run -t buildfs --disable-auto-clean - name: Attach artifact uses: actions/upload-artifact@v4 diff --git a/platformio.ini b/platformio.ini index 6dfdc42f..c5450992 100644 --- a/platformio.ini +++ b/platformio.ini @@ -308,7 +308,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp32c3m_4mb_fromitems.lib_deps} lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp32c3m_4mb="esp32c3m_4mb" -Wl,--wrap=esp_panic_handler framework = arduino diff --git a/src/modules/display/Smi2_m/modinfo.json b/src/modules/display/Smi2_m/modinfo.json index 443d5c46..e835ce90 100644 --- a/src/modules/display/Smi2_m/modinfo.json +++ b/src/modules/display/Smi2_m/modinfo.json @@ -50,7 +50,7 @@ } ] }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [] } diff --git a/src/modules/exec/EctoControlAdapter/modinfo.json b/src/modules/exec/EctoControlAdapter/modinfo.json index c52358aa..01c3c690 100644 --- a/src/modules/exec/EctoControlAdapter/modinfo.json +++ b/src/modules/exec/EctoControlAdapter/modinfo.json @@ -203,6 +203,7 @@ "defActive": false, "usedLibs": { "esp32*": [], + "esp32c3m_4mb": ["exclude"], "esp82*": [] } } \ No newline at end of file From f3ebfb363afdd1e03290c9673d169c27c8b5da19 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 27 Nov 2024 00:48:40 +0300 Subject: [PATCH 029/118] change /home/rise to ~ for script --- tools/patch32_ws.py | 2 +- tools/patch32c6.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/patch32_ws.py b/tools/patch32_ws.py index 4800c237..c30cfa43 100644 --- a/tools/patch32_ws.py +++ b/tools/patch32_ws.py @@ -10,7 +10,7 @@ if platform == "linux" or platform == "linux2": # linux - mainPyPath = '/home/rise/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src/WiFiClient.cpp' + mainPyPath = '~/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src/WiFiClient.cpp' else: # windows mainPyPath = os.environ['USERPROFILE'] + '\\.platformio\\packages\\framework-arduinoespressif32\\libraries\\WiFi\\src\\WiFiClient.cpp' diff --git a/tools/patch32c6.py b/tools/patch32c6.py index 7ab88d88..b05c8da7 100644 --- a/tools/patch32c6.py +++ b/tools/patch32c6.py @@ -5,8 +5,8 @@ if platform == "linux" or platform == "linux2": # linux - devkitm = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitm-1.json' - devkitc = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitc-1.json' + devkitm = '~/.platformio/platforms/espressif32/boards/esp32-c6-devkitm-1.json' + devkitc = '~/.platformio/platforms/espressif32/boards/esp32-c6-devkitc-1.json' else: # windows devkitm = os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif32\\boards\\esp32-c6-devkitm-1.json' From 17949a56da3521526088bc3dac2a5492a5c4a837 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 27 Nov 2024 01:00:43 +0300 Subject: [PATCH 030/118] undo ~, try exception --- tools/patch32_ws.py | 22 ++++++++++++---------- tools/patch32c6.py | 29 ++++++++++++++++------------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/tools/patch32_ws.py b/tools/patch32_ws.py index c30cfa43..5c7d21c6 100644 --- a/tools/patch32_ws.py +++ b/tools/patch32_ws.py @@ -10,18 +10,20 @@ if platform == "linux" or platform == "linux2": # linux - mainPyPath = '~/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src/WiFiClient.cpp' + mainPyPath = '/home/rise/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src/WiFiClient.cpp' else: # windows mainPyPath = os.environ['USERPROFILE'] + '\\.platformio\\packages\\framework-arduinoespressif32\\libraries\\WiFi\\src\\WiFiClient.cpp' # print(mainPyPath) - -with open(mainPyPath) as fr: - oldData = fr.read() - if not 'if WIFI_CLIENT_MAX_WRITE_RETRY (10)' in oldData: - shutil.copyfile(mainPyPath, mainPyPath+'.bak') - newData = oldData.replace('#define WIFI_CLIENT_MAX_WRITE_RETRY (10)', '#define WIFI_CLIENT_MAX_WRITE_RETRY (2)') - newData = newData.replace('#define WIFI_CLIENT_SELECT_TIMEOUT_US (1000000)', '#define WIFI_CLIENT_SELECT_TIMEOUT_US (500000)') - with open(mainPyPath, 'w') as fw: - fw.write(newData) \ No newline at end of file +try: + with open(mainPyPath) as fr: + oldData = fr.read() + if not 'if WIFI_CLIENT_MAX_WRITE_RETRY (10)' in oldData: + shutil.copyfile(mainPyPath, mainPyPath+'.bak') + newData = oldData.replace('#define WIFI_CLIENT_MAX_WRITE_RETRY (10)', '#define WIFI_CLIENT_MAX_WRITE_RETRY (2)') + newData = newData.replace('#define WIFI_CLIENT_SELECT_TIMEOUT_US (1000000)', '#define WIFI_CLIENT_SELECT_TIMEOUT_US (500000)') + with open(mainPyPath, 'w') as fw: + fw.write(newData) +except FileNotFoundError: + print("Файл не найден или не удается открыть") \ No newline at end of file diff --git a/tools/patch32c6.py b/tools/patch32c6.py index b05c8da7..adaa1fc6 100644 --- a/tools/patch32c6.py +++ b/tools/patch32c6.py @@ -5,25 +5,28 @@ if platform == "linux" or platform == "linux2": # linux - devkitm = '~/.platformio/platforms/espressif32/boards/esp32-c6-devkitm-1.json' - devkitc = '~/.platformio/platforms/espressif32/boards/esp32-c6-devkitc-1.json' + devkitm = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitm-1.json' + devkitc = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitc-1.json' else: # windows devkitm = os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif32\\boards\\esp32-c6-devkitm-1.json' devkitc = os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif32\\boards\\esp32-c6-devkitc-1.json' def add_arduino_to_frameworks(file_name): - with open(file_name, 'r+') as f: - data = json.load(f) - frameworks = data['frameworks'] - if 'arduino' not in frameworks: - frameworks.insert(frameworks.index('espidf') + 1, 'arduino') - data['frameworks'] = frameworks - f.seek(0) - json.dump(data, f, indent=4) - f.truncate() - else: - print(f"Arduino already exists in {file_name}") + try: + with open(file_name, 'r+') as f: + data = json.load(f) + frameworks = data['frameworks'] + if 'arduino' not in frameworks: + frameworks.insert(frameworks.index('espidf') + 1, 'arduino') + data['frameworks'] = frameworks + f.seek(0) + json.dump(data, f, indent=4) + f.truncate() + else: + print(f"Arduino already exists in {file_name}") + except FileNotFoundError: + print("Файл не найден или не удается открыть") if os.path.exists(devkitm) and os.path.exists(devkitc): add_arduino_to_frameworks(devkitm) From a1079a076468bf1cb17d565846911065b6586887 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 27 Nov 2024 01:06:18 +0300 Subject: [PATCH 031/118] smi2 false --- myProfile.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/myProfile.json b/myProfile.json index 2ec4b43e..8ac27629 100644 --- a/myProfile.json +++ b/myProfile.json @@ -533,7 +533,7 @@ }, { "path": "src/modules/display/Smi2_m", - "active": true + "active": false }, { "path": "src/modules/display/TM16XX", From a122de9b5d0d390cf72475839fffeb4918343d95 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 27 Nov 2024 01:20:16 +0300 Subject: [PATCH 032/118] =?UTF-8?q?=D0=B0=D1=80=D1=82=D0=B8=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D1=8B=20action=20github?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_iotm.yml | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build_iotm.yml b/.github/workflows/build_iotm.yml index cd4500fe..c4563c25 100644 --- a/.github/workflows/build_iotm.yml +++ b/.github/workflows/build_iotm.yml @@ -1,12 +1,11 @@ env: BOARDS: '["esp8266_4mb", "esp32_4mb3f", "esp32c3m_4mb", "esp32s2_4mb", "esp32s3_16mb"]' - + name: Build Firmware on: workflow_dispatch: - - + jobs: generate-matrix: runs-on: ubuntu-latest @@ -19,7 +18,7 @@ jobs: with: __case: kebab board: ${{ env.BOARDS }} - + build: needs: [ generate-matrix ] runs-on: ubuntu-latest @@ -44,22 +43,13 @@ jobs: - name: Build FS if: always() run: platformio run -t buildfs --disable-auto-clean + - name: Rearrange Artifacts + run: | + mkdir -p artifacts/${{ matrix.board }} + mv .pio/build/${{ matrix.board }}/*.bin artifacts/${{ matrix.board }} + working-directory: ${{ github.workspace }} - name: Attach artifact uses: actions/upload-artifact@v4 with: name: firmware - path: | - .pio/build/esp8266_4mb/firmware.bin - .pio/build/esp8266_4mb/littlefs.bin - .pio/build/esp32_4mb3f/firmware.bin - .pio/build/esp32_4mb3f/littlefs.bin - .pio/build/esp32_4mb3f/partitions.bin - .pio/build/esp32s2_4mb/firmware.bin - .pio/build/esp32s2_4mb/littlefs.bin - .pio/build/esp32s2_4mb/partitions.bin - .pio/build/esp32s3_16mb/firmware.bin - .pio/build/esp32s3_16mb/littlefs.bin - .pio/build/esp32s3_16mb/partitions.bin - .pio/build/esp32c3m_4mb/firmware.bin - .pio/build/esp32c3m_4mb/littlefs.bin - .pio/build/esp32c3m_4mb/partitions.bin + path: artifacts/${{ matrix.board }} \ No newline at end of file From 0bd525401b4fb0584dc32bae2e69923141de3e66 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 27 Nov 2024 01:27:55 +0300 Subject: [PATCH 033/118] =?UTF-8?q?=D0=B0=D1=80=D1=82=D0=B8=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_iotm.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_iotm.yml b/.github/workflows/build_iotm.yml index c4563c25..76dcb8f2 100644 --- a/.github/workflows/build_iotm.yml +++ b/.github/workflows/build_iotm.yml @@ -46,10 +46,10 @@ jobs: - name: Rearrange Artifacts run: | mkdir -p artifacts/${{ matrix.board }} - mv .pio/build/${{ matrix.board }}/*.bin artifacts/${{ matrix.board }} + find .pio/build/${{ matrix.board }} -name "*.bin" -exec mv {} artifacts/${{ matrix.board }} \; working-directory: ${{ github.workspace }} - name: Attach artifact uses: actions/upload-artifact@v4 with: - name: firmware + name: firmware-${{ matrix.board }}-${{ github.run_number }} path: artifacts/${{ matrix.board }} \ No newline at end of file From 463fc6164914e914ac775e4de6d3b8c803dc88f6 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 27 Nov 2024 22:21:53 +0300 Subject: [PATCH 034/118] pcf8591, sht30 --- data_svelte/widgets.json | 7 +++ src/modules/sensors/Pcf8591/Pcf8591.cpp | 78 ++++++++++++++++++++++++ src/modules/sensors/Pcf8591/modinfo.json | 52 ++++++++++++++++ src/modules/sensors/Sht30/Sht30.cpp | 39 ++++++++++-- src/modules/sensors/Sht30/modinfo.json | 4 +- 5 files changed, 173 insertions(+), 7 deletions(-) create mode 100644 src/modules/sensors/Pcf8591/Pcf8591.cpp create mode 100644 src/modules/sensors/Pcf8591/modinfo.json diff --git a/data_svelte/widgets.json b/data_svelte/widgets.json index 9da79005..21a983fc 100644 --- a/data_svelte/widgets.json +++ b/data_svelte/widgets.json @@ -325,5 +325,12 @@ { "name": "nil", "label": "Без виджета" + }, + { + "name": "anydataBar", + "label": "давление Bar", + "widget": "anydata", + "after": "Kg/cm²", + "icon": "speedometer" } ] \ No newline at end of file diff --git a/src/modules/sensors/Pcf8591/Pcf8591.cpp b/src/modules/sensors/Pcf8591/Pcf8591.cpp new file mode 100644 index 00000000..e3d2511d --- /dev/null +++ b/src/modules/sensors/Pcf8591/Pcf8591.cpp @@ -0,0 +1,78 @@ +#include "Global.h" +#include "classes/IoTItem.h" + +#include "Wire.h" +#include + +// Make sure that this is set to the value in volts of VCC +//#define ADC_REFERENCE_VOLTAGE 3.3 +// Make sure that this is set to the value in volts of VCC +//#define ADC_REFERENCE_VOLTAGE 5.0 + +class Pcf8591 : public IoTItem { + int _pin; + float _adc_ref; + bool _isRaw; + bool _isInited = false; + Adafruit_PCF8591 pcf = Adafruit_PCF8591(); + + public: + Pcf8591(String parameters) : IoTItem(parameters) { + String tmp; + jsonRead(parameters, "pin", tmp); + _pin = tmp.toInt(); + + jsonRead(parameters, "adc_ref", tmp); + _adc_ref = tmp.toFloat(); + + jsonRead(parameters, "mode", tmp); + _isRaw = tmp == "raw"; + + if (!pcf.begin()) { + Serial.println("# Adafruit PCF8591 not found!"); + _isInited = false; + } else + + _isInited = true; + + Serial.println("# Adafruit PCF8591 found"); + + pcf.enableDAC(true); + + Serial.println("AIN0, AIN1, AIN2, AIN3"); + + } + + uint8_t dac_counter = 0; + + void doByInterval() { + + // Make a triangle wave on the DAC output + pcf.analogWrite(dac_counter++); + + if (_isInited) { + if (_isRaw) + value.valD = pcf.analogRead(_pin); // Чтение АЦП нулевого канала (Вольты) + else + // value.valD = (int_to_volts(pcf.analogRead(_pin), 8, ADC_REFERENCE_VOLTAGE)); + value.valD = (int_to_volts(pcf.analogRead(_pin), 8, _adc_ref)); + regEvent(value.valD, "PCF8591"); + } + +} + + float int_to_volts(uint16_t dac_value, uint8_t bits, float logic_level) { + return (((float)dac_value / ((1 << bits) - 1)) * logic_level); + + } + + ~Pcf8591(){}; +}; + +void *getAPI_Pcf8591(String subtype, String param) { + if (subtype == F("Pcf8591")) { + return new Pcf8591(param); + } else { + return nullptr; + } +} diff --git a/src/modules/sensors/Pcf8591/modinfo.json b/src/modules/sensors/Pcf8591/modinfo.json new file mode 100644 index 00000000..99fdc606 --- /dev/null +++ b/src/modules/sensors/Pcf8591/modinfo.json @@ -0,0 +1,52 @@ +{ + "menuSection": "sensors", + "configItem": [ + { + "global": 0, + "name": "Расширитель портов PCF8591", + "type": "Reading", + "subtype": "Pcf8591", + "id": "Pcf85", + "widget": "anydataVlt", + "page": "PCF8591", + "descr": "PCF_0", + "pin": "0", + "mode": "volt", + "adc_ref": 5.0, + "map": "1,255,1,100", + "plus": 0, + "multiply": 1, + "round": 2, + "int": 7 + } + ], + "about": { + "authorName": "Serghei Crasnicov", + "authorContact": "https://t.me/Serghei63", + "authorGit": "https://github.com/Serghei63", + "specialThanks": "", + "moduleName": "Pcf8591", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "Расширитель 4-х аналоговых портов PCF8591", + "moduleDesc": "Позволяет получить относительную величину напряжения на понижающем трансформаторе.", + "propInfo": { + "pin": "Номер AN, к которому подключен датчик. Допускается 0, 1, 2, 3", + "mode": "Режим работы. volt - вывод в вольтах , raw - значения от 0 до 255", + "int": "Количество секунд между опросами датчика." + } + }, + "defActive": false, + "usedLibs": { + + "esp32*": [ + "https://github.com/adafruit/Adafruit_PCF8591" + ], + "esp82*": [ + "https://github.com/adafruit/Adafruit_PCF8591" + ] + } +} \ No newline at end of file diff --git a/src/modules/sensors/Sht30/Sht30.cpp b/src/modules/sensors/Sht30/Sht30.cpp index d78947df..fb4a5828 100644 --- a/src/modules/sensors/Sht30/Sht30.cpp +++ b/src/modules/sensors/Sht30/Sht30.cpp @@ -13,19 +13,33 @@ #include "Wire.h" #include -SHT3X sht30(0x45); +SHT3X sht30(0x44); class Sht30t : public IoTItem { + + private: + uint8_t _addr = 0; + public: - Sht30t(String parameters): IoTItem(parameters) { } + Sht30t(String parameters): IoTItem(parameters) { + { + String sAddr; + jsonRead(parameters, "addr", sAddr); + if (sAddr == "") + scanI2C(); + else + _addr = hexStringToUint8(sAddr); + } + + } void doByInterval() { if(sht30.get()==0){ value.valD = sht30.cTemp; - SerialPrint("E", "Sensor Sht30t", "OK"); + SerialPrint("i", "Sensor Sht30t", "OK"); - if (value.valD < -46.85F) regEvent(value.valD, "Sht30t"); // TODO: найти способ понимания ошибки получения данных + if (value.valD > -46.85F) regEvent(value.valD, "Sht30t"); // TODO: найти способ понимания ошибки получения данных else SerialPrint("E", "Sensor Sht30t", "Error", _id); } } @@ -33,14 +47,27 @@ class Sht30t : public IoTItem { }; class Sht30h : public IoTItem { + + private: + uint8_t _addr = 0; + public: - Sht30h(String parameters): IoTItem(parameters) { } + Sht30h(String parameters): IoTItem(parameters) { + { + String sAddr; + jsonRead(parameters, "addr", sAddr); + if (sAddr == "") + scanI2C(); + else + _addr = hexStringToUint8(sAddr); + } + } void doByInterval() { if(sht30.get()==0){ value.valD = sht30.humidity; - SerialPrint("E", "Sensor Sht30h", "OK"); + SerialPrint("i", "Sensor Sht30h", "OK"); if (value.valD != -6) regEvent(value.valD, "Sht30h"); // TODO: найти способ понимания ошибки получения данных else SerialPrint("E", "Sensor Sht30h", "Error", _id); } diff --git a/src/modules/sensors/Sht30/modinfo.json b/src/modules/sensors/Sht30/modinfo.json index 6a22d155..a9196559 100644 --- a/src/modules/sensors/Sht30/modinfo.json +++ b/src/modules/sensors/Sht30/modinfo.json @@ -10,6 +10,7 @@ "widget": "anydataTmp", "page": "Сенсоры", "descr": "SHT30 Температура", + "addr": "", "int": 15, "round": 1 }, @@ -22,6 +23,7 @@ "widget": "anydataHum", "page": "Сенсоры", "descr": "SHT30 Влажность", + "addr": "", "int": 15, "round": 1 } @@ -47,7 +49,7 @@ "int": "Количество секунд между опросами датчика." } }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [ "WEMOS SHT3x@1.0.0" From 64b4e67dcd49b150cfd02b9e173e427a55956600 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 29 Nov 2024 23:13:09 +0300 Subject: [PATCH 035/118] btn Home in localota --- myProfile.json | 1 + src/UpgradeFirm.cpp | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/myProfile.json b/myProfile.json index 8ac27629..e8d1579c 100644 --- a/myProfile.json +++ b/myProfile.json @@ -15,6 +15,7 @@ "mqttUser": "rise", "mqttPass": "3hostel3", "serverip": "http://iotmanager.org", + "serverlocal": "http://192.168.1.2:5500", "log": 0, "mqttin": 0, "pinSCL": 0, diff --git a/src/UpgradeFirm.cpp b/src/UpgradeFirm.cpp index a258865a..a9a74307 100644 --- a/src/UpgradeFirm.cpp +++ b/src/UpgradeFirm.cpp @@ -67,7 +67,8 @@ bool upgradeFS(String path) { saveUpdeteStatus("fs", UPDATE_FAILED); if (retFS == HTTP_UPDATE_FAILED) { SerialPrint("E", F("Update"), "HTTP_UPDATE_FAILED"); - HTTP.send(200, "text/plain", "FS UPDATE_FAILED! DELETE /localota !!!"); + String page = "Ошибка обновления FS!
FS Update failed!
Home"; + HTTP.send(200, "text/html; charset=UTF-8", page); } else if (retFS == HTTP_UPDATE_NO_UPDATES) { SerialPrint("E", F("Update"), "HTTP_UPDATE_NO_UPDATES! DELETE /localota !!!"); //HTTP.send(200, "text/plain", "NO_UPDATES"); @@ -102,17 +103,20 @@ bool upgradeBuild(String path) { // если BUILD обновился успешно if (retBuild == HTTP_UPDATE_OK) { SerialPrint("!!!", F("Update"), F("BUILD upgrade done!")); - HTTP.send(200, "text/plain", "BUILD upgrade done! DELETE /localota !!!"); + String page = "Обновление BUILD выполнено!
Build upgrade done!
Home"; + HTTP.send(200, "text/html; charset=UTF-8", page); saveUpdeteStatus("build", UPDATE_COMPLETED); ret = true; } else { saveUpdeteStatus("build", UPDATE_FAILED); if (retBuild == HTTP_UPDATE_FAILED) { SerialPrint("E", F("Update"), "HTTP_UPDATE_FAILED"); - HTTP.send(200, "text/plain", "UPDATE_FAILED! DELETE /localota !!!"); + String page = "Ошибка обновления прошивки!
Firmware update failed!
Home"; + HTTP.send(200, "text/html; charset=UTF-8", page); } else if (retBuild == HTTP_UPDATE_NO_UPDATES) { SerialPrint("E", F("Update"), "HTTP_UPDATE_NO_UPDATES"); - HTTP.send(200, "text/plain", "NO_UPDATES! DELETE /localota !!!"); + String page = "Нет обновлений!
No updates!
Home"; + HTTP.send(200, "text/html; charset=UTF-8", page); } } #endif From 889eb5f85bf9605dfe3ccc4054e9aaeb76cf64da Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 30 Nov 2024 21:11:02 +0300 Subject: [PATCH 036/118] fix display smi2 --- data_svelte/settings.json | 4 ++-- myProfile.json | 2 +- src/Main.cpp | 2 +- src/modules/display/Smi2_m/Smi2_m.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data_svelte/settings.json b/data_svelte/settings.json index b08c5c80..14c4c94a 100644 --- a/data_svelte/settings.json +++ b/data_svelte/settings.json @@ -14,7 +14,7 @@ "mqttUser": "rise", "mqttPass": "3hostel3", "serverip": "http://iotmanager.org", - "serverlocal": "http://192.168.1.2:5500", + "serverlocal": "http://192.168.1.2:5500", "log": 0, "mqttin": 0, "i2c": 0, @@ -22,7 +22,7 @@ "pinSDA": 0, "i2cFreq": 100000, "wg": "group1", - "debugTrace": 1, + "debugTraceMsgTlgrm": 1, "udps": 1, "settings_": "" } \ No newline at end of file diff --git a/myProfile.json b/myProfile.json index e8d1579c..52821839 100644 --- a/myProfile.json +++ b/myProfile.json @@ -22,7 +22,7 @@ "pinSDA": 0, "i2cFreq": 100000, "wg": "group1", - "debugTrace": 1 + "debugTraceMsgTlgrm": 1 }, "projectProp": { "platformio": { diff --git a/src/Main.cpp b/src/Main.cpp index bf22d2d5..99221627 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -221,7 +221,7 @@ void setup() { stopErrorMarker(SETUPINET_ERRORMARKER); bool postMsgTelegram; - if (!jsonRead(settingsFlashJson, "debugTrace", postMsgTelegram, false)) postMsgTelegram = 1; + if (!jsonRead(settingsFlashJson, "debugTraceMsgTlgrm", postMsgTelegram, false)) postMsgTelegram = 1; sendDebugTraceAndFreeMemory(postMsgTelegram); initErrorMarker(SETUPLAST_ERRORMARKER); diff --git a/src/modules/display/Smi2_m/Smi2_m.cpp b/src/modules/display/Smi2_m/Smi2_m.cpp index a93572cc..1d0194c9 100644 --- a/src/modules/display/Smi2_m/Smi2_m.cpp +++ b/src/modules/display/Smi2_m/Smi2_m.cpp @@ -45,7 +45,7 @@ class Smi2_m : public IoTItem { // Пакет,SLAVE адрес,функция модбус,адрес регистра,количесво запрашиваемых регистров,локальный адрес регистра. // Пакет,SLAVE адрес,функция модбус,адрес регистра,данные,локальный адрес регистра. smi->modbus_construct(&packets[PACKET1], 1, PRESET_MULTIPLE_REGISTERS, 4200, 1, 0); - smi->modbus_configure(&Serial, _baud, SERIAL_8N1, _rx, _tx, _pin, packets, TOTAL_NO_OF_PACKETS, regs); + smi->modbus_configure((HardwareSerial*)&Serial, _baud, SERIAL_8N1, _rx, _tx, _pin, &packets[PACKET1], (uint)TOTAL_NO_OF_PACKETS, ®s[0]); jsonRead(parameters, "id2show", _show); } From 322925fa5a9830c0eef9b46763607f68252f6cf7 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 3 Dec 2024 20:15:16 +0300 Subject: [PATCH 037/118] Broker fix --- src/modules/exec/BrokerMQTT/BrokerMQTT.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp b/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp index 1523d0c0..6176b3ee 100644 --- a/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp +++ b/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp @@ -7,12 +7,13 @@ namespace _Broker { #define DEF_PORT 1883 +bool _global_debug = false; // MqttBroker broker(1883); class myPicoMQTT : public PicoMQTT::Server { private: - bool _debug; + //bool _debug; String _user; String _pass; @@ -27,15 +28,15 @@ namespace _Broker _pass = pass; } - void setDebug(bool debug) +/* void setDebug(bool debug) { _debug = debug; } - + */ protected: void on_connected(const char *client_id) { - if (_debug) + if (_Broker::_global_debug) { Serial.print("[BrokerMQTT], Client connected: "); Serial.println(client_id); @@ -43,7 +44,7 @@ namespace _Broker } void on_disconnected(const char *client_id) { - if (_debug) + if (_Broker::_global_debug) { // SerialPrint("i", "BrokerMQTT", "Client disconnected: " + client_id); @@ -53,7 +54,7 @@ namespace _Broker } void on_subscribe(const char *client_id, const char *topic) { - if (_debug) + if (_Broker::_global_debug) { // SerialPrint("i", "BrokerMQTT", "Client " + client_id + ", subscribe: " + topic); @@ -65,7 +66,7 @@ namespace _Broker } void on_unsubscribe(const char *client_id, const char *topic) { - if (_debug) + if (_Broker::_global_debug) { // SerialPrint("i", "BrokerMQTT", "Client " + client_id + ", unsubscribe: " + topic); @@ -163,7 +164,8 @@ namespace _Broker _port = DEF_PORT; picoMqtt = new myPicoMQTT(_port); picoMqtt->begin(); - picoMqtt->setDebug(_debug); + //picoMqtt->setDebug(_debug); + _global_debug = _debug; picoMqtt->setAuth(_user, _pass); if (_brige) { @@ -182,12 +184,12 @@ namespace _Broker { picoMqtt->subscribe("#", [](const char *topic, const char *message) { clientMqtt->publish(topic, message); - if (_debug) + if (_Broker::_global_debug) SerialPrint("i", F("BrigeMQTT"), "Client publish, topic: " + String(topic) + " msg: " + String(message) ); }); clientMqtt->subscribe("#", [](const char *topic, const char *message) { picoMqtt->publish(topic, message); - if (_debug) + if (_Broker::_global_debug) SerialPrint("i", F("BrigeMQTT"), "Server publish, topic: " + String(topic) + " msg: " + String(message) ); }); } // picoMqtt.begin(); From 5e801e7789052c70d40a009dffd84fba4021624b Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sun, 8 Dec 2024 21:35:53 +0300 Subject: [PATCH 038/118] wifiIsConnect, module Broker update --- src/classes/IoTScenario.cpp | 8 +++++++- src/modules/exec/BrokerMQTT/BrokerMQTT.cpp | 10 +++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 7abce5f8..34b6eb0f 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -342,7 +342,8 @@ enum SysOp { sysop_getIP, sysop_mqttPub, sysop_getUptime, - sysop_mqttIsConnect + sysop_mqttIsConnect, + sysop_wifiIsConnect }; IoTValue sysExecute(SysOp command, std::vector ¶m) { @@ -446,6 +447,9 @@ IoTValue sysExecute(SysOp command, std::vector ¶m) { case sysop_mqttIsConnect: value.valD = mqttIsConnect(); break; + case sysop_wifiIsConnect: + value.valD = isNetworkActive(); + break; } return value; @@ -502,6 +506,8 @@ class SysCallExprAST : public ExprAST { operation = sysop_getUptime; else if (Callee == F("mqttIsConnect")) operation = sysop_mqttIsConnect; + else if (Callee == F("wifiIsConnect")) + operation = sysop_wifiIsConnect; else operation = sysop_notfound; } diff --git a/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp b/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp index 6176b3ee..91c2b99a 100644 --- a/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp +++ b/src/modules/exec/BrokerMQTT/BrokerMQTT.cpp @@ -121,6 +121,8 @@ bool _global_debug = false; clientMqtt->loop(); if (picoMqtt) picoMqtt->loop(); + if (!clientMqtt && !picoMqtt) + vTaskDelete(NULL); // picoMqtt.loop(); // vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(5)); } @@ -213,9 +215,11 @@ bool _global_debug = false; ~BrokerMQTT() { - vTaskDelete(brokerTask); - delete picoMqtt; - delete clientMqtt; + //vTaskDelete(brokerTask); + if (picoMqtt) + delete picoMqtt; + if (clientMqtt) + delete clientMqtt; } }; } From a844d08ebfca66b486fccbf527c2414a2c130aab Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 17 Dec 2024 21:09:22 +0300 Subject: [PATCH 039/118] module LocalUpdate, GyverLamp, WebSocket for C6 --- lib/WebSockets/src/WebSocketsServer.cpp | 46 +- lib/WebSockets/src/WebSocketsServer.h | 4 +- src/Main.cpp | 6 +- src/StandWebServer.cpp | 2 +- src/UpgradeFirm.cpp | 33 +- src/WsServer.cpp | 6 +- src/modules/display/GyverLAMP/GyverLAMP.cpp | 1309 ++++++++++++ src/modules/display/GyverLAMP/config.h | 9 + src/modules/display/GyverLAMP/effects.h | 1833 +++++++++++++++++ src/modules/display/GyverLAMP/matrix.h | 770 +++++++ src/modules/display/GyverLAMP/modinfo.json | 40 + src/modules/display/GyverLAMP/utility.h | 92 + src/modules/exec/IoTServo/modinfo.json | 2 +- src/modules/exec/Pwm8266/modinfo.json | 2 +- src/modules/sensors/Ble/modinfo.json | 8 +- .../virtual/UpdateServer/UpdateServer.cpp | 27 + src/modules/virtual/UpdateServer/modinfo.json | 41 + src/utils/WiFiUtils.cpp | 2 + 18 files changed, 4199 insertions(+), 33 deletions(-) create mode 100644 src/modules/display/GyverLAMP/GyverLAMP.cpp create mode 100644 src/modules/display/GyverLAMP/config.h create mode 100644 src/modules/display/GyverLAMP/effects.h create mode 100644 src/modules/display/GyverLAMP/matrix.h create mode 100644 src/modules/display/GyverLAMP/modinfo.json create mode 100644 src/modules/display/GyverLAMP/utility.h create mode 100644 src/modules/virtual/UpdateServer/UpdateServer.cpp create mode 100644 src/modules/virtual/UpdateServer/modinfo.json diff --git a/lib/WebSockets/src/WebSocketsServer.cpp b/lib/WebSockets/src/WebSocketsServer.cpp index 39d8d3e2..ec6928ea 100644 --- a/lib/WebSockets/src/WebSocketsServer.cpp +++ b/lib/WebSockets/src/WebSocketsServer.cpp @@ -25,6 +25,14 @@ #include "WebSockets.h" #include "WebSocketsServer.h" +#ifdef ESP32 +#if defined __has_include +#if __has_include("soc/wdev_reg.h") +#include "soc/wdev_reg.h" +#endif // __has_include +#endif // defined __has_include +#endif + WebSocketsServerCore::WebSocketsServerCore(const String & origin, const String & protocol) { _origin = origin; _protocol = protocol; @@ -65,6 +73,7 @@ WebSocketsServerCore::~WebSocketsServerCore() { } WebSocketsServer::~WebSocketsServer() { + delete _server; } /** @@ -82,9 +91,13 @@ void WebSocketsServerCore::begin(void) { #ifdef ESP8266 randomSeed(RANDOM_REG32); +#elif defined(ESP32) && defined(WDEV_RND_REG) + randomSeed(REG_READ(WDEV_RND_REG)); #elif defined(ESP32) #define DR_REG_RNG_BASE 0x3ff75144 randomSeed(READ_PERI_REG(DR_REG_RNG_BASE)); +#elif defined(ARDUINO_ARCH_RP2040) + randomSeed(rp2040.hwrand32()); #else // TODO find better seed randomSeed(millis()); @@ -400,7 +413,7 @@ bool WebSocketsServerCore::clientIsConnected(uint8_t num) { return clientIsConnected(client); } -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) /** * get an IP for a client * @param num uint8_t client id @@ -432,8 +445,16 @@ WSclient_t * WebSocketsServerCore::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclien for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { client = &_clients[i]; - // state is not connected or tcp connection is lost - if(!clientIsConnected(client)) { + // look for match to existing socket before creating a new one + if(clientIsConnected(client)) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) + // Check to see if it is the same socket - if so, return it + if(client->tcp->getSocketNumber() == TCPclient->getSocketNumber()) { + return client; + } +#endif + } else { + // state is not connected or tcp connection is lost client->tcp = TCPclient; #if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) @@ -445,7 +466,7 @@ WSclient_t * WebSocketsServerCore::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclien client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); #endif client->status = WSC_HEADER; -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) #ifndef NODEBUG_WEBSOCKETS IPAddress ip = client->tcp->remoteIP(); #endif @@ -527,7 +548,7 @@ void WebSocketsServerCore::dropNativeClient(WSclient_t * client) { } if(client->tcp) { if(client->tcp->connected()) { -#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP32) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_RP2040) client->tcp->flush(); #endif client->tcp->stop(); @@ -546,7 +567,7 @@ void WebSocketsServerCore::dropNativeClient(WSclient_t * client) { * @param client WSclient_t * ptr to the client struct */ void WebSocketsServerCore::clientDisconnect(WSclient_t * client) { -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) if(client->isSSL && client->ssl) { if(client->ssl->connected()) { client->ssl->flush(); @@ -620,7 +641,7 @@ WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tc if(!client) { // no free space to handle client -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) #ifndef NODEBUG_WEBSOCKETS IPAddress ip = tcpClient->remoteIP(); #endif @@ -633,6 +654,7 @@ WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tc client = &dummy; client->tcp = tcpClient; dropNativeClient(client); + return nullptr; } WEBSOCKETS_YIELD(); @@ -644,12 +666,12 @@ WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tc * Handle incoming Connection Request */ void WebSocketsServer::handleNewClients(void) { -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) while(_server->hasClient()) { #endif - // store new connection - WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->available()); +// store new connection + WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->accept()); if(!tcpClient) { DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); return; @@ -657,7 +679,7 @@ void WebSocketsServer::handleNewClients(void) { handleNewClient(tcpClient); -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) } #endif } @@ -928,7 +950,7 @@ void WebSocketsServer::begin(void) { void WebSocketsServer::close(void) { WebSocketsServerCore::close(); -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) _server->close(); #elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) _server->end(); diff --git a/lib/WebSockets/src/WebSocketsServer.h b/lib/WebSockets/src/WebSocketsServer.h index a8472a5b..5000f577 100644 --- a/lib/WebSockets/src/WebSocketsServer.h +++ b/lib/WebSockets/src/WebSocketsServer.h @@ -90,7 +90,7 @@ class WebSocketsServerCore : protected WebSockets { void enableHeartbeat(uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount); void disableHeartbeat(); -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) IPAddress remoteIP(uint8_t num); #endif @@ -241,4 +241,4 @@ class WebSocketsServer : public WebSocketsServerCore { WEBSOCKETS_NETWORK_SERVER_CLASS * _server; }; -#endif /* WEBSOCKETSSERVER_H_ */ +#endif /* WEBSOCKETSSERVER_H_ */ \ No newline at end of file diff --git a/src/Main.cpp b/src/Main.cpp index 99221627..cf82ef14 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -250,7 +250,9 @@ void setup() { // сброс WDT #if defined(ESP32) //SerialPrint("i", "Task", "reset wdt"); + #if !defined(esp32c6_4mb) && !defined(esp32c6_8mb) //TODO esp32-c6 переписать esp_task_wdt_init esp_task_wdt_reset(); + #endif #endif // сохраняем значения IoTItems в файл каждую секунду, если были изменения (установлены маркеры на сохранение) if (needSaveValues) { @@ -287,8 +289,8 @@ void setup() { nullptr, true); // test - Serial.println("-------test start--------"); - Serial.println("--------test end---------"); + //Serial.println("-------test start--------"); + //Serial.println("--------test end---------"); stopErrorMarker(SETUPLAST_ERRORMARKER); #if defined(RESTART_DEBUG_INFO) diff --git a/src/StandWebServer.cpp b/src/StandWebServer.cpp index 8a2453c3..8c16cc24 100644 --- a/src/StandWebServer.cpp +++ b/src/StandWebServer.cpp @@ -159,7 +159,7 @@ void handleStatus() { } void handleLocalOTA() { - upgrade_firmware(3, "local"); + upgrade_firmware(3,""); } #ifdef ESP32 diff --git a/src/UpgradeFirm.cpp b/src/UpgradeFirm.cpp index a9a74307..6b3baa30 100644 --- a/src/UpgradeFirm.cpp +++ b/src/UpgradeFirm.cpp @@ -3,6 +3,9 @@ updateFirm update; void upgrade_firmware(int type, String path) { + if (path == ""){ + path = getBinPath(); + } putUserDataToRam(); // сбросим файл статуса последнего обновления writeFile("ota.json", "{}"); @@ -44,9 +47,7 @@ bool upgradeFS(String path) { SerialPrint("E", F("Update"), F("FS Path error")); saveUpdeteStatus("fs", PATH_ERROR); return ret; - } else if (path == "local"){ - path = getBinPath(); - } + } #ifdef ESP8266 ESPhttpUpdate.rebootOnUpdate(false); t_httpUpdate_return retFS = ESPhttpUpdate.updateFS(wifiClient, path + "/littlefs.bin"); @@ -88,9 +89,7 @@ bool upgradeBuild(String path) { SerialPrint("E", F("Update"), F("Build Path error")); saveUpdeteStatus("build", PATH_ERROR); return ret; - } else if (path == "local"){ - path = getBinPath(); - } + } #if defined(esp8266_4mb) || defined(esp8266_16mb) || defined(esp8266_1mb) || defined(esp8266_1mb_ota) || defined(esp8266_2mb) || defined(esp8266_2mb_ota) ESPhttpUpdate.rebootOnUpdate(false); t_httpUpdate_return retBuild = ESPhttpUpdate.update(wifiClient, path + "/firmware.bin"); @@ -134,15 +133,29 @@ const String getBinPath() { String path = "error"; int targetVersion = 400; //HACKFUCK local OTA version in PrepareServer.py String serverip; -// if (jsonRead(errorsHeapJson, F("chver"), targetVersion)) { - if (targetVersion >= 400) { + if (jsonRead(errorsHeapJson, F("chver"), targetVersion)) { + if (targetVersion >= 400) + { + if (jsonRead(settingsFlashJson, F("serverip"), serverip)) + { + if (serverip != "") + { + path = jsonReadStr(settingsFlashJson, F("serverip")) + "/iotm/" + String(FIRMWARE_NAME) + "/" + String(targetVersion) + "/" ; + } + } + } + } + else if (targetVersion >= 400) + { if (jsonRead(settingsFlashJson, F("serverlocal"), serverip)) { - if (serverip != "") { + if (serverip != "") + { path = jsonReadStr(settingsFlashJson, F("serverlocal")) + "/iotm/" + String(FIRMWARE_NAME) + "/" + String(targetVersion) + "/"; } } } -// } + + SerialPrint("i", F("Update"), "server local: " + path); return path; } diff --git a/src/WsServer.cpp b/src/WsServer.cpp index 18cfe1e4..ad3e6bc5 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -435,9 +435,9 @@ void sendFileToWsByFrames(const String& filename, const String& header, const St continuation = true; } - Serial.println(String(i) + ") " + "ws: " + String(client_id) + " fr sz: " - + String(size) + " fin: " + String(fin) + " cnt: " + - String(continuation)); +// Serial.println(String(i) + ") " + "ws: " + String(client_id) + " fr sz: " +// + String(size) + " fin: " + String(fin) + " cnt: " + +// String(continuation)); #ifdef ASYNC_WEB_SOCKETS if (client_id == -1) { //ws.broadcastBIN(frameBuf, size, fin, continuation); diff --git a/src/modules/display/GyverLAMP/GyverLAMP.cpp b/src/modules/display/GyverLAMP/GyverLAMP.cpp new file mode 100644 index 00000000..9f1f8b7c --- /dev/null +++ b/src/modules/display/GyverLAMP/GyverLAMP.cpp @@ -0,0 +1,1309 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include "FastLED.h" +#include "effects.h" +#include "matrix.h" +extern IoTGpio IoTgpio; + +class GyverLAMP : public IoTItem +{ +private: + unsigned long prevmillis = 0; + String curEffect; + +public: + //======================================================================================================= + // setup() + GyverLAMP(String parameters) : IoTItem(parameters) + { + jsonRead(parameters, F("speed"), _speed); + jsonRead(parameters, F("dalay"), _dalay); + jsonRead(parameters, F("brightness"), _brightness); + // jsonRead(parameters, F("x_size"), _x_size); + // jsonRead(parameters, F("y_size"), _y_size); + + LEDS.setBrightness(_brightness); // ограничить максимальную яркость + LEDS.addLeds(leds, LED_COUNT); // настрйоки для нашей ленты (ленты на WS2811, WS2812, WS2812B) + one_color_all(0, 0, 0); // погасить все светодиоды + LEDS.show(); + } + + //======================================================================================================= + // doByInterval() + void doByInterval() + { + } + + //======================================================================================================= + // loop() + void loop() + { + + // yield(); + + if (millis() - prevmillis > _dalay) + { + + prevmillis = millis(); + thisdelay = _speed; + + if (curEffect == "rainbow_fade") + { + // rainbow_fade(); + ihue++; + if (ihue > 255) + { + ihue = 0; + } + for (int idex = 0; idex < LED_COUNT; idex++) + { + leds[idex] = CHSV(ihue, thissat, 255); + } + LEDS.show(); + } + if (curEffect == "rainbow_loop") + { + // rainbow_loop(); + idex++; + ihue = ihue + thisstep; + if (idex >= LED_COUNT) + { + idex = 0; + } + if (ihue > 255) + { + ihue = 0; + } + leds[idex] = CHSV(ihue, thissat, 255); + LEDS.show(); + } + if (curEffect == "random_burst") + { + // random_burst(); + idex = random(0, LED_COUNT); + ihue = random(0, 255); + leds[idex] = CHSV(ihue, thissat, 255); + LEDS.show(); + } + if (curEffect == "color_bounce") + { + // color_bounce(); + if (bouncedirection == 0) + { + idex = idex + 1; + if (idex == LED_COUNT) + { + bouncedirection = 1; + idex = idex - 1; + } + } + if (bouncedirection == 1) + { + idex = idex - 1; + if (idex == 0) + { + bouncedirection = 0; + } + } + for (int i = 0; i < LED_COUNT; i++) + { + if (i == idex) + { + leds[i] = CHSV(thishue, thissat, 255); + } + else + { + leds[i] = CHSV(0, 0, 0); + } + } + LEDS.show(); + } + if (curEffect == "color_bounceFADE") + { + // color_bounceFADE(); + if (bouncedirection == 0) + { + idex = idex + 1; + if (idex == LED_COUNT) + { + bouncedirection = 1; + idex = idex - 1; + } + } + if (bouncedirection == 1) + { + idex = idex - 1; + if (idex == 0) + { + bouncedirection = 0; + } + } + int iL1 = adjacent_cw(idex); + int iL2 = adjacent_cw(iL1); + int iL3 = adjacent_cw(iL2); + int iR1 = adjacent_ccw(idex); + int iR2 = adjacent_ccw(iR1); + int iR3 = adjacent_ccw(iR2); + for (int i = 0; i < LED_COUNT; i++) + { + if (i == idex) + { + leds[i] = CHSV(thishue, thissat, 255); + } + else if (i == iL1) + { + leds[i] = CHSV(thishue, thissat, 150); + } + else if (i == iL2) + { + leds[i] = CHSV(thishue, thissat, 80); + } + else if (i == iL3) + { + leds[i] = CHSV(thishue, thissat, 20); + } + else if (i == iR1) + { + leds[i] = CHSV(thishue, thissat, 150); + } + else if (i == iR2) + { + leds[i] = CHSV(thishue, thissat, 80); + } + else if (i == iR3) + { + leds[i] = CHSV(thishue, thissat, 20); + } + else + { + leds[i] = CHSV(0, 0, 0); + } + } + LEDS.show(); + } + if (curEffect == "ems_lightsONE") + { + // ems_lightsONE(); + idex++; + if (idex >= LED_COUNT) + { + idex = 0; + } + int idexR = idex; + int idexB = antipodal_index(idexR); + int thathue = (thishue + 160) % 255; + for (int i = 0; i < LED_COUNT; i++) + { + if (i == idexR) + { + leds[i] = CHSV(thishue, thissat, 255); + } + else if (i == idexB) + { + leds[i] = CHSV(thathue, thissat, 255); + } + else + { + leds[i] = CHSV(0, 0, 0); + } + } + LEDS.show(); + } + if (curEffect == "ems_lightsALL") + { + // ems_lightsALL(); + idex++; + if (idex >= LED_COUNT) + { + idex = 0; + } + int idexR = idex; + int idexB = antipodal_index(idexR); + int thathue = (thishue + 160) % 255; + leds[idexR] = CHSV(thishue, thissat, 255); + leds[idexB] = CHSV(thathue, thissat, 255); + LEDS.show(); + } + if (curEffect == "flicker") + { + flicker(); + } + + if (curEffect == "pulse_one_color_all") + { + // pulse_one_color_all(); + if (bouncedirection == 0) + { + ibright++; + if (ibright >= 255) + { + bouncedirection = 1; + } + } + if (bouncedirection == 1) + { + ibright = ibright - 1; + if (ibright <= 1) + { + bouncedirection = 0; + } + } + for (int idex = 0; idex < LED_COUNT; idex++) + { + leds[idex] = CHSV(thishue, thissat, ibright); + } + LEDS.show(); + } + if (curEffect == "pulse_one_color_all_rev") + { + // pulse_one_color_all_rev(); + if (bouncedirection == 0) + { + isat++; + if (isat >= 255) + { + bouncedirection = 1; + } + } + if (bouncedirection == 1) + { + isat = isat - 1; + if (isat <= 1) + { + bouncedirection = 0; + } + } + for (int idex = 0; idex < LED_COUNT; idex++) + { + leds[idex] = CHSV(thishue, isat, 255); + } + LEDS.show(); + } + if (curEffect == "fade_vertical") + { + // fade_vertical(); + idex++; + if (idex > TOP_INDEX) + { + idex = 0; + } + int idexA = idex; + int idexB = horizontal_index(idexA); + ibright = ibright + 10; + if (ibright > 255) + { + ibright = 0; + } + leds[idexA] = CHSV(thishue, thissat, ibright); + leds[idexB] = CHSV(thishue, thissat, ibright); + LEDS.show(); + } + if (curEffect == "rule30") + { + // rule30(); + if (bouncedirection == 0) + { + random_red(); + bouncedirection = 1; + } + copy_led_array(); + int iCW; + int iCCW; + int y = 100; + for (int i = 0; i < LED_COUNT; i++) + { + iCW = adjacent_cw(i); + iCCW = adjacent_ccw(i); + if (ledsX[iCCW][0] > y && ledsX[i][0] > y && ledsX[iCW][0] > y) + { + leds[i].r = 0; + } + if (ledsX[iCCW][0] > y && ledsX[i][0] > y && ledsX[iCW][0] <= y) + { + leds[i].r = 0; + } + if (ledsX[iCCW][0] > y && ledsX[i][0] <= y && ledsX[iCW][0] > y) + { + leds[i].r = 0; + } + if (ledsX[iCCW][0] > y && ledsX[i][0] <= y && ledsX[iCW][0] <= y) + { + leds[i].r = 255; + } + if (ledsX[iCCW][0] <= y && ledsX[i][0] > y && ledsX[iCW][0] > y) + { + leds[i].r = 255; + } + if (ledsX[iCCW][0] <= y && ledsX[i][0] > y && ledsX[iCW][0] <= y) + { + leds[i].r = 255; + } + if (ledsX[iCCW][0] <= y && ledsX[i][0] <= y && ledsX[iCW][0] > y) + { + leds[i].r = 255; + } + if (ledsX[iCCW][0] <= y && ledsX[i][0] <= y && ledsX[iCW][0] <= y) + { + leds[i].r = 0; + } + } + LEDS.show(); + } + if (curEffect == "random_march") + { + // random_march(); + copy_led_array(); + int iCCW; + leds[0] = CHSV(random(0, 255), 255, 255); + for (int idex = 1; idex < LED_COUNT; idex++) + { + iCCW = adjacent_ccw(idex); + leds[idex].r = ledsX[iCCW][0]; + leds[idex].g = ledsX[iCCW][1]; + leds[idex].b = ledsX[iCCW][2]; + } + LEDS.show(); + } + if (curEffect == "rwb_march") + { + // rwb_march(); + copy_led_array(); + int iCCW; + idex++; + if (idex > 2) + { + idex = 0; + } + switch (idex) + { + case 0: + leds[0].r = 255; + leds[0].g = 0; + leds[0].b = 0; + break; + case 1: + leds[0].r = 255; + leds[0].g = 255; + leds[0].b = 255; + break; + case 2: + leds[0].r = 0; + leds[0].g = 0; + leds[0].b = 255; + break; + } + for (int i = 1; i < LED_COUNT; i++) + { + iCCW = adjacent_ccw(i); + leds[i].r = ledsX[iCCW][0]; + leds[i].g = ledsX[iCCW][1]; + leds[i].b = ledsX[iCCW][2]; + } + LEDS.show(); + } + if (curEffect == "radiation") + { + // radiation(); + int N3 = int(LED_COUNT / 3); + int N6 = int(LED_COUNT / 6); + int N12 = int(LED_COUNT / 12); + for (int i = 0; i < N6; i++) + { //-HACKY, I KNOW... + tcount = tcount + .02; + if (tcount > 3.14) + { + tcount = 0.0; + } + ibright = int(sin(tcount) * 255); + int j0 = (i + LED_COUNT - N12) % LED_COUNT; + int j1 = (j0 + N3) % LED_COUNT; + int j2 = (j1 + N3) % LED_COUNT; + leds[j0] = CHSV(thishue, thissat, ibright); + leds[j1] = CHSV(thishue, thissat, ibright); + leds[j2] = CHSV(thishue, thissat, ibright); + } + LEDS.show(); + } + if (curEffect == "color_loop_vardelay") + { + // color_loop_vardelay(); + idex++; + if (idex > LED_COUNT) + { + idex = 0; + } + int di = abs(TOP_INDEX - idex); + int t = constrain((10 / di) * 10, 10, 500); + for (int i = 0; i < LED_COUNT; i++) + { + if (i == idex) + { + leds[i] = CHSV(0, thissat, 255); + } + else + { + leds[i].r = 0; + leds[i].g = 0; + leds[i].b = 0; + } + } + LEDS.show(); + } + if (curEffect == "white_temps") + { + // white_temps(); + int N9 = int(LED_COUNT / 9); + for (int i = 0; i < LED_COUNT; i++) + { + if (i >= 0 && i < N9) + { + leds[i].r = 255; //-CANDLE - 1900 + leds[i].g = 147; + leds[i].b = 41; + } + if (i >= N9 && i < N9 * 2) + { + leds[i].r = 255; //-40W TUNG - 2600 + leds[i].g = 197; + leds[i].b = 143; + } + if (i >= N9 * 2 && i < N9 * 3) + { + leds[i].r = 255; //-100W TUNG - 2850 + leds[i].g = 214; + leds[i].b = 170; + } + if (i >= N9 * 3 && i < N9 * 4) + { + leds[i].r = 255; //-HALOGEN - 3200 + leds[i].g = 241; + leds[i].b = 224; + } + if (i >= N9 * 4 && i < N9 * 5) + { + leds[i].r = 255; //-CARBON ARC - 5200 + leds[i].g = 250; + leds[i].b = 244; + } + if (i >= N9 * 5 && i < N9 * 6) + { + leds[i].r = 255; //-HIGH NOON SUN - 5400 + leds[i].g = 255; + leds[i].b = 251; + } + if (i >= N9 * 6 && i < N9 * 7) + { + leds[i].r = 255; //-DIRECT SUN - 6000 + leds[i].g = 255; + leds[i].b = 255; + } + if (i >= N9 * 7 && i < N9 * 8) + { + leds[i].r = 201; //-OVERCAST SKY - 7000 + leds[i].g = 226; + leds[i].b = 255; + } + if (i >= N9 * 8 && i < LED_COUNT) + { + leds[i].r = 64; //-CLEAR BLUE SKY - 20000 + leds[i].g = 156; + leds[i].b = 255; + } + } + LEDS.show(); + } + if (curEffect == "sin_bright_wave") + { + sin_bright_wave(); + } + if (curEffect == "pop_horizontal") + { + // pop_horizontal(); + int ix; + if (bouncedirection == 0) + { + bouncedirection = 1; + ix = idex; + } + else if (bouncedirection == 1) + { + bouncedirection = 0; + ix = horizontal_index(idex); + idex++; + if (idex > TOP_INDEX) + { + idex = 0; + } + } + for (int i = 0; i < LED_COUNT; i++) + { + if (i == ix) + { + leds[i] = CHSV(thishue, thissat, 255); + } + else + { + leds[i].r = 0; + leds[i].g = 0; + leds[i].b = 0; + } + } + LEDS.show(); + } + if (curEffect == "quad_bright_curve") + { + // quad_bright_curve(); + int ax; + for (int x = 0; x < LED_COUNT; x++) + { + if (x <= TOP_INDEX) + { + ax = x; + } + else if (x > TOP_INDEX) + { + ax = LED_COUNT - x; + } + int a = 1; + int b = 1; + int c = 0; + int iquad = -(ax * ax * a) + (ax * b) + c; //-ax2+bx+c + int hquad = -(TOP_INDEX * TOP_INDEX * a) + (TOP_INDEX * b) + c; + ibright = int((float(iquad) / float(hquad)) * 255); + leds[x] = CHSV(thishue, thissat, ibright); + } + LEDS.show(); + } + if (curEffect == "flame") + { + flame(); + } + if (curEffect == "rainbow_vertical") + { + // rainbow_vertical(); + idex++; + if (idex > TOP_INDEX) + { + idex = 0; + } + ihue = ihue + thisstep; + if (ihue > 255) + { + ihue = 0; + } + int idexA = idex; + int idexB = horizontal_index(idexA); + leds[idexA] = CHSV(ihue, thissat, 255); + leds[idexB] = CHSV(ihue, thissat, 255); + LEDS.show(); + } + if (curEffect == "pacman") + { + // pacman(); + int s = int(LED_COUNT / 4); + lcount++; + if (lcount > 5) + { + lcount = 0; + } + if (lcount == 0) + { + for (int i = 0; i < LED_COUNT; i++) + { + set_color_led(i, 255, 255, 0); + } + } + if (lcount == 1 || lcount == 5) + { + for (int i = 0; i < LED_COUNT; i++) + { + set_color_led(i, 255, 255, 0); + } + leds[s].r = 0; + leds[s].g = 0; + leds[s].b = 0; + } + if (lcount == 2 || lcount == 4) + { + for (int i = 0; i < LED_COUNT; i++) + { + set_color_led(i, 255, 255, 0); + } + leds[s - 1].r = 0; + leds[s - 1].g = 0; + leds[s - 1].b = 0; + leds[s].r = 0; + leds[s].g = 0; + leds[s].b = 0; + leds[s + 1].r = 0; + leds[s + 1].g = 0; + leds[s + 1].b = 0; + } + if (lcount == 3) + { + for (int i = 0; i < LED_COUNT; i++) + { + set_color_led(i, 255, 255, 0); + } + leds[s - 2].r = 0; + leds[s - 2].g = 0; + leds[s - 2].b = 0; + leds[s - 1].r = 0; + leds[s - 1].g = 0; + leds[s - 1].b = 0; + leds[s].r = 0; + leds[s].g = 0; + leds[s].b = 0; + leds[s + 1].r = 0; + leds[s + 1].g = 0; + leds[s + 1].b = 0; + leds[s + 2].r = 0; + leds[s + 2].g = 0; + leds[s + 2].b = 0; + } + LEDS.show(); + } + if (curEffect == "random_color_pop") + { + // random_color_pop(); + idex = random(0, LED_COUNT); + ihue = random(0, 255); + one_color_all(0, 0, 0); + leds[idex] = CHSV(ihue, thissat, 255); + LEDS.show(); + } + if (curEffect == "ems_lightsSTROBE") + { + ems_lightsSTROBE(); + } + if (curEffect == "Strobe") + { + Strobe(R, G, B, 10, 50, _speed); + } + + if (curEffect == "BouncingBalls") + { + BouncingBalls(R, G, B, 3); + } + if (curEffect == "BouncingColoredBalls") + { + byte colors[3][3] = {{0xff, 0, 0}, + {0xff, 0xff, 0xff}, + {0, 0, 0xff}}; + + BouncingColoredBalls(3, colors); + } + + if (curEffect == "rgb_propeller") + { + // rgb_propeller(); + idex++; + int ghue = (thishue + 80) % 255; + int bhue = (thishue + 160) % 255; + int N3 = int(LED_COUNT / 3); + int N6 = int(LED_COUNT / 6); + int N12 = int(LED_COUNT / 12); + for (int i = 0; i < N3; i++) + { + int j0 = (idex + i + LED_COUNT - N12) % LED_COUNT; + int j1 = (j0 + N3) % LED_COUNT; + int j2 = (j1 + N3) % LED_COUNT; + leds[j0] = CHSV(thishue, thissat, 255); + leds[j1] = CHSV(ghue, thissat, 255); + leds[j2] = CHSV(bhue, thissat, 255); + } + LEDS.show(); + } + if (curEffect == "kitt") + { + kitt(); + } + if (curEffect == "matrix") + { + // matrix(); + int rand = random(0, 100); + if (rand > 90) + { + leds[0] = CHSV(thishue, thissat, 255); + } + else + { + leds[0] = CHSV(thishue, thissat, 0); + } + copy_led_array(); + for (int i = 1; i < LED_COUNT; i++) + { + leds[i].r = ledsX[i - 1][0]; + leds[i].g = ledsX[i - 1][1]; + leds[i].b = ledsX[i - 1][2]; + } + LEDS.show(); + } + if (curEffect == "new_rainbow_loop") + { + // new_rainbow_loop(); + ihue -= 1; + fill_rainbow(leds, LED_COUNT, ihue); + LEDS.show(); + } + if (curEffect == "strip_march_ccw") + { + // strip_march_ccw(); + copy_led_array(); + int iCW; + for (int i = 0; i < LED_COUNT; i++) + { + iCW = adjacent_cw(i); + leds[i].r = ledsX[iCW][0]; + leds[i].g = ledsX[iCW][1]; + leds[i].b = ledsX[iCW][2]; + } + LEDS.show(); + } + if (curEffect == "strip_march_cw") + { + // strip_march_cw(); + copy_led_array(); + int iCCW; + for (int i = 0; i < LED_COUNT; i++) + { + iCCW = adjacent_ccw(i); + leds[i].r = ledsX[iCCW][0]; + leds[i].g = ledsX[iCCW][1]; + leds[i].b = ledsX[iCCW][2]; + } + LEDS.show(); + } + if (curEffect == "colorWipe") + { + colorWipe(R, G, B, thisdelay); + } + if (curEffect == "CylonBounce") + { + CylonBounce(R, G, B, 4, 10, thisdelay); + } + if (curEffect == "Fire") + { + // Fire(55, 120, thisdelay); + static byte heat[LED_COUNT]; + int cooldown; + int Cooling = 55, Sparking = 120; + // Step 1. Cool down every cell a little + for (int i = 0; i < LED_COUNT; i++) + { + cooldown = random(0, ((Cooling * 10) / LED_COUNT) + 2); + + if (cooldown > heat[i]) + { + heat[i] = 0; + } + else + { + heat[i] = heat[i] - cooldown; + } + } + + // Step 2. Heat from each cell drifts 'up' and diffuses a little + for (int k = LED_COUNT - 1; k >= 2; k--) + { + heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3; + } + + // Step 3. Randomly ignite new 'sparks' near the bottom + if (random(255) < Sparking) + { + int y = random(7); + heat[y] = heat[y] + random(160, 255); + // heat[y] = random(160,255); + } + + // Step 4. Convert heat to LED colors + for (int j = 0; j < LED_COUNT; j++) + { + setPixelHeatColor(j, heat[j]); + } + + FastLED.show(); + } + if (curEffect == "NewKITT") + { + NewKITT(0xff, 0, 0, 8, 10, thisdelay); + } + if (curEffect == "rainbowCycle") + { + rainbowCycle(thisdelay); + } + if (curEffect == "TwinkleRandom") + { + TwinkleRandom(20, thisdelay, 1); + } + if (curEffect == "RunningLights") + { + RunningLights(0xff, 0xff, 0x00, thisdelay); + } + if (curEffect == "Sparkle") + { + Sparkle(random(255), random(255), random(60), _speed); + } + if (curEffect == "SnowSparkle") + { + SnowSparkle(0, 0, 0, 20, random(100, 1000)); + } + if (curEffect == "theaterChase") + { + theaterChase(0xff, 0, 0, _speed); + } + if (curEffect == "theaterChaseRainbow") + { + theaterChaseRainbow(_speed); + } + + if (curEffect == "demo_modeA") + { + demo_modeA(); + } + if (curEffect == "demo_modeB") + { + demo_modeB(); + } + if (curEffect == "meteorRain") + { + meteorRain(R, G, B, 10, 64, true, _speed); + } + + // матрицы + // *********** "дыхание" яркостью *********** + if (curEffect == "brightnessRoutine") + { + brightnessRoutine(); + } + // *********** снегопад 2.0 *********** + if (curEffect == "snowRoutine") + { + snowRoutine(); + } + // ***************************** БЛУДНЫЙ КУБИК ***************************** + if (curEffect == "ballRoutine") + { + ballRoutine(); + } + // *********** радуга заливка *********** + if (curEffect == "rainbowRoutine") + { + rainbowRoutine(); + } + // *********** радуга дигональная *********** + if (curEffect == "rainbowDiagonalRoutine") + { + rainbowDiagonalRoutine(); + } + // *********** радуга активных светодиодов (рисунка) *********** + if (curEffect == "rainbowColorsRoutine") + { + rainbowColorsRoutine(); + } + // ********************** огонь ********************** + if (curEffect == "fireRoutine") + { + fireRoutine(); + } + // **************** МАТРИЦА ***************** + if (curEffect == "matrixRoutine") + { + matrixRoutine(); + } + // ********************* ЗВЕЗДОПАД ****************** + if (curEffect == "starfallRoutine") + { + starfallRoutine(); + } + // рандомные гаснущие вспышки + if (curEffect == "sparklesRoutine") + { + sparklesRoutine(); + } + // ----------------------------- СВЕТЛЯКИ ------------------------------ + if (curEffect == "lightersRoutine") + { + lightersRoutine(); + } + // ------------- ПЕЙНТБОЛ ------------- + if (curEffect == "lightBallsRoutine") + { + lightBallsRoutine(); + } + // ------------- ВОДОВОРОТ ------------- + if (curEffect == "swirlRoutine") + { + swirlRoutine(); + } + // ------------- крутящаяся радуга матрица ------------- + if (curEffect == "rainbow_loop_matrix") + { + idex++; + ihue = ihue + thisstep; + if (idex >= LED_COUNT) + { + idex = 0; + } + if (ihue > 255) + { + ihue = 0; + } + + for (byte i = 0; i < WIDTH; i++) + { + CHSV thisColor = CHSV(ihue, thissat, 255); + for (byte j = 0; j < HEIGHT; j++) + drawPixelXY(i, j, thisColor); // leds[getPixelNumber(i, j)] = thisColor; + } + } + + FastLED.show(); + } + } + + IoTValue + execute(String command, std::vector ¶m) + { + + if (command == "effect") + { + curEffect = "none"; + + ///////////////////////////////////// + if (param[0].valS == "rainbow_fade") + { + curEffect = "rainbow_fade"; + } + if (param[0].valS == "rainbow_loop") + { + curEffect = "rainbow_loop"; + } + if (param[0].valS == "random_burst") + { + curEffect = "random_burst"; + } + if (param[0].valS == "color_bounce") + { + curEffect = "color_bounce"; + } + if (param[0].valS == "color_bounceFADE") + { + curEffect = "color_bounceFADE"; + } + if (param[0].valS == "ems_lightsONE") + { + curEffect = "ems_lightsONE"; + } + if (param[0].valS == "ems_lightsALL") + { + curEffect = "ems_lightsALL"; + } + if (param[0].valS == "pulse_one_color_all") + { + curEffect = "pulse_one_color_all"; + } + if (param[0].valS == "pulse_one_color_all_rev") + { + curEffect = "pulse_one_color_all_rev"; + } + if (param[0].valS == "fade_vertical") + { + curEffect = "fade_vertical"; + } + if (param[0].valS == "rule30") + { + curEffect = "rule30"; + } + if (param[0].valS == "random_march") + { + curEffect = "random_march"; + } + if (param[0].valS == "rwb_march") + { + curEffect = "rwb_march"; + } + if (param[0].valS == "radiation") + { + curEffect = "radiation"; + } + if (param[0].valS == "color_loop_vardelay") + { + curEffect = "color_loop_vardelay"; + } + if (param[0].valS == "white_temps") + { + curEffect = "white_temps"; + } + if (param[0].valS == "sin_bright_wave") + { + curEffect = "sin_bright_wave"; + } + if (param[0].valS == "pop_horizontal") + { + curEffect = "pop_horizontal"; + } + if (param[0].valS == "quad_bright_curve") + { + curEffect = "quad_bright_curve"; + } + if (param[0].valS == "flame") + { + curEffect = "flame"; + } + if (param[0].valS == "rainbow_vertical") + { + curEffect = "rainbow_vertical"; + } + if (param[0].valS == "pacman") + { + curEffect = "pacman"; + } + if (param[0].valS == "random_color_pop") + { + curEffect = "random_color_pop"; + } + if (param[0].valS == "ems_lightsSTROBE") + { + curEffect = "ems_lightsSTROBE"; + } + if (param[0].valS == "rgb_propeller") + { + curEffect = "rgb_propeller"; + } + if (param[0].valS == "kitt") + { + curEffect = "kitt"; + } + if (param[0].valS == "matrix") + { + curEffect = "matrix"; + } + if (param[0].valS == "new_rainbow_loop") + { + curEffect = "new_rainbow_loop"; + } + if (param[0].valS == "strip_march_ccw") + { + curEffect = "strip_march_ccw"; + } + if (param[0].valS == "strip_march_cw") + { + curEffect = "strip_march_cw"; + } + if (param[0].valS == "colorWipe") + { + curEffect = "colorWipe"; + } + if (param[0].valS == "CylonBounce") + { + curEffect = "CylonBounce"; + } + if (param[0].valS == "Fire") + { + curEffect = "Fire"; + } + if (param[0].valS == "NewKITT") + { + curEffect = "NewKITT"; + } + if (param[0].valS == "rainbowCycle") + { + curEffect = "rainbowCycle"; + } + if (param[0].valS == "TwinkleRandom") + { + curEffect = "TwinkleRandom"; + } + if (param[0].valS == "RunningLights") + { + curEffect = "RunningLights"; + } + if (param[0].valS == "Sparkle") + { + curEffect = "Sparkle"; + } + if (param[0].valS == "SnowSparkle") + { + curEffect = "SnowSparkle"; + } + if (param[0].valS == "theaterChase") + { + curEffect = "theaterChase"; + } + if (param[0].valS == "theaterChaseRainbow") + { + curEffect = "theaterChaseRainbow"; + } + if (param[0].valS == "Strobe") + { + curEffect = "Strobe"; + } + if (param[0].valS == "BouncingBalls") + { + curEffect = "BouncingBalls"; + } + if (param[0].valS == "BouncingColoredBalls") + { + curEffect = "BouncingColoredBalls"; + } + if (param[0].valS == "demo_modeA") + { + curEffect = "demo_modeA"; + } + if (param[0].valS == "demo_modeB") + { + curEffect = "demo_modeB"; + } + if (param[0].valS == "meteorRain") + { + curEffect = "meteorRain"; + } + + // матрицы + + // *********** "дыхание" яркостью *********** + if (param[0].valS == "brightnessRoutine") + { + curEffect = "brightnessRoutine"; + } + // *********** снегопад 2.0 *********** + if (param[0].valS == "snowRoutine") + { + curEffect = "snowRoutine"; + } + // ***************************** БЛУДНЫЙ КУБИК ***************************** + if (param[0].valS == "ballRoutine") + { + curEffect = "ballRoutine"; + } + // *********** радуга заливка *********** + if (param[0].valS == "rainbowRoutine") + { + curEffect = "rainbowRoutine"; + } + // *********** радуга дигональная *********** + if (param[0].valS == "rainbowDiagonalRoutine") + { + curEffect = "rainbowDiagonalRoutine"; + } + // *********** радуга активных светодиодов (рисунка) *********** + if (param[0].valS == "rainbowColorsRoutine") + { + curEffect = "rainbowColorsRoutine"; + } + // ********************** огонь ********************** + if (param[0].valS == "fireRoutine") + { + curEffect = "fireRoutine"; + } + // **************** МАТРИЦА ***************** + if (param[0].valS == "matrixRoutine") + { + curEffect = "matrixRoutine"; + } + // ********************* ЗВЕЗДОПАД ****************** + if (param[0].valS == "starfallRoutine") + { + curEffect = "starfallRoutine"; + } + // рандомные гаснущие вспышки + if (param[0].valS == "sparklesRoutine") + { + curEffect = "sparklesRoutine"; + } + // ----------------------------- СВЕТЛЯКИ ------------------------------ + if (param[0].valS == "lightersRoutine") + { + curEffect = "lightersRoutine"; + } + // ------------- ПЕЙНТБОЛ ------------- + if (param[0].valS == "lightBallsRoutine") + { + curEffect = "lightBallsRoutine"; + } + // ------------- ВОДОВОРОТ ------------- + if (param[0].valS == "swirlRoutine") + { + curEffect = "swirlRoutine"; + } + // ------------- крутящаяся радуга матрица ------------- + if (param[0].valS == "rainbow_loop_matrix") + { + curEffect = "rainbow_loop_matrix"; + } + + /////////////////////////////////////////////////// + } + else if (command == "brightness") + { + _brightness = param[0].valD; + LEDS.setBrightness(_brightness); + LEDS.show(); + } + else if (command == "speed") + { + _speed = param[0].valD; + } + else if (command == "dalay") + { + _dalay = param[0].valD; + } + else if (command == "color") + { + R = param[0].valD; + G = param[1].valD; + B = param[2].valD; + setAll(R, G, B); + LEDS.show(); + } + else if (command == "Off") + { + curEffect = "none"; + setAll(0, 0, 0); + LEDS.show(); + } + else if (command == "On") + { + curEffect = "none"; + + if (param.size() == 3) + { + R = param[0].valD; + G = param[1].valD; + B = param[2].valD; + setAll(R, G, B); + } + else + { + setAll(R, G, B); + } + LEDS.show(); + } + + return {}; + } + void setValue(const IoTValue &Value, bool genEvent = true) + { + value = Value; + _brightness = map(value.valD, 1, 1024, 1, 100); + LEDS.setBrightness(_brightness); + regEvent(value.valD, "GyverLAMP", false, genEvent); + // setAll(R, G, B); + LEDS.show(); + } + ~GyverLAMP(){}; +}; + +void *getAPI_GyverLAMP(String subtype, String param) +{ + if (subtype == F("GyverLAMP")) + { + return new GyverLAMP(param); + } + else + { + return nullptr; + } +} diff --git a/src/modules/display/GyverLAMP/config.h b/src/modules/display/GyverLAMP/config.h new file mode 100644 index 00000000..5fa713c4 --- /dev/null +++ b/src/modules/display/GyverLAMP/config.h @@ -0,0 +1,9 @@ + +// матрица +#define WIDTH 16 // ширина матрицы +#define HEIGHT 16 // высота матрицы +#define SEGMENTS 1 // диодов в одном "пикселе" (для создания матрицы из кусков ленты) +#define NUM_LEDS WIDTH *HEIGHT *SEGMENTS +// лента +#define LED_COUNT NUM_LEDS // число светодиодов в кольце/ленте +#define LED_DT 13 // пин, куда подключен DIN ленты \ No newline at end of file diff --git a/src/modules/display/GyverLAMP/effects.h b/src/modules/display/GyverLAMP/effects.h new file mode 100644 index 00000000..811f2b71 --- /dev/null +++ b/src/modules/display/GyverLAMP/effects.h @@ -0,0 +1,1833 @@ +#include "config.h" +CRGB leds[NUM_LEDS]; +// ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ----------------- +int _brightness; +int _speed, _dalay; +// int _x_size, _y_size; +int R = 255, G = 255, B = 255; +int BOTTOM_INDEX = 0; // светодиод начала отсчёта +int TOP_INDEX = int(LED_COUNT / 2); +int EVENODD = LED_COUNT % 2; +int ledsX[LED_COUNT][3]; //-ARRAY FOR COPYING WHATS IN THE LED STRIP CURRENTLY (FOR CELL-AUTOMATA, MARCH, ETC) + +int thisdelay = 20; //-FX LOOPS DELAY VAR +int thisstep = 10; //-FX LOOPS DELAY VAR +int thishue = 0; //-FX LOOPS DELAY VAR +int thissat = 255; //-FX LOOPS DELAY VAR + +int thisindex = 0; +int thisRED = 0; +int thisGRN = 0; +int thisBLU = 0; + +int idex = 0; //-LED INDEX (0 to LED_COUNT-1 +int ihue = 0; //-HUE (0-255) +int ibright = 0; //-BRIGHTNESS (0-255) +int isat = 0; //-SATURATION (0-255) +int bouncedirection = 0; //-SWITCH FOR COLOR BOUNCE (0-1) +float tcount = 0.0; //-INC VAR FOR SIN LOOPS +int lcount = 0; //-ANOTHER COUNTING VAR + +volatile boolean changeFlag; +// цвета мячиков для режима +byte ballColors[3][3] = { + {0xff, 0, 0}, + {0xff, 0xff, 0xff}, + {0, 0, 0xff}}; + +//------------------------------------- UTILITY FXNS -------------------------------------- +//---SET THE COLOR OF A SINGLE RGB LED +void set_color_led(int adex, int cred, int cgrn, int cblu) +{ + leds[adex].setRGB(cred, cgrn, cblu); +} + +//---FIND INDEX OF HORIZONAL OPPOSITE LED +int horizontal_index(int i) +{ + //-ONLY WORKS WITH INDEX < TOPINDEX + if (i == BOTTOM_INDEX) + { + return BOTTOM_INDEX; + } + if (i == TOP_INDEX && EVENODD == 1) + { + return TOP_INDEX + 1; + } + if (i == TOP_INDEX && EVENODD == 0) + { + return TOP_INDEX; + } + return LED_COUNT - i; +} + +//---FIND INDEX OF ANTIPODAL OPPOSITE LED +int antipodal_index(int i) +{ + int iN = i + TOP_INDEX; + if (i >= TOP_INDEX) + { + iN = (i + TOP_INDEX) % LED_COUNT; + } + return iN; +} + +//---FIND ADJACENT INDEX CLOCKWISE +int adjacent_cw(int i) +{ + int r; + if (i < LED_COUNT - 1) + { + r = i + 1; + } + else + { + r = 0; + } + return r; +} + +//---FIND ADJACENT INDEX COUNTER-CLOCKWISE +int adjacent_ccw(int i) +{ + int r; + if (i > 0) + { + r = i - 1; + } + else + { + r = LED_COUNT - 1; + } + return r; +} + +void copy_led_array() +{ + for (int i = 0; i < LED_COUNT; i++) + { + ledsX[i][0] = leds[i].r; + ledsX[i][1] = leds[i].g; + ledsX[i][2] = leds[i].b; + } +} + +void setPixel(int Pixel, byte red, byte green, byte blue) +{ + leds[Pixel].r = red; + leds[Pixel].g = green; + leds[Pixel].b = blue; +} +void one_color_all(int cred, int cgrn, int cblu) +{ //-SET ALL LEDS TO ONE COLOR + for (int i = 0; i < LED_COUNT; i++) + { + leds[i].setRGB(cred, cgrn, cblu); + } +} +void setAll(byte red, byte green, byte blue) +{ + + for (int i = 0; i < LED_COUNT; i++) + { + setPixel(i, red, green, blue); + } + + FastLED.show(); +} + +boolean safeDelay(int delTime) +{ + uint32_t thisTime = millis(); + while (millis() - thisTime <= delTime) + { + if (changeFlag) + { + changeFlag = false; + return true; + } + } + return false; +} +//------------------------LED EFFECT FUNCTIONS------------------------ + +void one_color_allHSV(int ahue) +{ //-SET ALL LEDS TO ONE COLOR (HSV) + for (int i = 0; i < LED_COUNT; i++) + { + leds[i] = CHSV(ahue, thissat, 255); + } +} + +void rainbow_fade() +{ //-m2-FADE ALL LEDS THROUGH HSV RAINBOW + ihue++; + if (ihue > 255) + { + ihue = 0; + } + for (int idex = 0; idex < LED_COUNT; idex++) + { + leds[idex] = CHSV(ihue, thissat, 255); + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void rainbow_loop() +{ //-m3-LOOP HSV RAINBOW + idex++; + ihue = ihue + thisstep; + if (idex >= LED_COUNT) + { + idex = 0; + } + if (ihue > 255) + { + ihue = 0; + } + leds[idex] = CHSV(ihue, thissat, 255); + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void random_burst() +{ //-m4-RANDOM INDEX/COLOR + idex = random(0, LED_COUNT); + ihue = random(0, 255); + leds[idex] = CHSV(ihue, thissat, 255); + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void color_bounce() +{ //-m5-BOUNCE COLOR (SINGLE LED) + if (bouncedirection == 0) + { + idex = idex + 1; + if (idex == LED_COUNT) + { + bouncedirection = 1; + idex = idex - 1; + } + } + if (bouncedirection == 1) + { + idex = idex - 1; + if (idex == 0) + { + bouncedirection = 0; + } + } + for (int i = 0; i < LED_COUNT; i++) + { + if (i == idex) + { + leds[i] = CHSV(thishue, thissat, 255); + } + else + { + leds[i] = CHSV(0, 0, 0); + } + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void color_bounceFADE() +{ //-m6-BOUNCE COLOR (SIMPLE MULTI-LED FADE) + if (bouncedirection == 0) + { + idex = idex + 1; + if (idex == LED_COUNT) + { + bouncedirection = 1; + idex = idex - 1; + } + } + if (bouncedirection == 1) + { + idex = idex - 1; + if (idex == 0) + { + bouncedirection = 0; + } + } + int iL1 = adjacent_cw(idex); + int iL2 = adjacent_cw(iL1); + int iL3 = adjacent_cw(iL2); + int iR1 = adjacent_ccw(idex); + int iR2 = adjacent_ccw(iR1); + int iR3 = adjacent_ccw(iR2); + for (int i = 0; i < LED_COUNT; i++) + { + if (i == idex) + { + leds[i] = CHSV(thishue, thissat, 255); + } + else if (i == iL1) + { + leds[i] = CHSV(thishue, thissat, 150); + } + else if (i == iL2) + { + leds[i] = CHSV(thishue, thissat, 80); + } + else if (i == iL3) + { + leds[i] = CHSV(thishue, thissat, 20); + } + else if (i == iR1) + { + leds[i] = CHSV(thishue, thissat, 150); + } + else if (i == iR2) + { + leds[i] = CHSV(thishue, thissat, 80); + } + else if (i == iR3) + { + leds[i] = CHSV(thishue, thissat, 20); + } + else + { + leds[i] = CHSV(0, 0, 0); + } + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void ems_lightsONE() +{ //-m7-EMERGENCY LIGHTS (TWO COLOR SINGLE LED) + idex++; + if (idex >= LED_COUNT) + { + idex = 0; + } + int idexR = idex; + int idexB = antipodal_index(idexR); + int thathue = (thishue + 160) % 255; + for (int i = 0; i < LED_COUNT; i++) + { + if (i == idexR) + { + leds[i] = CHSV(thishue, thissat, 255); + } + else if (i == idexB) + { + leds[i] = CHSV(thathue, thissat, 255); + } + else + { + leds[i] = CHSV(0, 0, 0); + } + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void ems_lightsALL() +{ //-m8-EMERGENCY LIGHTS (TWO COLOR SOLID) + idex++; + if (idex >= LED_COUNT) + { + idex = 0; + } + int idexR = idex; + int idexB = antipodal_index(idexR); + int thathue = (thishue + 160) % 255; + leds[idexR] = CHSV(thishue, thissat, 255); + leds[idexB] = CHSV(thathue, thissat, 255); + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void flicker() +{ //-m9-FLICKER EFFECT + int random_bright = random(0, 255); + int random_delay = random(10, 100); + int random_bool = random(0, random_bright); + if (random_bool < 10) + { + for (int i = 0; i < LED_COUNT; i++) + { + leds[i] = CHSV(thishue, thissat, random_bright); + } + LEDS.show(); + if (safeDelay(random_delay)) + return; + } +} + +void pulse_one_color_all() +{ //-m10-PULSE BRIGHTNESS ON ALL LEDS TO ONE COLOR + if (bouncedirection == 0) + { + ibright++; + if (ibright >= 255) + { + bouncedirection = 1; + } + } + if (bouncedirection == 1) + { + ibright = ibright - 1; + if (ibright <= 1) + { + bouncedirection = 0; + } + } + for (int idex = 0; idex < LED_COUNT; idex++) + { + leds[idex] = CHSV(thishue, thissat, ibright); + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void pulse_one_color_all_rev() +{ //-m11-PULSE SATURATION ON ALL LEDS TO ONE COLOR + if (bouncedirection == 0) + { + isat++; + if (isat >= 255) + { + bouncedirection = 1; + } + } + if (bouncedirection == 1) + { + isat = isat - 1; + if (isat <= 1) + { + bouncedirection = 0; + } + } + for (int idex = 0; idex < LED_COUNT; idex++) + { + leds[idex] = CHSV(thishue, isat, 255); + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void fade_vertical() +{ //-m12-FADE 'UP' THE LOOP + idex++; + if (idex > TOP_INDEX) + { + idex = 0; + } + int idexA = idex; + int idexB = horizontal_index(idexA); + ibright = ibright + 10; + if (ibright > 255) + { + ibright = 0; + } + leds[idexA] = CHSV(thishue, thissat, ibright); + leds[idexB] = CHSV(thishue, thissat, ibright); + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} +//? +void random_red() +{ // QUICK 'N DIRTY RANDOMIZE TO GET CELL AUTOMATA STARTED + int temprand; + for (int i = 0; i < LED_COUNT; i++) + { + temprand = random(0, 100); + if (temprand > 50) + { + leds[i].r = 255; + } + if (temprand <= 50) + { + leds[i].r = 0; + } + leds[i].b = 0; + leds[i].g = 0; + } + LEDS.show(); +} + +void rule30() +{ //-m13-1D CELLULAR AUTOMATA - RULE 30 (RED FOR NOW) + if (bouncedirection == 0) + { + random_red(); + bouncedirection = 1; + } + copy_led_array(); + int iCW; + int iCCW; + int y = 100; + for (int i = 0; i < LED_COUNT; i++) + { + iCW = adjacent_cw(i); + iCCW = adjacent_ccw(i); + if (ledsX[iCCW][0] > y && ledsX[i][0] > y && ledsX[iCW][0] > y) + { + leds[i].r = 0; + } + if (ledsX[iCCW][0] > y && ledsX[i][0] > y && ledsX[iCW][0] <= y) + { + leds[i].r = 0; + } + if (ledsX[iCCW][0] > y && ledsX[i][0] <= y && ledsX[iCW][0] > y) + { + leds[i].r = 0; + } + if (ledsX[iCCW][0] > y && ledsX[i][0] <= y && ledsX[iCW][0] <= y) + { + leds[i].r = 255; + } + if (ledsX[iCCW][0] <= y && ledsX[i][0] > y && ledsX[iCW][0] > y) + { + leds[i].r = 255; + } + if (ledsX[iCCW][0] <= y && ledsX[i][0] > y && ledsX[iCW][0] <= y) + { + leds[i].r = 255; + } + if (ledsX[iCCW][0] <= y && ledsX[i][0] <= y && ledsX[iCW][0] > y) + { + leds[i].r = 255; + } + if (ledsX[iCCW][0] <= y && ledsX[i][0] <= y && ledsX[iCW][0] <= y) + { + leds[i].r = 0; + } + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void random_march() +{ //-m14-RANDOM MARCH CCW + copy_led_array(); + int iCCW; + leds[0] = CHSV(random(0, 255), 255, 255); + for (int idex = 1; idex < LED_COUNT; idex++) + { + iCCW = adjacent_ccw(idex); + leds[idex].r = ledsX[iCCW][0]; + leds[idex].g = ledsX[iCCW][1]; + leds[idex].b = ledsX[iCCW][2]; + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void rwb_march() +{ //-m15-R,W,B MARCH CCW + copy_led_array(); + int iCCW; + idex++; + if (idex > 2) + { + idex = 0; + } + switch (idex) + { + case 0: + leds[0].r = 255; + leds[0].g = 0; + leds[0].b = 0; + break; + case 1: + leds[0].r = 255; + leds[0].g = 255; + leds[0].b = 255; + break; + case 2: + leds[0].r = 0; + leds[0].g = 0; + leds[0].b = 255; + break; + } + for (int i = 1; i < LED_COUNT; i++) + { + iCCW = adjacent_ccw(i); + leds[i].r = ledsX[iCCW][0]; + leds[i].g = ledsX[iCCW][1]; + leds[i].b = ledsX[iCCW][2]; + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void radiation() +{ //-m16-SORT OF RADIATION SYMBOLISH- + int N3 = int(LED_COUNT / 3); + int N6 = int(LED_COUNT / 6); + int N12 = int(LED_COUNT / 12); + for (int i = 0; i < N6; i++) + { //-HACKY, I KNOW... + tcount = tcount + .02; + if (tcount > 3.14) + { + tcount = 0.0; + } + ibright = int(sin(tcount) * 255); + int j0 = (i + LED_COUNT - N12) % LED_COUNT; + int j1 = (j0 + N3) % LED_COUNT; + int j2 = (j1 + N3) % LED_COUNT; + leds[j0] = CHSV(thishue, thissat, ibright); + leds[j1] = CHSV(thishue, thissat, ibright); + leds[j2] = CHSV(thishue, thissat, ibright); + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void color_loop_vardelay() +{ //-m17-COLOR LOOP (SINGLE LED) w/ VARIABLE DELAY + idex++; + if (idex > LED_COUNT) + { + idex = 0; + } + int di = abs(TOP_INDEX - idex); + int t = constrain((10 / di) * 10, 10, 500); + for (int i = 0; i < LED_COUNT; i++) + { + if (i == idex) + { + leds[i] = CHSV(0, thissat, 255); + } + else + { + leds[i].r = 0; + leds[i].g = 0; + leds[i].b = 0; + } + } + LEDS.show(); + if (safeDelay(t)) + return; +} + +void white_temps() +{ //-m18-SHOW A SAMPLE OF BLACK BODY RADIATION COLOR TEMPERATURES + int N9 = int(LED_COUNT / 9); + for (int i = 0; i < LED_COUNT; i++) + { + if (i >= 0 && i < N9) + { + leds[i].r = 255; //-CANDLE - 1900 + leds[i].g = 147; + leds[i].b = 41; + } + if (i >= N9 && i < N9 * 2) + { + leds[i].r = 255; //-40W TUNG - 2600 + leds[i].g = 197; + leds[i].b = 143; + } + if (i >= N9 * 2 && i < N9 * 3) + { + leds[i].r = 255; //-100W TUNG - 2850 + leds[i].g = 214; + leds[i].b = 170; + } + if (i >= N9 * 3 && i < N9 * 4) + { + leds[i].r = 255; //-HALOGEN - 3200 + leds[i].g = 241; + leds[i].b = 224; + } + if (i >= N9 * 4 && i < N9 * 5) + { + leds[i].r = 255; //-CARBON ARC - 5200 + leds[i].g = 250; + leds[i].b = 244; + } + if (i >= N9 * 5 && i < N9 * 6) + { + leds[i].r = 255; //-HIGH NOON SUN - 5400 + leds[i].g = 255; + leds[i].b = 251; + } + if (i >= N9 * 6 && i < N9 * 7) + { + leds[i].r = 255; //-DIRECT SUN - 6000 + leds[i].g = 255; + leds[i].b = 255; + } + if (i >= N9 * 7 && i < N9 * 8) + { + leds[i].r = 201; //-OVERCAST SKY - 7000 + leds[i].g = 226; + leds[i].b = 255; + } + if (i >= N9 * 8 && i < LED_COUNT) + { + leds[i].r = 64; //-CLEAR BLUE SKY - 20000 + leds[i].g = 156; + leds[i].b = 255; + } + } + LEDS.show(); + delay(100); +} +//?? +void sin_bright_wave() +{ //-m19-BRIGHTNESS SINE WAVE + for (int i = 0; i < LED_COUNT; i++) + { + tcount = tcount + .1; + if (tcount > 3.14) + { + tcount = 0.0; + } + ibright = int(sin(tcount) * 255); + leds[i] = CHSV(thishue, thissat, ibright); + LEDS.show(); + if (safeDelay(thisdelay)) + return; + } +} + +void pop_horizontal() +{ //-m20-POP FROM LEFT TO RIGHT UP THE RING + int ix; + if (bouncedirection == 0) + { + bouncedirection = 1; + ix = idex; + } + else if (bouncedirection == 1) + { + bouncedirection = 0; + ix = horizontal_index(idex); + idex++; + if (idex > TOP_INDEX) + { + idex = 0; + } + } + for (int i = 0; i < LED_COUNT; i++) + { + if (i == ix) + { + leds[i] = CHSV(thishue, thissat, 255); + } + else + { + leds[i].r = 0; + leds[i].g = 0; + leds[i].b = 0; + } + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void quad_bright_curve() +{ //-m21-QUADRATIC BRIGHTNESS CURVER + int ax; + for (int x = 0; x < LED_COUNT; x++) + { + if (x <= TOP_INDEX) + { + ax = x; + } + else if (x > TOP_INDEX) + { + ax = LED_COUNT - x; + } + int a = 1; + int b = 1; + int c = 0; + int iquad = -(ax * ax * a) + (ax * b) + c; //-ax2+bx+c + int hquad = -(TOP_INDEX * TOP_INDEX * a) + (TOP_INDEX * b) + c; + ibright = int((float(iquad) / float(hquad)) * 255); + leds[x] = CHSV(thishue, thissat, ibright); + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} +//?? +void flame() +{ //-m22-FLAMEISH EFFECT + int idelay = random(0, 35); + float hmin = 0.1; + float hmax = 45.0; + float hdif = hmax - hmin; + int randtemp = random(0, 3); + float hinc = (hdif / float(TOP_INDEX)) + randtemp; + int ihue = hmin; + for (int i = 0; i <= TOP_INDEX; i++) + { + ihue = ihue + hinc; + leds[i] = CHSV(ihue, thissat, 255); + int ih = horizontal_index(i); + leds[ih] = CHSV(ihue, thissat, 255); + leds[TOP_INDEX].r = 255; + leds[TOP_INDEX].g = 255; + leds[TOP_INDEX].b = 255; + LEDS.show(); + if (safeDelay(idelay)) + return; + } +} + +void rainbow_vertical() +{ //-m23-RAINBOW 'UP' THE LOOP + idex++; + if (idex > TOP_INDEX) + { + idex = 0; + } + ihue = ihue + thisstep; + if (ihue > 255) + { + ihue = 0; + } + int idexA = idex; + int idexB = horizontal_index(idexA); + leds[idexA] = CHSV(ihue, thissat, 255); + leds[idexB] = CHSV(ihue, thissat, 255); + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void pacman() +{ //-m24-REALLY TERRIBLE PACMAN CHOMPING EFFECT + int s = int(LED_COUNT / 4); + lcount++; + if (lcount > 5) + { + lcount = 0; + } + if (lcount == 0) + { + for (int i = 0; i < LED_COUNT; i++) + { + set_color_led(i, 255, 255, 0); + } + } + if (lcount == 1 || lcount == 5) + { + for (int i = 0; i < LED_COUNT; i++) + { + set_color_led(i, 255, 255, 0); + } + leds[s].r = 0; + leds[s].g = 0; + leds[s].b = 0; + } + if (lcount == 2 || lcount == 4) + { + for (int i = 0; i < LED_COUNT; i++) + { + set_color_led(i, 255, 255, 0); + } + leds[s - 1].r = 0; + leds[s - 1].g = 0; + leds[s - 1].b = 0; + leds[s].r = 0; + leds[s].g = 0; + leds[s].b = 0; + leds[s + 1].r = 0; + leds[s + 1].g = 0; + leds[s + 1].b = 0; + } + if (lcount == 3) + { + for (int i = 0; i < LED_COUNT; i++) + { + set_color_led(i, 255, 255, 0); + } + leds[s - 2].r = 0; + leds[s - 2].g = 0; + leds[s - 2].b = 0; + leds[s - 1].r = 0; + leds[s - 1].g = 0; + leds[s - 1].b = 0; + leds[s].r = 0; + leds[s].g = 0; + leds[s].b = 0; + leds[s + 1].r = 0; + leds[s + 1].g = 0; + leds[s + 1].b = 0; + leds[s + 2].r = 0; + leds[s + 2].g = 0; + leds[s + 2].b = 0; + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void random_color_pop() +{ //-m25-RANDOM COLOR POP + idex = random(0, LED_COUNT); + ihue = random(0, 255); + one_color_all(0, 0, 0); + leds[idex] = CHSV(ihue, thissat, 255); + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} +//?? +void ems_lightsSTROBE() +{ //-m26-EMERGENCY LIGHTS (STROBE LEFT/RIGHT) + int thishue = 0; + int thathue = (thishue + 160) % 255; + for (int x = 0; x < 5; x++) + { + for (int i = 0; i < TOP_INDEX; i++) + { + leds[i] = CHSV(thishue, thissat, 255); + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; + one_color_all(0, 0, 0); + LEDS.show(); + if (safeDelay(thisdelay)) + return; + } + for (int x = 0; x < 5; x++) + { + for (int i = TOP_INDEX; i < LED_COUNT; i++) + { + leds[i] = CHSV(thathue, thissat, 255); + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; + one_color_all(0, 0, 0); + LEDS.show(); + if (safeDelay(thisdelay)) + return; + } +} + +void rgb_propeller() +{ //-m27-RGB PROPELLER + idex++; + int ghue = (thishue + 80) % 255; + int bhue = (thishue + 160) % 255; + int N3 = int(LED_COUNT / 3); + int N6 = int(LED_COUNT / 6); + int N12 = int(LED_COUNT / 12); + for (int i = 0; i < N3; i++) + { + int j0 = (idex + i + LED_COUNT - N12) % LED_COUNT; + int j1 = (j0 + N3) % LED_COUNT; + int j2 = (j1 + N3) % LED_COUNT; + leds[j0] = CHSV(thishue, thissat, 255); + leds[j1] = CHSV(ghue, thissat, 255); + leds[j2] = CHSV(bhue, thissat, 255); + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} +//?? +void kitt() +{ //-m28-KNIGHT INDUSTIES 2000 + int rand = random(0, TOP_INDEX); + for (int i = 0; i < rand; i++) + { + leds[TOP_INDEX + i] = CHSV(thishue, thissat, 255); + leds[TOP_INDEX - i] = CHSV(thishue, thissat, 255); + LEDS.show(); + if (safeDelay(thisdelay / rand)) + return; + } + for (int i = rand; i > 0; i--) + { + leds[TOP_INDEX + i] = CHSV(thishue, thissat, 0); + leds[TOP_INDEX - i] = CHSV(thishue, thissat, 0); + LEDS.show(); + if (safeDelay(thisdelay / rand)) + return; + } +} + +void matrix() +{ //-m29-ONE LINE MATRIX + int rand = random(0, 100); + if (rand > 90) + { + leds[0] = CHSV(thishue, thissat, 255); + } + else + { + leds[0] = CHSV(thishue, thissat, 0); + } + copy_led_array(); + for (int i = 1; i < LED_COUNT; i++) + { + leds[i].r = ledsX[i - 1][0]; + leds[i].g = ledsX[i - 1][1]; + leds[i].b = ledsX[i - 1][2]; + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void strip_march_cw() +{ //-m50-MARCH STRIP CW + copy_led_array(); + int iCW; + for (int i = 0; i < LED_COUNT; i++) + { + iCW = adjacent_cw(i); + leds[i].r = ledsX[iCW][0]; + leds[i].g = ledsX[iCW][1]; + leds[i].b = ledsX[iCW][2]; + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void strip_march_ccw() +{ //-m51-MARCH STRIP CCW + copy_led_array(); + int iCCW; + for (int i = 0; i < LED_COUNT; i++) + { + iCCW = adjacent_ccw(i); + leds[i].r = ledsX[iCCW][0]; + leds[i].g = ledsX[iCCW][1]; + leds[i].b = ledsX[iCCW][2]; + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void new_rainbow_loop() +{ //-m88-RAINBOW FADE FROM FAST_SPI2 + ihue -= 1; + fill_rainbow(leds, LED_COUNT, ihue); + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} + +void demo_modeB() +{ + int r = 10; + one_color_all(0, 0, 0); + LEDS.show(); + thisdelay = 35; + for (int i = 0; i < r * 10; i++) + { + random_color_pop(); + } + for (int i = 0; i < r / 2; i++) + { + ems_lightsSTROBE(); + } + thisdelay = 50; + for (int i = 0; i < r * 10; i++) + { + rgb_propeller(); + } + one_color_all(0, 0, 0); + LEDS.show(); + thisdelay = 100; + thishue = 0; + for (int i = 0; i < r * 3; i++) + { + kitt(); + } + one_color_all(0, 0, 0); + LEDS.show(); + thisdelay = 30; + thishue = 95; + for (int i = 0; i < r * 25; i++) + { + matrix(); + } + one_color_all(0, 0, 0); + LEDS.show(); +} +void demo_modeA() +{ + int r = 10; + thisdelay = 20; + thisstep = 10; + thishue = 0; + thissat = 255; + one_color_all(255, 255, 255); + LEDS.show(); + if (safeDelay(1200)) + return; + for (int i = 0; i < r * 25; i++) + { + rainbow_fade(); + } + for (int i = 0; i < r * 20; i++) + { + rainbow_loop(); + } + for (int i = 0; i < r * 20; i++) + { + random_burst(); + } + for (int i = 0; i < r * 12; i++) + { + color_bounce(); + } + thisdelay = 40; + for (int i = 0; i < r * 12; i++) + { + color_bounceFADE(); + } + for (int i = 0; i < r * 6; i++) + { + ems_lightsONE(); + } + for (int i = 0; i < r * 5; i++) + { + ems_lightsALL(); + } + thishue = 160; + thissat = 50; + for (int i = 0; i < r * 40; i++) + { + flicker(); + } + one_color_all(0, 0, 0); + LEDS.show(); + thisdelay = 15; + thishue = 0; + thissat = 255; + for (int i = 0; i < r * 50; i++) + { + pulse_one_color_all(); + } + for (int i = 0; i < r * 40; i++) + { + pulse_one_color_all_rev(); + } + thisdelay = 60; + thishue = 180; + for (int i = 0; i < r * 5; i++) + { + fade_vertical(); + } + random_red(); + thisdelay = 100; + for (int i = 0; i < r * 5; i++) + { + rule30(); + } + thisdelay = 40; + for (int i = 0; i < r * 8; i++) + { + random_march(); + } + thisdelay = 80; + for (int i = 0; i < r * 5; i++) + { + rwb_march(); + } + one_color_all(0, 0, 0); + ; + LEDS.show(); + thisdelay = 60; + thishue = 95; + for (int i = 0; i < r * 15; i++) + { + radiation(); + } + for (int i = 0; i < r * 15; i++) + { + color_loop_vardelay(); + } + for (int i = 0; i < r * 5; i++) + { + white_temps(); + } + thisdelay = 35; + thishue = 180; + for (int i = 0; i < r; i++) + { + sin_bright_wave(); + } + thisdelay = 100; + thishue = 0; + for (int i = 0; i < r * 5; i++) + { + pop_horizontal(); + } + thisdelay = 100; + thishue = 180; + for (int i = 0; i < r * 4; i++) + { + quad_bright_curve(); + } + one_color_all(0, 0, 0); + LEDS.show(); + for (int i = 0; i < r * 3; i++) + { + flame(); + } + thisdelay = 50; + for (int i = 0; i < r * 10; i++) + { + pacman(); + } + thisdelay = 50; + thisstep = 15; + for (int i = 0; i < r * 12; i++) + { + rainbow_vertical(); + } + thisdelay = 100; + for (int i = 0; i < r * 3; i++) + { + strip_march_ccw(); + } + for (int i = 0; i < r * 3; i++) + { + strip_march_cw(); + } + demo_modeB(); + thisdelay = 5; + for (int i = 0; i < r * 120; i++) + { + new_rainbow_loop(); + } + one_color_all(255, 0, 0); + LEDS.show(); + if (safeDelay(1200)) + return; + one_color_all(0, 255, 0); + LEDS.show(); + if (safeDelay(1200)) + return; + one_color_all(0, 0, 255); + LEDS.show(); + if (safeDelay(1200)) + return; + one_color_all(255, 255, 0); + LEDS.show(); + if (safeDelay(1200)) + return; + one_color_all(0, 255, 255); + LEDS.show(); + if (safeDelay(1200)) + return; + one_color_all(255, 0, 255); + LEDS.show(); + if (safeDelay(1200)) + return; +} +//?? +//-----------------------------плавное заполнение цветом----------------------------------------- +void colorWipe(byte red, byte green, byte blue, int SpeedDelay) +{ + for (uint16_t i = 0; i < LED_COUNT; i++) + { + setPixel(i, red, green, blue); + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + } +} +//?? +//-----------------------------------бегающие светодиоды----------------------------------- +void CylonBounce(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) +{ + + for (int i = 0; i < LED_COUNT - EyeSize - 2; i++) + { + setAll(0, 0, 0); + setPixel(i, red / 10, green / 10, blue / 10); + for (int j = 1; j <= EyeSize; j++) + { + setPixel(i + j, red, green, blue); + } + setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10); + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + } + + if (safeDelay(ReturnDelay)) + return; + + for (int i = LED_COUNT - EyeSize - 2; i > 0; i--) + { + setAll(0, 0, 0); + setPixel(i, red / 10, green / 10, blue / 10); + for (int j = 1; j <= EyeSize; j++) + { + setPixel(i + j, red, green, blue); + } + setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10); + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + } + + if (safeDelay(ReturnDelay)) + return; +} + +//---------------------------------линейный огонь------------------------------------- + +void setPixelHeatColor(int Pixel, byte temperature) +{ + // Scale 'heat' down from 0-255 to 0-191 + byte t192 = round((temperature / 255.0) * 191); + + // calculate ramp up from + byte heatramp = t192 & 0x3F; // 0..63 + heatramp <<= 2; // scale up to 0..252 + + // figure out which third of the spectrum we're in: + if (t192 > 0x80) + { // hottest + setPixel(Pixel, 255, 255, heatramp); + } + else if (t192 > 0x40) + { // middle + setPixel(Pixel, 255, heatramp, 0); + } + else + { // coolest + setPixel(Pixel, heatramp, 0, 0); + } +} +void Fire(int Cooling, int Sparking, int SpeedDelay) +{ + static byte heat[LED_COUNT]; + int cooldown; + + // Step 1. Cool down every cell a little + for (int i = 0; i < LED_COUNT; i++) + { + cooldown = random(0, ((Cooling * 10) / LED_COUNT) + 2); + + if (cooldown > heat[i]) + { + heat[i] = 0; + } + else + { + heat[i] = heat[i] - cooldown; + } + } + + // Step 2. Heat from each cell drifts 'up' and diffuses a little + for (int k = LED_COUNT - 1; k >= 2; k--) + { + heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3; + } + + // Step 3. Randomly ignite new 'sparks' near the bottom + if (random(255) < Sparking) + { + int y = random(7); + heat[y] = heat[y] + random(160, 255); + // heat[y] = random(160,255); + } + + // Step 4. Convert heat to LED colors + for (int j = 0; j < LED_COUNT; j++) + { + setPixelHeatColor(j, heat[j]); + } + + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; +} + +//-------------------------------newKITT--------------------------------------- + +void CenterToOutside(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) +{ + for (int i = ((LED_COUNT - EyeSize) / 2); i >= 0; i--) + { + setAll(0, 0, 0); + + setPixel(i, red / 10, green / 10, blue / 10); + for (int j = 1; j <= EyeSize; j++) + { + setPixel(i + j, red, green, blue); + } + setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10); + + setPixel(LED_COUNT - i, red / 10, green / 10, blue / 10); + for (int j = 1; j <= EyeSize; j++) + { + setPixel(LED_COUNT - i - j, red, green, blue); + } + setPixel(LED_COUNT - i - EyeSize - 1, red / 10, green / 10, blue / 10); + + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + } + if (safeDelay(ReturnDelay)) + return; +} + +void OutsideToCenter(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) +{ + for (int i = 0; i <= ((LED_COUNT - EyeSize) / 2); i++) + { + setAll(0, 0, 0); + + setPixel(i, red / 10, green / 10, blue / 10); + for (int j = 1; j <= EyeSize; j++) + { + setPixel(i + j, red, green, blue); + } + setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10); + + setPixel(LED_COUNT - i, red / 10, green / 10, blue / 10); + for (int j = 1; j <= EyeSize; j++) + { + setPixel(LED_COUNT - i - j, red, green, blue); + } + setPixel(LED_COUNT - i - EyeSize - 1, red / 10, green / 10, blue / 10); + + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + } + if (safeDelay(ReturnDelay)) + return; +} + +void LeftToRight(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) +{ + for (int i = 0; i < LED_COUNT - EyeSize - 2; i++) + { + setAll(0, 0, 0); + setPixel(i, red / 10, green / 10, blue / 10); + for (int j = 1; j <= EyeSize; j++) + { + setPixel(i + j, red, green, blue); + } + setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10); + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + } + if (safeDelay(ReturnDelay)) + return; +} + +void RightToLeft(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) +{ + for (int i = LED_COUNT - EyeSize - 2; i > 0; i--) + { + setAll(0, 0, 0); + setPixel(i, red / 10, green / 10, blue / 10); + for (int j = 1; j <= EyeSize; j++) + { + setPixel(i + j, red, green, blue); + } + setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10); + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + } + if (safeDelay(ReturnDelay)) + return; +} +void NewKITT(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) +{ + RightToLeft(red, green, blue, EyeSize, SpeedDelay, ReturnDelay); + LeftToRight(red, green, blue, EyeSize, SpeedDelay, ReturnDelay); + OutsideToCenter(red, green, blue, EyeSize, SpeedDelay, ReturnDelay); + CenterToOutside(red, green, blue, EyeSize, SpeedDelay, ReturnDelay); + LeftToRight(red, green, blue, EyeSize, SpeedDelay, ReturnDelay); + RightToLeft(red, green, blue, EyeSize, SpeedDelay, ReturnDelay); + OutsideToCenter(red, green, blue, EyeSize, SpeedDelay, ReturnDelay); + CenterToOutside(red, green, blue, EyeSize, SpeedDelay, ReturnDelay); +} + +//-------------------------------rainbowCycle--------------------------------------- +//?? +byte *Wheel(byte WheelPos) +{ + static byte c[3]; + + if (WheelPos < 85) + { + c[0] = WheelPos * 3; + c[1] = 255 - WheelPos * 3; + c[2] = 0; + } + else if (WheelPos < 170) + { + WheelPos -= 85; + c[0] = 255 - WheelPos * 3; + c[1] = 0; + c[2] = WheelPos * 3; + } + else + { + WheelPos -= 170; + c[0] = 0; + c[1] = WheelPos * 3; + c[2] = 255 - WheelPos * 3; + } + + return c; +} + +void rainbowCycle(int SpeedDelay) +{ + byte *c; + uint16_t i, j; + + for (j = 0; j < 256 * 5; j++) + { // 5 cycles of all colors on wheel + for (i = 0; i < LED_COUNT; i++) + { + c = Wheel(((i * 256 / LED_COUNT) + j) & 255); + setPixel(i, *c, *(c + 1), *(c + 2)); + } + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + } +} +//?? +//-------------------------------TwinkleRandom--------------------------------------- +void TwinkleRandom(int Count, int SpeedDelay, boolean OnlyOne) +{ + setAll(0, 0, 0); + + for (int i = 0; i < Count; i++) + { + setPixel(random(LED_COUNT), random(0, 255), random(0, 255), random(0, 255)); + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + if (OnlyOne) + { + setAll(0, 0, 0); + } + } + + if (safeDelay(SpeedDelay)) + return; +} + +//-------------------------------RunningLights--------------------------------------- +void RunningLights(byte red, byte green, byte blue, int WaveDelay) +{ + int Position = 0; + + for (int i = 0; i < LED_COUNT * 2; i++) + { + Position++; // = 0; //Position + Rate; + for (int i = 0; i < LED_COUNT; i++) + { + // sine wave, 3 offset waves make a rainbow! + // float level = sin(i+Position) * 127 + 128; + // setPixel(i,level,0,0); + // float level = sin(i+Position) * 127 + 128; + setPixel(i, ((sin(i + Position) * 127 + 128) / 255) * red, + ((sin(i + Position) * 127 + 128) / 255) * green, + ((sin(i + Position) * 127 + 128) / 255) * blue); + } + + FastLED.show(); + if (safeDelay(WaveDelay)) + return; + } +} + +//-------------------------------Sparkle--------------------------------------- +void Sparkle(byte red, byte green, byte blue, int SpeedDelay) +{ + int Pixel = random(LED_COUNT); + setPixel(Pixel, red, green, blue); + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + setPixel(Pixel, 0, 0, 0); +} + +//-------------------------------SnowSparkle--------------------------------------- +void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) +{ + setAll(red, green, blue); + + int Pixel = random(LED_COUNT); + setPixel(Pixel, 0xff, 0xff, 0xff); + FastLED.show(); + if (safeDelay(SparkleDelay)) + return; + setPixel(Pixel, red, green, blue); + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; +} +//?? +//-------------------------------theaterChase--------------------------------------- +void theaterChase(byte red, byte green, byte blue, int SpeedDelay) +{ + for (int j = 0; j < 10; j++) + { // do 10 cycles of chasing + for (int q = 0; q < 3; q++) + { + for (int i = 0; i < LED_COUNT; i = i + 3) + { + setPixel(i + q, red, green, blue); // turn every third pixel on + } + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + for (int i = 0; i < LED_COUNT; i = i + 3) + { + setPixel(i + q, 0, 0, 0); // turn every third pixel off + } + } + } +} + +//-------------------------------theaterChaseRainbow--------------------------------------- +void theaterChaseRainbow(int SpeedDelay) +{ + byte *c; + + for (int j = 0; j < 256; j++) + { // cycle all 256 colors in the wheel + for (int q = 0; q < 3; q++) + { + for (int i = 0; i < LED_COUNT; i = i + 3) + { + c = Wheel((i + j) % 255); + setPixel(i + q, *c, *(c + 1), *(c + 2)); // turn every third pixel on + } + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + for (int i = 0; i < LED_COUNT; i = i + 3) + { + setPixel(i + q, 0, 0, 0); // turn every third pixel off + } + } + } +} +//?? +//-------------------------------Strobe--------------------------------------- +void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause) +{ + for (int j = 0; j < StrobeCount; j++) + { + setAll(red, green, blue); + FastLED.show(); + if (safeDelay(FlashDelay)) + return; + setAll(0, 0, 0); + FastLED.show(); + if (safeDelay(FlashDelay)) + return; + } + + if (safeDelay(EndPause)) + return; +} + +//-------------------------------BouncingBalls--------------------------------------- +void BouncingBalls(byte red, byte green, byte blue, int BallCount) +{ + float Gravity = -9.81; + int StartHeight = 1; + + float Height[BallCount]; + float ImpactVelocityStart = sqrt(-2 * Gravity * StartHeight); + float ImpactVelocity[BallCount]; + float TimeSinceLastBounce[BallCount]; + int Position[BallCount]; + long ClockTimeSinceLastBounce[BallCount]; + float Dampening[BallCount]; + + for (int i = 0; i < BallCount; i++) + { + ClockTimeSinceLastBounce[i] = millis(); + Height[i] = StartHeight; + Position[i] = 0; + ImpactVelocity[i] = ImpactVelocityStart; + TimeSinceLastBounce[i] = 0; + Dampening[i] = 0.90 - float(i) / pow(BallCount, 2); + } + + while (true) + { + if (changeFlag) + { + changeFlag = false; + return; + } + for (int i = 0; i < BallCount; i++) + { + TimeSinceLastBounce[i] = millis() - ClockTimeSinceLastBounce[i]; + Height[i] = 0.5 * Gravity * pow(TimeSinceLastBounce[i] / 1000, 2.0) + ImpactVelocity[i] * TimeSinceLastBounce[i] / 1000; + + if (Height[i] < 0) + { + Height[i] = 0; + ImpactVelocity[i] = Dampening[i] * ImpactVelocity[i]; + ClockTimeSinceLastBounce[i] = millis(); + + if (ImpactVelocity[i] < 0.01) + { + ImpactVelocity[i] = ImpactVelocityStart; + } + } + Position[i] = round(Height[i] * (LED_COUNT - 1) / StartHeight); + } + + for (int i = 0; i < BallCount; i++) + { + setPixel(Position[i], red, green, blue); + } + FastLED.show(); + setAll(0, 0, 0); + } +} + +//-------------------------------BouncingColoredBalls--------------------------------------- +void BouncingColoredBalls(int BallCount, byte colors[][3]) +{ + float Gravity = -9.81; + int StartHeight = 1; + + float Height[BallCount]; + float ImpactVelocityStart = sqrt(-2 * Gravity * StartHeight); + float ImpactVelocity[BallCount]; + float TimeSinceLastBounce[BallCount]; + int Position[BallCount]; + long ClockTimeSinceLastBounce[BallCount]; + float Dampening[BallCount]; + + for (int i = 0; i < BallCount; i++) + { + ClockTimeSinceLastBounce[i] = millis(); + Height[i] = StartHeight; + Position[i] = 0; + ImpactVelocity[i] = ImpactVelocityStart; + TimeSinceLastBounce[i] = 0; + Dampening[i] = 0.90 - float(i) / pow(BallCount, 2); + } + + while (true) + { + if (changeFlag) + { + changeFlag = false; + return; + } + for (int i = 0; i < BallCount; i++) + { + TimeSinceLastBounce[i] = millis() - ClockTimeSinceLastBounce[i]; + Height[i] = 0.5 * Gravity * pow(TimeSinceLastBounce[i] / 1000, 2.0) + ImpactVelocity[i] * TimeSinceLastBounce[i] / 1000; + + if (Height[i] < 0) + { + Height[i] = 0; + ImpactVelocity[i] = Dampening[i] * ImpactVelocity[i]; + ClockTimeSinceLastBounce[i] = millis(); + + if (ImpactVelocity[i] < 0.01) + { + ImpactVelocity[i] = ImpactVelocityStart; + } + } + Position[i] = round(Height[i] * (LED_COUNT - 1) / StartHeight); + } + + for (int i = 0; i < BallCount; i++) + { + setPixel(Position[i], colors[i][0], colors[i][1], colors[i][2]); + } + FastLED.show(); + setAll(0, 0, 0); + } +} + +//-----------Meteor Rain------- +void fadeToBlack(int ledNo, byte fadeValue) +{ +#ifdef ADAFRUIT_NEOPIXEL_H + // NeoPixel + uint32_t oldColor; + uint8_t r, g, b; + int value; + + oldColor = strip.getPixelColor(ledNo); + r = (oldColor & 0x00ff0000UL) >> 16; + g = (oldColor & 0x0000ff00UL) >> 8; + b = (oldColor & 0x000000ffUL); + + r = (r <= 10) ? 0 : (int)r - (r * fadeValue / 256); + g = (g <= 10) ? 0 : (int)g - (g * fadeValue / 256); + b = (b <= 10) ? 0 : (int)b - (b * fadeValue / 256); + + strip.setPixelColor(ledNo, r, g, b); +#endif +#ifndef ADAFRUIT_NEOPIXEL_H + // FastLED + leds[ledNo].fadeToBlackBy(fadeValue); +#endif +} +void meteorRain(byte red, byte green, byte blue, byte meteorSize, byte meteorTrailDecay, boolean meteorRandomDecay, int SpeedDelay) +{ + setAll(0, 0, 0); + + for (int i = 0; i < NUM_LEDS + NUM_LEDS; i++) + { + + // fade brightness all LEDs one step + for (int j = 0; j < NUM_LEDS; j++) + { + if ((!meteorRandomDecay) || (random(10) > 5)) + { + fadeToBlack(j, meteorTrailDecay); + } + } + + // draw meteor + for (int j = 0; j < meteorSize; j++) + { + if ((i - j < NUM_LEDS) && (i - j >= 0)) + { + setPixel(i - j, red, green, blue); + } + } + + FastLED.show(); + if (safeDelay(SpeedDelay)) + return; + } +} diff --git a/src/modules/display/GyverLAMP/matrix.h b/src/modules/display/GyverLAMP/matrix.h new file mode 100644 index 00000000..ce102bf1 --- /dev/null +++ b/src/modules/display/GyverLAMP/matrix.h @@ -0,0 +1,770 @@ +#include "utility.h" + +byte hue; +boolean loadingFlag = true; +// **************** НАСТРОЙКИ ЭФФЕКТОВ **************** +// эффект "синусоиды" - ОТКЛЮЧЕН +#define WAVES_AMOUNT 2 // количество синусоид + +// эффект "шарики" +#define BALLS_AMOUNT 3 // количество "шариков" +#define CLEAR_PATH 1 // очищать путь +#define BALL_TRACK 1 // (0 / 1) - вкл/выкл следы шариков +#define DRAW_WALLS 0 // режим с рисованием препятствий для шаров (не работает на ESP и STM32) +#define TRACK_STEP 70 // длина хвоста шарика (чем больше цифра, тем хвост короче) + +// эффект "квадратик" +#define BALL_SIZE 3 // размер шара +#define RANDOM_COLOR 1 // случайный цвет при отскоке + +// эффект "огонь" +#define SPARKLES 1 // вылетающие угольки вкл выкл +#define HUE_ADD 0 // добавка цвета в огонь (от 0 до 230) - меняет весь цвет пламени + +// эффект "кометы" +#define TAIL_STEP 100 // длина хвоста кометы +#define SATURATION 150 // насыщенность кометы (от 0 до 255) +#define STAR_DENSE 60 // количество (шанс появления) комет + +// эффект "конфетти" +#define DENSE 3 // плотность конфетти +#define BRIGHT_STEP 70 // шаг уменьшения яркости + +// эффект "снег" +#define SNOW_DENSE 10 // плотность снегопада + +// эффект "Светляки" +#define LIGHTERS_AM 35 // количество светляков + +uint32_t globalColor = 0xffffff; // Цвет рисования при запуске белый +unsigned char matrixValue[8][16]; +unsigned char line[WIDTH]; +int pcnt = 0; +int effectSpeed = _speed; // скрость изменения эффекта +uint8_t USE_SEGMENTS = 1; +uint8_t BorderWidth = 0; +uint8_t dir_mx, seg_num, seg_size, seg_offset; +uint16_t XY(uint8_t, uint8_t); // __attribute__ ((weak)); + +// эффекты матрицы + +// *********** "дыхание" яркостью *********** +boolean brightnessDirection; +byte breathBrightness; // Яркость эффекта "Дыхание" +byte globalBrightness = _brightness; +void brightnessRoutine() +{ + if (brightnessDirection) + { + breathBrightness += 2; + if (breathBrightness > globalBrightness - 1) + { + brightnessDirection = false; + } + } + else + { + breathBrightness -= 2; + if (breathBrightness < 1) + { + brightnessDirection = true; + } + } + FastLED.setBrightness(breathBrightness); +} + +// *********** снегопад 2.0 *********** +void snowRoutine() +{ + + // сдвигаем всё вниз + for (byte x = 0; x < WIDTH; x++) + { + for (byte y = 0; y < HEIGHT - 1; y++) + { + drawPixelXY(x, y, getPixColorXY(x, y + 1)); + } + } + + for (byte x = 0; x < WIDTH; x++) + { + // заполняем случайно верхнюю строку + // а также не даём двум блокам по вертикали вместе быть + if (getPixColorXY(x, HEIGHT - 2) == 0 && (random(0, SNOW_DENSE) == 0)) + drawPixelXY(x, HEIGHT - 1, 0xE0FFFF - 0x101010 * random(0, 4)); + else + drawPixelXY(x, HEIGHT - 1, 0x000000); + } +} + +// ***************************** БЛУДНЫЙ КУБИК ***************************** +int coordB[2]; +int8_t vectorB[2]; +CRGB ballColor; + +void ballRoutine() +{ + if (loadingFlag) + { + for (byte i = 0; i < 2; i++) + { + coordB[i] = WIDTH / 2 * 10; + vectorB[i] = random(8, 20); + ballColor = CHSV(random(0, 9) * 28, 255, 255); + } + + loadingFlag = false; + } + for (byte i = 0; i < 2; i++) + { + coordB[i] += vectorB[i]; + if (coordB[i] < 0) + { + coordB[i] = 0; + vectorB[i] = -vectorB[i]; + if (RANDOM_COLOR) + ballColor = CHSV(random(0, 9) * 28, 255, 255); + // vectorB[i] += random(0, 6) - 3; + } + } + if (coordB[0] > (WIDTH - BALL_SIZE) * 10) + { + coordB[0] = (WIDTH - BALL_SIZE) * 10; + vectorB[0] = -vectorB[0]; + if (RANDOM_COLOR) + ballColor = CHSV(random(0, 9) * 28, 255, 255); + // vectorB[0] += random(0, 6) - 3; + } + if (coordB[1] > (HEIGHT - BALL_SIZE) * 10) + { + coordB[1] = (HEIGHT - BALL_SIZE) * 10; + vectorB[1] = -vectorB[1]; + if (RANDOM_COLOR) + ballColor = CHSV(random(0, 9) * 28, 255, 255); + // vectorB[1] += random(0, 6) - 3; + } + FastLED.clear(); + for (byte i = 0; i < BALL_SIZE; i++) + for (byte j = 0; j < BALL_SIZE; j++) + leds[getPixelNumber(coordB[0] / 10 + i, coordB[1] / 10 + j)] = ballColor; +} + +// *********** радуга заливка *********** +void rainbowRoutine() +{ + + hue += 3; + for (byte i = 0; i < WIDTH; i++) + { + CHSV thisColor = CHSV((byte)(hue + i * float(255 / WIDTH)), 255, 255); + for (byte j = 0; j < HEIGHT; j++) + drawPixelXY(i, j, thisColor); // leds[getPixelNumber(i, j)] = thisColor; + } +} + +// *********** радуга дигональная *********** +void rainbowDiagonalRoutine() +{ + + hue += 3; + for (byte x = 0; x < WIDTH; x++) + { + for (byte y = 0; y < HEIGHT; y++) + { + CHSV thisColor = CHSV((byte)(hue + (float)(WIDTH / HEIGHT * x + y) * (float)(255 / 100)), 255, 255); + drawPixelXY(x, y, thisColor); // leds[getPixelNumber(i, j)] = thisColor; + } + } +} + +// *********** радуга активных светодиодов (рисунка) *********** +void rainbowColorsRoutine() +{ + hue++; + for (byte i = 0; i < WIDTH; i++) + { + CHSV thisColor = CHSV((byte)(hue + i * float(255 / WIDTH)), 255, 255); + for (byte j = 0; j < HEIGHT; j++) + if (getPixColor(getPixelNumber(i, j)) > 0) + drawPixelXY(i, j, thisColor); + } +} + +// ****************************** ОГОНЬ ****************************** +// ********************** огонь ********************** +// these values are substracetd from the generated values to give a shape to the animation +const unsigned char valueMask[8][16] PROGMEM = { + {32, 0, 0, 0, 0, 0, 0, 32, 32, 0, 0, 0, 0, 0, 0, 32}, + {64, 0, 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 64}, + {96, 32, 0, 0, 0, 0, 32, 96, 96, 32, 0, 0, 0, 0, 32, 96}, + {128, 64, 32, 0, 0, 32, 64, 128, 128, 64, 32, 0, 0, 32, 64, 128}, + {160, 96, 64, 32, 32, 64, 96, 160, 160, 96, 64, 32, 32, 64, 96, 160}, + {192, 128, 96, 64, 64, 96, 128, 192, 192, 128, 96, 64, 64, 96, 128, 192}, + {255, 160, 128, 96, 96, 128, 160, 255, 255, 160, 128, 96, 96, 128, 160, 255}, + {255, 192, 160, 128, 128, 160, 192, 255, 255, 192, 160, 128, 128, 160, 192, 255}}; + +// these are the hues for the fire, +// should be between 0 (red) to about 25 (yellow) +const unsigned char hueMask[8][16] PROGMEM = { + {1, 11, 19, 25, 25, 22, 11, 1, 1, 11, 19, 25, 25, 22, 11, 1}, + {1, 8, 13, 19, 25, 19, 8, 1, 1, 8, 13, 19, 25, 19, 8, 1}, + {1, 8, 13, 16, 19, 16, 8, 1, 1, 8, 13, 16, 19, 16, 8, 1}, + {1, 5, 11, 13, 13, 13, 5, 1, 1, 5, 11, 13, 13, 13, 5, 1}, + {1, 5, 11, 11, 11, 11, 5, 1, 1, 5, 11, 11, 11, 11, 5, 1}, + {0, 1, 5, 8, 8, 5, 1, 0, 0, 1, 5, 8, 8, 5, 1, 0}, + {0, 0, 1, 5, 5, 1, 0, 0, 0, 0, 1, 5, 5, 1, 0, 0}, + {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}}; +// Randomly generate the next line (matrix row) + +void generateLine() +{ + for (uint8_t x = 0; x < WIDTH; x++) + { + line[x] = random(64, 255); + } +} + +// shift all values in the matrix up one row + +void shiftUp() +{ + for (uint8_t y = HEIGHT - 1; y > 0; y--) + { + for (uint8_t x = 0; x < WIDTH; x++) + { + uint8_t newX = x; + if (x > 15) + newX = x % 16; + if (y > 7) + continue; + matrixValue[y][newX] = matrixValue[y - 1][newX]; + } + } + + for (uint8_t x = 0; x < WIDTH; x++) + { + uint8_t newX = x; + if (x > 15) + newX = x % 16; + matrixValue[0][newX] = line[newX]; + } +} + +// draw a frame, interpolating between 2 "key frames" +// @param pcnt percentage of interpolation + +void drawFrame(int pcnt) +{ + int nextv; + + // each row interpolates with the one before it + for (unsigned char y = HEIGHT - 1; y > 0; y--) + { + for (unsigned char x = 0; x < WIDTH; x++) + { + uint8_t newX = x; + if (x > 15) + newX = x % 16; + if (y < 8) + { + nextv = + (((100.0 - pcnt) * matrixValue[y][newX] + pcnt * matrixValue[y - 1][newX]) / 100.0) - pgm_read_byte(&(valueMask[y][newX])); + + CRGB color = CHSV( + HUE_ADD + pgm_read_byte(&(hueMask[y][newX])), // H + 255, // S + (uint8_t)max(0, nextv) // V + ); + + leds[getPixelNumber(x, y)] = color; + } + else if (y == 8 && SPARKLES) + { + if (random(0, 20) == 0 && getPixColorXY(x, y - 1) != 0) + drawPixelXY(x, y, getPixColorXY(x, y - 1)); + else + drawPixelXY(x, y, 0); + } + else if (SPARKLES) + { + + // старая версия для яркости + if (getPixColorXY(x, y - 1) > 0) + drawPixelXY(x, y, getPixColorXY(x, y - 1)); + else + drawPixelXY(x, y, 0); + } + } + } + + // first row interpolates with the "next" line + for (unsigned char x = 0; x < WIDTH; x++) + { + uint8_t newX = x; + if (x > 15) + newX = x % 16; + CRGB color = CHSV( + HUE_ADD + pgm_read_byte(&(hueMask[0][newX])), // H + 255, // S + (uint8_t)(((100.0 - pcnt) * matrixValue[0][newX] + pcnt * line[newX]) / 100.0) // V + ); + // leds[getPixelNumber(newX, 0)] = color; // На форуме пишут что это ошибка - вместо newX должно быть x, иначе + leds[getPixelNumber(x, 0)] = color; // на матрицах шире 16 столбцов нижний правый угол неработает + } +} +void fireRoutine() +{ + if (loadingFlag) + { + + loadingFlag = false; + FastLED.clear(); + generateLine(); + memset(matrixValue, 0, sizeof(matrixValue)); + } + if (pcnt >= 100) + { + shiftUp(); + generateLine(); + pcnt = 0; + } + drawFrame(pcnt); + pcnt += 30; +} + +// **************** МАТРИЦА ***************** +void matrixRoutine() +{ + if (loadingFlag) + { + loadingFlag = false; + + FastLED.clear(); + } + for (byte x = 0; x < WIDTH; x++) + { + // заполняем случайно верхнюю строку + uint32_t thisColor = getPixColorXY(x, HEIGHT - 1); + if (thisColor == 0) + drawPixelXY(x, HEIGHT - 1, 0x00FF00 * (random(0, 10) == 0)); + else if (thisColor < 0x002000) + drawPixelXY(x, HEIGHT - 1, 0); + else + drawPixelXY(x, HEIGHT - 1, thisColor - 0x002000); + } + + // сдвигаем всё вниз + for (byte x = 0; x < WIDTH; x++) + { + for (byte y = 0; y < HEIGHT - 1; y++) + { + drawPixelXY(x, y, getPixColorXY(x, y + 1)); + } + } +} + +// ********************* ЗВЕЗДОПАД ****************** +void fadePixel(byte i, byte j, byte step) +{ // новый фейдер + int pixelNum = getPixelNumber(i, j); + if (getPixColor(pixelNum) == 0) + return; + + if (leds[pixelNum].r >= 30 || + leds[pixelNum].g >= 30 || + leds[pixelNum].b >= 30) + { + leds[pixelNum].fadeToBlackBy(step); + } + else + { + leds[pixelNum] = 0; + } +} +// функция плавного угасания цвета для всех пикселей +void fader(byte step) +{ + for (byte i = 0; i < WIDTH; i++) + { + for (byte j = 0; j < HEIGHT; j++) + { + fadePixel(i, j, step); + } + } +} + +void starfallRoutine() +{ + + // заполняем головами комет левую и верхнюю линию + for (byte i = HEIGHT / 2; i < HEIGHT; i++) + { + if (getPixColorXY(0, i) == 0 && (random(0, STAR_DENSE) == 0) && getPixColorXY(0, i + 1) == 0 && getPixColorXY(0, i - 1) == 0) + leds[getPixelNumber(0, i)] = CHSV(random(0, 200), SATURATION, 255); + } + for (byte i = 0; i < WIDTH / 2; i++) + { + if (getPixColorXY(i, HEIGHT - 1) == 0 && (random(0, STAR_DENSE) == 0) && getPixColorXY(i + 1, HEIGHT - 1) == 0 && getPixColorXY(i - 1, HEIGHT - 1) == 0) + leds[getPixelNumber(i, HEIGHT - 1)] = CHSV(random(0, 200), SATURATION, 255); + } + + // сдвигаем по диагонали + for (byte y = 0; y < HEIGHT - 1; y++) + { + for (byte x = WIDTH - 1; x > 0; x--) + { + drawPixelXY(x, y, getPixColorXY(x - 1, y + 1)); + } + } + + // уменьшаем яркость левой и верхней линии, формируем "хвосты" + for (byte i = HEIGHT / 2; i < HEIGHT; i++) + { + fadePixel(0, i, TAIL_STEP); + } + for (byte i = 0; i < WIDTH / 2; i++) + { + fadePixel(i, HEIGHT - 1, TAIL_STEP); + } +} + +// рандомные гаснущие вспышки +void sparklesRoutine() +{ + + for (byte i = 0; i < DENSE; i++) + { + byte x = random(0, WIDTH); + byte y = random(0, HEIGHT); + if (getPixColorXY(x, y) == 0) + leds[getPixelNumber(x, y)] = CHSV(random(0, 255), 255, 255); + } + fader(BRIGHT_STEP); +} + +// ----------------------------- СВЕТЛЯКИ ------------------------------ +int lightersPos[2][LIGHTERS_AM]; +int8_t lightersSpeed[2][LIGHTERS_AM]; +CHSV lightersColor[LIGHTERS_AM]; +byte loopCounter; + +int angle[LIGHTERS_AM]; +int speedV[LIGHTERS_AM]; +int8_t angleSpeed[LIGHTERS_AM]; + +void lightersRoutine() +{ + if (loadingFlag) + { + loadingFlag = false; + randomSeed(millis()); + for (byte i = 0; i < LIGHTERS_AM; i++) + { + lightersPos[0][i] = random(0, WIDTH * 10); + lightersPos[1][i] = random(0, HEIGHT * 10); + lightersSpeed[0][i] = random(-10, 10); + lightersSpeed[1][i] = random(-10, 10); + lightersColor[i] = CHSV(random(0, 255), 255, 255); + } + } + FastLED.clear(); + if (++loopCounter > 20) + loopCounter = 0; + for (byte i = 0; i < map(LIGHTERS_AM, 0, 255, 5, 150); i++) + { + if (loopCounter == 0) + { // меняем скорость каждые 255 отрисовок + lightersSpeed[0][i] += random(-3, 4); + lightersSpeed[1][i] += random(-3, 4); + lightersSpeed[0][i] = constrain(lightersSpeed[0][i], -20, 20); + lightersSpeed[1][i] = constrain(lightersSpeed[1][i], -20, 20); + } + + lightersPos[0][i] += lightersSpeed[0][i]; + lightersPos[1][i] += lightersSpeed[1][i]; + + if (lightersPos[0][i] < 0) + lightersPos[0][i] = (WIDTH - 1) * 10; + if (lightersPos[0][i] >= WIDTH * 10) + lightersPos[0][i] = 0; + + if (lightersPos[1][i] < 0) + { + lightersPos[1][i] = 0; + lightersSpeed[1][i] = -lightersSpeed[1][i]; + } + if (lightersPos[1][i] >= (HEIGHT - 1) * 10) + { + lightersPos[1][i] = (HEIGHT - 1) * 10; + lightersSpeed[1][i] = -lightersSpeed[1][i]; + } + drawPixelXY(lightersPos[0][i] / 10, lightersPos[1][i] / 10, lightersColor[i]); + } +} + +// ------------- ПЕЙНТБОЛ ------------- + +void lightBallsRoutine() +{ + if (loadingFlag) + { + loadingFlag = false; + + FastLED.clear(); // очистить + dir_mx = WIDTH > HEIGHT ? 0 : 1; // 0 - квадратные сегменты расположены горизонтально, 1 - вертикально + seg_num = dir_mx == 0 ? (WIDTH / HEIGHT) : (HEIGHT / WIDTH); // вычисляем количество сегментов, умещающихся на матрице + seg_size = dir_mx == 0 ? HEIGHT : WIDTH; // Размер квадратного сегмента (высота и ширина равны) + seg_offset = ((dir_mx == 0 ? WIDTH : HEIGHT) - seg_size * seg_num) / (seg_num + 1); // смещение от края матрицы и между сегментами + BorderWidth = 0; + } + + // 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 = dim8_raw(beatsin8(2, 64, 100)); + blur2d(leds, WIDTH, HEIGHT, blurAmount); + + // The color of each point shifts over time, each at a different speed. + uint32_t ms = millis(); + int16_t idx; + + byte cnt = map(effectSpeed, 0, 255, 1, 4); + + if (USE_SEGMENTS != 0) + { + // Для неквадратных - вычленяем квадратные сегменты, которые равномерно распределяем по ширине / высоте матрицы + uint8_t i = beatsin8(91, 0, seg_size - BorderWidth - 1); + uint8_t j = beatsin8(109, 0, seg_size - BorderWidth - 1); + uint8_t k = beatsin8(73, 0, seg_size - BorderWidth - 1); + uint8_t m = beatsin8(123, 0, seg_size - BorderWidth - 1); + + uint8_t d1 = ms / 29; + uint8_t d2 = ms / 41; + uint8_t d3 = ms / 73; + uint8_t d4 = ms / 97; + + for (uint8_t ii = 0; ii < seg_num; ii++) + { + delay(0); // Для предотвращения ESP8266 Watchdog Timer + uint8_t cx = dir_mx == 0 ? (seg_offset * (ii + 1) + seg_size * ii) : 0; + uint8_t cy = dir_mx == 0 ? 0 : (seg_offset * (ii + 1) + seg_size * ii); + uint8_t color_shift = ii * 50; + if (cnt <= 1) + { + idx = XY(i + cx, j + cy); + leds[idx] += CHSV(color_shift + d1, 200U, 255U); + } + if (cnt <= 2) + { + idx = XY(j + cx, k + cy); + leds[idx] += CHSV(color_shift + d2, 200U, 255U); + } + if (cnt <= 3) + { + idx = XY(k + cx, m + cy); + leds[idx] += CHSV(color_shift + d3, 200U, 255U); + } + if (cnt <= 4) + { + idx = XY(m + cx, i + cy); + leds[idx] += CHSV(color_shift + d4, 200U, 255U); + } + + // При соединении матрицы из угла вверх или вниз почему-то слева и справа узора остаются полосы, которые + // не гаснут обычным blur - гасим полоски левой и правой стороны дополнительно. + // При соединении из угла влево или вправо или на неквадратных матрицах такого эффекта не наблюдается + for (byte i2 = cy; i2 < cy + seg_size; i2++) + { + fadePixel(cx + BorderWidth, i2, 15); + fadePixel(cx + seg_size - BorderWidth - 1, i2, 15); + } + } + } + else + { + uint8_t i = beatsin8(91, BorderWidth, WIDTH - BorderWidth - 1); + uint8_t j = beatsin8(109, BorderWidth, HEIGHT - BorderWidth - 1); + uint8_t k = beatsin8(73, BorderWidth, WIDTH - BorderWidth - 1); + uint8_t m = beatsin8(123, BorderWidth, HEIGHT - BorderWidth - 1); + + if (cnt <= 1) + { + idx = XY(i, j); + leds[idx] += CHSV(ms / 29, 200U, 255U); + } + if (cnt <= 2) + { + idx = XY(k, j); + leds[idx] += CHSV(ms / 41, 200U, 255U); + } + if (cnt <= 3) + { + idx = XY(k, m); + leds[idx] += CHSV(ms / 73, 200U, 255U); + } + if (cnt <= 4) + { + idx = XY(i, m); + leds[idx] += CHSV(ms / 97, 200U, 255U); + } + + if (WIDTH == HEIGHT) + { + // При соединении матрицы из угла вверх или вниз почему-то слева и справа узора остаются полосы, которые + // не гаснут обычным blur - гасим полоски левой и правой стороны дополнительно. + // При соединении из угла влево или вправо или на неквадратных матрицах такого эффекта не наблюдается + for (byte i = 0; i < HEIGHT; i++) + { + fadePixel(0, i, 15); + fadePixel(WIDTH - 1, i, 15); + } + } + } +} +// ------------- ВОДОВОРОТ ------------- + +void swirlRoutine() +{ + if (loadingFlag) + { + loadingFlag = false; + + FastLED.clear(); // очистить + dir_mx = WIDTH > HEIGHT ? 0 : 1; // 0 - квадратные сегменты расположены горизонтально, 1 - вертикально + seg_num = dir_mx == 0 ? (WIDTH / HEIGHT) : (HEIGHT / WIDTH); // вычисляем количество сегментов, умещающихся на матрице + seg_size = dir_mx == 0 ? HEIGHT : WIDTH; // Размер квадратного сегмента (высота и ширина равны) + seg_offset = ((dir_mx == 0 ? WIDTH : HEIGHT) - seg_size * seg_num) / (seg_num + 1); // смещение от края матрицы и между сегментами + BorderWidth = seg_num == 1 ? 0 : 1; + } + + // 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 = dim8_raw(beatsin8(2, 64, 100)); + blur2d(leds, WIDTH, HEIGHT, blurAmount); + + uint32_t ms = millis(); + int16_t idx; + + if (USE_SEGMENTS != 0) + { + // Use two out-of-sync sine waves + uint8_t i = beatsin8(41, 0, seg_size - BorderWidth - 1); + uint8_t j = beatsin8(27, 0, seg_size - BorderWidth - 1); + + // Also calculate some reflections + uint8_t ni = (seg_size - 1) - i; + uint8_t nj = (seg_size - 1) - j; + + uint8_t d1 = ms / 11; + uint8_t d2 = ms / 13; + uint8_t d3 = ms / 17; + uint8_t d4 = ms / 29; + uint8_t d5 = ms / 37; + uint8_t d6 = ms / 41; + + for (uint8_t ii = 0; ii < seg_num; ii++) + { + delay(0); // Для предотвращения ESP8266 Watchdog Timer + uint8_t cx = dir_mx == 0 ? (seg_offset * (ii + 1) + seg_size * ii) : 0; + uint8_t cy = dir_mx == 0 ? 0 : (seg_offset * (ii + 1) + seg_size * ii); + uint8_t color_shift = ii * 50; + + // The color of each point shifts over time, each at a different speed. + idx = XY(i + cx, j + cy); + leds[idx] += CHSV(color_shift + d1, 200, 192); + idx = XY(ni + cx, nj + cy); + leds[idx] += CHSV(color_shift + d2, 200, 192); + idx = XY(i + cx, nj + cy); + leds[idx] += CHSV(color_shift + d3, 200, 192); + idx = XY(ni + cx, j + cy); + leds[idx] += CHSV(color_shift + d4, 200, 192); + idx = XY(j + cx, i + cy); + leds[idx] += CHSV(color_shift + d5, 200, 192); + idx = XY(nj + cx, ni + cy); + leds[idx] += CHSV(color_shift + d6, 200, 192); + + // При соединении матрицы из угла вверх или вниз почему-то слева и справа узора остаются полосы, которые + // не гаснут обычным blur - гасим полоски левой и правой стороны дополнительно. + // При соединении из угла влево или вправо или на неквадратных матрицах такого эффекта не наблюдается + for (byte i2 = cy; i2 < cy + seg_size; i2++) + { + fadePixel(cx, i2, 15); + fadePixel(cx + BorderWidth, i2, 15); + fadePixel(cx + seg_size - 1, i2, 15); + fadePixel(cx + seg_size - BorderWidth - 1, i2, 15); + } + } + } + else + { + // Use two out-of-sync sine waves + uint8_t i = beatsin8(41, BorderWidth, WIDTH - BorderWidth - 1); + uint8_t j = beatsin8(27, BorderWidth, HEIGHT - BorderWidth - 1); + + // Also calculate some reflections + uint8_t ni = (WIDTH - 1) - i; + uint8_t nj = (HEIGHT - 1) - j; + + // The color of each point shifts over time, each at a different speed. + idx = XY(i, j); + leds[idx] += CHSV(ms / 11, 200, 192); + idx = XY(ni, nj); + leds[idx] += CHSV(ms / 13, 200, 192); + idx = XY(i, nj); + leds[idx] += CHSV(ms / 17, 200, 192); + idx = XY(ni, j); + leds[idx] += CHSV(ms / 29, 200, 192); + + if (HEIGHT == WIDTH) + { + // для квадратных матриц - 6 точек создают более красивую картину + idx = XY(j, i); + leds[idx] += CHSV(ms / 37, 200, 192); + idx = XY(nj, ni); + leds[idx] += CHSV(ms / 41, 200, 192); + + // При соединении матрицы из угла вверх или вниз почему-то слева и справа узора остаются полосы, которые + // не гаснут обычным blur - гасим полоски левой и правой стороны дополнительно. + // При соединении из угла влево или вправо или на неквадратных матрицах такого эффекта не наблюдается + for (byte i = 0; i < HEIGHT; i++) + { + fadePixel(0, i, 15); + fadePixel(WIDTH - 1, i, 15); + } + } + } +} + +uint16_t XY(uint8_t x, uint8_t y) +{ + return getPixelNumber(x, y); +} + +//--------------------крутящаяся радуга матрица------------------ + +void rainbow_loop_matrix() +{ //-m3-LOOP HSV RAINBOW + idex++; + ihue = ihue + thisstep; + if (idex >= LED_COUNT) + { + idex = 0; + } + if (ihue > 255) + { + ihue = 0; + } + + for (byte i = 0; i < WIDTH; i++) + { + CHSV thisColor = CHSV(ihue, thissat, 255); + for (byte j = 0; j < HEIGHT; j++) + drawPixelXY(i, j, thisColor); // leds[getPixelNumber(i, j)] = thisColor; + } + LEDS.show(); + if (safeDelay(thisdelay)) + return; +} \ No newline at end of file diff --git a/src/modules/display/GyverLAMP/modinfo.json b/src/modules/display/GyverLAMP/modinfo.json new file mode 100644 index 00000000..d5aff0d6 --- /dev/null +++ b/src/modules/display/GyverLAMP/modinfo.json @@ -0,0 +1,40 @@ +{ + "menuSection": "screens", + "configItem": [ + { + "global": 0, + "name": "GyverLAMP", + "type": "Reading", + "subtype": "GyverLAMP", + "id": "GyverLAMP", + "widget": "range", + "page": "Кнопки", + "descr": "GyverLAMP", + "needSave": 0, + "brightness": "10", + "speed": 30, + "dalay": 10000 + } + ], + "about": { + "authorName": "", + "authorContact": "", + "authorGit": "", + "exampleURL": "", + "specialThanks": "", + "moduleName": "GyverLAMP", + "moduleVersion": "1", + "moduleDesc": "xxx", + "propInfo": {}, + "funcInfo": [] + }, + "defActive": false, + "usedLibs": { + "esp32*": [ + "fastled/FastLED@^3.5.0" + ], + "esp82*": [ + "fastled/FastLED@^3.5.0" + ] + } +} \ No newline at end of file diff --git a/src/modules/display/GyverLAMP/utility.h b/src/modules/display/GyverLAMP/utility.h new file mode 100644 index 00000000..fff2d740 --- /dev/null +++ b/src/modules/display/GyverLAMP/utility.h @@ -0,0 +1,92 @@ +#include "config.h" +#define MATRIX_TYPE 0 +// #define NUM_LEDS LED_COUNT + +// **************** НАСТРОЙКА МАТРИЦЫ **************** +#if (CONNECTION_ANGLE == 0 && STRIP_DIRECTION == 0) +#define _WIDTH WIDTH +#define THIS_X x +#define THIS_Y y + +#elif (CONNECTION_ANGLE == 0 && STRIP_DIRECTION == 1) +#define _WIDTH HEIGHT +#define THIS_X y +#define THIS_Y x + +#elif (CONNECTION_ANGLE == 1 && STRIP_DIRECTION == 0) +#define _WIDTH WIDTH +#define THIS_X x +#define THIS_Y (HEIGHT - y - 1) + +#elif (CONNECTION_ANGLE == 1 && STRIP_DIRECTION == 3) +#define _WIDTH HEIGHT +#define THIS_X (HEIGHT - y - 1) +#define THIS_Y x + +#elif (CONNECTION_ANGLE == 2 && STRIP_DIRECTION == 2) +#define _WIDTH WIDTH +#define THIS_X (WIDTH - x - 1) +#define THIS_Y (HEIGHT - y - 1) + +#elif (CONNECTION_ANGLE == 2 && STRIP_DIRECTION == 3) +#define _WIDTH HEIGHT +#define THIS_X (HEIGHT - y - 1) +#define THIS_Y (WIDTH - x - 1) + +#elif (CONNECTION_ANGLE == 3 && STRIP_DIRECTION == 2) +#define _WIDTH WIDTH +#define THIS_X (WIDTH - x - 1) +#define THIS_Y y + +#elif (CONNECTION_ANGLE == 3 && STRIP_DIRECTION == 1) +#define _WIDTH HEIGHT +#define THIS_X y +#define THIS_Y (WIDTH - x - 1) + +#else +#define _WIDTH WIDTH +#define THIS_X x +#define THIS_Y y +#pragma message "Wrong matrix parameters! Set to default" + +#endif + +// получить номер пикселя в ленте по координатам +uint16_t getPixelNumber(int8_t x, int8_t y) +{ + if ((THIS_Y % 2 == 0) || MATRIX_TYPE) + { // если чётная строка + return (THIS_Y * _WIDTH + THIS_X); + } + else + { // если нечётная строка + return (THIS_Y * _WIDTH + _WIDTH - THIS_X - 1); + } +} +// функция отрисовки точки по координатам X Y +void drawPixelXY(int8_t x, int8_t y, CRGB color) +{ + + if (x < 0 || x > WIDTH - 1 || y < 0 || y > HEIGHT - 1) + return; + int thisPixel = getPixelNumber(x, y) * SEGMENTS; + for (byte i = 0; i < SEGMENTS; i++) + { + leds[thisPixel + i] = color; + } + //FastLED.show(); +} +// функция получения цвета пикселя по его номеру +uint32_t getPixColor(int thisSegm) +{ + int thisPixel = thisSegm * SEGMENTS; + if (thisPixel < 0 || thisPixel > NUM_LEDS - 1) + return 0; + return (((uint32_t)leds[thisPixel].r << 16) | ((long)leds[thisPixel].g << 8) | (long)leds[thisPixel].b); +} + +// функция получения цвета пикселя в матрице по его координатам +uint32_t getPixColorXY(int8_t x, int8_t y) +{ + return getPixColor(getPixelNumber(x, y)); +} diff --git a/src/modules/exec/IoTServo/modinfo.json b/src/modules/exec/IoTServo/modinfo.json index b5184c51..ec50f810 100644 --- a/src/modules/exec/IoTServo/modinfo.json +++ b/src/modules/exec/IoTServo/modinfo.json @@ -50,7 +50,7 @@ } ] }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [ "https://github.com/RoboticsBrno/ServoESP32#v1.0.3" diff --git a/src/modules/exec/Pwm8266/modinfo.json b/src/modules/exec/Pwm8266/modinfo.json index 98163426..02a13034 100644 --- a/src/modules/exec/Pwm8266/modinfo.json +++ b/src/modules/exec/Pwm8266/modinfo.json @@ -38,7 +38,7 @@ "freq": "Частота" } }, - "defActive": true, + "defActive": false, "usedLibs": { "esp82*": [] } diff --git a/src/modules/sensors/Ble/modinfo.json b/src/modules/sensors/Ble/modinfo.json index c4cb3106..f51d0618 100644 --- a/src/modules/sensors/Ble/modinfo.json +++ b/src/modules/sensors/Ble/modinfo.json @@ -64,7 +64,13 @@ }, "defActive": false, "usedLibs": { - "esp32*": [ + "esp32c62_4mb": [ + "https://github.com/h2zero/NimBLE-Arduino#c6-build" + ], + "esp32c62_8mb": [ + "https://github.com/h2zero/NimBLE-Arduino#c6-build" + ], + "esp32_4mb3f": [ "https://github.com/Mit4el/NimBLE-Arduino.git" ], "esp32s2_4mb": [ diff --git a/src/modules/virtual/UpdateServer/UpdateServer.cpp b/src/modules/virtual/UpdateServer/UpdateServer.cpp new file mode 100644 index 00000000..b9f6b75a --- /dev/null +++ b/src/modules/virtual/UpdateServer/UpdateServer.cpp @@ -0,0 +1,27 @@ +#include "Global.h" +#include "classes/IoTItem.h" + +class UpdateServer : public IoTItem { + public: + UpdateServer(String parameters) : IoTItem(parameters) {} + + void onModuleOrder(String &key, String &value) { + if (key == "startUpdateAll") { + upgrade_firmware(3, value); + } else if (key == "startUpdateFS") { + upgrade_firmware(2, value); + } else if (key == "startUpdateFW") { + upgrade_firmware(1, value); + } + } + + ~UpdateServer() {}; +}; + +void* getAPI_UpdateServer(String subtype, String param) { + if (subtype == F("UpdateServer")) { + return new UpdateServer(param); + } else { + return nullptr; + } +} diff --git a/src/modules/virtual/UpdateServer/modinfo.json b/src/modules/virtual/UpdateServer/modinfo.json new file mode 100644 index 00000000..c4b8fc70 --- /dev/null +++ b/src/modules/virtual/UpdateServer/modinfo.json @@ -0,0 +1,41 @@ +{ + "menuSection": "virtual_elments", + "configItem": [ + { + "global": 0, + "name": "Свой сервер обновлений", + "type": "Reading", + "subtype": "UpdateServer", + "id": "UpdateServer", + "widget": "", + "page": "", + "descr": "", + "btn-startUpdateAll": "http://192.168.11.112/iotm/esp8266_4mb/400", + "btn-startUpdateFS": "http://192.168.11.112/iotm/esp8266_4mb/400", + "btn-startUpdateFW": "http://192.168.11.112/iotm/esp8266_4mb/400" + } + ], + "about": { + "authorName": "Ilya Belyakov", + "authorContact": "https://t.me/Biveraxe", + "authorGit": "https://github.com/biveraxe", + "exampleURL": "https://iotmanager.org/", + "specialThanks": "", + "moduleName": "UpdateServer", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "Свой сервер обновлений", + "moduleDesc": "Модуль для получения прошивки из своего сервера обновлений.", + "propInfo": { + "btn-startUpdate": "Кнопка запуска процесса обновления из указанного URL" + } + }, + "defActive": true, + "usedLibs": { + "esp32*": [], + "esp82*": [] + } +} \ No newline at end of file diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index bd44849d..429b5164 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -96,7 +96,9 @@ void routerConnect() } #if defined(ESP32) //SerialPrint("i", "Task", "Resetting WDT..."); + #if !defined(esp32c6_4mb) && !defined(esp32c6_8mb) //TODO esp32-c6 переписать esp_task_wdt_init esp_task_wdt_reset(); + #endif #endif Serial.print("."); delay(1000); From 68fea2ae37e655246a2f25c8a664dd81ddb00a5b Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 6 Jan 2025 20:35:19 +0300 Subject: [PATCH 040/118] fix esp32c6 & add ble, Fix Date Log, add BL0942, upd Descovery --- platformio.ini | 11 +- src/ESPConfiguration.cpp | 21 ++ src/MqttClient.cpp | 4 +- src/NTP.cpp | 47 ++- src/modules/exec/MySensors/modinfo.json | 6 + src/modules/sensors/BL0942/BL0942.cpp | 289 ++++++++++++++++++ src/modules/sensors/BL0942/datatypes.h | 116 +++++++ src/modules/sensors/BL0942/modinfo.json | 108 +++++++ src/modules/sensors/Ble/Ble.cpp | 15 +- src/modules/sensors/Ble/modinfo.json | 4 +- src/modules/sensors/Ble_part1/Ble_p1.cpp | 14 + src/modules/sensors/Ble_part1/modinfo.json | 6 + src/modules/sensors/Ble_part2/Ble_p2.cpp | 15 +- src/modules/sensors/Ble_part2/modinfo.json | 6 + .../virtual/DiscoveryHA/DiscoveryHA.cpp | 71 +++-- .../virtual/DiscoveryHomeD/DiscoveryHomeD.cpp | 62 ++-- .../virtual/DiscoveryHomeD/modinfo.json | 3 +- tools/partitions_custom_8mb.csv | 6 + 18 files changed, 719 insertions(+), 85 deletions(-) create mode 100644 src/modules/sensors/BL0942/BL0942.cpp create mode 100644 src/modules/sensors/BL0942/datatypes.h create mode 100644 src/modules/sensors/BL0942/modinfo.json create mode 100644 tools/partitions_custom_8mb.csv diff --git a/platformio.ini b/platformio.ini index c5450992..514c4648 100644 --- a/platformio.ini +++ b/platformio.ini @@ -396,8 +396,8 @@ framework = arduino board = esp32-c6-devkitm-1 platform = espressif32 @6.9.0 platform_packages = - platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git - platformio/framework-arduinoespressif32-libs @ https://github.com/espressif/esp32-arduino-libs.git#idf-release/v5.1 + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 + framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip monitor_filters = esp32_exception_decoder upload_speed = 921600 monitor_speed = 115200 @@ -423,15 +423,16 @@ build_flags = -DARDUINO_USB_MODE=0 -Wl,--wrap=esp_panic_handler framework = arduino -board = esp32-c6-devkitc-1 +board = esp32-c6-devkitm-1 platform = espressif32 @6.9.0 platform_packages = - platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git - platformio/framework-arduinoespressif32-libs @ https://github.com/espressif/esp32-arduino-libs.git#idf-release/v5.1 + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.1 + framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.1/esp32-arduino-libs-3.0.1.zip monitor_filters = esp32_exception_decoder upload_speed = 921600 monitor_speed = 115200 debug_tool = esp-prog +board_build.partitions = tools/partitions_custom_8mb.csv board_build.filesystem = littlefs build_src_filter = +<*.cpp> diff --git a/src/ESPConfiguration.cpp b/src/ESPConfiguration.cpp index 2326d3aa..64db3e5e 100644 --- a/src/ESPConfiguration.cpp +++ b/src/ESPConfiguration.cpp @@ -1,5 +1,6 @@ #include "ESPConfiguration.h" #include "classes/IoTGpio.h" +//#include "classes/IoTDiscovery.h" extern IoTGpio IoTgpio; @@ -52,6 +53,26 @@ void configure(String path) { } file.close(); SerialPrint("i", "Config", "Configured"); +/* +#ifdef ESP32 + if(HOMEdDiscovery) + HOMEdDiscovery->mqttSubscribeDiscovery(); + if(HADiscovery) + HADiscovery->mqttSubscribeDiscovery(); + // оттправляем все статусы + if(HOMEdDiscovery || HADiscovery) + { + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) + { + if ((*it)->iAmLocal) + { + publishStatusMqtt((*it)->getID(), (*it)->getValue()); + (*it)->onMqttWsAppConnectEvent(); + } + } + } +#endif +*/ } void clearConfigure() { diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index b3a26a56..2f5a205d 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -120,7 +120,9 @@ void getMqttData() { mqttUser = jsonReadStr(settingsFlashJson, F("mqttUser")); mqttPass = jsonReadStr(settingsFlashJson, F("mqttPass")); mqttPrefix = jsonReadStr(settingsFlashJson, F("mqttPrefix")); - nameId = jsonReadStr(settingsFlashJson, F("name")); + if (jsonReadInt(settingsFlashJson, F("HOMEd_names"))){ + nameId = jsonReadStr(settingsFlashJson, F("name"));} + else{nameId = getChipId();} mqttRootDevice = mqttPrefix + "/" + chipId; } diff --git a/src/NTP.cpp b/src/NTP.cpp index fe5ba80f..c6b3a227 100644 --- a/src/NTP.cpp +++ b/src/NTP.cpp @@ -180,33 +180,30 @@ const String getTodayDateDotFormated() { // format 22.02.2022 unsigned long strDateToUnix(String date) { - int day = selectToMarker(date, ".").toInt(); - date = deleteBeforeDelimiter(date, "."); - int month = selectToMarker(date, ".").toInt(); - date = deleteBeforeDelimiter(date, "."); - int year = selectToMarker(date, ".").toInt(); - int secsInOneDay = 86400; - int daysInOneYear = 365; - int daysInLeepYear = 366; - int numberOfLeepYears = 12; - int totalNormalYears = year - 1970 - numberOfLeepYears; + int day, month, year; unsigned int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - if (year % 4 == 0) { - if (year % 100 != 0 || year % 400 == 0) { - daysInMonth[1] = 29; - } else { - daysInMonth[1] = 28; - } - } else { - daysInMonth[1] = 28; - } - int numberOfDaysInPastMonths = 0; - for (int i = 0; i <= 11; i++) { - if (i <= month - 2) { - numberOfDaysInPastMonths = numberOfDaysInPastMonths + daysInMonth[i]; - } + + day = date.substring(0, date.indexOf(".")).toInt(); + date = date.substring(date.indexOf(".") + 1); + month = date.substring(0, date.indexOf(".")).toInt(); + date = date.substring(date.indexOf(".") + 1); + year = date.toInt(); + + unsigned long unixTime = (year - 1970) * 365 * 86400; + int numberOfLeepYears = (year - 1968) / 4 - (year - 1900) / 100 + (year - 1600) / 400; + unixTime += numberOfLeepYears * 86400; + + if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) { + daysInMonth[1] = 29; + } + + for (int i = 0; i < month - 1; i++) { + unixTime += daysInMonth[i] * 86400; } - return (day * secsInOneDay) + (numberOfDaysInPastMonths * secsInOneDay) + (totalNormalYears * daysInOneYear * secsInOneDay) + (numberOfLeepYears * daysInLeepYear * secsInOneDay); + + unixTime += (day - 1) * 86400; + + return unixTime; } const String getDateTimeDotFormatedFromUnix(unsigned long unixTime) { diff --git a/src/modules/exec/MySensors/modinfo.json b/src/modules/exec/MySensors/modinfo.json index 0eb297c8..ecd57d67 100644 --- a/src/modules/exec/MySensors/modinfo.json +++ b/src/modules/exec/MySensors/modinfo.json @@ -49,6 +49,12 @@ }, "defActive": false, "usedLibs": { + "esp32c6_4mb": [ + "exclude" + ], + "esp32c6_8mb": [ + "exclude" + ], "esp32*": [] } } \ No newline at end of file diff --git a/src/modules/sensors/BL0942/BL0942.cpp b/src/modules/sensors/BL0942/BL0942.cpp new file mode 100644 index 00000000..7fec2366 --- /dev/null +++ b/src/modules/sensors/BL0942/BL0942.cpp @@ -0,0 +1,289 @@ + +#include "Global.h" +#include "classes/IoTUart.h" +#include "datatypes.h" + +//namespace bl0942 +//{ + class BL0942cmd; + BL0942cmd *BL0942 = nullptr; + DataPacket buffer; + uint8_t inpos = 0xFF; + uint8_t checksum; + uint8_t pubPhase = 0xFF; + bool needUpdate = false; + + static const float BL0942_PREF = 596; // taken from tasmota + static const float BL0942_UREF = 15873.35944299; // should be 73989/1.218 + static const float BL0942_IREF = 251213.46469622; // 305978/1.218 + static const float BL0942_EREF = 3304.61127328; // Measured + + static const char *const TAG = "bl0942"; + + static const uint8_t BL0942_READ_COMMAND = 0x58; + static const uint8_t BL0942_FULL_PACKET = 0xAA; + static const uint8_t BL0942_PACKET_HEADER = 0x55; + + static const uint8_t BL0942_WRITE_COMMAND = 0xA8; + static const uint8_t BL0942_REG_I_FAST_RMS_CTRL = 0x10; + static const uint8_t BL0942_REG_MODE = 0x18; + static const uint8_t BL0942_REG_SOFT_RESET = 0x19; + static const uint8_t BL0942_REG_USR_WRPROT = 0x1A; + static const uint8_t BL0942_REG_TPS_CTRL = 0x1B; + + // TODO: Confirm insialisation works as intended + const uint8_t BL0942_INIT[5][6] = { + // Reset to default + {BL0942_WRITE_COMMAND, BL0942_REG_SOFT_RESET, 0x5A, 0x5A, 0x5A, 0x38}, + // Enable User Operation Write + {BL0942_WRITE_COMMAND, BL0942_REG_USR_WRPROT, 0x55, 0x00, 0x00, 0xF0}, + // 0x0100 = CF_UNABLE energy pulse, AC_FREQ_SEL 50Hz, RMS_UPDATE_SEL 800mS + {BL0942_WRITE_COMMAND, BL0942_REG_MODE, 0x00, 0x10, 0x00, 0x37}, + // 0x47FF = Over-current and leakage alarm on, Automatic temperature measurement, Interval 100mS + {BL0942_WRITE_COMMAND, BL0942_REG_TPS_CTRL, 0xFF, 0x47, 0x00, 0xFE}, + // 0x181C = Half cycle, Fast RMS threshold 6172 + {BL0942_WRITE_COMMAND, BL0942_REG_I_FAST_RMS_CTRL, 0x1C, 0x18, 0x00, 0x1B}}; + + + class BL0942cmd : public IoTUart + { + private: + float i_rms, watt, v_rms, frequency, total_energy_consumption = 0; + // Divide by this to turn into Watt + float power_reference_ = BL0942_PREF; + // Divide by this to turn into Volt + float voltage_reference_ = BL0942_UREF; + // Divide by this to turn into Ampere + float current_reference_ = BL0942_IREF; + // Divide by this to turn into kWh + float energy_reference_ = BL0942_EREF; + + public: + BL0942cmd(String parameters) : IoTUart(parameters) + { + /* + jsonRead(parameters, "R_current", CURRENT_RESISTOR); + jsonRead(parameters, "R_upstream", VOLTAGE_RESISTOR_UPSTREAM); + jsonRead(parameters, "R_downstream", VOLTAGE_RESISTOR_DOWNSTREAM); + jsonRead(parameters, "CF_GPIO", BL0942_CF_GPIO); + jsonRead(parameters, "CF1_GPIO", BL0942_CF1_GPIO); + jsonRead(parameters, "SEL_GPIO", BL0942_SEL_GPIO_INV); + jsonRead(parameters, "kfV", _kfV); + jsonRead(parameters, "kfA", _kfA); + jsonRead(parameters, "kfW", _kfW); + */ + for (auto *i : BL0942_INIT) + { + _myUART->write(i, 6); + delay(1); + } + _myUART->flush(); + BL0942 = this; + } + + void loop() + { + if (_myUART->available()) + { + while (_myUART->available()) + { + uint8_t in; + _myUART->readBytes(&in, 1); + if (inpos < sizeof(buffer) - 1) + { // читаем тело пакета + ((uint8_t *)(&buffer))[inpos] = in; + inpos++; + checksum += in; + } + else if (inpos < sizeof(buffer)) + { // получили контрольную сумму + inpos++; + checksum ^= 0xFF; + if (in != checksum) + { + ESP_LOGE(TAG, "BL0942 invalid checksum! 0x%02X != 0x%02X", checksum, in); + } + else + { + pubPhase = 0; + } + } + else + { + if (in == BL0942_PACKET_HEADER) + { // стартовый хидер + ((uint8_t *)(&buffer))[0] = BL0942_PACKET_HEADER; + inpos = 1; // начало сохранения буфера + checksum = BL0942_READ_COMMAND + BL0942_PACKET_HEADER; // начальные данные рассчета кс + pubPhase = 3; + } + else + { + ESP_LOGE(TAG, "Invalid data. Header mismatch: %d", in); + } + } + } + } + else if (pubPhase < 3) + { + if (pubPhase == 0) + { + + i_rms = (uint24_t)buffer.i_rms / current_reference_; + + watt = (int24_t)buffer.watt / power_reference_; + + pubPhase = 1; + } + else if (pubPhase == 1) + { + + v_rms = (uint24_t)buffer.v_rms / voltage_reference_; + + frequency = 1000000.0f / buffer.frequency; + + pubPhase = 2; + } + else if (pubPhase == 2) + { + + uint32_t cf_cnt = (uint24_t)buffer.cf_cnt; + total_energy_consumption = cf_cnt / energy_reference_; + + pubPhase = 3; + } + } + IoTItem::loop(); + } + void doByInterval() + { + _myUART->write(BL0942_READ_COMMAND); + _myUART->write(BL0942_FULL_PACKET); + } + float getEnergy() { return total_energy_consumption; } + float getPower() { return watt; } + float getCurrent() { return i_rms; } + float getVoltage() { return v_rms; } + + ~BL0942cmd(){ + + }; + }; + + class BL0942v : public IoTItem + { + private: + public: + BL0942v(String parameters) : IoTItem(parameters) + { + } + + void doByInterval() + { + if (BL0942) + regEvent(BL0942->getVoltage(), "BL0942 V"); + else + { + regEvent(NAN, "BL0942v"); + SerialPrint("E", "BL0942cmd", "initialization error", _id); + } + } + + ~BL0942v(){}; + }; + + class BL0942a : public IoTItem + { + private: + public: + BL0942a(String parameters) : IoTItem(parameters) + { + } + + void doByInterval() + { + if (BL0942) + regEvent(BL0942->getCurrent(), "BL0942 A"); + else + { + regEvent(NAN, "BL0942a"); + SerialPrint("E", "BL0942cmd", "initialization error", _id); + } + } + + ~BL0942a(){}; + }; + + class BL0942w : public IoTItem + { + private: + public: + BL0942w(String parameters) : IoTItem(parameters) + { + } + + void doByInterval() + { + if (BL0942) + regEvent(BL0942->getPower(), "BL0942 W"); + else + { + regEvent(NAN, "BL0942w"); + SerialPrint("E", "BL0942cmd", "initialization error", _id); + } + } + + ~BL0942w(){}; + }; + + class BL0942wh : public IoTItem + { + private: + public: + BL0942wh(String parameters) : IoTItem(parameters) + { + } + + void doByInterval() + { + if (BL0942) + regEvent(BL0942->getEnergy() / 3600.0 / 1000.0, "BL0942 Wh"); + else + { + regEvent(NAN, "BL0942wh"); + SerialPrint("E", "BL0942cmd", "initialization error", _id); + } + } + + ~BL0942wh(){}; + }; + +//} // namespace bl0942 + +void *getAPI_BL0942(String subtype, String param) +{ + if (subtype == F("BL0942v")) + { + return new BL0942v(param); + } + else if (subtype == F("BL0942a")) + { + return new BL0942a(param); + } + else if (subtype == F("BL0942w")) + { + return new BL0942w(param); + } + else if (subtype == F("BL0942wh")) + { + return new BL0942wh(param); + } + else if (subtype == F("BL0942cmd")) + { + return new BL0942cmd(param); + } + else + { + return nullptr; + } +} diff --git a/src/modules/sensors/BL0942/datatypes.h b/src/modules/sensors/BL0942/datatypes.h new file mode 100644 index 00000000..4fe9b8fd --- /dev/null +++ b/src/modules/sensors/BL0942/datatypes.h @@ -0,0 +1,116 @@ +#pragma once + +#include + +//#include "helpers.h" + + +namespace internal { + +// Various functions can be constexpr in C++14, but not in C++11 (because their body isn't just a return statement). +// Define a substitute constexpr keyword for those functions, until we can drop C++11 support. +#if __cplusplus >= 201402L +#define constexpr14 constexpr +#else +#define constexpr14 inline // constexpr implies inline +#endif + + +// std::byteswap from C++23 +template constexpr14 T byteswap(T n) { + T m; + for (size_t i = 0; i < sizeof(T); i++) + reinterpret_cast(&m)[i] = reinterpret_cast(&n)[sizeof(T) - 1 - i]; + return m; +} +template<> constexpr14 uint8_t byteswap(uint8_t n) { return n; } +template<> constexpr14 uint16_t byteswap(uint16_t n) { return __builtin_bswap16(n); } +template<> constexpr14 uint32_t byteswap(uint32_t n) { return __builtin_bswap32(n); } +template<> constexpr14 uint64_t byteswap(uint64_t n) { return __builtin_bswap64(n); } +template<> constexpr14 int8_t byteswap(int8_t n) { return n; } +template<> constexpr14 int16_t byteswap(int16_t n) { return __builtin_bswap16(n); } +template<> constexpr14 int32_t byteswap(int32_t n) { return __builtin_bswap32(n); } +template<> constexpr14 int64_t byteswap(int64_t n) { return __builtin_bswap64(n); } + +/// Convert a value between host byte order and big endian (most significant byte first) order. +template constexpr14 T convert_big_endian(T val) { +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return byteswap(val); +#else + return val; +#endif +} + +/// Convert a value between host byte order and little endian (least significant byte first) order. +template constexpr14 T convert_little_endian(T val) { +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return val; +#else + return byteswap(val); +#endif +} + +/// Wrapper class for memory using big endian data layout, transparently converting it to native order. +template class BigEndianLayout { + public: + constexpr14 operator T() { return convert_big_endian(val_); } + + private: + T val_; +} __attribute__((packed)); + +/// Wrapper class for memory using big endian data layout, transparently converting it to native order. +template class LittleEndianLayout { + public: + constexpr14 operator T() { return convert_little_endian(val_); } + + private: + T val_; +} __attribute__((packed)); + +} // namespace internal + +/// 24-bit unsigned integer type, transparently converting to 32-bit. +struct uint24_t { // NOLINT(readability-identifier-naming) + operator uint32_t() { return val; } + uint32_t val : 24; +} __attribute__((packed)); + +/// 24-bit signed integer type, transparently converting to 32-bit. +struct int24_t { // NOLINT(readability-identifier-naming) + operator int32_t() { return val; } + int32_t val : 24; +} __attribute__((packed)); + +// Integer types in big or little endian data layout. +using uint64_be_t = internal::BigEndianLayout; +using uint32_be_t = internal::BigEndianLayout; +using uint24_be_t = internal::BigEndianLayout; +using uint16_be_t = internal::BigEndianLayout; +using int64_be_t = internal::BigEndianLayout; +using int32_be_t = internal::BigEndianLayout; +using int24_be_t = internal::BigEndianLayout; +using int16_be_t = internal::BigEndianLayout; +using uint64_le_t = internal::LittleEndianLayout; +using uint32_le_t = internal::LittleEndianLayout; +using uint24_le_t = internal::LittleEndianLayout; +using uint16_le_t = internal::LittleEndianLayout; +using int64_le_t = internal::LittleEndianLayout; +using int32_le_t = internal::LittleEndianLayout; +using int24_le_t = internal::LittleEndianLayout; +using int16_le_t = internal::LittleEndianLayout; + +struct DataPacket { + uint8_t frame_header; + uint24_le_t i_rms; + uint24_le_t v_rms; + uint24_le_t i_fast_rms; + int24_le_t watt; + uint24_le_t cf_cnt; + uint16_le_t frequency; + uint8_t reserved1; + uint8_t status; + uint8_t reserved2; + uint8_t reserved3; + uint8_t checksum; +} __attribute__((packed)); \ No newline at end of file diff --git a/src/modules/sensors/BL0942/modinfo.json b/src/modules/sensors/BL0942/modinfo.json new file mode 100644 index 00000000..de771e05 --- /dev/null +++ b/src/modules/sensors/BL0942/modinfo.json @@ -0,0 +1,108 @@ +{ + "menuSection": "sensors", + "configItem": [ + { + "global": 0, + "name": "BL0942 Напряжение", + "type": "Reading", + "subtype": "BL0942v", + "id": "bl_v", + "widget": "anydataVlt", + "page": "BL0942", + "descr": "Напряжение", + "int": 15, + "round": 1 + }, + { + "global": 0, + "name": "BL0942 Сила тока", + "type": "Reading", + "subtype": "BL0942a", + "id": "bl_a", + "widget": "anydataAmp", + "page": "BL0942", + "descr": "Сила тока", + "int": 15, + "round": 1 + }, + { + "global": 0, + "name": "BL0942 Мощность", + "type": "Reading", + "subtype": "BL0942w", + "id": "bl_w", + "widget": "anydataWt", + "page": "BL0942", + "descr": "Мощность", + "int": 15, + "round": 1 + }, + { + "global": 0, + "name": "BL0942 Энергия", + "type": "Reading", + "subtype": "BL0942wh", + "id": "bl_wh", + "widget": "anydataWth", + "page": "BL0942", + "descr": "Энергия", + "int": 15, + "round": 1 + }, + { + "global": 0, + "name": "BL0942 настройка", + "type": "Reading", + "subtype": "BL0942cmd", + "id": "bl_set", + "widget": "nil", + "page": "", + "descr": "", + "int": "5", + "tx": 17, + "rx": 16, + "line": 2, + "speed": 9600 + } + ], + "about": { + "authorName": "Bubnov Mikhail", + "authorContact": "https://t.me/Mit4bmw", + "authorGit": "https://github.com/Mit4el", + "specialThanks": "", + "moduleName": "BL0942", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "Счетчик электроэнергии BL0942", + "moduleDesc": "Считает потраченную электроэнергию, измеряет напряжение, силу тока и прочие параметры.", + "propInfo": { + "int": "Количество секунд между опросами датчика. В bl_set интервал между попытками калибровки (т.к. нужны сначала данные от датчика)", + "btn-reset": "Энергия BL0942 будет сброшена к нулю.", + "R_current": "Резистор подключенный последовательно к основной линии", + "R_upstream": "это 5 резисторов по 470 Ком в делителе напряжения, который питает вывод V2P", + "R_downstream": "это резистор емкостью 1 Ком в делителе напряжения, который питает вывод V2P", + "CF_GPIO": "пин CF", + "CF1_GPIO": "пин CF1", + "SEL_GPIO": "пин SEL", + "kfV": "Коэффициент корректировки напряжение, указать после калибровки", + "kfA": "Коэффициент корректировки тока, указать после калибровки", + "kfW": "Коэффициент корректировки мощности, указать после калибровки" + }, + "funcInfo": [ + { + "name": "calibration", + "descr": "Расчет коэффициентов калибровки. Вызывать от имени BL0942 настройка. bl_set.calibration(220, 16, 3.5). Полученный коэффициенты искать в логе и ввести в конфигурацию kfV, kfA и kfW", + "params": ["Напряжение, Ток, Мощность"] + } + ] + }, + "defActive": true, + "usedLibs": { + "esp32*": [], + "esp82*": [], + "bk72*": [] + } +} \ No newline at end of file diff --git a/src/modules/sensors/Ble/Ble.cpp b/src/modules/sensors/Ble/Ble.cpp index c9713e57..caaa3d53 100644 --- a/src/modules/sensors/Ble/Ble.cpp +++ b/src/modules/sensors/Ble/Ble.cpp @@ -178,7 +178,11 @@ void scanEndedCB(NimBLEScanResults results) // pBLEScan->clearResults(); } +//#if defined (esp32c6_4mb) || defined (esp32c6_8mb) +//class BleScan : public IoTItem, NimBLEScanCallbacks +//#else class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks +//#endif { private: // описание параметров передаваемых из настроек датчика из веба @@ -218,7 +222,9 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks BLEdata["manufacturerdata"] = manufacturerdata; free(manufacturerdata); } +#if !defined (esp32c6_4mb) && !defined (esp32c6_8mb) if (advertisedDevice->haveRSSI()) +#endif BLEdata["rssi"] = (int)advertisedDevice->getRSSI(); if (advertisedDevice->haveTXPower()) BLEdata["txpower"] = (int8_t)advertisedDevice->getTXPower(); @@ -243,7 +249,6 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks mac_address = BLEdata["id"].as(); } mac_address.replace(":", ""); - if (_debug < 2) { BLEdata.remove("manufacturerdata"); @@ -297,7 +302,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); // create new scan +#if defined (esp32c6_4mb) || defined (esp32c6_8mb) + pBLEScan->setScanCallbacks(this); +#else pBLEScan->setAdvertisedDeviceCallbacks(this); +#endif pBLEScan->setActiveScan(false); // active scan uses more power, but get results faster pBLEScan->setInterval(100); pBLEScan->setWindow(99); // less or equal setInterval value @@ -312,7 +321,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks if (_scanDuration > 0) { SerialPrint("i", F("BLE"), "Start Scanning..."); +#if defined (esp32c6_4mb) || defined (esp32c6_8mb) + pBLEScan->start(_scanDuration, false); +#else pBLEScan->start(_scanDuration, scanEndedCB, false); +#endif } } } diff --git a/src/modules/sensors/Ble/modinfo.json b/src/modules/sensors/Ble/modinfo.json index f51d0618..9a75dbd9 100644 --- a/src/modules/sensors/Ble/modinfo.json +++ b/src/modules/sensors/Ble/modinfo.json @@ -64,10 +64,10 @@ }, "defActive": false, "usedLibs": { - "esp32c62_4mb": [ + "esp32c6_4mb": [ "https://github.com/h2zero/NimBLE-Arduino#c6-build" ], - "esp32c62_8mb": [ + "esp32c6_8mb": [ "https://github.com/h2zero/NimBLE-Arduino#c6-build" ], "esp32_4mb3f": [ diff --git a/src/modules/sensors/Ble_part1/Ble_p1.cpp b/src/modules/sensors/Ble_part1/Ble_p1.cpp index 7ead4a2c..534e7c4b 100644 --- a/src/modules/sensors/Ble_part1/Ble_p1.cpp +++ b/src/modules/sensors/Ble_part1/Ble_p1.cpp @@ -178,7 +178,11 @@ void scanEndedCB(NimBLEScanResults results) // pBLEScan->clearResults(); } +//#if defined (esp32c6_4mb) || defined (esp32c6_8mb) +//class BleScan : public IoTItem, NimBLEScanCallbacks +//#else class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks +//#endif { private: // описание параметров передаваемых из настроек датчика из веба @@ -218,7 +222,9 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks BLEdata["manufacturerdata"] = manufacturerdata; free(manufacturerdata); } +#if !defined (esp32c6_4mb) && !defined (esp32c6_8mb) if (advertisedDevice->haveRSSI()) +#endif BLEdata["rssi"] = (int)advertisedDevice->getRSSI(); if (advertisedDevice->haveTXPower()) BLEdata["txpower"] = (int8_t)advertisedDevice->getTXPower(); @@ -296,7 +302,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); // create new scan +#if defined (esp32c6_4mb) || defined (esp32c6_8mb) + pBLEScan->setScanCallbacks(this); +#else pBLEScan->setAdvertisedDeviceCallbacks(this); +#endif pBLEScan->setActiveScan(false); // active scan uses more power, but get results faster pBLEScan->setInterval(100); pBLEScan->setWindow(99); // less or equal setInterval value @@ -311,7 +321,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks if (_scanDuration > 0) { SerialPrint("i", F("BLE"), "Start Scanning..."); +#if defined (esp32c6_4mb) || defined (esp32c6_8mb) + pBLEScan->start(_scanDuration, false); +#else pBLEScan->start(_scanDuration, scanEndedCB, false); +#endif } } } diff --git a/src/modules/sensors/Ble_part1/modinfo.json b/src/modules/sensors/Ble_part1/modinfo.json index 199c92b8..0d2f484e 100644 --- a/src/modules/sensors/Ble_part1/modinfo.json +++ b/src/modules/sensors/Ble_part1/modinfo.json @@ -64,6 +64,12 @@ }, "defActive": false, "usedLibs": { + "esp32c6_4mb": [ + "https://github.com/h2zero/NimBLE-Arduino#c6-build" + ], + "esp32c6_8mb": [ + "https://github.com/h2zero/NimBLE-Arduino#c6-build" + ], "esp32*": [ "https://github.com/Mit4el/NimBLE-Arduino.git" ], diff --git a/src/modules/sensors/Ble_part2/Ble_p2.cpp b/src/modules/sensors/Ble_part2/Ble_p2.cpp index 0c8de171..9c3be51d 100644 --- a/src/modules/sensors/Ble_part2/Ble_p2.cpp +++ b/src/modules/sensors/Ble_part2/Ble_p2.cpp @@ -178,7 +178,11 @@ void scanEndedCB(NimBLEScanResults results) // pBLEScan->clearResults(); } +//#if defined (esp32c6_4mb) || defined (esp32c6_8mb) +//class BleScan : public IoTItem, NimBLEScanCallbacks +//#else class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks +//#endif { private: // описание параметров передаваемых из настроек датчика из веба @@ -218,7 +222,9 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks BLEdata["manufacturerdata"] = manufacturerdata; free(manufacturerdata); } +#if !defined (esp32c6_4mb) && !defined (esp32c6_8mb) if (advertisedDevice->haveRSSI()) +#endif BLEdata["rssi"] = (int)advertisedDevice->getRSSI(); if (advertisedDevice->haveTXPower()) BLEdata["txpower"] = (int8_t)advertisedDevice->getTXPower(); @@ -254,7 +260,6 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks BLEdata.remove("track"); BLEdata.remove("id"); } - // дописываем время прихода пакета данных BLEdata["last"] = millis(); if (_debug) @@ -297,7 +302,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); // create new scan +#if defined (esp32c6_4mb) || defined (esp32c6_8mb) + pBLEScan->setScanCallbacks(this); +#else pBLEScan->setAdvertisedDeviceCallbacks(this); +#endif pBLEScan->setActiveScan(false); // active scan uses more power, but get results faster pBLEScan->setInterval(100); pBLEScan->setWindow(99); // less or equal setInterval value @@ -312,7 +321,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks if (_scanDuration > 0) { SerialPrint("i", F("BLE"), "Start Scanning..."); +#if defined (esp32c6_4mb) || defined (esp32c6_8mb) + pBLEScan->start(_scanDuration, false); +#else pBLEScan->start(_scanDuration, scanEndedCB, false); +#endif } } } diff --git a/src/modules/sensors/Ble_part2/modinfo.json b/src/modules/sensors/Ble_part2/modinfo.json index b32ccd52..26241435 100644 --- a/src/modules/sensors/Ble_part2/modinfo.json +++ b/src/modules/sensors/Ble_part2/modinfo.json @@ -64,6 +64,12 @@ }, "defActive": false, "usedLibs": { + "esp32c6_4mb": [ + "https://github.com/h2zero/NimBLE-Arduino#c6-build" + ], + "esp32c6_8mb": [ + "https://github.com/h2zero/NimBLE-Arduino#c6-build" + ], "esp32*": [ "https://github.com/Mit4el/NimBLE-Arduino.git" ], diff --git a/src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp b/src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp index 86f8e069..3c659755 100644 --- a/src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp +++ b/src/modules/virtual/DiscoveryHA/DiscoveryHA.cpp @@ -28,25 +28,25 @@ class DiscoveryHA : public IoTDiscovery // mqttSubscribeExternal(_topic); } } -/* - void onMqttRecive(String &topic, String &msg) - { - if (!HA) - return; - - if (msg.indexOf("HELLO") == -1) + /* + void onMqttRecive(String &topic, String &msg) { - String dev = selectToMarkerLast(topic, "/"); - dev.toUpperCase(); - dev.replace(":", ""); - if (_topic != topic) - { - // SerialPrint("i", "ExternalMQTT", _id + " not equal: " + topic + " msg: " + msg); + if (!HA) return; + + if (msg.indexOf("HELLO") == -1) + { + String dev = selectToMarkerLast(topic, "/"); + dev.toUpperCase(); + dev.replace(":", ""); + if (_topic != topic) + { + // SerialPrint("i", "ExternalMQTT", _id + " not equal: " + topic + " msg: " + msg); + return; + } + // обработка топика, на который подписались } - // обработка топика, на который подписались - } - } */ + } */ void doByInterval() { @@ -96,7 +96,7 @@ class DiscoveryHA : public IoTDiscovery jsonWriteInt(errorsHeapJson, F("jse3"), 1); // Ошибка чтения json файла с виджетами при отправки в mqtt } int i = 0; - // String path = jsonReadStr(settingsFlashJson, F("HomeAssistant")); + // String HATopic = jsonReadStr(settingsFlashJson, F("HomeAssistant")); JsonArray arr = doc.as(); for (JsonVariant value : arr) { @@ -104,7 +104,7 @@ class DiscoveryHA : public IoTDiscovery dev.replace(":", ""); String HAjson = ""; HAjson = "{\"availability\":[{\"topic\": \"" + mqttRootDevice + "/state\",\"value_template\": \"{{ value_json.status }}\"}],\"availability_mode\": \"any\","; - HAjson = HAjson + " \"device\": {\"identifiers\": [\"" + value["page"].as() + "\"],"; + HAjson = HAjson + " \"device\": {\"identifiers\": [\"" + mqttRootDevice + value["page"].as() + "\"],"; HAjson = HAjson + " \"name\": \" " + value["page"].as() + "\"},"; HAjson = HAjson + " \"name\": \"" + value["descr"].as() + "\","; HAjson = HAjson + " \"state_topic\": \"" + value["topic"].as() + "/status\","; @@ -114,22 +114,39 @@ class DiscoveryHA : public IoTDiscovery if (value["name"].as() == "anydataTmp") { HAjson = HAjson + " \"value_template\": \"{{ float( value_json.status, default = 0) | default }}\","; - HAjson = HAjson + " \"unique_id\": \"" + dev + "\","; - HAjson = HAjson + " \"state_class\": \"measurement\","; + HAjson = HAjson + " \"unique_id\": \"" + mqttRootDevice + dev + "\","; HAjson = HAjson + " \"unit_of_measurement\": \"°C\""; } else if (value["name"].as() == "anydataHum") { HAjson = HAjson + " \"value_template\": \"{{ float( value_json.status, default = 0) | default }}\","; - HAjson = HAjson + " \"unique_id\": \"" + dev + "\","; - HAjson = HAjson + " \"state_class\": \"measurement\","; + HAjson = HAjson + " \"unique_id\": \"" + mqttRootDevice + dev + "\","; HAjson = HAjson + " \"unit_of_measurement\": \"%\""; } - // ввод числа + else if (value["name"].as() == "anydataMm") + { + HAjson = HAjson + " \"value_template\": \"{{ float( value_json.status, default = 0) | default }}\","; + HAjson = HAjson + " \"unique_id\": \"" + mqttRootDevice + dev + "\","; + HAjson = HAjson + " \"unit_of_measurement\": \"mm\""; + } + else if (value["name"].as() == "anydataBar") + { + HAjson = HAjson + " \"value_template\": \"{{ float( value_json.status, default = 0) | default }}\","; + HAjson = HAjson + " \"unique_id\": \"" + mqttRootDevice + dev + "\","; + HAjson = HAjson + " \"unit_of_measurement\": \"Bar\""; + } + else if (value["name"].as() == "anydataPpm") + { + HAjson = HAjson + " \"value_template\": \"{{ float( value_json.status, default = 0) | default }}\","; + HAjson = HAjson + " \"unique_id\": \"" + mqttRootDevice + dev + "\","; + HAjson = HAjson + " \"unit_of_measurement\": \"ppm\""; + } + + // ввод числаФВ else if (value["name"].as() == "inputDgt") { HAjson = HAjson + " \"value_template\": \"{{ float( value_json.status, default = 0) | default }}\","; - HAjson = HAjson + " \"unique_id\": \"" + dev + "\","; + HAjson = HAjson + " \"unique_id\": \"" + mqttRootDevice + dev + "\","; HAjson = HAjson + " \"command_topic\": \"" + value["topic"].as() + "/control\","; HAjson = HAjson + " \"mode\": \"box\","; HAjson = HAjson + " \"min\": " + -1000000 + ","; @@ -139,14 +156,14 @@ class DiscoveryHA : public IoTDiscovery else if (value["name"].as() == "inputTxt") { HAjson = HAjson + " \"value_template\": \"{{ value_json.status | default }}\","; - HAjson = HAjson + " \"unique_id\": \"" + dev + "\","; + HAjson = HAjson + " \"unique_id\": \"" + mqttRootDevice + dev + "\","; HAjson = HAjson + " \"command_topic\": \"" + value["topic"].as() + "/control\""; } // переключатель else if (value["name"].as() == "toggle") { HAjson = HAjson + " \"value_template\": \"{{ value_json.status | default }}\","; - HAjson = HAjson + " \"unique_id\": \"" + dev + "\","; + HAjson = HAjson + " \"unique_id\": \"" + mqttRootDevice + dev + "\","; HAjson = HAjson + " \"command_topic\": \"" + value["topic"].as() + "/control\","; HAjson = HAjson + " \"device_class\": \"switch\","; HAjson = HAjson + " \"payload_off\": " + 0 + ","; @@ -157,7 +174,7 @@ class DiscoveryHA : public IoTDiscovery else { HAjson = HAjson + " \"value_template\": \"{{ value_json.status | default }}\","; - HAjson = HAjson + " \"unique_id\": \"" + dev + "\""; + HAjson = HAjson + " \"unique_id\": \"" + mqttRootDevice + dev + "\""; } HAjson = HAjson + " }"; diff --git a/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp b/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp index 0fa8be96..8872651e 100644 --- a/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp +++ b/src/modules/virtual/DiscoveryHomeD/DiscoveryHomeD.cpp @@ -8,16 +8,29 @@ class DiscoveryHomeD : public IoTDiscovery bool sendOk = false; // bool topicOk = false; bool HOMEd = false; + int _names = 0; + String esp_id = chipId; public: DiscoveryHomeD(String parameters) : IoTDiscovery(parameters) { _topic = jsonReadStr(parameters, "topic"); + _names = jsonReadInt(parameters, "names"); if (_topic && _topic != "" && _topic != "null") { HOMEd = true; HOMEdTopic = _topic; } + if (_names) + { + esp_id = jsonReadStr(settingsFlashJson, F("name")); + jsonWriteInt(settingsFlashJson, F("HOMEd_names"), 1); + } + else + { + jsonWriteInt(settingsFlashJson, F("HOMEd_names"), 0); + } + if (mqttIsConnect() && HOMEd) { mqttReconnect(); @@ -33,14 +46,14 @@ class DiscoveryHomeD : public IoTDiscovery if (payloadStr.indexOf("HELLO") == -1) { -/* String dev = selectToMarkerLast(topic, "/"); - dev.toUpperCase(); - dev.replace(":", ""); - if (_topic != topic) - { - // SerialPrint("i", "ExternalMQTT", _id + " not equal: " + topic + " msg: " + msg); - return; - } */ + /* String dev = selectToMarkerLast(topic, "/"); + dev.toUpperCase(); + dev.replace(":", ""); + if (_topic != topic) + { + // SerialPrint("i", "ExternalMQTT", _id + " not equal: " + topic + " msg: " + msg); + return; + } */ // обработка топика, на который подписались if (topic.indexOf(F("/td/custom")) != -1) { @@ -52,7 +65,6 @@ class DiscoveryHomeD : public IoTDiscovery { String key = kvp.key().c_str(); - SerialPrint("i", F("=>MQTT"), "Msg from HOMEd: " + key); String value = kvp.value().as(); if (key.indexOf(F("status_")) != -1) { @@ -71,11 +83,17 @@ class DiscoveryHomeD : public IoTDiscovery generateOrder(key, val); } } - - if (!value) + else { - float val = kvp.value(); - generateOrder(key, (String)(val)); + if (!value) + { + float val = kvp.value(); + generateOrder(key, (String)(val)); + } + else + { + generateOrder(key, value); + } } } @@ -90,8 +108,8 @@ class DiscoveryHomeD : public IoTDiscovery if (mqttIsConnect() && !sendOk && topicOk) { sendOk = true; - publishRetain(_topic + "/device/custom/" + nameId, "{\"status\":\"online\"}"); - String HOMEdsubscribeTopic = _topic + "/td/custom/" + nameId; + publishRetain(_topic + "/device/custom/" + esp_id, "{\"status\":\"online\"}"); + String HOMEdsubscribeTopic = _topic + "/td/custom/" + esp_id; // mqtt.subscribe(HOMEdsubscribeTopic.c_str()); mqttSubscribeExternal(HOMEdsubscribeTopic); } @@ -103,7 +121,7 @@ class DiscoveryHomeD : public IoTDiscovery void publishStatusHOMEd(const String &topic, const String &data) { - String path_h = HOMEdTopic + "/fd/custom/" + nameId; + String path_h = HOMEdTopic + "/fd/custom/" + esp_id; String json_h = "{}"; if (topic != "onStart") { @@ -133,8 +151,8 @@ class DiscoveryHomeD : public IoTDiscovery { deleteFromHOMEd(); getlayoutHOMEd(); - publishRetain(HOMEdTopic + "/device/custom/" + nameId, "{\"status\":\"online\"}"); - String HOMEdsubscribeTopic = HOMEdTopic + "/td/custom/" + nameId; + publishRetain(HOMEdTopic + "/device/custom/" + esp_id, "{\"status\":\"online\"}"); + String HOMEdsubscribeTopic = HOMEdTopic + "/td/custom/" + esp_id; mqtt.subscribe(HOMEdsubscribeTopic.c_str()); } } @@ -164,7 +182,7 @@ class DiscoveryHomeD : public IoTDiscovery JsonArray arr = doc.as(); String HOMEdJSON = ""; HOMEdJSON = "{\"action\":\"updateDevice\","; - HOMEdJSON = HOMEdJSON + "\"device\":\"" + nameId + "\","; + HOMEdJSON = HOMEdJSON + "\"device\":\"" + chipId + "\","; HOMEdJSON = HOMEdJSON + "\"data\":{"; HOMEdJSON = HOMEdJSON + "\"active\": true,"; HOMEdJSON = HOMEdJSON + "\"cloud\": false,"; @@ -178,7 +196,7 @@ class DiscoveryHomeD : public IoTDiscovery { String name = value["descr"]; String device = selectToMarkerLast(value["topic"].as(), "/"); - //String id = chipId + "-" + device; + // String id = ChipId + "-" + device; String expose = value["name"]; if (value["name"].as() == "toggle") { @@ -219,7 +237,7 @@ class DiscoveryHomeD : public IoTDiscovery file.close(); - publishRetain(HOMEdTopic + "/device/custom/" + nameId, "{\"status\":\"online\"}"); + publishRetain(HOMEdTopic + "/device/custom/" + esp_id, "{\"status\":\"online\"}"); for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { @@ -243,7 +261,7 @@ class DiscoveryHomeD : public IoTDiscovery String HOMEdjson = ""; HOMEdjson = "{\"action\":\"removeDevice\","; HOMEdjson = HOMEdjson + "\"device\":\""; - HOMEdjson = HOMEdjson + nameId; + HOMEdjson = HOMEdjson + chipId; HOMEdjson = HOMEdjson + "\"}"; String topic = (HOMEdTopic + "/command/custom").c_str(); if (!publish(topic, HOMEdjson)) diff --git a/src/modules/virtual/DiscoveryHomeD/modinfo.json b/src/modules/virtual/DiscoveryHomeD/modinfo.json index 800a7816..a34e6f10 100644 --- a/src/modules/virtual/DiscoveryHomeD/modinfo.json +++ b/src/modules/virtual/DiscoveryHomeD/modinfo.json @@ -10,7 +10,8 @@ "widget": "", "page": "", "descr": "", - "topic": "homed" + "topic": "homed", + "names":1 } ], "about": { diff --git a/tools/partitions_custom_8mb.csv b/tools/partitions_custom_8mb.csv new file mode 100644 index 00000000..1c76ee59 --- /dev/null +++ b/tools/partitions_custom_8mb.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, , 3000K, +app1, app, ota_1, , 3000K, +spiffs, data, spiffs, , 1500K, \ No newline at end of file From 025bf94abcb4a7341dda41221ab79d872ea1d1fa Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 6 Jan 2025 21:06:55 +0300 Subject: [PATCH 041/118] =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D1=81=D1=87=D0=B5?= =?UTF-8?q?=D1=82=20=D1=81=D1=80=D0=B5=D0=B4=D0=BD=D0=B5=D0=B3=D0=BE=20ADC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/AnalogAdc/AnalogAdc.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modules/sensors/AnalogAdc/AnalogAdc.cpp b/src/modules/sensors/AnalogAdc/AnalogAdc.cpp index 510d5723..4ee91d51 100644 --- a/src/modules/sensors/AnalogAdc/AnalogAdc.cpp +++ b/src/modules/sensors/AnalogAdc/AnalogAdc.cpp @@ -17,6 +17,7 @@ class AnalogAdc : public IoTItem { unsigned int _pin; unsigned int _avgSteps, _avgCount; unsigned long _avgSumm; + float adCresult; public: //======================================================================================================= @@ -45,6 +46,7 @@ class AnalogAdc : public IoTItem { // и выполнить за несколько тактов void doByInterval() { if (_avgSteps <= 1) value.valD = IoTgpio.analogRead(_pin); + value.valD = adCresult;/// regEvent(value.valD, "AnalogAdc"); //обязательный вызов хотяб один } @@ -56,7 +58,8 @@ class AnalogAdc : public IoTItem { void loop() { if (_avgSteps > 1) { if (_avgCount > _avgSteps) { - value.valD = _avgSumm / _avgSteps; + // value.valD = _avgSumm / (_avgSteps + 1); + adCresult = _avgSumm / (_avgSteps + 1); _avgSumm = 0; _avgCount = 0; } From c086c71728a64742af3cc562f2ba2477a96975a0 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 7 Jan 2025 13:36:31 +0300 Subject: [PATCH 042/118] esp32c6 flash_size 8mb --- platformio.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 514c4648..7870772c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -418,7 +418,7 @@ lib_deps = ${env:esp32c6_8mb_fromitems.lib_deps} lib_ignore = LT_WebSockets build_flags = - -Desp32c6_4mb="esp32c6_4mb" + -Desp32c6_8mb="esp32c6_8mb" -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MODE=0 -Wl,--wrap=esp_panic_handler @@ -433,6 +433,7 @@ upload_speed = 921600 monitor_speed = 115200 debug_tool = esp-prog board_build.partitions = tools/partitions_custom_8mb.csv +board_upload.flash_size = 8MB board_build.filesystem = littlefs build_src_filter = +<*.cpp> From 18cd043ea89919616082a7a2f21ec9f9ac11e7cb Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 7 Jan 2025 13:46:03 +0300 Subject: [PATCH 043/118] test path script --- .github/workflows/build_iotm.yml | 2 +- tools/patch8266_16m.py | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build_iotm.yml b/.github/workflows/build_iotm.yml index 76dcb8f2..d30a26da 100644 --- a/.github/workflows/build_iotm.yml +++ b/.github/workflows/build_iotm.yml @@ -1,5 +1,5 @@ env: - BOARDS: '["esp8266_4mb", "esp32_4mb3f", "esp32c3m_4mb", "esp32s2_4mb", "esp32s3_16mb"]' + BOARDS: '["esp8266_4mb", "esp8266_16mb", "esp32_4mb3f", "esp32c3m_4mb", "esp32s2_4mb", "esp32s3_16mb"]' name: Build Firmware diff --git a/tools/patch8266_16m.py b/tools/patch8266_16m.py index c0358cec..8edd570a 100644 --- a/tools/patch8266_16m.py +++ b/tools/patch8266_16m.py @@ -4,15 +4,17 @@ import os import shutil from sys import platform +Import("env") + if platform == "linux" or platform == "linux2": - # linux - mainPyPath = '~/.platformio/platforms/espressif8266@4.0.1/builder/main.py' + # linux '~/.platformio/platforms/espressif8266@4.0.1/builder/main.py' + mainPyPath = env.get("PLATFORMIO_PLATFORMS_DIR") + '/espressif8266@4.0.1/builder/main.py' else: - # windows - mainPyPath = os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif8266@4.0.1\\builder\\main.py' + # windows os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif8266@4.0.1\\builder\\main.py' + mainPyPath = env.get("PLATFORMIO_PLATFORMS_DIR") + '\\espressif8266@4.0.1\\builder\\main.py' -# print(mainPyPath) +print(mainPyPath) with open(mainPyPath) as fr: oldData = fr.read() From fce887d10be6e7b2a23ef91d9a51995d39b8afe0 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 7 Jan 2025 13:54:34 +0300 Subject: [PATCH 044/118] test fix path script --- tools/patch8266_16m.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/patch8266_16m.py b/tools/patch8266_16m.py index 8edd570a..9babec92 100644 --- a/tools/patch8266_16m.py +++ b/tools/patch8266_16m.py @@ -9,10 +9,10 @@ if platform == "linux" or platform == "linux2": # linux '~/.platformio/platforms/espressif8266@4.0.1/builder/main.py' - mainPyPath = env.get("PLATFORMIO_PLATFORMS_DIR") + '/espressif8266@4.0.1/builder/main.py' + mainPyPath = env.subst("$PLATFORMIO_PLATFORMS_DIR") + '/espressif8266@4.0.1/builder/main.py' else: # windows os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif8266@4.0.1\\builder\\main.py' - mainPyPath = env.get("PLATFORMIO_PLATFORMS_DIR") + '\\espressif8266@4.0.1\\builder\\main.py' + mainPyPath = env.subst("$PLATFORMIO_PLATFORMS_DIR") + '\\espressif8266@4.0.1\\builder\\main.py' print(mainPyPath) From 2397d1c01854dbd6fa538fcbb3a9fd8ce2f28baa Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 7 Jan 2025 14:17:14 +0300 Subject: [PATCH 045/118] test --- tools/patch8266_16m.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/patch8266_16m.py b/tools/patch8266_16m.py index 9babec92..d04c4d24 100644 --- a/tools/patch8266_16m.py +++ b/tools/patch8266_16m.py @@ -6,6 +6,7 @@ from sys import platform Import("env") +print(env) if platform == "linux" or platform == "linux2": # linux '~/.platformio/platforms/espressif8266@4.0.1/builder/main.py' From 24430de25f78ab00d311e5e0804ca0d6d25bb411 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 7 Jan 2025 16:22:58 +0300 Subject: [PATCH 046/118] test path script --- tools/patch8266_16m.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tools/patch8266_16m.py b/tools/patch8266_16m.py index d04c4d24..5e170751 100644 --- a/tools/patch8266_16m.py +++ b/tools/patch8266_16m.py @@ -1,21 +1,22 @@ # правим %USERPROFILE%\.platformio\platforms\espressif8266\builder\main.py 103-115 # для добавления возможности прошивки 16мб модуля esp8266 +Import("env") import os import shutil from sys import platform -Import("env") -print(env) +pio_home = env.subst("$PROJECT_CORE_DIR") +print(pio_home) if platform == "linux" or platform == "linux2": - # linux '~/.platformio/platforms/espressif8266@4.0.1/builder/main.py' - mainPyPath = env.subst("$PLATFORMIO_PLATFORMS_DIR") + '/espressif8266@4.0.1/builder/main.py' + #mainPyPath = '/home/rise/.platformio/platforms/espressif8266@4.0.1/builder/main.py' + mainPyPath = pio_home + '/platforms/espressif8266@4.0.1/builder/main.py' else: - # windows os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif8266@4.0.1\\builder\\main.py' - mainPyPath = env.subst("$PLATFORMIO_PLATFORMS_DIR") + '\\espressif8266@4.0.1\\builder\\main.py' + #mainPyPath = os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif8266@4.0.1\\builder\\main.py' + mainPyPath = pio_home + '\\platforms\\espressif8266@4.0.1\\builder\\main.py' -print(mainPyPath) +print("FIX 16Mb path: " + mainPyPath) with open(mainPyPath) as fr: oldData = fr.read() From 79c1810be8f6be2ff8a7863bad427bab172a0578 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 7 Jan 2025 16:49:18 +0300 Subject: [PATCH 047/118] =?UTF-8?q?fix=20=D0=B0=D0=B1=D1=81=D0=BE=D0=BB?= =?UTF-8?q?=D1=8E=D1=82=D0=BD=D1=8B=D1=85=20=D0=BF=D1=83=D1=82=D0=B5=D0=B9?= =?UTF-8?q?=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_iotm.yml | 2 +- tools/patch32_ws.py | 11 ++++++++--- tools/patch32c6.py | 14 ++++++++++---- tools/patch8266_16m.py | 17 ++++++++++------- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build_iotm.yml b/.github/workflows/build_iotm.yml index d30a26da..78ed394d 100644 --- a/.github/workflows/build_iotm.yml +++ b/.github/workflows/build_iotm.yml @@ -1,5 +1,5 @@ env: - BOARDS: '["esp8266_4mb", "esp8266_16mb", "esp32_4mb3f", "esp32c3m_4mb", "esp32s2_4mb", "esp32s3_16mb"]' + BOARDS: '["esp8266_4mb", "esp8266_16mb", "esp32_4mb3f", "esp32c3m_4mb", "esp32s2_4mb", "esp32s3_16mb", "esp32c6_4mb"]' name: Build Firmware diff --git a/tools/patch32_ws.py b/tools/patch32_ws.py index 5c7d21c6..b56d5159 100644 --- a/tools/patch32_ws.py +++ b/tools/patch32_ws.py @@ -3,17 +3,22 @@ # #define WIFI_CLIENT_MAX_WRITE_RETRY (10) # #define WIFI_CLIENT_SELECT_TIMEOUT_US (1000000) # Прописать скрипт в platformio.ini внутри [env:esp32_4mb3f] написать extra_scripts = pre:tools/patch32_ws.py - +Import("env") import os import shutil from sys import platform +pio_home = env.subst("$PROJECT_CORE_DIR") +print(pio_home) + if platform == "linux" or platform == "linux2": # linux - mainPyPath = '/home/rise/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src/WiFiClient.cpp' + #mainPyPath = '/home/rise/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src/WiFiClient.cpp' + mainPyPath = pio_home + '/packages/framework-arduinoespressif32/libraries/WiFi/src/WiFiClient.cpp' else: # windows - mainPyPath = os.environ['USERPROFILE'] + '\\.platformio\\packages\\framework-arduinoespressif32\\libraries\\WiFi\\src\\WiFiClient.cpp' + #mainPyPath = os.environ['USERPROFILE'] + '\\.platformio\\packages\\framework-arduinoespressif32\\libraries\\WiFi\\src\\WiFiClient.cpp' + mainPyPath = pio_home + '\\packages\\framework-arduinoespressif32\\libraries\\WiFi\\src\\WiFiClient.cpp' # print(mainPyPath) try: diff --git a/tools/patch32c6.py b/tools/patch32c6.py index adaa1fc6..3264c06f 100644 --- a/tools/patch32c6.py +++ b/tools/patch32c6.py @@ -1,16 +1,22 @@ +Import("env") import json import os import shutil from sys import platform +pio_home = env.subst("$PROJECT_CORE_DIR") +print(pio_home) + if platform == "linux" or platform == "linux2": # linux - devkitm = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitm-1.json' - devkitc = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitc-1.json' + #devkitm = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitm-1.json' + #devkitc = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitc-1.json' + devkitm = pio_home + '/platforms/espressif32/boards/esp32-c6-devkitm-1.json' + devkitc = pio_home + '/platforms/espressif32/boards/esp32-c6-devkitc-1.json' else: # windows - devkitm = os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif32\\boards\\esp32-c6-devkitm-1.json' - devkitc = os.environ['USERPROFILE'] + '\\.platformio\\platforms\\espressif32\\boards\\esp32-c6-devkitc-1.json' + devkitm = pio_home + '\\platforms\\espressif32\\boards\\esp32-c6-devkitm-1.json' + devkitc = pio_home + '\\platforms\\espressif32\\boards\\esp32-c6-devkitc-1.json' def add_arduino_to_frameworks(file_name): try: diff --git a/tools/patch8266_16m.py b/tools/patch8266_16m.py index 5e170751..89311217 100644 --- a/tools/patch8266_16m.py +++ b/tools/patch8266_16m.py @@ -18,10 +18,13 @@ print("FIX 16Mb path: " + mainPyPath) -with open(mainPyPath) as fr: - oldData = fr.read() - if not 'if _value == -0x6000:' in oldData: - shutil.copyfile(mainPyPath, mainPyPath+'.bak') - newData = oldData.replace('_value += 0xE00000 # correction', '_value += 0xE00000 # correction\n\n if _value == -0x6000:\n _value = env[k]-0x40200000') - with open(mainPyPath, 'w') as fw: - fw.write(newData) \ No newline at end of file +try: + with open(mainPyPath) as fr: + oldData = fr.read() + if not 'if _value == -0x6000:' in oldData: + shutil.copyfile(mainPyPath, mainPyPath+'.bak') + newData = oldData.replace('_value += 0xE00000 # correction', '_value += 0xE00000 # correction\n\n if _value == -0x6000:\n _value = env[k]-0x40200000') + with open(mainPyPath, 'w') as fw: + fw.write(newData) +except FileNotFoundError: + print("Файл не найден или не удается открыть") \ No newline at end of file From 96b8311579a51f96277ca35e4c0af5e2dc51dabb Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 7 Jan 2025 17:02:35 +0300 Subject: [PATCH 048/118] =?UTF-8?q?=D0=BF=D1=83=D1=82=D0=B8=20=D0=B2=20?= =?UTF-8?q?=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/patch32_ws.py | 3 ++- tools/patch32c6.py | 3 ++- tools/patch8266_16m.py | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/patch32_ws.py b/tools/patch32_ws.py index b56d5159..86df29dc 100644 --- a/tools/patch32_ws.py +++ b/tools/patch32_ws.py @@ -9,7 +9,7 @@ from sys import platform pio_home = env.subst("$PROJECT_CORE_DIR") -print(pio_home) +print("PLATFORMIO_DIR" + pio_home) if platform == "linux" or platform == "linux2": # linux @@ -30,5 +30,6 @@ newData = newData.replace('#define WIFI_CLIENT_SELECT_TIMEOUT_US (1000000)', '#define WIFI_CLIENT_SELECT_TIMEOUT_US (500000)') with open(mainPyPath, 'w') as fw: fw.write(newData) + print(f"Файл изменён, ОК! {mainPyPath}") except FileNotFoundError: print("Файл не найден или не удается открыть") \ No newline at end of file diff --git a/tools/patch32c6.py b/tools/patch32c6.py index 3264c06f..5933dc68 100644 --- a/tools/patch32c6.py +++ b/tools/patch32c6.py @@ -5,7 +5,7 @@ from sys import platform pio_home = env.subst("$PROJECT_CORE_DIR") -print(pio_home) +print("PLATFORMIO_DIR" + pio_home) if platform == "linux" or platform == "linux2": # linux @@ -29,6 +29,7 @@ def add_arduino_to_frameworks(file_name): f.seek(0) json.dump(data, f, indent=4) f.truncate() + print(f"Файл изменён, ОК! {file_name}") else: print(f"Arduino already exists in {file_name}") except FileNotFoundError: diff --git a/tools/patch8266_16m.py b/tools/patch8266_16m.py index 89311217..75aecbb9 100644 --- a/tools/patch8266_16m.py +++ b/tools/patch8266_16m.py @@ -7,7 +7,7 @@ from sys import platform pio_home = env.subst("$PROJECT_CORE_DIR") -print(pio_home) +print("PLATFORMIO_DIR" + pio_home) if platform == "linux" or platform == "linux2": #mainPyPath = '/home/rise/.platformio/platforms/espressif8266@4.0.1/builder/main.py' @@ -26,5 +26,6 @@ newData = oldData.replace('_value += 0xE00000 # correction', '_value += 0xE00000 # correction\n\n if _value == -0x6000:\n _value = env[k]-0x40200000') with open(mainPyPath, 'w') as fw: fw.write(newData) + print(f"Файл изменён, ОК! {mainPyPath}") except FileNotFoundError: print("Файл не найден или не удается открыть") \ No newline at end of file From 3791fe29adc02dddb34992136ca1c5532e7d29c7 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 7 Jan 2025 17:05:18 +0300 Subject: [PATCH 049/118] fix webSocket 8266 --- lib/WebSockets/src/WebSocketsServer.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/WebSockets/src/WebSocketsServer.cpp b/lib/WebSockets/src/WebSocketsServer.cpp index ec6928ea..60a038cb 100644 --- a/lib/WebSockets/src/WebSocketsServer.cpp +++ b/lib/WebSockets/src/WebSocketsServer.cpp @@ -671,7 +671,11 @@ void WebSocketsServer::handleNewClients(void) { #endif // store new connection - WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->accept()); +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->available()); //available +#else + WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->accept()); //available +#endif if(!tcpClient) { DEBUG_WEBSOCKETS("[WS-Client] creating Network class failed!"); return; From 9904b561d9f3375575d825324390ad29524aba6c Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 7 Jan 2025 17:13:24 +0300 Subject: [PATCH 050/118] CI github Action --- .github/workflows/build_iotm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_iotm.yml b/.github/workflows/build_iotm.yml index 78ed394d..d30a26da 100644 --- a/.github/workflows/build_iotm.yml +++ b/.github/workflows/build_iotm.yml @@ -1,5 +1,5 @@ env: - BOARDS: '["esp8266_4mb", "esp8266_16mb", "esp32_4mb3f", "esp32c3m_4mb", "esp32s2_4mb", "esp32s3_16mb", "esp32c6_4mb"]' + BOARDS: '["esp8266_4mb", "esp8266_16mb", "esp32_4mb3f", "esp32c3m_4mb", "esp32s2_4mb", "esp32s3_16mb"]' name: Build Firmware From 130dd038c69aacfe19280cf8c5d685557795732e Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 7 Jan 2025 19:27:55 +0300 Subject: [PATCH 051/118] preAlfa modBus_async --- myProfile.json | 34 +- src/modules/sensors/BL0942/BL0942.cpp | 6 +- .../sensors/ModbusRTUasync/MudbusRTU.cpp | 381 ++++++++++++++++++ .../sensors/ModbusRTUasync/modinfo.json | 100 +++++ src/modules/virtual/Loging/modinfo.json | 2 +- 5 files changed, 515 insertions(+), 8 deletions(-) create mode 100644 src/modules/sensors/ModbusRTUasync/MudbusRTU.cpp create mode 100644 src/modules/sensors/ModbusRTUasync/modinfo.json diff --git a/myProfile.json b/myProfile.json index 52821839..f4b9d32d 100644 --- a/myProfile.json +++ b/myProfile.json @@ -22,7 +22,7 @@ "pinSDA": 0, "i2cFreq": 100000, "wg": "group1", - "debugTraceMsgTlgrm": 1 + "debugTraceMsgTlgrm": 1 }, "projectProp": { "platformio": { @@ -174,6 +174,10 @@ "path": "src/modules/virtual/LogingDaily", "active": true }, + { + "path": "src/modules/virtual/LogingHourly", + "active": true + }, { "path": "src/modules/virtual/Math", "active": true @@ -190,6 +194,10 @@ "path": "src/modules/virtual/Timer", "active": true }, + { + "path": "src/modules/virtual/UpdateServer", + "active": true + }, { "path": "src/modules/virtual/Variable", "active": true @@ -236,6 +244,10 @@ "path": "src/modules/sensors/BL0937", "active": true }, + { + "path": "src/modules/sensors/BL0942", + "active": true + }, { "path": "src/modules/sensors/Ble", "active": false @@ -332,6 +344,10 @@ "path": "src/modules/sensors/Mhz19", "active": false }, + { + "path": "src/modules/sensors/ModbusRTUasync", + "active": true + }, { "path": "src/modules/sensors/MQgas", "active": true @@ -340,6 +356,10 @@ "path": "src/modules/sensors/Ntc", "active": false }, + { + "path": "src/modules/sensors/Pcf8591", + "active": false + }, { "path": "src/modules/sensors/Pzem004t", "active": false @@ -378,7 +398,7 @@ }, { "path": "src/modules/sensors/Sht30", - "active": true + "active": false }, { "path": "src/modules/sensors/Sonar", @@ -432,7 +452,7 @@ }, { "path": "src/modules/exec/IoTServo", - "active": true + "active": false }, { "path": "src/modules/exec/IRremote", @@ -468,7 +488,7 @@ }, { "path": "src/modules/exec/Pwm8266", - "active": true + "active": false }, { "path": "src/modules/exec/SDcard", @@ -500,7 +520,7 @@ }, { "path": "src/modules/exec/Thermostat", - "active": false + "active": true }, { "path": "src/modules/sensors/Ds2423", @@ -512,6 +532,10 @@ "path": "src/modules/display/DwinI", "active": true }, + { + "path": "src/modules/display/GyverLAMP", + "active": false + }, { "path": "src/modules/display/Lcd2004", "active": true diff --git a/src/modules/sensors/BL0942/BL0942.cpp b/src/modules/sensors/BL0942/BL0942.cpp index 7fec2366..ec43d1ea 100644 --- a/src/modules/sensors/BL0942/BL0942.cpp +++ b/src/modules/sensors/BL0942/BL0942.cpp @@ -101,7 +101,8 @@ checksum ^= 0xFF; if (in != checksum) { - ESP_LOGE(TAG, "BL0942 invalid checksum! 0x%02X != 0x%02X", checksum, in); + //ESP_LOGE(TAG, "BL0942 invalid checksum! 0x%02X != 0x%02X", checksum, in); + SerialPrint("E", "BL0942cmd", "Invalid checksum!", _id); } else { @@ -119,7 +120,8 @@ } else { - ESP_LOGE(TAG, "Invalid data. Header mismatch: %d", in); + //ESP_LOGE(TAG, "Invalid data. Header mismatch: %d", in); + SerialPrint("E", "BL0942cmd", "Invalid data. Header mismatch", _id); } } } diff --git a/src/modules/sensors/ModbusRTUasync/MudbusRTU.cpp b/src/modules/sensors/ModbusRTUasync/MudbusRTU.cpp new file mode 100644 index 00000000..1c455594 --- /dev/null +++ b/src/modules/sensors/ModbusRTUasync/MudbusRTU.cpp @@ -0,0 +1,381 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include +#include + +#include "Logging.h" +#include "ModbusClientRTU.h" +#include "CoilData.h" + +// class ModbusUart; +Stream *_modbusUART = nullptr; + +// Данные Modbus по умолчанию +int8_t _DIR_PIN = 0; +#define UART_LINE 2 +#define MODBUS_RX_PIN 18 // Rx pin +#define MODBUS_TX_PIN 19 // Tx pin +#define MODBUS_SERIAL_BAUD 9600 // Baud rate for esp32 and max485 communication + +bool data_ready = false; +uint32_t request_time; + +ModbusClientRTU *MB = nullptr; + +ModbusClientRTU *instanceModBus(int8_t _DR) +{ + if (!MB) + { // Если библиотека ранее инициализировалась, т о просто вернем указатель + // Инициализируем библиотеку + if (_DR) + MB = new ModbusClientRTU(_DR); + else + MB = new ModbusClientRTU(); + } + return MB; +} +// ModbusClientRTU MB(_DIR_PIN); +// ModbusClientRTU MB(); + +// TODO УБРАТЬ ЭТО ИЗ ПРИМЕРА +#define NUM_VALUES 21 +float values[NUM_VALUES]; +// Define an onData handler function to receive the regular responses +// Arguments are received response message and the request's token +void handleModBusData(ModbusMessage response, uint32_t token) +{ + printf("Response --- FC:%02X Server:%d Length:%d\n", + response.getFunctionCode(), + response.getServerID(), + response.size()); + HEXDUMP_N("Data dump", response.data(), response.size()); + data_ready = true; +} + +// Define an onError handler function to receive error responses +// Arguments are the error code returned and a user-supplied token to identify the causing request +void handleModBusError(Error error, uint32_t token) +{ + // ModbusError wraps the error code and provides a readable error message for it + ModbusError me(error); + // LOG_E("Error response: %02X - %s\n", (int)me, (const char *)me); + Serial.printf("Error response: %02X - %s\n", (int)me, (const char *)me); +} + +class ModbusClientAsync : public IoTItem +{ +private: + int8_t _rx = MODBUS_RX_PIN; // адреса прочитаем с веба + int8_t _tx = MODBUS_TX_PIN; + int _baud = MODBUS_SERIAL_BAUD; + String _prot = "SERIAL_8N1"; + int protocol = SERIAL_8N1; + + int _addr = 0; // Адрес слейва от 1 до 247 ( вроде ) + String _regStr = ""; // Адрес регистра который будем дергать ( по коду от 0х0000 до 0х????) + uint16_t _reg = 0; + bool _debug; // Дебаг + +public: + ModbusClientAsync(String parameters) : IoTItem(parameters) + { + _rx = (int8_t)jsonReadInt(parameters, "RX"); // прочитаем с веба + _tx = (int8_t)jsonReadInt(parameters, "TX"); + _DIR_PIN = (int8_t)jsonReadInt(parameters, "DIR_PIN"); + _baud = jsonReadInt(parameters, "baud"); + _prot = jsonReadStr(parameters, "protocol"); + jsonRead(parameters, "debug", _debug); + + if (_prot == "SERIAL_8N1") + { + protocol = SERIAL_8N1; + } + else if (_prot == "SERIAL_8N2") + { + protocol = SERIAL_8N2; + } + + pinMode(_DIR_PIN, OUTPUT); + digitalWrite(_DIR_PIN, LOW); + + // Serial2.begin(baud-rate, protocol, RX pin, TX pin); + instanceModBus(_DIR_PIN); + _modbusUART = new HardwareSerial(UART_LINE); + + if (_debug) + { + SerialPrint("I", "ModbusClientAsync", "baud: " + String(_baud) + ", protocol: " + String(protocol, HEX) + ", RX: " + String(_rx) + ", TX: " + String(_tx)); + } + RTUutils::prepareHardwareSerial((HardwareSerial &)*_modbusUART); + // Serial2.begin(BAUDRATE, SERIAL_8N1, RXPIN, TXPIN); + ((HardwareSerial *)_modbusUART)->begin(_baud, protocol, _rx, _tx); // выбираем тип протокола, скорость и все пины с веба + ((HardwareSerial *)_modbusUART)->setTimeout(200); + + // Set up ModbusRTU client. + // - provide onData handler function + MB->onDataHandler(&handleModBusData); + // - provide onError handler function + MB->onErrorHandler(&handleModBusError); + // Set message timeout to 2000ms + MB->setTimeout(2000); + // Start ModbusRTU background task + MB->begin((HardwareSerial &)*_modbusUART); + } + + // Комманды из сценария + IoTValue execute(String command, std::vector ¶m) + { + IoTValue val; + uint8_t result; + uint32_t reading; + + uint16_t _reg = 0; + uint8_t count = 1; + bool isFloat = 0; + if (command == "readInputRegisters") // vout = mb.readInputRegisters(1, "0х0000", 1, 0) - "Адрес","Регистр","Кличество регистров","1-float, 0-long" + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + count = (uint8_t)param[2].valD; + count = count > 2 ? 2 : count; + count = count < 1 ? 1 : count; + isFloat = (bool)param[3].valD; + // val.valD = readFunctionModBus(0x04, _addr, _reg, count, isFloat); + uint32_t lastMillis = millis(); + Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); + Error err; + err = MB->addRequest((uint32_t)lastMillis, _addr, READ_INPUT_REGISTER, _reg, count); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + return val; + } + else if (command == "readHoldingRegisters") // vout = mb.readHoldingRegisters(1, "0х0000", 2, 1) - "Адрес","Регистр","Кличество регистров","1-float, 0-long" + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + count = (uint8_t)param[2].valD; + count = count > 2 ? 2 : count; + count = count < 1 ? 1 : count; + isFloat = (bool)param[3].valD; + // val.valD = readFunctionModBus(0x03, _addr, _reg, count, isFloat); + + // Create request for + // (Fill in your data here!) + // - server ID = 1 + // - function code = 0x03 (read holding register) + // - start address to read = word 10 + // - number of words to read = 4 + // - token to match the response with the request. We take the current millis() value for it. + // + // If something is missing or wrong with the call parameters, we will immediately get an error code + // and the request will not be issued + uint32_t lastMillis = millis(); + Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); + Error err; + err = MB->addRequest((uint32_t)lastMillis, _addr, READ_HOLD_REGISTER, _reg, count); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + return val; + } + else if (command == "readCoils") // vout = mb.readCoils(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" + { + if (param.size()) + { + count = (uint8_t)param[2].valD; + count = count > 16 ? 16 : count; + count = count < 1 ? 1 : count; + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + // node.begin(_addr, (Stream &)*_modbusUART); + // val.valD = readFunctionModBus(0x01, _addr, _reg, count); + + // Read a slice of 12 coils, starting at 13 + uint32_t lastMillis = millis(); + Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); + Error err; + err = MB->addRequest((uint32_t)lastMillis, _addr, READ_COIL, _reg, count); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + return val; + } + else if (command == "readDiscreteInputs") // vout = mb.readDiscreteInputs(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" + { + if (param.size()) + { + count = (uint8_t)param[2].valD; + count = count > 16 ? 16 : count; + count = count < 1 ? 1 : count; + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + // node.begin(_addr, (Stream &)*_modbusUART); + // val.valD = readFunctionModBus(0x02, _addr, _reg, count); + uint32_t lastMillis = millis(); + Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); + Error err; + err = MB->addRequest((uint32_t)lastMillis, _addr, READ_DISCR_INPUT, _reg, count); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + return val; + } + else if (command == "writeSingleRegister") // vout = mb.writeSingleRegister(1,"0x0003", 1) - addr, register, state + { + if (param.size()) + { + // node.begin((uint8_t)param[0].valD, (Stream &)*_modbusUART); + + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + // bool state = param[2].valD; + uint16_t state = param[2].valD; + // result = node.writeSingleRegister(_reg, state); + if (_debug) + { + SerialPrint("I", "ModbusClientAsync", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " = result: " + String(result, HEX)); + } + + // We will first set the register to a known state, read the register, + // then write to it and finally read it again to verify the change + + // Set defined conditions first - write 0x1234 to the register + // The Token value is used in handleData to avoid the output for this first preparation request! + // uint32_t Token = 1111; + uint32_t lastMillis = millis(); + Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); + Error err; + err = MB->addRequest((uint32_t)lastMillis, _addr, WRITE_HOLD_REGISTER, _reg, state); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + // Что можно вернуть в ответ на запись ??? + return {}; + } + else if (command == "writeSingleCoil") // vout = mb.writeSingleCoil(1,"0x0003", 1) - addr, register, state + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + // node.begin(_addr, (Stream &)*_modbusUART); + + bool state = param[2].valD; + // result = node.writeSingleCoil(_reg, state); + if (_debug) + { + SerialPrint("I", "ModbusClientAsync", "writeSingleCoil, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " = result: " + String(result, HEX)); + } + + // next set a single coil at 8 + uint32_t lastMillis = millis(); + Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); + Error err; + err = MB->addRequest((uint32_t)lastMillis, _addr, WRITE_COIL, _reg, state); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + // Что можно вернуть в ответ на запись койлов??? + return {}; + } + else if (command == "writeMultipleCoils") // Пример: mb.writeMultipleCoils(1, \"0х0000\", 4, 3) - будут записаны в четыре бита 0011 + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + count = (uint8_t)param[2].valD; + count = count > 16 ? 16 : count; + count = count < 1 ? 1 : count; + // node.begin(_addr, (Stream &)*_modbusUART); + + uint16_t state = param[3].valD; + // node.setTransmitBuffer(0, state); + // result = node.writeMultipleRegisters(_reg, count); + // node.clearTransmitBuffer(); + if (_debug) + { + SerialPrint("I", "ModbusClientAsync", "writeSingleCoil, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " = result: " + String(result, HEX)); + } + + CoilData cd(12); + // Finally set a a bunch of coils starting at 20 + cd = "011010010110"; + uint32_t lastMillis = millis(); + Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); + Error err; + err = MB->addRequest((uint32_t)lastMillis, _addr, WRITE_MULT_COILS, _reg, cd.coils(), cd.size(), cd.data()); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + return {}; + } + // На данный момент записывает 2(два) регистра!!!!! Подходит для записи float?? Функция 0х10 протокола. + else if (command == "writeMultipleRegisters") // mb.writeMultipleRegisters(1, \"0х0000\", 1234.987) + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + // node.begin(_addr, (Stream &)*_modbusUART); + + float state = param[2].valD; + + // node.setTransmitBuffer(0, lowWord(state)); + // node.setTransmitBuffer(1, highWord(state)); + // result = node.writeMultipleRegisters(_reg, 2); + // node.clearTransmitBuffer(); + Serial.printf("NOT SUPPORTED!\n"); + if (_debug) + { + SerialPrint("I", "ModbusClientAsync", "writeMultipleRegisters, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " (" + String(state, HEX) + ")"); + } + } + return {}; + } + return val; + } + + ~ModbusClientAsync() + { + delete _modbusUART; + _modbusUART = nullptr; + }; +}; + +void *getAPI_ModbusRTUasync(String subtype, String param) +{ + if (subtype == F("mbClient")) + { + return new ModbusClientAsync(param); + } + { + return nullptr; + } +} diff --git a/src/modules/sensors/ModbusRTUasync/modinfo.json b/src/modules/sensors/ModbusRTUasync/modinfo.json new file mode 100644 index 00000000..224bc1bf --- /dev/null +++ b/src/modules/sensors/ModbusRTUasync/modinfo.json @@ -0,0 +1,100 @@ +{ + "menuSection": "sensors", + "configItem": [ + { + "global": 0, + "name": "ModbusAsunc", + "type": "Reading", + "subtype": "mbClient", + "id": "mb", + "widget": "anydataTmp", + "page": "Modbus", + "descr": "Настройки modbus", + "int": 5, + "RX": 18, + "TX": 19, + "DIR_PIN": 4, + "baud": 9600, + "protocol": "SERIAL_8N2", + "debug": 1 + } + ], + "about": { + "authorName": "Bubnov Mikhail", + "authorContact": "https://t.me/Mit4bmw", + "authorGit": "https://github.com/Mit4el", + "specialThanks": "Serghei Crasnicov", + "moduleName": "ModbusRTUasync", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "subTypes": [ + "mbClient" + ], + "title": "ModbusAsync", + "moduleDesc": "Позволяет управлять оборудованием по протоколу modbus", + "propInfo": { + "int": "Количество секунд между опросами датчика.", + "RX": "Пин RX", + "TX": "Пин TX", + "DIR_PIN": "connect DR, RE pin of MAX485 to gpio, указать 0 если не нужен", + "baud": "скорость Uart", + "protocol": "Протокол Uart: SERIAL_8N1 или SERIAL_8N2", + "debug": " 1 - включить вывод дебага , 0 - отключить дебаг" + }, + "funcInfo": [ + { + "name": "readCoils", + "descr": "Чтение койла (битового поля). Функция 0х01 протокола. Читает не более 16 бит за раз. Пример: mb.readCoils(1, \"0х0000\", 1)", + "params": ["Адрес","Регистр","Кличество бит"] + }, + { + "name": "readDiscreteInputs", + "descr": "Чтение дискретного выхода (битового поля). Функция 0х02 протокола. Читает не более 16 бит за раз. Пример: mb.readDiscreteInputs(1, \"0х0000\", 8)", + "params": ["Адрес","Регистр","Кличество бит"] + + }, + { + "name": "readHoldingRegisters", + "descr": "Запрос данных регистра. Функция 0х03 протокола. Читает не более двух регистров за раз. Пример: mb.readHoldingRegisters(1, \"0х0000\", 1, 0)", + "params": ["Адрес","Регистр","Кличество регистров","1-float, 0-long"] + }, + { + "name": "readInputRegisters", + "descr": "Запрос данных регистра. Функция 0х04 протокола. Читает не более двух регистров за раз. Пример: mb.readInputRegisters(1, \"0х0000\", 1, 0)", + "params": ["Адрес","Регистр","Кличество регистров","1-float, 0-long"] + }, + { + "name": "writeSingleCoils", + "descr": "Запись в койл (битовое поле) одного бита. Функция 0х05 протокола. Пример: mb.writeSingleCoils(1, \"0х0000\", 1)", + "params": ["Адрес","Регистр","Данные"] + }, + { + "name": "writeSingleRegister", + "descr": "Запись данных в один регистр. Функция 0х06 протокола. Пример: mb.writeSingleRegister(1, \"0х0000\", 128)", + "params": ["Адрес","Регистр","Данные"] + }, + { + "name": "writeMultipleCoils", + "descr": "Запись данных в несколько койлов до 16 (число от 0 до 65535). Функция 0x0F протокола. Пример: mb.writeMultipleCoils(1, \"0х0000\", 4, 3) - будут записаны в четыре бита 0011", + "params": ["Адрес","Регистр","Кличество койлов (бит)","Данные"] + }, + { + "name": "writeMultipleRegisters", + "descr": "Запись данных в несколько регистров. На данный момент записывает 2(два) регистра!!!!! Подходит для записи float?? Функция 0х10 протокола. Пример: mb.writeMultipleRegisters(1, \"0х0000\", 1234.987)", + "params": ["Адрес","Регистр","Данные"] + } + ] + }, + "defActive": false, + "usedLibs": { + "esp32*": [ + "https://github.com/eModBus/eModBus" + ], + "esp82*": [ + "https://github.com/eModBus/eModBus" + ] + } +} \ No newline at end of file diff --git a/src/modules/virtual/Loging/modinfo.json b/src/modules/virtual/Loging/modinfo.json index 65b5fef8..6a0a4b98 100644 --- a/src/modules/virtual/Loging/modinfo.json +++ b/src/modules/virtual/Loging/modinfo.json @@ -51,7 +51,7 @@ "logid": "ID величины которую будем логировать", "points": "Максимальное количество точек в одном файле, может быть не более 300. Не рекомендуется менять этот параметр", "daysSave": "Количество дней за которое надо хранить график", - "daysShow": "За какое количество дней отображать график при открытии" + "daysShow": "Какое количество дней отображать на графике, в дополнение к текущему. 0 - за текущие сутки с ноля часов; 1 - вчерашние сутки и сегодняшние, и т.д." } }, "defActive": true, From a6e4617b303b849921d25c15332d56cf39db78e3 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 13 Jan 2025 19:19:02 +0300 Subject: [PATCH 052/118] =?UTF-8?q?new=20lib=20BLE,=20=D1=87=D1=83=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BC=D0=B5=D0=BD=D1=8C=D1=88=D0=B5=20=D1=80=D0=B0?= =?UTF-8?q?=D1=81=D1=85=D0=BE=D0=B4=D1=83=D0=B5=D1=82=20=D0=BF=D0=B0=D0=BC?= =?UTF-8?q?=D1=8F=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/Ble/Ble.cpp | 31 +++++++++++------- src/modules/sensors/Ble/modinfo.json | 8 ++--- src/modules/sensors/Ble_part1/Ble_p1.cpp | 37 +++++++++++++--------- src/modules/sensors/Ble_part1/modinfo.json | 6 ++-- src/modules/sensors/Ble_part2/Ble_p2.cpp | 37 +++++++++++++--------- src/modules/sensors/Ble_part2/modinfo.json | 6 ++-- 6 files changed, 73 insertions(+), 52 deletions(-) diff --git a/src/modules/sensors/Ble/Ble.cpp b/src/modules/sensors/Ble/Ble.cpp index caaa3d53..370287be 100644 --- a/src/modules/sensors/Ble/Ble.cpp +++ b/src/modules/sensors/Ble/Ble.cpp @@ -181,7 +181,7 @@ void scanEndedCB(NimBLEScanResults results) //#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //class BleScan : public IoTItem, NimBLEScanCallbacks //#else -class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks +class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbacks //#endif { private: @@ -218,13 +218,20 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks } if (advertisedDevice->haveManufacturerData()) { +#if defined (esp32c6_4mb) || defined (esp32c6_8mb) char *manufacturerdata = BLEUtils::buildHexData(NULL, (uint8_t *)advertisedDevice->getManufacturerData().data(), advertisedDevice->getManufacturerData().length()); +#else + std::string manufacturerdata = NimBLEUtils::dataToHexString((uint8_t *)advertisedDevice->getManufacturerData().data(), advertisedDevice->getManufacturerData().length()); +#endif + BLEdata["manufacturerdata"] = manufacturerdata; + #if defined (esp32c6_4mb) || defined (esp32c6_8mb) free(manufacturerdata); + #endif } -#if !defined (esp32c6_4mb) && !defined (esp32c6_8mb) - if (advertisedDevice->haveRSSI()) -#endif +//#if !defined (esp32c6_4mb) && !defined (esp32c6_8mb) //&& !defined (esp32_4mb3f) +// if (advertisedDevice->haveRSSI()) +//#endif BLEdata["rssi"] = (int)advertisedDevice->getRSSI(); if (advertisedDevice->haveTXPower()) BLEdata["txpower"] = (int8_t)advertisedDevice->getTXPower(); @@ -302,11 +309,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); // create new scan -#if defined (esp32c6_4mb) || defined (esp32c6_8mb) +//#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //|| defined (esp32_4mb3f) pBLEScan->setScanCallbacks(this); -#else - pBLEScan->setAdvertisedDeviceCallbacks(this); -#endif +//#else +// pBLEScan->setAdvertisedDeviceCallbacks(this); +//#endif pBLEScan->setActiveScan(false); // active scan uses more power, but get results faster pBLEScan->setInterval(100); pBLEScan->setWindow(99); // less or equal setInterval value @@ -321,11 +328,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks if (_scanDuration > 0) { SerialPrint("i", F("BLE"), "Start Scanning..."); -#if defined (esp32c6_4mb) || defined (esp32c6_8mb) +//#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //|| defined (esp32_4mb3f) pBLEScan->start(_scanDuration, false); -#else - pBLEScan->start(_scanDuration, scanEndedCB, false); -#endif +//#else +// pBLEScan->start(_scanDuration, scanEndedCB, false); +//#endif } } } diff --git a/src/modules/sensors/Ble/modinfo.json b/src/modules/sensors/Ble/modinfo.json index 9a75dbd9..65e57602 100644 --- a/src/modules/sensors/Ble/modinfo.json +++ b/src/modules/sensors/Ble/modinfo.json @@ -65,13 +65,13 @@ "defActive": false, "usedLibs": { "esp32c6_4mb": [ - "https://github.com/h2zero/NimBLE-Arduino#c6-build" + "https://github.com/Mit4el/NimBLE-Arduino.git#c6-build" ], "esp32c6_8mb": [ - "https://github.com/h2zero/NimBLE-Arduino#c6-build" + "https://github.com/Mit4el/NimBLE-Arduino.git#c6-build" ], - "esp32_4mb3f": [ - "https://github.com/Mit4el/NimBLE-Arduino.git" + "esp32*": [ + "https://github.com/Mit4el/NimBLE-Arduino.git#release/2.2" ], "esp32s2_4mb": [ "exclude" diff --git a/src/modules/sensors/Ble_part1/Ble_p1.cpp b/src/modules/sensors/Ble_part1/Ble_p1.cpp index 534e7c4b..2aab9be7 100644 --- a/src/modules/sensors/Ble_part1/Ble_p1.cpp +++ b/src/modules/sensors/Ble_part1/Ble_p1.cpp @@ -181,7 +181,7 @@ void scanEndedCB(NimBLEScanResults results) //#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //class BleScan : public IoTItem, NimBLEScanCallbacks //#else -class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks +class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbacks //#endif { private: @@ -218,13 +218,20 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks } if (advertisedDevice->haveManufacturerData()) { +#if defined (esp32c6_4mb) || defined (esp32c6_8mb) char *manufacturerdata = BLEUtils::buildHexData(NULL, (uint8_t *)advertisedDevice->getManufacturerData().data(), advertisedDevice->getManufacturerData().length()); +#else + std::string manufacturerdata = NimBLEUtils::dataToHexString((uint8_t *)advertisedDevice->getManufacturerData().data(), advertisedDevice->getManufacturerData().length()); +#endif + BLEdata["manufacturerdata"] = manufacturerdata; + #if defined (esp32c6_4mb) || defined (esp32c6_8mb) free(manufacturerdata); + #endif } -#if !defined (esp32c6_4mb) && !defined (esp32c6_8mb) - if (advertisedDevice->haveRSSI()) -#endif +//#if !defined (esp32c6_4mb) && !defined (esp32c6_8mb) //&& !defined (esp32_4mb3f) +// if (advertisedDevice->haveRSSI()) +//#endif BLEdata["rssi"] = (int)advertisedDevice->getRSSI(); if (advertisedDevice->haveTXPower()) BLEdata["txpower"] = (int8_t)advertisedDevice->getTXPower(); @@ -302,11 +309,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); // create new scan -#if defined (esp32c6_4mb) || defined (esp32c6_8mb) +//#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //|| defined (esp32_4mb3f) pBLEScan->setScanCallbacks(this); -#else - pBLEScan->setAdvertisedDeviceCallbacks(this); -#endif +//#else +// pBLEScan->setAdvertisedDeviceCallbacks(this); +//#endif pBLEScan->setActiveScan(false); // active scan uses more power, but get results faster pBLEScan->setInterval(100); pBLEScan->setWindow(99); // less or equal setInterval value @@ -321,11 +328,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks if (_scanDuration > 0) { SerialPrint("i", F("BLE"), "Start Scanning..."); -#if defined (esp32c6_4mb) || defined (esp32c6_8mb) +//#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //|| defined (esp32_4mb3f) pBLEScan->start(_scanDuration, false); -#else - pBLEScan->start(_scanDuration, scanEndedCB, false); -#endif +//#else +// pBLEScan->start(_scanDuration, scanEndedCB, false); +//#endif } } } @@ -335,13 +342,13 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //======================================================================================================= -void *getAPI_Ble_part1(String subtype, String param) +void *getAPI_Ble(String subtype, String param) { - if (subtype == F("BleScan_p1")) + if (subtype == F("BleScan")) { return new BleScan(param); } - else if (subtype == F("BleSens_p1")) + else if (subtype == F("BleSens")) { return new BleSens(param); } diff --git a/src/modules/sensors/Ble_part1/modinfo.json b/src/modules/sensors/Ble_part1/modinfo.json index 0d2f484e..2ceaa1a0 100644 --- a/src/modules/sensors/Ble_part1/modinfo.json +++ b/src/modules/sensors/Ble_part1/modinfo.json @@ -65,13 +65,13 @@ "defActive": false, "usedLibs": { "esp32c6_4mb": [ - "https://github.com/h2zero/NimBLE-Arduino#c6-build" + "https://github.com/Mit4el/NimBLE-Arduino.git#c6-build" ], "esp32c6_8mb": [ - "https://github.com/h2zero/NimBLE-Arduino#c6-build" + "https://github.com/Mit4el/NimBLE-Arduino.git#c6-build" ], "esp32*": [ - "https://github.com/Mit4el/NimBLE-Arduino.git" + "https://github.com/Mit4el/NimBLE-Arduino.git#release/2.2" ], "esp32s2_4mb": [ "exclude" diff --git a/src/modules/sensors/Ble_part2/Ble_p2.cpp b/src/modules/sensors/Ble_part2/Ble_p2.cpp index 9c3be51d..f74b2419 100644 --- a/src/modules/sensors/Ble_part2/Ble_p2.cpp +++ b/src/modules/sensors/Ble_part2/Ble_p2.cpp @@ -181,7 +181,7 @@ void scanEndedCB(NimBLEScanResults results) //#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //class BleScan : public IoTItem, NimBLEScanCallbacks //#else -class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks +class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbacks //#endif { private: @@ -218,13 +218,20 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks } if (advertisedDevice->haveManufacturerData()) { +#if defined (esp32c6_4mb) || defined (esp32c6_8mb) char *manufacturerdata = BLEUtils::buildHexData(NULL, (uint8_t *)advertisedDevice->getManufacturerData().data(), advertisedDevice->getManufacturerData().length()); +#else + std::string manufacturerdata = NimBLEUtils::dataToHexString((uint8_t *)advertisedDevice->getManufacturerData().data(), advertisedDevice->getManufacturerData().length()); +#endif + BLEdata["manufacturerdata"] = manufacturerdata; + #if defined (esp32c6_4mb) || defined (esp32c6_8mb) free(manufacturerdata); + #endif } -#if !defined (esp32c6_4mb) && !defined (esp32c6_8mb) - if (advertisedDevice->haveRSSI()) -#endif +//#if !defined (esp32c6_4mb) && !defined (esp32c6_8mb) //&& !defined (esp32_4mb3f) +// if (advertisedDevice->haveRSSI()) +//#endif BLEdata["rssi"] = (int)advertisedDevice->getRSSI(); if (advertisedDevice->haveTXPower()) BLEdata["txpower"] = (int8_t)advertisedDevice->getTXPower(); @@ -302,11 +309,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); // create new scan -#if defined (esp32c6_4mb) || defined (esp32c6_8mb) +//#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //|| defined (esp32_4mb3f) pBLEScan->setScanCallbacks(this); -#else - pBLEScan->setAdvertisedDeviceCallbacks(this); -#endif +//#else +// pBLEScan->setAdvertisedDeviceCallbacks(this); +//#endif pBLEScan->setActiveScan(false); // active scan uses more power, but get results faster pBLEScan->setInterval(100); pBLEScan->setWindow(99); // less or equal setInterval value @@ -321,11 +328,11 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks if (_scanDuration > 0) { SerialPrint("i", F("BLE"), "Start Scanning..."); -#if defined (esp32c6_4mb) || defined (esp32c6_8mb) +//#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //|| defined (esp32_4mb3f) pBLEScan->start(_scanDuration, false); -#else - pBLEScan->start(_scanDuration, scanEndedCB, false); -#endif +//#else +// pBLEScan->start(_scanDuration, scanEndedCB, false); +//#endif } } } @@ -335,13 +342,13 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //======================================================================================================= -void *getAPI_Ble_part2(String subtype, String param) +void *getAPI_Ble(String subtype, String param) { - if (subtype == F("BleScan_p2")) + if (subtype == F("BleScan")) { return new BleScan(param); } - else if (subtype == F("BleSens_p2")) + else if (subtype == F("BleSens")) { return new BleSens(param); } diff --git a/src/modules/sensors/Ble_part2/modinfo.json b/src/modules/sensors/Ble_part2/modinfo.json index 26241435..06f8fbf9 100644 --- a/src/modules/sensors/Ble_part2/modinfo.json +++ b/src/modules/sensors/Ble_part2/modinfo.json @@ -65,13 +65,13 @@ "defActive": false, "usedLibs": { "esp32c6_4mb": [ - "https://github.com/h2zero/NimBLE-Arduino#c6-build" + "https://github.com/Mit4el/NimBLE-Arduino.git#c6-build" ], "esp32c6_8mb": [ - "https://github.com/h2zero/NimBLE-Arduino#c6-build" + "https://github.com/Mit4el/NimBLE-Arduino.git#c6-build" ], "esp32*": [ - "https://github.com/Mit4el/NimBLE-Arduino.git" + "https://github.com/Mit4el/NimBLE-Arduino.git#release/2.2" ], "esp32s2_4mb": [ "exclude" From f214140cea7c0bf73b9a16267797ede0502d5cc8 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 13 Jan 2025 19:19:35 +0300 Subject: [PATCH 053/118] add ModBusNode --- .../sensors/ModbusRTUasync/ModbusRTU.cpp | 474 ++++++++++++++++++ .../sensors/ModbusRTUasync/modinfo.json | 24 +- 2 files changed, 494 insertions(+), 4 deletions(-) create mode 100644 src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp diff --git a/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp b/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp new file mode 100644 index 00000000..2ab02980 --- /dev/null +++ b/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp @@ -0,0 +1,474 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include +#include + +#include "Logging.h" +#include "ModbusClientRTU.h" +#include "CoilData.h" + +// class ModbusUart; +Stream *_modbusUART = nullptr; + +// Данные Modbus по умолчанию +int8_t MODBUS_DIR_PIN = 0; +#define MODBUS_UART_LINE 2 +#define MODBUS_RX_PIN 18 // Rx pin +#define MODBUS_TX_PIN 19 // Tx pin +#define MODBUS_SERIAL_BAUD 9600 // Baud rate for esp32 and max485 communication + +// bool modBus_data_ready = false; +uint32_t modBus_Token_count = 0; // Счетчик токенов для Нод, 0 - всегду у главного класса, дальше по порядку +//class ModbusNode; +std::map MBNoneMap; +ModbusClientRTU *MB = nullptr; + +ModbusClientRTU *instanceModBus(int8_t _DR) +{ + if (!MB) + { // Если библиотека ранее инициализировалась, т о просто вернем указатель + // Инициализируем библиотеку + if (_DR) + MB = new ModbusClientRTU(_DR); + else + MB = new ModbusClientRTU(); + } + return MB; +} +// ModbusClientRTU MB(_DIR_PIN); +// ModbusClientRTU MB(); + +// Define an onData handler function to receive the regular responses +// Arguments are received response message and the request's token +void handleModBusData(ModbusMessage response, uint32_t token) +{ + printf("Response --- Token:%d FC:%02X Server:%d Length:%d\n", + token, + response.getFunctionCode(), + response.getServerID(), + response.size()); + HEXDUMP_N("Data dump", response.data(), response.size()); + + // // First value is on pos 3, after server ID, function code and length byte + // uint16_t offs = 3; + // // The device has values all as IEEE754 float32 in two consecutive registers + // offs = response.get(offs, values[i]); + uint16_t val; + response.get(3, val); + if(MBNoneMap[token]){ + MBNoneMap[token]->regEvent(val,"ModMusNode resposne"); + } + // modBus_data_ready = true; +} + +// Define an onError handler function to receive error responses +// Arguments are the error code returned and a user-supplied token to identify the causing request +void handleModBusError(Error error, uint32_t token) +{ + // ModbusError wraps the error code and provides a readable error message for it + ModbusError me(error); + // LOG_E("Error response: %02X - %s\n", (int)me, (const char *)me); + Serial.printf("Error response: %02X - %s\n", (int)me, (const char *)me); +} + +class ModbusClientAsync : public IoTItem +{ +private: + int8_t _rx = MODBUS_RX_PIN; // адреса прочитаем с веба + int8_t _tx = MODBUS_TX_PIN; + int _baud = MODBUS_SERIAL_BAUD; + String _prot = "SERIAL_8N1"; + int protocol = SERIAL_8N1; + + int _addr = 0; // Адрес слейва от 1 до 247 ( вроде ) + String _regStr = ""; // Адрес регистра который будем дергать ( по коду от 0х0000 до 0х????) + uint16_t _reg = 0; + bool _debug; // Дебаг + uint32_t _token = 0; // Токен у главного класса весгда 0 + +public: + ModbusClientAsync(String parameters) : IoTItem(parameters) + { + _rx = (int8_t)jsonReadInt(parameters, "RX"); // прочитаем с веба + _tx = (int8_t)jsonReadInt(parameters, "TX"); + MODBUS_DIR_PIN = (int8_t)jsonReadInt(parameters, "DIR_PIN"); + _baud = jsonReadInt(parameters, "baud"); + _prot = jsonReadStr(parameters, "protocol"); + jsonRead(parameters, "debug", _debug); + + if (_prot == "SERIAL_8N1") + { + protocol = SERIAL_8N1; + } + else if (_prot == "SERIAL_8N2") + { + protocol = SERIAL_8N2; + } + + pinMode(MODBUS_DIR_PIN, OUTPUT); + digitalWrite(MODBUS_DIR_PIN, LOW); + + // Serial2.begin(baud-rate, protocol, RX pin, TX pin); + instanceModBus(MODBUS_DIR_PIN); + _modbusUART = new HardwareSerial(MODBUS_UART_LINE); + + if (_debug) + { + SerialPrint("I", "ModbusClientAsync", "baud: " + String(_baud) + ", protocol: " + String(protocol, HEX) + ", RX: " + String(_rx) + ", TX: " + String(_tx)); + } + RTUutils::prepareHardwareSerial((HardwareSerial &)*_modbusUART); + // Serial2.begin(BAUDRATE, SERIAL_8N1, RXPIN, TXPIN); + ((HardwareSerial *)_modbusUART)->begin(_baud, protocol, _rx, _tx); // выбираем тип протокола, скорость и все пины с веба + ((HardwareSerial *)_modbusUART)->setTimeout(200); + + // Set up ModbusRTU client. + // - provide onData handler function + MB->onDataHandler(&handleModBusData); + // - provide onError handler function + MB->onErrorHandler(&handleModBusError); + // Set message timeout to 2000ms + MB->setTimeout(2000); + // Start ModbusRTU background task + MB->begin((HardwareSerial &)*_modbusUART); + MBNoneMap[_token] = this; + } + + // Комманды из сценария + IoTValue execute(String command, std::vector ¶m) + { + IoTValue val; + // uint8_t result; + // uint32_t reading; + + uint16_t _reg = 0; + uint8_t count = 1; + if (command == "readInputRegisters") // vout = mb.readInputRegisters(1, "0х0000", 1, 0) - "Адрес","Регистр","Кличество регистров","1-float, 0-long" + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + count = (uint8_t)param[2].valD; + count = count > 2 ? 2 : count; + count = count < 1 ? 1 : count; + // val.valD = readFunctionModBus(0x04, _addr, _reg, count, isFloat); + // uint32_t lastMillis = millis(); + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_INPUT_REGISTER, _reg, count); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + return val; + } + else if (command == "readHoldingRegisters") // vout = mb.readHoldingRegisters(1, "0х0000", 2, 1) - "Адрес","Регистр","Кличество регистров","1-float, 0-long" + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + count = (uint8_t)param[2].valD; + count = count > 2 ? 2 : count; + count = count < 1 ? 1 : count; + // val.valD = readFunctionModBus(0x03, _addr, _reg, count, isFloat); + + // Create request for + // (Fill in your data here!) + // - server ID = 1 + // - function code = 0x03 (read holding register) + // - start address to read = word 10 + // - number of words to read = 4 + // - token to match the response with the request. We take the current millis() value for it. + // + // If something is missing or wrong with the call parameters, we will immediately get an error code + // and the request will not be issued + + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_HOLD_REGISTER, _reg, count); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + return val; + } + else if (command == "readCoils") // vout = mb.readCoils(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" + { + if (param.size()) + { + count = (uint8_t)param[2].valD; + count = count > 16 ? 16 : count; + count = count < 1 ? 1 : count; + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + // node.begin(_addr, (Stream &)*_modbusUART); + // val.valD = readFunctionModBus(0x01, _addr, _reg, count); + + // Read a slice of 12 coils, starting at 13 + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_COIL, _reg, count); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + return val; + } + else if (command == "readDiscreteInputs") // vout = mb.readDiscreteInputs(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" + { + if (param.size()) + { + count = (uint8_t)param[2].valD; + count = count > 16 ? 16 : count; + count = count < 1 ? 1 : count; + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + // node.begin(_addr, (Stream &)*_modbusUART); + // val.valD = readFunctionModBus(0x02, _addr, _reg, count); + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_DISCR_INPUT, _reg, count); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + return val; + } + else if (command == "writeSingleRegister") // vout = mb.writeSingleRegister(1,"0x0003", 1) - addr, register, state + { + if (param.size()) + { + // node.begin((uint8_t)param[0].valD, (Stream &)*_modbusUART); + + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + // bool state = param[2].valD; + uint16_t state = param[2].valD; + // result = node.writeSingleRegister(_reg, state); + if (_debug) + { + SerialPrint("I", "ModbusClientAsync", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state)); + } + + // We will first set the register to a known state, read the register, + // then write to it and finally read it again to verify the change + + // Set defined conditions first - write 0x1234 to the register + // The Token value is used in handleData to avoid the output for this first preparation request! + // uint32_t Token = 1111; + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, WRITE_HOLD_REGISTER, _reg, state); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + // Что можно вернуть в ответ на запись ??? + return {}; + } + else if (command == "writeSingleCoil") // vout = mb.writeSingleCoil(1,"0x0003", 1) - addr, register, state + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + // node.begin(_addr, (Stream &)*_modbusUART); + + bool state = param[2].valD; + // result = node.writeSingleCoil(_reg, state); + if (_debug) + { + SerialPrint("I", "ModbusClientAsync", "writeSingleCoil, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state)); + } + + // next set a single coil at 8 + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, WRITE_COIL, _reg, state); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + // Что можно вернуть в ответ на запись койлов??? + return {}; + } + else if (command == "writeMultipleCoils") // Пример: mb.writeMultipleCoils(1, \"0х0000\", 4, 3) - будут записаны в четыре бита 0011 + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + count = (uint8_t)param[2].valD; + count = count > 16 ? 16 : count; + count = count < 1 ? 1 : count; + // node.begin(_addr, (Stream &)*_modbusUART); + + uint16_t state = param[3].valD; + // node.setTransmitBuffer(0, state); + // result = node.writeMultipleRegisters(_reg, count); + // node.clearTransmitBuffer(); + if (_debug) + { + SerialPrint("I", "ModbusClientAsync", "writeSingleCoil, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state)); + } + + CoilData cd(12); + // Finally set a a bunch of coils starting at 20 + cd = "011010010110"; + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, WRITE_MULT_COILS, _reg, cd.coils(), cd.size(), cd.data()); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + return {}; + } + // На данный момент записывает 2(два) регистра!!!!! Подходит для записи float?? Функция 0х10 протокола. + else if (command == "writeMultipleRegisters") // mb.writeMultipleRegisters(1, \"0х0000\", 1234.987) + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + // node.begin(_addr, (Stream &)*_modbusUART); + + float state = param[2].valD; + + // node.setTransmitBuffer(0, lowWord(state)); + // node.setTransmitBuffer(1, highWord(state)); + // result = node.writeMultipleRegisters(_reg, 2); + // node.clearTransmitBuffer(); + Serial.printf("NOT SUPPORTED!\n"); + if (_debug) + { + SerialPrint("I", "ModbusClientAsync", "writeMultipleRegisters, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " (" + String(state, HEX) + ")"); + } + } + return {}; + } + return val; + } + + ~ModbusClientAsync() + { + delete _modbusUART; + _modbusUART = nullptr; + MBNoneMap.clear(); + }; +}; + +class ModbusNode : public IoTItem +{ +private: + // Initialize the ModbusMaster object as node + // Инициализируем объект ModbusMaster как узел + + uint8_t _addr = 0; // Адрес слейва от 1 до 247 + String _regStr = ""; // Адрес регистра который будем дергать ( по коду от 0х0000 до 0х????) + String _funcStr = ""; // Функция ModBUS + uint8_t _func; + uint16_t _reg = 0; + uint8_t _countReg = 1; + uint32_t _token = 0; + +public: + ModbusNode(String parameters) : IoTItem(parameters) + { + _addr = jsonReadInt(parameters, "addr"); // адреса slave прочитаем с веба + jsonRead(parameters, "reg", _regStr); // адреса регистров прочитаем с веба + jsonRead(parameters, "func", _funcStr); // Функция ModBUS + _countReg = jsonReadInt(parameters, "count"); + _func = hexStringToUint8(_funcStr); + _reg = hexStringToUint16(_regStr); + modBus_Token_count++; + _token = modBus_Token_count; + MBNoneMap[_token] = this; + } + + void doByInterval() + { + if (!MB) + { + Serial.printf("ModbusNode: ModbusClientAsync is NULL\n"); + return; + } + if (_func == 0x04) // vout = mb.readInputRegisters(1, "0х0000", 1, 0) - "Адрес","Регистр","Кличество регистров" + { + // val.valD = readFunctionModBus(0x04, _addr, _reg, count, isFloat); + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_INPUT_REGISTER, _reg, _countReg); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + else if (_func == 0x03) // vout = mb.readHoldingRegisters(1, "0х0000", 2, 1) - "Адрес","Регистр","Кличество регистров" + { + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_HOLD_REGISTER, _reg, _countReg); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + else if (_func == 0x01) // vout = mb.readCoils(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" + { + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_COIL, _reg, _countReg); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + else if (_func == 0x02) // vout = mb.readDiscreteInputs(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" + { + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_DISCR_INPUT, _reg, _countReg); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + } + + ~ModbusNode() {}; +}; + +void *getAPI_ModbusRTUasync(String subtype, String param) +{ + if (subtype == F("mbNode")) + { + return new ModbusNode(param); + } + else if (subtype == F("mbClient")) + { + return new ModbusClientAsync(param); + } + { + return nullptr; + } +} diff --git a/src/modules/sensors/ModbusRTUasync/modinfo.json b/src/modules/sensors/ModbusRTUasync/modinfo.json index 224bc1bf..7897682e 100644 --- a/src/modules/sensors/ModbusRTUasync/modinfo.json +++ b/src/modules/sensors/ModbusRTUasync/modinfo.json @@ -1,6 +1,22 @@ { "menuSection": "sensors", "configItem": [ + { + "global": 0, + "name": "ModbusNode", + "type": "Reading", + "subtype": "mbNode", + "id": "mbNode", + "widget": "anydataTmp", + "page": "Modbus", + "descr": "Данные modbus", + "int": 5, + "func": "0x03", + "addr": 1, + "reg": "0x0000", + "count": 1, + "round": 0 + }, { "global": 0, "name": "ModbusAsunc", @@ -58,13 +74,13 @@ }, { "name": "readHoldingRegisters", - "descr": "Запрос данных регистра. Функция 0х03 протокола. Читает не более двух регистров за раз. Пример: mb.readHoldingRegisters(1, \"0х0000\", 1, 0)", - "params": ["Адрес","Регистр","Кличество регистров","1-float, 0-long"] + "descr": "Запрос данных регистра. Функция 0х03 протокола. Читает не более двух регистров за раз. Пример: mb.readHoldingRegisters(1, \"0х0000\", 1)", + "params": ["Адрес","Регистр","Кличество регистров"] }, { "name": "readInputRegisters", - "descr": "Запрос данных регистра. Функция 0х04 протокола. Читает не более двух регистров за раз. Пример: mb.readInputRegisters(1, \"0х0000\", 1, 0)", - "params": ["Адрес","Регистр","Кличество регистров","1-float, 0-long"] + "descr": "Запрос данных регистра. Функция 0х04 протокола. Читает не более двух регистров за раз. Пример: mb.readInputRegisters(1, \"0х0000\", 1)", + "params": ["Адрес","Регистр","Кличество регистров"] }, { "name": "writeSingleCoils", From 68d653902ca229be36043e92853799216bd2c599 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 13 Jan 2025 19:29:33 +0300 Subject: [PATCH 054/118] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20Pcf8574?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/exec/Pcf8591/Pcf8591.cpp | 71 --------------------------- src/modules/exec/Pcf8591/modinfo.json | 51 ------------------- 2 files changed, 122 deletions(-) delete mode 100644 src/modules/exec/Pcf8591/Pcf8591.cpp delete mode 100644 src/modules/exec/Pcf8591/modinfo.json diff --git a/src/modules/exec/Pcf8591/Pcf8591.cpp b/src/modules/exec/Pcf8591/Pcf8591.cpp deleted file mode 100644 index ff7d45bc..00000000 --- a/src/modules/exec/Pcf8591/Pcf8591.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "Global.h" -#include "classes/IoTItem.h" - -#include "Wire.h" -#include - -// Make sure that this is set to the value in volts of VCC -#define ADC_REFERENCE_VOLTAGE 3.3 - -class Pcf8591 : public IoTItem { - int _pin; - bool _isRaw; - bool _isInited = false; - Adafruit_PCF8591 pcf = Adafruit_PCF8591(); - - public: - Pcf8591(String parameters) : IoTItem(parameters) { - String tmp; - jsonRead(parameters, "pin", tmp); - _pin = tmp.toInt(); - - jsonRead(parameters, "mode", tmp); - _isRaw = tmp == "raw"; - - if (!pcf.begin()) { - Serial.println("# Adafruit PCF8591 not found!"); - _isInited = false; - } else - - _isInited = true; - - Serial.println("# Adafruit PCF8591 found"); - - pcf.enableDAC(true); - - Serial.println("AIN0, AIN1, AIN2, AIN3"); - - } - - uint8_t dac_counter = 0; - - void doByInterval() { - - // Make a triangle wave on the DAC output - pcf.analogWrite(dac_counter++); - - if (_isInited) { - if (_isRaw) - value.valD = pcf.analogRead(_pin); // Чтение АЦП нулевого канала (Вольты) - else - value.valD = (int_to_volts(pcf.analogRead(_pin), 8, ADC_REFERENCE_VOLTAGE)); - regEvent(value.valD, "PCF8591"); - } - -} - - float int_to_volts(uint16_t dac_value, uint8_t bits, float logic_level) { - return (((float)dac_value / ((1 << bits) - 1)) * logic_level); - - } - - ~Pcf8591(){}; -}; - -void *getAPI_Pcf8591(String subtype, String param) { - if (subtype == F("Pcf8591")) { - return new Pcf8591(param); - } else { - return nullptr; - } -} diff --git a/src/modules/exec/Pcf8591/modinfo.json b/src/modules/exec/Pcf8591/modinfo.json deleted file mode 100644 index 183b354b..00000000 --- a/src/modules/exec/Pcf8591/modinfo.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "menuSection": "sensors", - "configItem": [ - { - "global": 0, - "name": "Расширитель портов PCF8591", - "type": "Reading", - "subtype": "Pcf8591", - "id": "Pcf85", - "widget": "anydataVlt", - "page": "PCF8591", - "descr": "PCF_0", - "pin": "0", - "mode": "volt", - "map": "1,255,1,100", - "plus": 0, - "multiply": 1, - "round": 2, - "int": 7 - } - ], - "about": { - "authorName": "Serghei Crasnicov", - "authorContact": "https://t.me/Serghei63", - "authorGit": "https://github.com/Serghei63", - "specialThanks": "", - "moduleName": "Pcf8591", - "moduleVersion": "1.0", - "usedRam": { - "esp32_4mb": 15, - "esp8266_4mb": 15 - }, - "title": "Расширитель 4-х аналоговых портов PCF8591", - "moduleDesc": "Позволяет получить относительную величину напряжения на понижающем трансформаторе.", - "propInfo": { - "pin": "Номер AN, к которому подключен датчик. Допускается 0, 1, 2, 3", - "mode": "Режим работы. volt - вывод в вольтах , raw - значения от 0 до 255", - "int": "Количество секунд между опросами датчика." - } - }, - "defActive": false, - "usedLibs": { - - "esp32*": [ - "https://github.com/adafruit/Adafruit_PCF8591" - ], - "esp82*": [ - "https://github.com/adafruit/Adafruit_PCF8591" - ] - } -} \ No newline at end of file From d337dea1b8942f6ccb9258c78116855ad932e463 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 13 Jan 2025 19:58:59 +0300 Subject: [PATCH 055/118] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D1=83=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrepareProject.py | 3 + myProfile.json | 38 +- platformio.ini | 184 +++------ src/modules/display/DwinI/modinfo.json | 30 +- src/modules/display/Lcd2004/modinfo.json | 2 +- src/modules/display/Nextion/modinfo.json | 9 +- src/modules/display/Oled64/modinfo.json | 2 +- src/modules/exec/Mcp23017/modinfo.json | 2 +- src/modules/exec/Mp3/modinfo.json | 2 +- src/modules/exec/Pcf8574/modinfo.json | 2 +- src/modules/exec/SIM800/modinfo.json | 2 - src/modules/exec/SmartBoiler/modinfo.json | 1 - src/modules/sensors/A02Distance/modinfo.json | 2 +- src/modules/sensors/Acs712/modinfo.json | 2 +- src/modules/sensors/BL0937/modinfo.json | 2 +- src/modules/sensors/BL0942/modinfo.json | 2 +- src/modules/sensors/EnergyMon485/modinfo.json | 13 +- src/modules/sensors/MQgas/modinfo.json | 17 +- .../sensors/ModbusRTUasync/MudbusRTU.cpp | 381 ------------------ src/modules/sensors/Ntc/modinfo.json | 2 +- src/modules/sensors/Pzem004t_v2/modinfo.json | 15 +- src/modules/sensors/S8/modinfo.json | 2 +- src/modules/sensors/Sht20/modinfo.json | 2 +- src/modules/sensors/Sonar/modinfo.json | 2 +- 24 files changed, 95 insertions(+), 624 deletions(-) delete mode 100644 src/modules/sensors/ModbusRTUasync/MudbusRTU.cpp diff --git a/PrepareProject.py b/PrepareProject.py index 53037698..7e8a495d 100644 --- a/PrepareProject.py +++ b/PrepareProject.py @@ -98,10 +98,13 @@ def updateModulesInProfile(profJson): printHelp() sys.exit() elif opt in ("-p", "--profile"): + print('Загрузка профиля из файла:' + arg) profile = arg elif opt in ("-u", "--update"): + print('Создание новой конфигурации по исходным файлам!') update = True elif opt in ("-b", "--board"): + print('Создание профиля для платы:' + arg) selectDevice = arg if Path(profile).is_file(): diff --git a/myProfile.json b/myProfile.json index f4b9d32d..72e3986e 100644 --- a/myProfile.json +++ b/myProfile.json @@ -212,17 +212,13 @@ } ], "sensors": [ - { - "path": "src/modules/exec/Pcf8591", - "active": false - }, { "path": "src/modules/sensors/A02Distance", - "active": true + "active": false }, { "path": "src/modules/sensors/Acs712", - "active": true + "active": false }, { "path": "src/modules/sensors/Ads1115", @@ -242,11 +238,11 @@ }, { "path": "src/modules/sensors/BL0937", - "active": true + "active": false }, { "path": "src/modules/sensors/BL0942", - "active": true + "active": false }, { "path": "src/modules/sensors/Ble", @@ -346,15 +342,15 @@ }, { "path": "src/modules/sensors/ModbusRTUasync", - "active": true + "active": false }, { "path": "src/modules/sensors/MQgas", - "active": true + "active": false }, { "path": "src/modules/sensors/Ntc", - "active": false + "active": true }, { "path": "src/modules/sensors/Pcf8591", @@ -366,7 +362,7 @@ }, { "path": "src/modules/sensors/Pzem004t_v2", - "active": true + "active": false }, { "path": "src/modules/sensors/RCswitch", @@ -378,7 +374,7 @@ }, { "path": "src/modules/sensors/S8", - "active": true + "active": false }, { "path": "src/modules/sensors/Scd40", @@ -394,7 +390,7 @@ }, { "path": "src/modules/sensors/Sht20", - "active": true + "active": false }, { "path": "src/modules/sensors/Sht30", @@ -402,7 +398,7 @@ }, { "path": "src/modules/sensors/Sonar", - "active": true + "active": false }, { "path": "src/modules/sensors/UART", @@ -464,11 +460,11 @@ }, { "path": "src/modules/exec/Mcp23017", - "active": true + "active": false }, { "path": "src/modules/exec/Mp3", - "active": true + "active": false }, { "path": "src/modules/exec/Multitouch", @@ -480,7 +476,7 @@ }, { "path": "src/modules/exec/Pcf8574", - "active": true + "active": false }, { "path": "src/modules/exec/Pwm32", @@ -530,7 +526,7 @@ "screens": [ { "path": "src/modules/display/DwinI", - "active": true + "active": false }, { "path": "src/modules/display/GyverLAMP", @@ -538,7 +534,7 @@ }, { "path": "src/modules/display/Lcd2004", - "active": true + "active": false }, { "path": "src/modules/display/Nextion", @@ -554,7 +550,7 @@ }, { "path": "src/modules/display/Oled64", - "active": true + "active": false }, { "path": "src/modules/display/Smi2_m", diff --git a/platformio.ini b/platformio.ini index 7870772c..ce9d468f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -679,62 +679,38 @@ lib_deps = adafruit/Adafruit BMP280 Library beegee-tokyo/DHT sensor library for ESPx https://github.com/milesburton/Arduino-Temperature-Control-Library - robtillaart/SHT2x@^0.1.1 - WEMOS SHT3x@1.0.0 plerup/EspSoftwareSerial gyverlibs/EncButton @ ^2.0 - adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 - adafruit/Adafruit BusIO @ ^1.13.2 - dfrobot/DFRobotDFPlayerMini @ ^1.0.5 - adafruit/Adafruit BusIO @ ^1.13.2 - plerup/EspSoftwareSerial - https://github.com/robotclass/RobotClass_LiquidCrystal_I2C - marcoschwartz/LiquidCrystal_I2C@^1.1.4 - https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED - https://github.com/adafruit/Adafruit-GFX-Library build_src_filter = + + + + + + + + + + + + + - + - + + + - + + + + + + - + - + + + + - + - + - + - + + + + + + + - + - + - + + - + - + + - + - + - + + + [env:esp32_4mb_fromitems] lib_deps = @@ -743,31 +719,20 @@ lib_deps = adafruit/Adafruit BMP280 Library beegee-tokyo/DHT sensor library for ESPx https://github.com/milesburton/Arduino-Temperature-Control-Library - robtillaart/SHT2x@^0.1.1 - WEMOS SHT3x@1.0.0 plerup/EspSoftwareSerial gyverlibs/EncButton @ ^2.0 - https://github.com/RoboticsBrno/ServoESP32#v1.0.3 - adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 - adafruit/Adafruit BusIO @ ^1.13.2 - dfrobot/DFRobotDFPlayerMini @ ^1.0.5 - adafruit/Adafruit BusIO @ ^1.13.2 - https://github.com/robotclass/RobotClass_LiquidCrystal_I2C - marcoschwartz/LiquidCrystal_I2C@^1.1.4 - https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED - https://github.com/adafruit/Adafruit-GFX-Library - https://github.com/maxint-rd/TM16xx - adafruit/Adafruit GFX Library @ ^1.11.5 - adafruit/Adafruit BusIO @ ^1.13.2 build_src_filter = + + + + + + + + + + + + + + + - + + + + @@ -775,29 +740,18 @@ build_src_filter = + + + - + + + + - + - + - + - + + + + + + + + - + - + - + + - + - + + + - + - + - + - + + + [env:esp32_4mb3f_fromitems] lib_deps = @@ -806,64 +760,39 @@ lib_deps = adafruit/Adafruit BMP280 Library beegee-tokyo/DHT sensor library for ESPx https://github.com/milesburton/Arduino-Temperature-Control-Library - robtillaart/SHT2x@^0.1.1 - WEMOS SHT3x@1.0.0 plerup/EspSoftwareSerial gyverlibs/EncButton @ ^2.0 - https://github.com/RoboticsBrno/ServoESP32#v1.0.3 - adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 - adafruit/Adafruit BusIO @ ^1.13.2 - dfrobot/DFRobotDFPlayerMini @ ^1.0.5 - adafruit/Adafruit BusIO @ ^1.13.2 - plerup/EspSoftwareSerial - https://github.com/robotclass/RobotClass_LiquidCrystal_I2C - marcoschwartz/LiquidCrystal_I2C@^1.1.4 - https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED - https://github.com/adafruit/Adafruit-GFX-Library build_src_filter = + + + + + + + + + + + + + - + - + + + - + + + + + + - + - + + + + - + - + - + - + + + + + + + - + - + - + + - + + + - + - + - + - + + + [env:esp32cam_4mb_fromitems] lib_deps = @@ -896,19 +825,44 @@ build_src_filter = [env:esp8266_16mb_fromitems] lib_deps = + https://github.com/dancol90/ESP8266Ping + https://github.com/enjoyneering/AHTxx.git + adafruit/Adafruit BME280 Library + adafruit/Adafruit BMP280 Library + beegee-tokyo/DHT sensor library for ESPx + https://github.com/milesburton/Arduino-Temperature-Control-Library + plerup/EspSoftwareSerial gyverlibs/EncButton @ ^2.0 build_src_filter = + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [env:esp32_16mb_fromitems] lib_deps = @@ -953,58 +907,39 @@ lib_deps = adafruit/Adafruit BMP280 Library beegee-tokyo/DHT sensor library for ESPx https://github.com/pstolarz/Arduino-Temperature-Control-Library.git#OneWireNg - robtillaart/SHT2x@^0.1.1 - WEMOS SHT3x@1.0.0 plerup/EspSoftwareSerial gyverlibs/EncButton @ ^2.0 - https://github.com/RoboticsBrno/ServoESP32#v1.0.3 - adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 - adafruit/Adafruit BusIO @ ^1.13.2 - adafruit/Adafruit BusIO @ ^1.13.2 - https://github.com/robotclass/RobotClass_LiquidCrystal_I2C - marcoschwartz/LiquidCrystal_I2C@^1.1.4 - https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED - https://github.com/adafruit/Adafruit-GFX-Library build_src_filter = + + + + + + + + + + + + + - + - + + + - + + + + + + + + + - + - + - + - + + + + + + + - + - + + - + + + - + - + - + + + [env:esp32c6_8mb_fromitems] lib_deps = @@ -1013,58 +948,39 @@ lib_deps = adafruit/Adafruit BMP280 Library beegee-tokyo/DHT sensor library for ESPx https://github.com/pstolarz/Arduino-Temperature-Control-Library.git#OneWireNg - robtillaart/SHT2x@^0.1.1 - WEMOS SHT3x@1.0.0 plerup/EspSoftwareSerial gyverlibs/EncButton @ ^2.0 - https://github.com/RoboticsBrno/ServoESP32#v1.0.3 - adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 - adafruit/Adafruit BusIO @ ^1.13.2 - adafruit/Adafruit BusIO @ ^1.13.2 - https://github.com/robotclass/RobotClass_LiquidCrystal_I2C - marcoschwartz/LiquidCrystal_I2C@^1.1.4 - https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED - https://github.com/adafruit/Adafruit-GFX-Library build_src_filter = + + + + + + + + + + + + + - + - + + + - + + + + + + + + + - + - + - + - + + + + + + + - + - + + - + + + - + - + - + + + [env:bk7231n_fromitems] lib_deps = @@ -1072,13 +988,13 @@ build_src_filter = + + + + + + + + + + + - + + + + diff --git a/src/modules/display/DwinI/modinfo.json b/src/modules/display/DwinI/modinfo.json index c5a57f04..863ee10c 100644 --- a/src/modules/display/DwinI/modinfo.json +++ b/src/modules/display/DwinI/modinfo.json @@ -40,36 +40,12 @@ "btn-uploadUI": "Формирует автоматически графический интерфейс на базе конфигурации и выгружает в экран. Занимает продолжительное время! (в разработке)" } }, - "defActive": true, + "defActive": false, "usedLibs": { - "esp32_4mb": [ + "esp32*": [ "plerup/EspSoftwareSerial" ], - "esp32_4mb3f": [ - "plerup/EspSoftwareSerial" - ], - "esp32cam_4mb": [ - "plerup/EspSoftwareSerial" - ], - "esp8266_4mb": [ - "plerup/EspSoftwareSerial" - ], - "esp8266_1mb": [ - "plerup/EspSoftwareSerial" - ], - "esp8266_1mb_ota": [ - "plerup/EspSoftwareSerial" - ], - "esp8266_2mb": [ - "plerup/EspSoftwareSerial" - ], - "esp8266_2mb_ota": [ - "plerup/EspSoftwareSerial" - ], - "esp8285_1mb": [ - "plerup/EspSoftwareSerial" - ], - "esp8285_1mb_ota": [ + "esp82*": [ "plerup/EspSoftwareSerial" ] } diff --git a/src/modules/display/Lcd2004/modinfo.json b/src/modules/display/Lcd2004/modinfo.json index 0700b92f..bdf3f34f 100644 --- a/src/modules/display/Lcd2004/modinfo.json +++ b/src/modules/display/Lcd2004/modinfo.json @@ -117,7 +117,7 @@ } ] }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [ "https://github.com/robotclass/RobotClass_LiquidCrystal_I2C", diff --git a/src/modules/display/Nextion/modinfo.json b/src/modules/display/Nextion/modinfo.json index f473471c..be965fb7 100644 --- a/src/modules/display/Nextion/modinfo.json +++ b/src/modules/display/Nextion/modinfo.json @@ -89,12 +89,7 @@ }, "defActive": false, "usedLibs": { - "esp32_4mb": [], - "esp32_4mb3f": [], - "esp8266_4mb": [], - "esp8266_1mb": [], - "esp8266_1mb_ota": [], - "esp8285_1mb": [], - "esp8285_1mb_ota": [] + "esp32*": [], + "esp82*": [] } } \ No newline at end of file diff --git a/src/modules/display/Oled64/modinfo.json b/src/modules/display/Oled64/modinfo.json index b64b4eef..ee34620c 100644 --- a/src/modules/display/Oled64/modinfo.json +++ b/src/modules/display/Oled64/modinfo.json @@ -75,7 +75,7 @@ } ] }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [ "https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED", diff --git a/src/modules/exec/Mcp23017/modinfo.json b/src/modules/exec/Mcp23017/modinfo.json index 5d2fba62..91a6f97c 100644 --- a/src/modules/exec/Mcp23017/modinfo.json +++ b/src/modules/exec/Mcp23017/modinfo.json @@ -34,7 +34,7 @@ "index": "Значения от 1 до 4, где при выборе 1 будет нумерация pin 100-115, при выборе 2 200-215 и т.д." } }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [ "adafruit/Adafruit MCP23017 Arduino Library@^2.1.0", diff --git a/src/modules/exec/Mp3/modinfo.json b/src/modules/exec/Mp3/modinfo.json index e64d1460..3494d9a5 100644 --- a/src/modules/exec/Mp3/modinfo.json +++ b/src/modules/exec/Mp3/modinfo.json @@ -87,7 +87,7 @@ } ] }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [ "dfrobot/DFRobotDFPlayerMini @ ^1.0.5" diff --git a/src/modules/exec/Pcf8574/modinfo.json b/src/modules/exec/Pcf8574/modinfo.json index f3ece10d..6a040c14 100644 --- a/src/modules/exec/Pcf8574/modinfo.json +++ b/src/modules/exec/Pcf8574/modinfo.json @@ -30,7 +30,7 @@ }, "title": "Расширитель портов Pcf8574" }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [ "adafruit/Adafruit BusIO @ ^1.13.2" diff --git a/src/modules/exec/SIM800/modinfo.json b/src/modules/exec/SIM800/modinfo.json index 959879ed..aac9f890 100644 --- a/src/modules/exec/SIM800/modinfo.json +++ b/src/modules/exec/SIM800/modinfo.json @@ -78,8 +78,6 @@ }, "defActive": false, "usedLibs": { - "esp32_4mb": [], - "esp32_4mb3f": [], "esp32*": [], "esp82*": [] } diff --git a/src/modules/exec/SmartBoiler/modinfo.json b/src/modules/exec/SmartBoiler/modinfo.json index af2aa194..a5a1e861 100644 --- a/src/modules/exec/SmartBoiler/modinfo.json +++ b/src/modules/exec/SmartBoiler/modinfo.json @@ -164,7 +164,6 @@ }, "defActive": false, "usedLibs": { - "esp32_4mb3f": [], "esp32*": [], "esp82*": [] } diff --git a/src/modules/sensors/A02Distance/modinfo.json b/src/modules/sensors/A02Distance/modinfo.json index ba970862..85ac0c70 100644 --- a/src/modules/sensors/A02Distance/modinfo.json +++ b/src/modules/sensors/A02Distance/modinfo.json @@ -35,7 +35,7 @@ }, "title": "A0221AU, A02YYUW Ультразвуковой датчик дальности" }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [], "esp82*": [] diff --git a/src/modules/sensors/Acs712/modinfo.json b/src/modules/sensors/Acs712/modinfo.json index b741d377..c542e2c1 100644 --- a/src/modules/sensors/Acs712/modinfo.json +++ b/src/modules/sensors/Acs712/modinfo.json @@ -39,7 +39,7 @@ }, "title": "Acs712 Датчик тока" }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [], "esp82*": [] diff --git a/src/modules/sensors/BL0937/modinfo.json b/src/modules/sensors/BL0937/modinfo.json index f6dea0d2..66aeba0f 100644 --- a/src/modules/sensors/BL0937/modinfo.json +++ b/src/modules/sensors/BL0937/modinfo.json @@ -129,7 +129,7 @@ } ] }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [], "esp82*": [], diff --git a/src/modules/sensors/BL0942/modinfo.json b/src/modules/sensors/BL0942/modinfo.json index de771e05..39ac37b8 100644 --- a/src/modules/sensors/BL0942/modinfo.json +++ b/src/modules/sensors/BL0942/modinfo.json @@ -99,7 +99,7 @@ } ] }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [], "esp82*": [], diff --git a/src/modules/sensors/EnergyMon485/modinfo.json b/src/modules/sensors/EnergyMon485/modinfo.json index 233bfabc..1e5823a0 100644 --- a/src/modules/sensors/EnergyMon485/modinfo.json +++ b/src/modules/sensors/EnergyMon485/modinfo.json @@ -67,17 +67,6 @@ "defActive": false, "usedLibs": { "esp32*": [], - "esp82*": [], - "esp32_4mb": [], - "esp32_4mb3f": [], - "esp32cam_4mb": [], - "esp32c3m_4mb": [], - "esp8266_4mb": [], - "esp8266_1mb": [], - "esp8266_1mb_ota": [], - "esp8285_1mb": [], - "esp8285_1mb_ota": [], - "esp8266_2mb": [], - "esp8266_2mb_ota": [] + "esp82*": [] } } \ No newline at end of file diff --git a/src/modules/sensors/MQgas/modinfo.json b/src/modules/sensors/MQgas/modinfo.json index bcaa1fd6..4b1f42d9 100644 --- a/src/modules/sensors/MQgas/modinfo.json +++ b/src/modules/sensors/MQgas/modinfo.json @@ -252,20 +252,9 @@ ] }, - "defActive": true, + "defActive": false, "usedLibs": { - "esp32_4mb": [], - "esp32_4mb3f": [], - "esp32cam_4mb": [], - "esp32_16mb": [], - "esp32s2_4mb": [], - "esp8266_4mb": [], - "esp8266_16mb": [], - "esp8266_1mb": [], - "esp8266_1mb_ota": [], - "esp8285_1mb": [], - "esp8285_1mb_ota": [], - "esp8266_2mb": [], - "esp8266_2mb_ota": [] + "esp32*": [], + "esp82*": [] } } diff --git a/src/modules/sensors/ModbusRTUasync/MudbusRTU.cpp b/src/modules/sensors/ModbusRTUasync/MudbusRTU.cpp deleted file mode 100644 index 1c455594..00000000 --- a/src/modules/sensors/ModbusRTUasync/MudbusRTU.cpp +++ /dev/null @@ -1,381 +0,0 @@ -#include "Global.h" -#include "classes/IoTItem.h" -#include -#include - -#include "Logging.h" -#include "ModbusClientRTU.h" -#include "CoilData.h" - -// class ModbusUart; -Stream *_modbusUART = nullptr; - -// Данные Modbus по умолчанию -int8_t _DIR_PIN = 0; -#define UART_LINE 2 -#define MODBUS_RX_PIN 18 // Rx pin -#define MODBUS_TX_PIN 19 // Tx pin -#define MODBUS_SERIAL_BAUD 9600 // Baud rate for esp32 and max485 communication - -bool data_ready = false; -uint32_t request_time; - -ModbusClientRTU *MB = nullptr; - -ModbusClientRTU *instanceModBus(int8_t _DR) -{ - if (!MB) - { // Если библиотека ранее инициализировалась, т о просто вернем указатель - // Инициализируем библиотеку - if (_DR) - MB = new ModbusClientRTU(_DR); - else - MB = new ModbusClientRTU(); - } - return MB; -} -// ModbusClientRTU MB(_DIR_PIN); -// ModbusClientRTU MB(); - -// TODO УБРАТЬ ЭТО ИЗ ПРИМЕРА -#define NUM_VALUES 21 -float values[NUM_VALUES]; -// Define an onData handler function to receive the regular responses -// Arguments are received response message and the request's token -void handleModBusData(ModbusMessage response, uint32_t token) -{ - printf("Response --- FC:%02X Server:%d Length:%d\n", - response.getFunctionCode(), - response.getServerID(), - response.size()); - HEXDUMP_N("Data dump", response.data(), response.size()); - data_ready = true; -} - -// Define an onError handler function to receive error responses -// Arguments are the error code returned and a user-supplied token to identify the causing request -void handleModBusError(Error error, uint32_t token) -{ - // ModbusError wraps the error code and provides a readable error message for it - ModbusError me(error); - // LOG_E("Error response: %02X - %s\n", (int)me, (const char *)me); - Serial.printf("Error response: %02X - %s\n", (int)me, (const char *)me); -} - -class ModbusClientAsync : public IoTItem -{ -private: - int8_t _rx = MODBUS_RX_PIN; // адреса прочитаем с веба - int8_t _tx = MODBUS_TX_PIN; - int _baud = MODBUS_SERIAL_BAUD; - String _prot = "SERIAL_8N1"; - int protocol = SERIAL_8N1; - - int _addr = 0; // Адрес слейва от 1 до 247 ( вроде ) - String _regStr = ""; // Адрес регистра который будем дергать ( по коду от 0х0000 до 0х????) - uint16_t _reg = 0; - bool _debug; // Дебаг - -public: - ModbusClientAsync(String parameters) : IoTItem(parameters) - { - _rx = (int8_t)jsonReadInt(parameters, "RX"); // прочитаем с веба - _tx = (int8_t)jsonReadInt(parameters, "TX"); - _DIR_PIN = (int8_t)jsonReadInt(parameters, "DIR_PIN"); - _baud = jsonReadInt(parameters, "baud"); - _prot = jsonReadStr(parameters, "protocol"); - jsonRead(parameters, "debug", _debug); - - if (_prot == "SERIAL_8N1") - { - protocol = SERIAL_8N1; - } - else if (_prot == "SERIAL_8N2") - { - protocol = SERIAL_8N2; - } - - pinMode(_DIR_PIN, OUTPUT); - digitalWrite(_DIR_PIN, LOW); - - // Serial2.begin(baud-rate, protocol, RX pin, TX pin); - instanceModBus(_DIR_PIN); - _modbusUART = new HardwareSerial(UART_LINE); - - if (_debug) - { - SerialPrint("I", "ModbusClientAsync", "baud: " + String(_baud) + ", protocol: " + String(protocol, HEX) + ", RX: " + String(_rx) + ", TX: " + String(_tx)); - } - RTUutils::prepareHardwareSerial((HardwareSerial &)*_modbusUART); - // Serial2.begin(BAUDRATE, SERIAL_8N1, RXPIN, TXPIN); - ((HardwareSerial *)_modbusUART)->begin(_baud, protocol, _rx, _tx); // выбираем тип протокола, скорость и все пины с веба - ((HardwareSerial *)_modbusUART)->setTimeout(200); - - // Set up ModbusRTU client. - // - provide onData handler function - MB->onDataHandler(&handleModBusData); - // - provide onError handler function - MB->onErrorHandler(&handleModBusError); - // Set message timeout to 2000ms - MB->setTimeout(2000); - // Start ModbusRTU background task - MB->begin((HardwareSerial &)*_modbusUART); - } - - // Комманды из сценария - IoTValue execute(String command, std::vector ¶m) - { - IoTValue val; - uint8_t result; - uint32_t reading; - - uint16_t _reg = 0; - uint8_t count = 1; - bool isFloat = 0; - if (command == "readInputRegisters") // vout = mb.readInputRegisters(1, "0х0000", 1, 0) - "Адрес","Регистр","Кличество регистров","1-float, 0-long" - { - if (param.size()) - { - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - count = (uint8_t)param[2].valD; - count = count > 2 ? 2 : count; - count = count < 1 ? 1 : count; - isFloat = (bool)param[3].valD; - // val.valD = readFunctionModBus(0x04, _addr, _reg, count, isFloat); - uint32_t lastMillis = millis(); - Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); - Error err; - err = MB->addRequest((uint32_t)lastMillis, _addr, READ_INPUT_REGISTER, _reg, count); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - return val; - } - else if (command == "readHoldingRegisters") // vout = mb.readHoldingRegisters(1, "0х0000", 2, 1) - "Адрес","Регистр","Кличество регистров","1-float, 0-long" - { - if (param.size()) - { - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - count = (uint8_t)param[2].valD; - count = count > 2 ? 2 : count; - count = count < 1 ? 1 : count; - isFloat = (bool)param[3].valD; - // val.valD = readFunctionModBus(0x03, _addr, _reg, count, isFloat); - - // Create request for - // (Fill in your data here!) - // - server ID = 1 - // - function code = 0x03 (read holding register) - // - start address to read = word 10 - // - number of words to read = 4 - // - token to match the response with the request. We take the current millis() value for it. - // - // If something is missing or wrong with the call parameters, we will immediately get an error code - // and the request will not be issued - uint32_t lastMillis = millis(); - Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); - Error err; - err = MB->addRequest((uint32_t)lastMillis, _addr, READ_HOLD_REGISTER, _reg, count); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - return val; - } - else if (command == "readCoils") // vout = mb.readCoils(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" - { - if (param.size()) - { - count = (uint8_t)param[2].valD; - count = count > 16 ? 16 : count; - count = count < 1 ? 1 : count; - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - // node.begin(_addr, (Stream &)*_modbusUART); - // val.valD = readFunctionModBus(0x01, _addr, _reg, count); - - // Read a slice of 12 coils, starting at 13 - uint32_t lastMillis = millis(); - Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); - Error err; - err = MB->addRequest((uint32_t)lastMillis, _addr, READ_COIL, _reg, count); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - return val; - } - else if (command == "readDiscreteInputs") // vout = mb.readDiscreteInputs(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" - { - if (param.size()) - { - count = (uint8_t)param[2].valD; - count = count > 16 ? 16 : count; - count = count < 1 ? 1 : count; - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - // node.begin(_addr, (Stream &)*_modbusUART); - // val.valD = readFunctionModBus(0x02, _addr, _reg, count); - uint32_t lastMillis = millis(); - Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); - Error err; - err = MB->addRequest((uint32_t)lastMillis, _addr, READ_DISCR_INPUT, _reg, count); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - return val; - } - else if (command == "writeSingleRegister") // vout = mb.writeSingleRegister(1,"0x0003", 1) - addr, register, state - { - if (param.size()) - { - // node.begin((uint8_t)param[0].valD, (Stream &)*_modbusUART); - - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - // bool state = param[2].valD; - uint16_t state = param[2].valD; - // result = node.writeSingleRegister(_reg, state); - if (_debug) - { - SerialPrint("I", "ModbusClientAsync", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " = result: " + String(result, HEX)); - } - - // We will first set the register to a known state, read the register, - // then write to it and finally read it again to verify the change - - // Set defined conditions first - write 0x1234 to the register - // The Token value is used in handleData to avoid the output for this first preparation request! - // uint32_t Token = 1111; - uint32_t lastMillis = millis(); - Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); - Error err; - err = MB->addRequest((uint32_t)lastMillis, _addr, WRITE_HOLD_REGISTER, _reg, state); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - // Что можно вернуть в ответ на запись ??? - return {}; - } - else if (command == "writeSingleCoil") // vout = mb.writeSingleCoil(1,"0x0003", 1) - addr, register, state - { - if (param.size()) - { - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - // node.begin(_addr, (Stream &)*_modbusUART); - - bool state = param[2].valD; - // result = node.writeSingleCoil(_reg, state); - if (_debug) - { - SerialPrint("I", "ModbusClientAsync", "writeSingleCoil, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " = result: " + String(result, HEX)); - } - - // next set a single coil at 8 - uint32_t lastMillis = millis(); - Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); - Error err; - err = MB->addRequest((uint32_t)lastMillis, _addr, WRITE_COIL, _reg, state); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - // Что можно вернуть в ответ на запись койлов??? - return {}; - } - else if (command == "writeMultipleCoils") // Пример: mb.writeMultipleCoils(1, \"0х0000\", 4, 3) - будут записаны в четыре бита 0011 - { - if (param.size()) - { - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - count = (uint8_t)param[2].valD; - count = count > 16 ? 16 : count; - count = count < 1 ? 1 : count; - // node.begin(_addr, (Stream &)*_modbusUART); - - uint16_t state = param[3].valD; - // node.setTransmitBuffer(0, state); - // result = node.writeMultipleRegisters(_reg, count); - // node.clearTransmitBuffer(); - if (_debug) - { - SerialPrint("I", "ModbusClientAsync", "writeSingleCoil, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " = result: " + String(result, HEX)); - } - - CoilData cd(12); - // Finally set a a bunch of coils starting at 20 - cd = "011010010110"; - uint32_t lastMillis = millis(); - Serial.printf("sending request with token %d\n", (uint32_t)lastMillis); - Error err; - err = MB->addRequest((uint32_t)lastMillis, _addr, WRITE_MULT_COILS, _reg, cd.coils(), cd.size(), cd.data()); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - return {}; - } - // На данный момент записывает 2(два) регистра!!!!! Подходит для записи float?? Функция 0х10 протокола. - else if (command == "writeMultipleRegisters") // mb.writeMultipleRegisters(1, \"0х0000\", 1234.987) - { - if (param.size()) - { - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - // node.begin(_addr, (Stream &)*_modbusUART); - - float state = param[2].valD; - - // node.setTransmitBuffer(0, lowWord(state)); - // node.setTransmitBuffer(1, highWord(state)); - // result = node.writeMultipleRegisters(_reg, 2); - // node.clearTransmitBuffer(); - Serial.printf("NOT SUPPORTED!\n"); - if (_debug) - { - SerialPrint("I", "ModbusClientAsync", "writeMultipleRegisters, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " (" + String(state, HEX) + ")"); - } - } - return {}; - } - return val; - } - - ~ModbusClientAsync() - { - delete _modbusUART; - _modbusUART = nullptr; - }; -}; - -void *getAPI_ModbusRTUasync(String subtype, String param) -{ - if (subtype == F("mbClient")) - { - return new ModbusClientAsync(param); - } - { - return nullptr; - } -} diff --git a/src/modules/sensors/Ntc/modinfo.json b/src/modules/sensors/Ntc/modinfo.json index 6e0dc849..f7876979 100644 --- a/src/modules/sensors/Ntc/modinfo.json +++ b/src/modules/sensors/Ntc/modinfo.json @@ -48,7 +48,7 @@ "Beta": "Beta термистора" } }, - "defActive": false, + "defActive": true, "usedLibs": { "esp32*": [], "esp82*": [] diff --git a/src/modules/sensors/Pzem004t_v2/modinfo.json b/src/modules/sensors/Pzem004t_v2/modinfo.json index 57008f54..6b543024 100644 --- a/src/modules/sensors/Pzem004t_v2/modinfo.json +++ b/src/modules/sensors/Pzem004t_v2/modinfo.json @@ -142,18 +142,9 @@ "btn-reset": "pzem будет сброшен к нулю. Смотрите в логе результат: [i] Pzem reset done" } }, - "defActive": true, + "defActive": false, "usedLibs": { - "esp32_4mb": [], - "esp32_4mb3f": [], - "esp32cam_4mb": [], - "esp32c3m_4mb": [], - "esp8266_4mb": [], - "esp8266_1mb": [], - "esp8266_1mb_ota": [], - "esp8285_1mb": [], - "esp8285_1mb_ota": [], - "esp8266_2mb": [], - "esp8266_2mb_ota": [] + "esp32*": [], + "esp82*": [] } } \ No newline at end of file diff --git a/src/modules/sensors/S8/modinfo.json b/src/modules/sensors/S8/modinfo.json index 5aeadc3f..eab320b8 100644 --- a/src/modules/sensors/S8/modinfo.json +++ b/src/modules/sensors/S8/modinfo.json @@ -34,7 +34,7 @@ "int": "Количество секунд между опросами датчика." } }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [], "esp82*": [] diff --git a/src/modules/sensors/Sht20/modinfo.json b/src/modules/sensors/Sht20/modinfo.json index fdded673..b2feed28 100644 --- a/src/modules/sensors/Sht20/modinfo.json +++ b/src/modules/sensors/Sht20/modinfo.json @@ -47,7 +47,7 @@ "int": "Количество секунд между опросами датчика." } }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [ "robtillaart/SHT2x@^0.1.1" diff --git a/src/modules/sensors/Sonar/modinfo.json b/src/modules/sensors/Sonar/modinfo.json index 737ecd3f..de6fcd56 100644 --- a/src/modules/sensors/Sonar/modinfo.json +++ b/src/modules/sensors/Sonar/modinfo.json @@ -35,7 +35,7 @@ "int": "Количество секунд между опросами датчика." } }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [], "esp82*": [] From 6094c621affe076f57547f419ef928d93a9af95e Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 13 Jan 2025 20:59:51 +0300 Subject: [PATCH 056/118] add module ModBusRTU --- src/modules/sensors/ModbusRTU/MudbusRTU.cpp | 399 ++++++++++++++++++++ src/modules/sensors/ModbusRTU/modinfo.json | 124 ++++++ 2 files changed, 523 insertions(+) create mode 100644 src/modules/sensors/ModbusRTU/MudbusRTU.cpp create mode 100644 src/modules/sensors/ModbusRTU/modinfo.json diff --git a/src/modules/sensors/ModbusRTU/MudbusRTU.cpp b/src/modules/sensors/ModbusRTU/MudbusRTU.cpp new file mode 100644 index 00000000..2c4d9489 --- /dev/null +++ b/src/modules/sensors/ModbusRTU/MudbusRTU.cpp @@ -0,0 +1,399 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include +#include + +// https://github.com/4-20ma/ModbusMaster + +#include + +// class ModbusUart; +Stream *_modbusUART = nullptr; +int _DIR_PIN = 0; + +#define UART_LINE 2 + +// Modbus stuff +// Данные Modbus по умолчанию + +#define MODBUS_RX_PIN 18 // Rx pin +#define MODBUS_TX_PIN 19 // Tx pin +#define MODBUS_SERIAL_BAUD 9600 // Baud rate for esp32 and max485 communication + +void modbusPreTransmission() +{ + // delay(500); + if (_DIR_PIN) + digitalWrite(_DIR_PIN, HIGH); +} + +// Pin 4 made low for Modbus receive mode +// Контакт 4 установлен на низком уровне для режима приема Modbus +void modbusPostTransmission() +{ + if (_DIR_PIN) + digitalWrite(_DIR_PIN, LOW); + // delay(500); +} + +float readFunctionModBus(const uint8_t &func, const uint8_t &addr, const uint16_t ®, const uint8_t &count = 1, const bool &isFloat = 0) +{ + float retValue = 0; + if (_modbusUART) + { + + node.begin(addr, (Stream &)*_modbusUART); + uint8_t result; + // uint16_t data[2] = {0, 0}; + uint32_t reading; + switch (func) + { + // Modbus function 0x01 Read Coils + // Функция Modbus 0x01 Чтение Катушек + case 1: // 0x01 + count = count > 16 ? 16 : count; + count = count < 1 ? 1 : count; + result = node.readCoils(reg, count); + if (_debug) + { + SerialPrint("I", "ModbusNode", "readCoils, addr: " + String(addr, HEX) + ", reg: " + String(reg, HEX) + " = result: " + String(result, HEX)); + } + break; + + // Modbus function 0x02 Read Discrete Inputs + // Функция Modbus 0x02 Чтение дискретных входов + case 2: // 0x02 + count = count > 16 ? 16 : count; + count = count < 1 ? 1 : count; + result = node.readDiscreteInputs(reg, count); + if (_debug) + { + SerialPrint("I", "ModbusNode", "readDiscreteInputs, addr: " + String(addr, HEX) + ", reg: " + String(reg, HEX) + " = result: " + String(result, HEX)); + } + break; + + // Modbus function 0x03 Read Holding Registers + case 3: // 0x03 + count = count > 2 ? 2 : count; + count = count < 1 ? 1 : count; + result = node.readHoldingRegisters(reg, count); + if (_debug) + { + SerialPrint("I", "ModbusNode", "readHoldingRegisters, addr: " + String(addr, HEX) + ", reg: " + String(reg, HEX) + " = result: " + String(result, HEX)); + } + break; + + // Modbus function 0x04 Read Input Registers + // Функция Modbus 0x04 Чтение входных регистров + case 4: // 0x04 + count = count > 2 ? 2 : count; + count = count < 1 ? 1 : count; + result = node.readInputRegisters(reg, count); + if (_debug) + { + SerialPrint("I", "ModbusNode", "readInputRegisters, addr: " + String(addr, HEX) ", reg: " + String(reg, HEX) + " = result: " + String(result, HEX)); + } + break; + + default: + SerialPrint("I", "ModbusNode", "Unknown function or not supported: " + String(func, HEX)); + + break; + } + + if (result == node.ku8MBSuccess) + { + if ((func == 3 || func == 4) && countR == 2) + { + reading = node.getResponseBuffer(0x00) | + node.getResponseBuffer(0x01) << 16; + } + else + { + reading = node.getResponseBuffer(0x00); + } + node.clearResponseBuffer(); + + if (_debug) + { + SerialPrint("I", "ModbusMaster", "Success, Received data, register: " + String(reg) + " = " + String(reading, HEX)); + } + if (isFloat) + { + retValue = *(float *)&reading; + } + retValue = reading; + } + else + { + + if (_debug) + { + SerialPrint("I", "ModbusMaster", "Failed, Response Code: " + String(result, HEX)); + } + } + } + return retValue; +} + +ModbusMaster node; + +class ModbusNode : public IoTItem +{ +private: + // Initialize the ModbusMaster object as node + // Инициализируем объект ModbusMaster как узел + + uint8_t _addr = 0; // Адрес слейва от 1 до 247 + String _regStr = ""; // Адрес регистра который будем дергать ( по коду от 0х0000 до 0х????) + String _funcStr = ""; // Функция ModBUS + uint8_t _func; + uint16_t _reg = 0; + uint8_t _countReg = 1; + bool _isFloat = 0; + bool _debug; // Дебаг + +public: + ModbusNode(String parameters) : IoTItem(parameters) + { + _addr = jsonReadInt(parameters, "addr"); // адреса slave прочитаем с веба + jsonRead(parameters, "reg", _regStr); // адреса регистров прочитаем с веба + jsonRead(parameters, "func", _funcStr); // Функция ModBUS + _countReg = jsonReadInt(parameters, "count"); + jsonRead(parameters, "float", _isFloat); + jsonRead(parameters, "debug", _debug); + _func = hexStringToUint8(_funcStr); + _reg = hexStringToUint16(_regStr); + } + + void doByInterval() + { + regEvent(readFunctionModBus(_func, _addr, _reg, _countReg, _isFloat), "register"); + } + + ~ModbusNode(){}; +}; + +class ModbusMaster : public IoTItem +{ +private: + int _rx = MODBUS_RX_PIN; // адреса прочитаем с веба + int _tx = MODBUS_TX_PIN; + int _baud = MODBUS_SERIAL_BAUD; + String _prot = "SERIAL_8N1"; + int protocol = SERIAL_8N1; + + int _addr = 0; // Адрес слейва от 1 до 247 ( вроде ) + String _regStr = ""; // Адрес регистра который будем дергать ( по коду от 0х0000 до 0х????) + uint16_t _reg = 0; + bool _debug; // Дебаг + +public: + ModbusMaster(String parameters) : IoTItem(parameters) + { + _rx = jsonReadInt(parameters, "RX"); // прочитаем с веба + _tx = jsonReadInt(parameters, "TX"); + _DIR_PIN = jsonReadInt(parameters, "DIR_PIN"); + _baud = jsonReadInt(parameters, "baud"); + _prot = jsonReadStr(parameters, "protocol"); + jsonRead(parameters, "debug", _debug); + + if (_prot == "SERIAL_8N1") + { + protocol = SERIAL_8N1; + } + else if (_prot == "SERIAL_8N2") + { + protocol = SERIAL_8N2; + } + + pinMode(_DIR_PIN, OUTPUT); + digitalWrite(_DIR_PIN, LOW); + + // Serial2.begin(baud-rate, protocol, RX pin, TX pin); + + _modbusUART = new HardwareSerial(UART_LINE); + + if (_debug) + { + SerialPrint("I", "ModbusMaster", "baud: " + String(_baud) + ", protocol: " + String(protocol, HEX) + ", RX: " + String(_rx) + ", TX: " + String(_tx)); + } + ((HardwareSerial *)_modbusUART)->begin(_baud, protocol, _rx, _tx); // выбираем тип протокола, скорость и все пины с веба + ((HardwareSerial *)_modbusUART)->setTimeout(200); + + node.preTransmission(modbusPreTransmission); + node.postTransmission(modbusPostTransmission); + } + + // Комманды из сценария + IoTValue execute(String command, std::vector ¶m) + { + IoTValue val; + uint8_t result; + uint32_t reading; + + uint16_t _reg = 0; + uint8_t count = 1; + bool isFloat = 0; + if (command == "readInputRegisters") // vout = mb.readInputRegisters(1, "0х0000", 1, 0) - "Адрес","Регистр","Кличество регистров","1-float, 0-long" + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + count = (uint8_t)param[2].valD; + count = count > 2 ? 2 : count; + count = count < 1 ? 1 : count; + isFloat = (bool)param[3].valD; + val.valD = readFunctionModBus(0x04, _addr, _reg, count, isFloat); + } + return val; + } + else if (command == "readHoldingRegisters") // vout = mb.readHoldingRegisters(1, "0х0000", 2, 1) - "Адрес","Регистр","Кличество регистров","1-float, 0-long" + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + count = (uint8_t)param[2].valD; + count = count > 2 ? 2 : count; + count = count < 1 ? 1 : count; + isFloat = (bool)param[3].valD; + val.valD = readFunctionModBus(0x03, _addr, _reg, count, isFloat); + } + return val; + } + else if (command == "readCoils") // vout = mb.readCoils(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" + { + if (param.size()) + { + count = (uint8_t)param[2].valD; + count = count > 16 ? 16 : count; + count = count < 1 ? 1 : count; + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + node.begin(_addr, (Stream &)*_modbusUART); + val.valD = readFunctionModBus(0x01, _addr, _reg, count); + } + return val; + } + else if (command == "readDiscreteInputs") // vout = mb.readDiscreteInputs(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" + { + if (param.size()) + { + count = (uint8_t)param[2].valD; + count = count > 16 ? 16 : count; + count = count < 1 ? 1 : count; + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + node.begin(_addr, (Stream &)*_modbusUART); + val.valD = readFunctionModBus(0x02, _addr, _reg, count); + } + return val; + } + else if (command == "writeSingleRegister") // vout = mb.writeSingleRegister(1,"0x0003", 1) - addr, register, state + { + if (param.size()) + { + node.begin((uint8_t)param[0].valD, (Stream &)*_modbusUART); + + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + // bool state = param[2].valD; + uint16_t state = param[2].valD; + result = node.writeSingleRegister(_reg, state); + if (_debug) + { + SerialPrint("I", "ModbusMaster", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " = result: " + String(result, HEX)); + } + } + // Что можно вернуть в ответ на запись ??? + return {}; + } + else if (command == "writeSingleCoil") // vout = mb.writeSingleCoil(1,"0x0003", 1) - addr, register, state + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + node.begin(_addr, (Stream &)*_modbusUART); + + bool state = param[2].valD; + result = node.writeSingleCoil(_reg, state); + if (_debug) + { + SerialPrint("I", "ModbusMaster", "writeSingleCoil, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " = result: " + String(result, HEX)); + } + } + // Что можно вернуть в ответ на запись койлов??? + return {}; + } + else if (command == "writeMultipleCoils") // Пример: mb.writeMultipleCoils(1, \"0х0000\", 4, 3) - будут записаны в четыре бита 0011 + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + count = (uint8_t)param[2].valD; + count = count > 16 ? 16 : count; + count = count < 1 ? 1 : count; + node.begin(_addr, (Stream &)*_modbusUART); + + uint16_t state = param[3].valD; + node.setTransmitBuffer(0, state); + result = node.writeMultipleRegisters(_reg, count); + node.clearTransmitBuffer(); + if (_debug) + { + SerialPrint("I", "ModbusMaster", "writeSingleCoil, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " = result: " + String(result, HEX)); + } + } + return {}; + } + // На данный момент записывает 2(два) регистра!!!!! Подходит для записи float?? Функция 0х10 протокола. + else if (command == "writeMultipleRegisters") // mb.writeMultipleRegisters(1, \"0х0000\", 1234.987) + { + if (param.size()) + { + _addr = param[0].valD; + _reg = hexStringToUint16(param[1].valS); + node.begin(_addr, (Stream &)*_modbusUART); + + float state = param[2].valD; + + node.setTransmitBuffer(0, lowWord(state)); + node.setTransmitBuffer(1, highWord(state)); + result = node.writeMultipleRegisters(_reg, 2); + node.clearTransmitBuffer(); + if (_debug) + { + SerialPrint("I", "ModbusMaster", "writeMultipleRegisters, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(_reg, HEX) + ", state: " + String(state) + " (" + String(state, HEX) + ")"); + } + } + return {}; + } + return val; + } + + ~ModbusMaster() + { + delete _modbusUART; + _modbusUART = nullptr; + }; +}; + +void *getAPI_ModbusRTU(String subtype, String param) +{ + + if (subtype == F("mbNode")) + { + return new ModbusNode(param); + } + else if (subtype == F("mbMaster")) + { + return new ModbusMaster(param); + } + { + return nullptr; + } +} diff --git a/src/modules/sensors/ModbusRTU/modinfo.json b/src/modules/sensors/ModbusRTU/modinfo.json new file mode 100644 index 00000000..8d7d7075 --- /dev/null +++ b/src/modules/sensors/ModbusRTU/modinfo.json @@ -0,0 +1,124 @@ +{ + "menuSection": "sensors", + "configItem": [ + { + "global": 0, + "name": "ModbusNode", + "type": "Reading", + "subtype": "mbNode", + "id": "mbNode", + "widget": "anydataTmp", + "page": "Modbus", + "descr": "Данные modbus", + "int": 5, + "func": "0x03", + "addr": 1, + "reg": "0x0000", + "count": 1, + "float": 1, + "round": 0, + "debug": 1 + }, + { + "global": 0, + "name": "ModbusMaster", + "type": "Reading", + "subtype": "mbMaster", + "id": "mb", + "widget": "anydataTmp", + "page": "Modbus", + "descr": "Настройки modbus", + "int": 5, + "RX": 18, + "TX": 19, + "DIR_PIN": 4, + "baud": 9600, + "protocol": "SERIAL_8N2", + "debug": 1 + } + ], + "about": { + "authorName": "Serghei Crasnicov", + "authorContact": "https://t.me/Serghei63", + "authorGit": "https://github.com/Serghei63", + "specialThanks": "Mit4bmw", + "moduleName": "ModbusRTU", + "moduleVersion": "2.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "subTypes": [ + "mbNode", + "mbMaster" + ], + "title": "ModbusMaster", + "moduleDesc": "Позволяет управлять оборудованием по протоколу modbus", + "propInfo": { + "func": "Функция modbus", + "addr": "Адрес slav", + "reg": "Адрес регистра", + "count": "Количество регистров. В ModbusNode 16-разядные регистры можно считать не более 2 в ноде. Для битовых данных не более 16 бит в ноде. Значение поместится в value Ноды", + "float": "Тип считываемых данных, если count=2, то данные могут быть long (указать 0) или float (указать 1). Числа Long не рекомендуются (на больших числах не будет точности), так как будет ограничено точность представление в IotManager идет во float", + "int": "Количество секунд между опросами датчика.", + "RX": "Пин RX", + "TX": "Пин TX", + "DIR_PIN": "connect DR, RE pin of MAX485 to gpio, указать 0 если не нужен", + "baud": "скорость Uart", + "protocol": "Протокол Uart: SERIAL_8N1 или SERIAL_8N2", + "debug": " 1 - включить вывод дебага , 0 - отключить дебаг" + }, + "funcInfo": [ + { + "name": "readCoils", + "descr": "Чтение койла (битового поля). Функция 0х01 протокола. Читает не более 16 бит за раз. Пример: mb.readCoils(1, \"0х0000\", 1)", + "params": ["Адрес","Регистр","Кличество бит"] + }, + { + "name": "readDiscreteInputs", + "descr": "Чтение дискретного выхода (битового поля). Функция 0х02 протокола. Читает не более 16 бит за раз. Пример: mb.readDiscreteInputs(1, \"0х0000\", 8)", + "params": ["Адрес","Регистр","Кличество бит"] + + }, + { + "name": "readHoldingRegisters", + "descr": "Запрос данных регистра. Функция 0х03 протокола. Читает не более двух регистров за раз. Пример: mb.readHoldingRegisters(1, \"0х0000\", 1, 0)", + "params": ["Адрес","Регистр","Кличество регистров","1-float, 0-long"] + }, + { + "name": "readInputRegisters", + "descr": "Запрос данных регистра. Функция 0х04 протокола. Читает не более двух регистров за раз. Пример: mb.readInputRegisters(1, \"0х0000\", 1, 0)", + "params": ["Адрес","Регистр","Кличество регистров","1-float, 0-long"] + }, + { + "name": "writeSingleCoils", + "descr": "Запись в койл (битовое поле) одного бита. Функция 0х05 протокола. Пример: mb.writeSingleCoils(1, \"0х0000\", 1)", + "params": ["Адрес","Регистр","Данные"] + }, + { + "name": "writeSingleRegister", + "descr": "Запись данных в один регистр. Функция 0х06 протокола. Пример: mb.writeSingleRegister(1, \"0х0000\", 128)", + "params": ["Адрес","Регистр","Данные"] + }, + { + "name": "writeMultipleCoils", + "descr": "Запись данных в несколько койлов до 16 (число от 0 до 65535). Функция 0x0F протокола. Пример: mb.writeMultipleCoils(1, \"0х0000\", 4, 3) - будут записаны в четыре бита 0011", + "params": ["Адрес","Регистр","Кличество койлов (бит)","Данные"] + }, + { + "name": "writeMultipleRegisters", + "descr": "Запись данных в несколько регистров. На данный момент записывает 2(два) регистра!!!!! Подходит для записи float?? Функция 0х10 протокола. Пример: mb.writeMultipleRegisters(1, \"0х0000\", 1234.987)", + "params": ["Адрес","Регистр","Данные"] + } + ] + }, + "defActive": false, + "usedLibs": { + "esp32*": [ + "https://github.com/4-20ma/ModbusMaster" + ], + "esp82*": [ + "https://github.com/4-20ma/ModbusMaster" + ] + } +} \ No newline at end of file From 9a1e92d74777ef7d4663bab8cd3290c1184895a4 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 13 Jan 2025 21:00:55 +0300 Subject: [PATCH 057/118] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB?= =?UTF-8?q?=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myProfile.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/myProfile.json b/myProfile.json index 72e3986e..9a32b8bc 100644 --- a/myProfile.json +++ b/myProfile.json @@ -340,6 +340,10 @@ "path": "src/modules/sensors/Mhz19", "active": false }, + { + "path": "src/modules/sensors/ModbusRTU", + "active": false + }, { "path": "src/modules/sensors/ModbusRTUasync", "active": false From 959315b86e484d6f03a2f6595376a43f5c9d325a Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 13 Jan 2025 22:20:02 +0300 Subject: [PATCH 058/118] test ModBusAsync --- .../sensors/ModbusRTUasync/ModbusRTU.cpp | 234 +++++++++++------- .../sensors/ModbusRTUasync/modinfo.json | 32 +-- 2 files changed, 151 insertions(+), 115 deletions(-) diff --git a/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp b/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp index 2ab02980..d983e307 100644 --- a/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp +++ b/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp @@ -19,8 +19,8 @@ int8_t MODBUS_DIR_PIN = 0; // bool modBus_data_ready = false; uint32_t modBus_Token_count = 0; // Счетчик токенов для Нод, 0 - всегду у главного класса, дальше по порядку -//class ModbusNode; -std::map MBNoneMap; +class ModbusNode; +std::map MBNoneMap; ModbusClientRTU *MB = nullptr; ModbusClientRTU *instanceModBus(int8_t _DR) @@ -38,6 +38,136 @@ ModbusClientRTU *instanceModBus(int8_t _DR) // ModbusClientRTU MB(_DIR_PIN); // ModbusClientRTU MB(); +class ModbusNode : public IoTItem +{ +private: + // Initialize the ModbusMaster object as node + // Инициализируем объект ModbusMaster как узел + + uint8_t _addr = 0; // Адрес слейва от 1 до 247 + String _regStr = ""; // Адрес регистра который будем дергать ( по коду от 0х0000 до 0х????) + String _funcStr = ""; // Функция ModBUS + uint8_t _func; + uint16_t _reg = 0; + uint8_t _countReg = 1; + uint32_t _token = 0; + bool _isFloat = 0; + +public: + ModbusNode(String parameters) : IoTItem(parameters) + { + _addr = jsonReadInt(parameters, "addr"); // адреса slave прочитаем с веба + jsonRead(parameters, "reg", _regStr); // адреса регистров прочитаем с веба + jsonRead(parameters, "func", _funcStr); // Функция ModBUS + jsonRead(parameters, "isFloat", _isFloat); + _countReg = jsonReadInt(parameters, "count"); + _func = hexStringToUint8(_funcStr); + _reg = hexStringToUint16(_regStr); + modBus_Token_count++; + _token = modBus_Token_count; + MBNoneMap[_token] = this; + } + + void doByInterval() + { + if (!MB) + { + Serial.printf("ModbusNode: ModbusClientAsync is NULL\n"); + return; + } + if (_func == 0x04) // vout = mb.readInputRegisters(1, "0х0000", 1, 0) - "Адрес","Регистр","Кличество регистров" + { + // val.valD = readFunctionModBus(0x04, _addr, _reg, count, isFloat); + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_INPUT_REGISTER, _reg, _countReg); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + else if (_func == 0x03) // vout = mb.readHoldingRegisters(1, "0х0000", 2, 1) - "Адрес","Регистр","Кличество регистров" + { + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_HOLD_REGISTER, _reg, _countReg); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + else if (_func == 0x01) // vout = mb.readCoils(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" + { + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_COIL, _reg, _countReg); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + else if (_func == 0x02) // vout = mb.readDiscreteInputs(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" + { + Serial.printf("sending request with token %d\n", _token); + Error err; + err = MB->addRequest(_token, _addr, READ_DISCR_INPUT, _reg, _countReg); + if (err != SUCCESS) + { + ModbusError e(err); + Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); + } + } + } + + void parseMB(ModbusMessage response) + { + if (MB) + { + if (_func == 0x02) // coil + { + uint16_t val; + response.get(3, val); + regEvent(val, "ModbusNode"); + CoilData cd(_countReg); + cd.set(0, _countReg, (uint8_t *)response.data() + 3); + cd.print("Received : ", Serial); + } + else + { + if (_countReg == 2 && _isFloat) + { + float val; + response.get(3, val); + regEvent(val, "ModbusNode"); + } + else + { + if (_countReg == 2) + { + uint16_t val1, val2; + response.get(3, val1); + response.get(4, val2); + long val = val1 | val2 << 16; + regEvent(val, "ModbusNode"); + } + else + { + uint16_t val; + response.get(3, val); + regEvent(val, "ModbusNode"); + } + } + } + } + } + + ~ModbusNode() {}; +}; + + // Define an onData handler function to receive the regular responses // Arguments are received response message and the request's token void handleModBusData(ModbusMessage response, uint32_t token) @@ -53,10 +183,11 @@ void handleModBusData(ModbusMessage response, uint32_t token) // uint16_t offs = 3; // // The device has values all as IEEE754 float32 in two consecutive registers // offs = response.get(offs, values[i]); - uint16_t val; - response.get(3, val); - if(MBNoneMap[token]){ - MBNoneMap[token]->regEvent(val,"ModMusNode resposne"); + // uint16_t val; + // response.get(3, val); + if (MBNoneMap[token]) + { + MBNoneMap[token]->parseMB(response); } // modBus_data_ready = true; } @@ -83,7 +214,7 @@ class ModbusClientAsync : public IoTItem int _addr = 0; // Адрес слейва от 1 до 247 ( вроде ) String _regStr = ""; // Адрес регистра который будем дергать ( по коду от 0х0000 до 0х????) uint16_t _reg = 0; - bool _debug; // Дебаг + bool _debug; // Дебаг uint32_t _token = 0; // Токен у главного класса весгда 0 public: @@ -130,7 +261,7 @@ class ModbusClientAsync : public IoTItem MB->setTimeout(2000); // Start ModbusRTU background task MB->begin((HardwareSerial &)*_modbusUART); - MBNoneMap[_token] = this; + // MBNoneMap[_token] = this; } // Комманды из сценария @@ -142,6 +273,7 @@ class ModbusClientAsync : public IoTItem uint16_t _reg = 0; uint8_t count = 1; + /* if (command == "readInputRegisters") // vout = mb.readInputRegisters(1, "0х0000", 1, 0) - "Адрес","Регистр","Кличество регистров","1-float, 0-long" { if (param.size()) @@ -243,7 +375,8 @@ class ModbusClientAsync : public IoTItem } return val; } - else if (command == "writeSingleRegister") // vout = mb.writeSingleRegister(1,"0x0003", 1) - addr, register, state + else */ + if (command == "writeSingleRegister") // vout = mb.writeSingleRegister(1,"0x0003", 1) - addr, register, state { if (param.size()) { @@ -373,90 +506,7 @@ class ModbusClientAsync : public IoTItem }; }; -class ModbusNode : public IoTItem -{ -private: - // Initialize the ModbusMaster object as node - // Инициализируем объект ModbusMaster как узел - - uint8_t _addr = 0; // Адрес слейва от 1 до 247 - String _regStr = ""; // Адрес регистра который будем дергать ( по коду от 0х0000 до 0х????) - String _funcStr = ""; // Функция ModBUS - uint8_t _func; - uint16_t _reg = 0; - uint8_t _countReg = 1; - uint32_t _token = 0; - -public: - ModbusNode(String parameters) : IoTItem(parameters) - { - _addr = jsonReadInt(parameters, "addr"); // адреса slave прочитаем с веба - jsonRead(parameters, "reg", _regStr); // адреса регистров прочитаем с веба - jsonRead(parameters, "func", _funcStr); // Функция ModBUS - _countReg = jsonReadInt(parameters, "count"); - _func = hexStringToUint8(_funcStr); - _reg = hexStringToUint16(_regStr); - modBus_Token_count++; - _token = modBus_Token_count; - MBNoneMap[_token] = this; - } - - void doByInterval() - { - if (!MB) - { - Serial.printf("ModbusNode: ModbusClientAsync is NULL\n"); - return; - } - if (_func == 0x04) // vout = mb.readInputRegisters(1, "0х0000", 1, 0) - "Адрес","Регистр","Кличество регистров" - { - // val.valD = readFunctionModBus(0x04, _addr, _reg, count, isFloat); - Serial.printf("sending request with token %d\n", _token); - Error err; - err = MB->addRequest(_token, _addr, READ_INPUT_REGISTER, _reg, _countReg); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - else if (_func == 0x03) // vout = mb.readHoldingRegisters(1, "0х0000", 2, 1) - "Адрес","Регистр","Кличество регистров" - { - Serial.printf("sending request with token %d\n", _token); - Error err; - err = MB->addRequest(_token, _addr, READ_HOLD_REGISTER, _reg, _countReg); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - else if (_func == 0x01) // vout = mb.readCoils(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" - { - Serial.printf("sending request with token %d\n", _token); - Error err; - err = MB->addRequest(_token, _addr, READ_COIL, _reg, _countReg); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - else if (_func == 0x02) // vout = mb.readDiscreteInputs(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" - { - Serial.printf("sending request with token %d\n", _token); - Error err; - err = MB->addRequest(_token, _addr, READ_DISCR_INPUT, _reg, _countReg); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - } - ~ModbusNode() {}; -}; void *getAPI_ModbusRTUasync(String subtype, String param) { diff --git a/src/modules/sensors/ModbusRTUasync/modinfo.json b/src/modules/sensors/ModbusRTUasync/modinfo.json index 7897682e..ea9d4ef9 100644 --- a/src/modules/sensors/ModbusRTUasync/modinfo.json +++ b/src/modules/sensors/ModbusRTUasync/modinfo.json @@ -15,6 +15,7 @@ "addr": 1, "reg": "0x0000", "count": 1, + "isFloat": 0, "round": 0 }, { @@ -50,7 +51,7 @@ "mbClient" ], "title": "ModbusAsync", - "moduleDesc": "Позволяет управлять оборудованием по протоколу modbus", + "moduleDesc": "Позволяет управлять оборудованием по протоколу modbus. Чтение регситров через Ноды, Запись через функции сценария в ModbusAsunc", "propInfo": { "int": "Количество секунд между опросами датчика.", "RX": "Пин RX", @@ -58,30 +59,15 @@ "DIR_PIN": "connect DR, RE pin of MAX485 to gpio, указать 0 если не нужен", "baud": "скорость Uart", "protocol": "Протокол Uart: SERIAL_8N1 или SERIAL_8N2", - "debug": " 1 - включить вывод дебага , 0 - отключить дебаг" + "debug": " 1 - включить вывод дебага , 0 - отключить дебаг", + "isFloat": "Тип считываемых данных, если count=2, то данные могут быть long (указать 0) или float (указать 1). Числа Long не рекомендуются (на больших числах не будет точности), так как будет ограничено точность представление в IotManager идет во float", + "func": "Функция modbus", + "addr": "Адрес slav", + "reg": "Адрес регистра", + "count": "Количество регистров. В ModbusNode 16-разядные регистры можно считать не более 2 в ноде. Для битовых данных не более 16 бит в ноде. Значение поместится в value Ноды" + }, "funcInfo": [ - { - "name": "readCoils", - "descr": "Чтение койла (битового поля). Функция 0х01 протокола. Читает не более 16 бит за раз. Пример: mb.readCoils(1, \"0х0000\", 1)", - "params": ["Адрес","Регистр","Кличество бит"] - }, - { - "name": "readDiscreteInputs", - "descr": "Чтение дискретного выхода (битового поля). Функция 0х02 протокола. Читает не более 16 бит за раз. Пример: mb.readDiscreteInputs(1, \"0х0000\", 8)", - "params": ["Адрес","Регистр","Кличество бит"] - - }, - { - "name": "readHoldingRegisters", - "descr": "Запрос данных регистра. Функция 0х03 протокола. Читает не более двух регистров за раз. Пример: mb.readHoldingRegisters(1, \"0х0000\", 1)", - "params": ["Адрес","Регистр","Кличество регистров"] - }, - { - "name": "readInputRegisters", - "descr": "Запрос данных регистра. Функция 0х04 протокола. Читает не более двух регистров за раз. Пример: mb.readInputRegisters(1, \"0х0000\", 1)", - "params": ["Адрес","Регистр","Кличество регистров"] - }, { "name": "writeSingleCoils", "descr": "Запись в койл (битовое поле) одного бита. Функция 0х05 протокола. Пример: mb.writeSingleCoils(1, \"0х0000\", 1)", From 10b1adb5a52ee746f58cddcf69e36d3d47aa9cad Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 5 Feb 2025 20:33:05 +0300 Subject: [PATCH 059/118] upd /localota, modbusAsync --- include/StandWebServer.h | 1 + src/StandWebServer.cpp | 9 ++++- src/modules/exec/Buzzer/modinfo.json | 2 +- .../sensors/ModbusRTUasync/ModbusRTU.cpp | 40 ++++++++++++++----- 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/include/StandWebServer.h b/include/StandWebServer.h index 40898c46..419a4538 100644 --- a/include/StandWebServer.h +++ b/include/StandWebServer.h @@ -10,6 +10,7 @@ extern void handleFileUpload(); extern void handleFileDelete(); extern void handleFileCreate(); extern void handleLocalOTA(); +extern void handleLocalOTA_Handler(); extern void handleFileList(); //void printDirectory(File dir, String& out); extern void handleStatus(); diff --git a/src/StandWebServer.cpp b/src/StandWebServer.cpp index 8c16cc24..f28ed01d 100644 --- a/src/StandWebServer.cpp +++ b/src/StandWebServer.cpp @@ -91,6 +91,8 @@ void standWebServerInit() { HTTP.on("/localota", HTTP_GET, handleLocalOTA); + HTTP.on("/localota_handler", HTTP_GET, handleLocalOTA_Handler); + // Default handler for all URIs not defined above // Use it to read files from filesystem HTTP.onNotFound(handleNotFound); @@ -159,7 +161,12 @@ void handleStatus() { } void handleLocalOTA() { - upgrade_firmware(3,""); + String page = "

"; + HTTP.send(200, "text/html", page);} + +void handleLocalOTA_Handler() { + String serverValue = HTTP.arg("server"); + upgrade_firmware(3,serverValue); } #ifdef ESP32 diff --git a/src/modules/exec/Buzzer/modinfo.json b/src/modules/exec/Buzzer/modinfo.json index be7ee225..3036985c 100644 --- a/src/modules/exec/Buzzer/modinfo.json +++ b/src/modules/exec/Buzzer/modinfo.json @@ -101,7 +101,7 @@ } ] }, - "defActive": true, + "defActive": false, "usedLibs": { "esp32*": [], "esp82*": [] diff --git a/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp b/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp index d983e307..38a47039 100644 --- a/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp +++ b/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp @@ -66,6 +66,7 @@ class ModbusNode : public IoTItem modBus_Token_count++; _token = modBus_Token_count; MBNoneMap[_token] = this; + Serial.printf("Добавлен нода/токен: %s - %d\n", getID(), _token); } void doByInterval() @@ -129,11 +130,13 @@ class ModbusNode : public IoTItem if (_func == 0x02) // coil { uint16_t val; - response.get(3, val); - regEvent(val, "ModbusNode"); - CoilData cd(_countReg); + //response.get(3, val); + //regEvent((float)val, "ModbusNode"); + CoilData cd(_countReg); cd.set(0, _countReg, (uint8_t *)response.data() + 3); cd.print("Received : ", Serial); + val = cd[0]; + regEvent(val, "ModbusNode"); } else { @@ -151,23 +154,25 @@ class ModbusNode : public IoTItem response.get(3, val1); response.get(4, val2); long val = val1 | val2 << 16; - regEvent(val, "ModbusNode"); + regEvent((float)val, "ModbusNode"); } else { uint16_t val; response.get(3, val); - regEvent(val, "ModbusNode"); + regEvent((float)val, "ModbusNode"); } } } } } - ~ModbusNode() {}; + ~ModbusNode() + { + MBNoneMap.erase(_token); + }; }; - // Define an onData handler function to receive the regular responses // Arguments are received response message and the request's token void handleModBusData(ModbusMessage response, uint32_t token) @@ -189,6 +194,10 @@ void handleModBusData(ModbusMessage response, uint32_t token) { MBNoneMap[token]->parseMB(response); } + else + { + Serial.printf("Токен/Нода не найден: %d\n", token); + } // modBus_data_ready = true; } @@ -214,7 +223,7 @@ class ModbusClientAsync : public IoTItem int _addr = 0; // Адрес слейва от 1 до 247 ( вроде ) String _regStr = ""; // Адрес регистра который будем дергать ( по коду от 0х0000 до 0х????) uint16_t _reg = 0; - bool _debug; // Дебаг + bool _debug; // Дебаг uint32_t _token = 0; // Токен у главного класса весгда 0 public: @@ -428,7 +437,17 @@ class ModbusClientAsync : public IoTItem // next set a single coil at 8 Serial.printf("sending request with token %d\n", _token); Error err; - err = MB->addRequest(_token, _addr, WRITE_COIL, _reg, state); + ModbusMessage msg; + if (state) + { + msg.setMessage(_addr, WRITE_COIL, _reg, 0xFF00); + err = MB->addRequest(msg, _token); + } + else + { + //msg.setMessage(_addr, WRITE_COIL, _reg, 0x0000); + err = MB->addRequest(_token, _addr, WRITE_COIL, _reg, 0); + } if (err != SUCCESS) { ModbusError e(err); @@ -453,6 +472,7 @@ class ModbusClientAsync : public IoTItem // node.setTransmitBuffer(0, state); // result = node.writeMultipleRegisters(_reg, count); // node.clearTransmitBuffer(); + Serial.printf("NOT SUPPORTED!\n"); if (_debug) { SerialPrint("I", "ModbusClientAsync", "writeSingleCoil, addr: " + String((uint8_t)_addr, HEX) + ", regStr: " + _regStr + ", reg: " + String(_reg, HEX) + ", state: " + String(state)); @@ -506,8 +526,6 @@ class ModbusClientAsync : public IoTItem }; }; - - void *getAPI_ModbusRTUasync(String subtype, String param) { if (subtype == F("mbNode")) From 229dc89a7c4b770b35890f85c33a034da6720ad1 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 5 Feb 2025 21:40:03 +0300 Subject: [PATCH 060/118] fix float & long --- src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp b/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp index 38a47039..5d575416 100644 --- a/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp +++ b/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp @@ -152,7 +152,8 @@ class ModbusNode : public IoTItem { uint16_t val1, val2; response.get(3, val1); - response.get(4, val2); + response.get(5, val2); + Serial.printf("COUNT 2: %02X - %02X\n", (int)val1, (int)val2); long val = val1 | val2 << 16; regEvent((float)val, "ModbusNode"); } From 05ea75aa0ac8841fad975839aa020de4eeb30b4c Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 8 Feb 2025 17:44:27 +0300 Subject: [PATCH 061/118] upd ModBus --- .../sensors/ModbusRTUasync/ModbusRTU.cpp | 139 ++++-------------- .../sensors/ModbusRTUasync/modinfo.json | 30 ++-- 2 files changed, 48 insertions(+), 121 deletions(-) diff --git a/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp b/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp index 5d575416..f6f346b5 100644 --- a/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp +++ b/src/modules/sensors/ModbusRTUasync/ModbusRTU.cpp @@ -52,6 +52,7 @@ class ModbusNode : public IoTItem uint8_t _countReg = 1; uint32_t _token = 0; bool _isFloat = 0; + CoilData _respCoil; public: ModbusNode(String parameters) : IoTItem(parameters) @@ -127,13 +128,14 @@ class ModbusNode : public IoTItem { if (MB) { - if (_func == 0x02) // coil + if (_func == 0x02 || _func == 0x01) // coil { uint16_t val; - //response.get(3, val); - //regEvent((float)val, "ModbusNode"); + // response.get(3, val); + // regEvent((float)val, "ModbusNode"); CoilData cd(_countReg); cd.set(0, _countReg, (uint8_t *)response.data() + 3); + _respCoil = cd; cd.print("Received : ", Serial); val = cd[0]; regEvent(val, "ModbusNode"); @@ -168,9 +170,33 @@ class ModbusNode : public IoTItem } } + // Комманды из сценария + IoTValue execute(String command, std::vector ¶m) + { + IoTValue val; + // uint8_t result; + // uint32_t reading; + + uint16_t _index = 0; + + if (command == "getBits") + { + if (param.size()) + { + if (_respCoil.size() > _index) + { + _index = param[0].valD; + val.valD = _respCoil[_index]; + return val; + } + } + } + return {}; + } + ~ModbusNode() { - MBNoneMap.erase(_token); + //MBNoneMap.erase(_token); }; }; @@ -283,109 +309,6 @@ class ModbusClientAsync : public IoTItem uint16_t _reg = 0; uint8_t count = 1; - /* - if (command == "readInputRegisters") // vout = mb.readInputRegisters(1, "0х0000", 1, 0) - "Адрес","Регистр","Кличество регистров","1-float, 0-long" - { - if (param.size()) - { - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - count = (uint8_t)param[2].valD; - count = count > 2 ? 2 : count; - count = count < 1 ? 1 : count; - // val.valD = readFunctionModBus(0x04, _addr, _reg, count, isFloat); - // uint32_t lastMillis = millis(); - Serial.printf("sending request with token %d\n", _token); - Error err; - err = MB->addRequest(_token, _addr, READ_INPUT_REGISTER, _reg, count); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - return val; - } - else if (command == "readHoldingRegisters") // vout = mb.readHoldingRegisters(1, "0х0000", 2, 1) - "Адрес","Регистр","Кличество регистров","1-float, 0-long" - { - if (param.size()) - { - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - count = (uint8_t)param[2].valD; - count = count > 2 ? 2 : count; - count = count < 1 ? 1 : count; - // val.valD = readFunctionModBus(0x03, _addr, _reg, count, isFloat); - - // Create request for - // (Fill in your data here!) - // - server ID = 1 - // - function code = 0x03 (read holding register) - // - start address to read = word 10 - // - number of words to read = 4 - // - token to match the response with the request. We take the current millis() value for it. - // - // If something is missing or wrong with the call parameters, we will immediately get an error code - // and the request will not be issued - - Serial.printf("sending request with token %d\n", _token); - Error err; - err = MB->addRequest(_token, _addr, READ_HOLD_REGISTER, _reg, count); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - return val; - } - else if (command == "readCoils") // vout = mb.readCoils(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" - { - if (param.size()) - { - count = (uint8_t)param[2].valD; - count = count > 16 ? 16 : count; - count = count < 1 ? 1 : count; - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - // node.begin(_addr, (Stream &)*_modbusUART); - // val.valD = readFunctionModBus(0x01, _addr, _reg, count); - - // Read a slice of 12 coils, starting at 13 - Serial.printf("sending request with token %d\n", _token); - Error err; - err = MB->addRequest(_token, _addr, READ_COIL, _reg, count); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - return val; - } - else if (command == "readDiscreteInputs") // vout = mb.readDiscreteInputs(1, \"0х0000\", 1) - "Адрес","Регистр","Кличество бит" - { - if (param.size()) - { - count = (uint8_t)param[2].valD; - count = count > 16 ? 16 : count; - count = count < 1 ? 1 : count; - _addr = param[0].valD; - _reg = hexStringToUint16(param[1].valS); - // node.begin(_addr, (Stream &)*_modbusUART); - // val.valD = readFunctionModBus(0x02, _addr, _reg, count); - Serial.printf("sending request with token %d\n", _token); - Error err; - err = MB->addRequest(_token, _addr, READ_DISCR_INPUT, _reg, count); - if (err != SUCCESS) - { - ModbusError e(err); - Serial.printf("Error creating request: %02X - %s\n", (int)e, (const char *)e); - } - } - return val; - } - else */ if (command == "writeSingleRegister") // vout = mb.writeSingleRegister(1,"0x0003", 1) - addr, register, state { if (param.size()) @@ -446,7 +369,7 @@ class ModbusClientAsync : public IoTItem } else { - //msg.setMessage(_addr, WRITE_COIL, _reg, 0x0000); + // msg.setMessage(_addr, WRITE_COIL, _reg, 0x0000); err = MB->addRequest(_token, _addr, WRITE_COIL, _reg, 0); } if (err != SUCCESS) diff --git a/src/modules/sensors/ModbusRTUasync/modinfo.json b/src/modules/sensors/ModbusRTUasync/modinfo.json index ea9d4ef9..88afa653 100644 --- a/src/modules/sensors/ModbusRTUasync/modinfo.json +++ b/src/modules/sensors/ModbusRTUasync/modinfo.json @@ -9,7 +9,7 @@ "id": "mbNode", "widget": "anydataTmp", "page": "Modbus", - "descr": "Данные modbus", + "descr": "Чтение данных modbus", "int": 5, "func": "0x03", "addr": 1, @@ -26,7 +26,7 @@ "id": "mb", "widget": "anydataTmp", "page": "Modbus", - "descr": "Настройки modbus", + "descr": "Настройки и запись modbus", "int": 5, "RX": 18, "TX": 19, @@ -42,7 +42,7 @@ "authorGit": "https://github.com/Mit4el", "specialThanks": "Serghei Crasnicov", "moduleName": "ModbusRTUasync", - "moduleVersion": "1.0", + "moduleVersion": "1.1", "usedRam": { "esp32_4mb": 15, "esp8266_4mb": 15 @@ -51,7 +51,7 @@ "mbClient" ], "title": "ModbusAsync", - "moduleDesc": "Позволяет управлять оборудованием по протоколу modbus. Чтение регситров через Ноды, Запись через функции сценария в ModbusAsunc", + "moduleDesc": "Позволяет управлять оборудованием по протоколу modbus. Модуль ModbusAsync обязательный для настройки. Запись через функции сценария в ModbusAsync. Для чтение регистров добавлять модули ModbusNode.", "propInfo": { "int": "Количество секунд между опросами датчика.", "RX": "Пин RX", @@ -60,33 +60,37 @@ "baud": "скорость Uart", "protocol": "Протокол Uart: SERIAL_8N1 или SERIAL_8N2", "debug": " 1 - включить вывод дебага , 0 - отключить дебаг", - "isFloat": "Тип считываемых данных, если count=2, то данные могут быть long (указать 0) или float (указать 1). Числа Long не рекомендуются (на больших числах не будет точности), так как будет ограничено точность представление в IotManager идет во float", - "func": "Функция modbus", - "addr": "Адрес slav", + "func": "Функция чтения modbus (0x01, 0x02, 0x03, 0x04)", + "addr": "Адрес slave", "reg": "Адрес регистра", - "count": "Количество регистров. В ModbusNode 16-разядные регистры можно считать не более 2 в ноде. Для битовых данных не более 16 бит в ноде. Значение поместится в value Ноды" - + "count": "Количество регистров. В ModbusNode 16-разядные регистры можно считать не более 2 в ноде. Для битовых данных не более 16 бит в ноде. Значение поместится в value Ноды", + "isFloat": "Тип считываемых данных, если count=2, то данные могут быть long (указать 0) или float (указать 1). Числа Long не рекомендуются (на больших числах не будет точности), так как будет ограничено точность представление в IotManager идет во float" }, "funcInfo": [ { "name": "writeSingleCoils", - "descr": "Запись в койл (битовое поле) одного бита. Функция 0х05 протокола. Пример: mb.writeSingleCoils(1, \"0х0000\", 1)", + "descr": "Запись в койл (битовое поле) одного бита, вызывать из ModbusAsunc. Функция 0х05 протокола. Пример: mb.writeSingleCoils(1, \"0х0000\", 1)", "params": ["Адрес","Регистр","Данные"] }, { "name": "writeSingleRegister", - "descr": "Запись данных в один регистр. Функция 0х06 протокола. Пример: mb.writeSingleRegister(1, \"0х0000\", 128)", + "descr": "Запись данных в один регистр, вызывать из ModbusAsunc. Функция 0х06 протокола. Пример: mb.writeSingleRegister(1, \"0х0000\", 128)", "params": ["Адрес","Регистр","Данные"] }, { "name": "writeMultipleCoils", - "descr": "Запись данных в несколько койлов до 16 (число от 0 до 65535). Функция 0x0F протокола. Пример: mb.writeMultipleCoils(1, \"0х0000\", 4, 3) - будут записаны в четыре бита 0011", + "descr": "В разработке! Запись данных в несколько койлов до 16 (число от 0 до 65535), вызывать из ModbusAsunc. Функция 0x0F протокола. Пример: mb.writeMultipleCoils(1, \"0х0000\", 4, 3) - будут записаны в четыре бита 0011", "params": ["Адрес","Регистр","Кличество койлов (бит)","Данные"] }, { "name": "writeMultipleRegisters", - "descr": "Запись данных в несколько регистров. На данный момент записывает 2(два) регистра!!!!! Подходит для записи float?? Функция 0х10 протокола. Пример: mb.writeMultipleRegisters(1, \"0х0000\", 1234.987)", + "descr": "В разработке! Запись данных в несколько регистров, вызывать из ModbusAsunc. Записывает 2(два) регистра!!!!! Подходит для записи float?? Функция 0х10 протокола. Пример: mb.writeMultipleRegisters(1, \"0х0000\", 1234.987)", "params": ["Адрес","Регистр","Данные"] + }, + { + "name": "getBits", + "descr": "Получить из ModbusNode бит по его номеру, если ранее считали из слейва F0x01 или F0x02 более одного бита. Вернёт -1 если данных нет. Пример: mbNode.getCoil(0) получит первый из считанных бит", + "params": ["индекс бита"] } ] }, From e3d3bca68ea89ae5f12c6a45b87c63052e0c0fd0 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 14 Feb 2025 17:32:01 +0300 Subject: [PATCH 062/118] optimize memory, upd AnalogADC --- include/Const.h | 20 ++++++++++---------- include/ESPConfiguration.h | 2 +- include/MqttClient.h | 4 ++-- src/ESPConfiguration.cpp | 1 + src/Global.cpp | 3 ++- src/MqttClient.cpp | 15 +++++++++------ src/classes/IoTItem.cpp | 2 +- src/modules/sensors/AnalogAdc/AnalogAdc.cpp | 2 +- 8 files changed, 27 insertions(+), 22 deletions(-) diff --git a/include/Const.h b/include/Const.h index 9a18ea18..ca9718bb 100644 --- a/include/Const.h +++ b/include/Const.h @@ -109,8 +109,8 @@ enum TimerTask_t { WIFI_SCAN, WIFI_MQTT_CONNECTION_CHECK, TIME, - TIME_SYNC, - UPTIME, + // TIME_SYNC, // не используется + // UPTIME, // не используется UDPt, // UDPP TIMES, // периодические секундные проверки PTASK, @@ -119,12 +119,12 @@ enum TimerTask_t { END }; -// задачи которые надо протащить через loop -enum NotAsyncActions { - do_ZERO, - do_MQTTPARAMSCHANGED, - do_LAST, -}; +// задачи которые надо протащить через loop // не используется +// enum NotAsyncActions { +// do_ZERO, +// do_MQTTPARAMSCHANGED, +// do_LAST, +// }; // состояния обновления enum UpdateStates { UPDATE_COMPLETED, UPDATE_FAILED, PATH_ERROR }; @@ -132,7 +132,7 @@ enum UpdateStates { UPDATE_COMPLETED, UPDATE_FAILED, PATH_ERROR }; enum distination { TO_MQTT, TO_WS, - TO_MQTT_WS, + TO_MQTT_WS }; -#define WS_BROADCAST -1 +// #define WS_BROADCAST -1 // не используется diff --git a/include/ESPConfiguration.h b/include/ESPConfiguration.h index 1e185219..c795becd 100644 --- a/include/ESPConfiguration.h +++ b/include/ESPConfiguration.h @@ -6,4 +6,4 @@ extern std::list IoTItems; // вектор ссылок базово extern void configure(String path); void clearConfigure(); -extern IoTItem* myIoTItem; +// extern IoTItem* myIoTItem; // экономим память, используется в одном месте diff --git a/include/MqttClient.h b/include/MqttClient.h index f7614f94..0085401f 100644 --- a/include/MqttClient.h +++ b/include/MqttClient.h @@ -29,8 +29,8 @@ bool publishChartFileToMqtt(String path, String id, int maxCount); void publishWidgets(); void mqttCallback(char* topic, uint8_t* payload, size_t length); -void handleMqttStatus(bool send); -void handleMqttStatus(bool send, int state); +//void handleMqttStatus(bool send); +void handleMqttStatus(bool send, int state == -1); const String getStateStr(int e); diff --git a/src/ESPConfiguration.cpp b/src/ESPConfiguration.cpp index 64db3e5e..af81f47c 100644 --- a/src/ESPConfiguration.cpp +++ b/src/ESPConfiguration.cpp @@ -23,6 +23,7 @@ void configure(String path) { jsonArrayElement = ""; } if (jsonArrayElement != "") { + IoTItem* myIoTItem; String subtype; if (!jsonRead(jsonArrayElement, F("subtype"), subtype)) { //если нет такого ключа в представленном json или он не валидный SerialPrint(F("E"), F("Config"), "json error " + subtype); diff --git a/src/Global.cpp b/src/Global.cpp index 0e00c731..9843a65d 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -4,7 +4,8 @@ *****************************************глобальные объекты классов*************************************************** **********************************************************************************************************************/ -TickerScheduler ts(END + 1); +// TickerScheduler ts(END + 1); // зачем на 1 больше? +TickerScheduler ts(END); WiFiClient espClient; PubSubClient mqtt(espClient); diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index 2f5a205d..199aef48 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -343,14 +343,17 @@ bool publishChartFileToMqtt(String path, String id, int maxCount) { return true; } -void handleMqttStatus(bool send) { - String stateStr = getStateStr(mqtt.state()); - // Serial.println(stateStr); - jsonWriteStr_(errorsHeapJson, F("mqtt"), stateStr); - if (!send) sendStringToWs("errors", errorsHeapJson, -1); -} +// void handleMqttStatus(bool send) { +// String stateStr = getStateStr(mqtt.state()); +// // Serial.println(stateStr); +// jsonWriteStr_(errorsHeapJson, F("mqtt"), stateStr); +// if (!send) sendStringToWs("errors", errorsHeapJson, -1); +// } void handleMqttStatus(bool send, int state) { + if (state == -1) { + state = mqtt.state(); + } String stateStr = getStateStr(state); // Serial.println(stateStr); jsonWriteStr_(errorsHeapJson, F("mqtt"), stateStr); diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index 60cadc34..33984eda 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -289,7 +289,7 @@ unsigned long IoTItem::getRtcUnixTime() //========================================================================================================================================= -IoTItem* myIoTItem; +// IoTItem* myIoTItem; // экономим память, используется в одном месте // поиск элемента модуля в существующей конфигурации IoTItem* findIoTItem(const String& name) { diff --git a/src/modules/sensors/AnalogAdc/AnalogAdc.cpp b/src/modules/sensors/AnalogAdc/AnalogAdc.cpp index 4ee91d51..f5a2cb51 100644 --- a/src/modules/sensors/AnalogAdc/AnalogAdc.cpp +++ b/src/modules/sensors/AnalogAdc/AnalogAdc.cpp @@ -46,7 +46,7 @@ class AnalogAdc : public IoTItem { // и выполнить за несколько тактов void doByInterval() { if (_avgSteps <= 1) value.valD = IoTgpio.analogRead(_pin); - value.valD = adCresult;/// + else value.valD = adCresult;/// regEvent(value.valD, "AnalogAdc"); //обязательный вызов хотяб один } From 95b9dc3d2d0102ca7003ab010e06fa99b48086bb Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 14 Feb 2025 18:42:07 +0300 Subject: [PATCH 063/118] fix BLE --- include/MqttClient.h | 2 +- src/modules/sensors/Ble/Ble.cpp | 4 ++-- src/modules/sensors/Ble_part1/Ble_p1.cpp | 13 +++++++------ src/modules/sensors/Ble_part2/Ble_p2.cpp | 11 ++++++----- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/include/MqttClient.h b/include/MqttClient.h index 0085401f..9ab587dc 100644 --- a/include/MqttClient.h +++ b/include/MqttClient.h @@ -30,7 +30,7 @@ void publishWidgets(); void mqttCallback(char* topic, uint8_t* payload, size_t length); //void handleMqttStatus(bool send); -void handleMqttStatus(bool send, int state == -1); +void handleMqttStatus(bool send, int state = -1); const String getStateStr(int e); diff --git a/src/modules/sensors/Ble/Ble.cpp b/src/modules/sensors/Ble/Ble.cpp index 370287be..7dab51b5 100644 --- a/src/modules/sensors/Ble/Ble.cpp +++ b/src/modules/sensors/Ble/Ble.cpp @@ -181,7 +181,7 @@ void scanEndedCB(NimBLEScanResults results) //#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //class BleScan : public IoTItem, NimBLEScanCallbacks //#else -class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbacks +class BleScan : public IoTItem, NimBLEScanCallbacks //BLEAdvertisedDeviceCallbacks //NimBLEScanCallbacks //#endif { private: @@ -205,7 +205,7 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbac return spr; } - void onResult(BLEAdvertisedDevice *advertisedDevice) + void onResult(const NimBLEAdvertisedDevice *advertisedDevice) override { JsonObject BLEdata = doc.to(); String mac_adress_ = advertisedDevice->getAddress().toString().c_str(); diff --git a/src/modules/sensors/Ble_part1/Ble_p1.cpp b/src/modules/sensors/Ble_part1/Ble_p1.cpp index 2aab9be7..c174a274 100644 --- a/src/modules/sensors/Ble_part1/Ble_p1.cpp +++ b/src/modules/sensors/Ble_part1/Ble_p1.cpp @@ -181,7 +181,7 @@ void scanEndedCB(NimBLEScanResults results) //#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //class BleScan : public IoTItem, NimBLEScanCallbacks //#else -class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbacks +class BleScan : public IoTItem, NimBLEScanCallbacks//BLEAdvertisedDeviceCallbacks //NimBLEScanCallbacks //#endif { private: @@ -205,13 +205,13 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbac return spr; } - void onResult(BLEAdvertisedDevice *advertisedDevice) + void onResult(const NimBLEAdvertisedDevice *advertisedDevice) override { JsonObject BLEdata = doc.to(); String mac_adress_ = advertisedDevice->getAddress().toString().c_str(); mac_adress_.toUpperCase(); BLEdata["id"] = (char *)mac_adress_.c_str(); - + //SerialPrint("i", F("BLE"), "FOUND "+ mac_adress_); if (advertisedDevice->haveName()) { BLEdata["name"] = (char *)advertisedDevice->getName().c_str(); @@ -304,6 +304,7 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbac BleScan(String parameters) : IoTItem(parameters) { _scanDuration = jsonReadInt(parameters, "scanDuration"); + _scanDuration = _scanDuration * 1000; _filter = jsonReadStr(parameters, "filter"); jsonRead(parameters, "debug", _debug); @@ -342,13 +343,13 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbac //======================================================================================================= -void *getAPI_Ble(String subtype, String param) +void *getAPI_Ble_part1(String subtype, String param) { - if (subtype == F("BleScan")) + if (subtype == F("BleScan_p1")) { return new BleScan(param); } - else if (subtype == F("BleSens")) + else if (subtype == F("BleSens_p1")) { return new BleSens(param); } diff --git a/src/modules/sensors/Ble_part2/Ble_p2.cpp b/src/modules/sensors/Ble_part2/Ble_p2.cpp index f74b2419..bb815f0c 100644 --- a/src/modules/sensors/Ble_part2/Ble_p2.cpp +++ b/src/modules/sensors/Ble_part2/Ble_p2.cpp @@ -181,7 +181,7 @@ void scanEndedCB(NimBLEScanResults results) //#if defined (esp32c6_4mb) || defined (esp32c6_8mb) //class BleScan : public IoTItem, NimBLEScanCallbacks //#else -class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbacks +class BleScan : public IoTItem, NimBLEScanCallbacks //BLEAdvertisedDeviceCallbacks //NimBLEScanCallbacks //#endif { private: @@ -205,7 +205,7 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbac return spr; } - void onResult(BLEAdvertisedDevice *advertisedDevice) + void onResult(const NimBLEAdvertisedDevice *advertisedDevice) override { JsonObject BLEdata = doc.to(); String mac_adress_ = advertisedDevice->getAddress().toString().c_str(); @@ -304,6 +304,7 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbac BleScan(String parameters) : IoTItem(parameters) { _scanDuration = jsonReadInt(parameters, "scanDuration"); + _scanDuration = _scanDuration * 1000; _filter = jsonReadStr(parameters, "filter"); jsonRead(parameters, "debug", _debug); @@ -342,13 +343,13 @@ class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks //NimBLEScanCallbac //======================================================================================================= -void *getAPI_Ble(String subtype, String param) +void *getAPI_Ble_part2(String subtype, String param) { - if (subtype == F("BleScan")) + if (subtype == F("BleScan_p2")) { return new BleScan(param); } - else if (subtype == F("BleSens")) + else if (subtype == F("BleSens_p2")) { return new BleSens(param); } From dccdf4af662d1a864f85f96c006466427211d1db Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 14 Feb 2025 19:03:23 +0300 Subject: [PATCH 064/118] fix ble --- src/modules/sensors/Ble/Ble.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/sensors/Ble/Ble.cpp b/src/modules/sensors/Ble/Ble.cpp index 7dab51b5..b687bfe8 100644 --- a/src/modules/sensors/Ble/Ble.cpp +++ b/src/modules/sensors/Ble/Ble.cpp @@ -304,6 +304,7 @@ class BleScan : public IoTItem, NimBLEScanCallbacks //BLEAdvertisedDeviceCallbac BleScan(String parameters) : IoTItem(parameters) { _scanDuration = jsonReadInt(parameters, "scanDuration"); + _scanDuration = _scanDuration * 1000; _filter = jsonReadStr(parameters, "filter"); jsonRead(parameters, "debug", _debug); From 9b620fda5ed66542b409a101ee961fc80c73efec Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 15 Feb 2025 00:20:44 +0300 Subject: [PATCH 065/118] new WiFi async connect --- include/Const.h | 3 + include/utils/WiFiUtils.h | 12 +- src/Main.cpp | 5 +- src/WsServer.cpp | 4 +- .../sensors/ModbusRTUasync/modinfo.json | 3 - src/utils/WiFiUtils.cpp | 460 +++++++++++++----- tools/patch32_ws.py | 2 +- 7 files changed, 371 insertions(+), 118 deletions(-) diff --git a/include/Const.h b/include/Const.h index ca9718bb..691983f0 100644 --- a/include/Const.h +++ b/include/Const.h @@ -108,6 +108,9 @@ WEB_SOCKETS_FRAME_SIZE создан для того что бы не загру enum TimerTask_t { WIFI_SCAN, WIFI_MQTT_CONNECTION_CHECK, +#ifndef ESP8266 + WIFI_CONN, +#endif TIME, // TIME_SYNC, // не используется // UPTIME, // не используется diff --git a/include/utils/WiFiUtils.h b/include/utils/WiFiUtils.h index 593a39f1..96fed80f 100644 --- a/include/utils/WiFiUtils.h +++ b/include/utils/WiFiUtils.h @@ -4,11 +4,19 @@ #include "MqttClient.h" boolean isNetworkActive(); uint8_t getNumAPClients(); +#ifdef ESP8266 void routerConnect(); -bool startAPMode(); boolean RouterFind(std::vector jArray); +#else +void handleScanResults(); +void WiFiUtilsItit(); +void connectToNextNetwork(); +void checkConnection(); +void ScanAsync(); +bool startAPMode(); +#endif uint8_t RSSIquality(); -extern void wifiSignalInit(); +//extern void wifiSignalInit(); #ifdef LIBRETINY String httpGetString(HTTPClient &http); #endif \ No newline at end of file diff --git a/src/Main.cpp b/src/Main.cpp index cf82ef14..e95706dc 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -200,8 +200,11 @@ void setup() { initErrorMarker(SETUPINET_ERRORMARKER); // подключаемся к роутеру +#ifdef ESP8266 routerConnect(); - +#else + WiFiUtilsItit(); +#endif // инициализация асинхронного веб сервера и веб сокетов #ifdef ASYNC_WEB_SERVER asyncWebServerInit(); diff --git a/src/WsServer.cpp b/src/WsServer.cpp index ad3e6bc5..a711a3ce 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -61,7 +61,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) //----------------------------------------------------------------------// if (headerStr == "p|") { standWebSocket.sendTXT(num, "p|"); - Serial.printf("Ping client: %u\n", num); + //Serial.printf("Ping client: %u\n", num); ws_clients[num]=1; } // публикация всех виджетов @@ -175,7 +175,9 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) if (headerStr == "/scan|") { std::vector jArray; jsonReadArray(settingsFlashJson, "routerssid", jArray); +#ifdef ESP8266 RouterFind(jArray); +#endif sendStringToWs("ssidli", ssidListHeapJson, num); } diff --git a/src/modules/sensors/ModbusRTUasync/modinfo.json b/src/modules/sensors/ModbusRTUasync/modinfo.json index 88afa653..429f6059 100644 --- a/src/modules/sensors/ModbusRTUasync/modinfo.json +++ b/src/modules/sensors/ModbusRTUasync/modinfo.json @@ -98,9 +98,6 @@ "usedLibs": { "esp32*": [ "https://github.com/eModBus/eModBus" - ], - "esp82*": [ - "https://github.com/eModBus/eModBus" ] } } \ No newline at end of file diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index 429b5164..7b2c2441 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -3,17 +3,276 @@ #if defined(ESP32) #include #endif -#define TRIESONE 25 // количество попыток подключения к одной сети из несколких -#define TRIES 40 // количество попыток подключения сети если она одна -/* -IPAddress stringToIp(String strIp) +#define TRIESONE 20 // количество секунд ожидания подключения к одной сети из несколких +#define TRIES 30 // количество секунд ожидания подключения сети если она одна + +#ifndef ESP8266 +std::vector _ssidList; +std::vector _passwordList; +volatile bool scanInProgress = false; +// номер сети, для перебирания в момент подключения к сетям из массива +volatile uint8_t currentNetwork = 0; +volatile bool wifiConnecting = false; +volatile uint8_t connectionAttempts = 0; +//------------------------------------------ +// Обработчики событий Wi-Fi +//------------------------------------------ +void WiFiEvent(arduino_event_t *event) { - IPAddress ip; - ip.fromString(strIp); - return ip; -} */ + switch (event->event_id) + { +#if defined(LIBRETINY) || defined(esp32c6_4mb) || defined(esp32c6_8mb) + case ARDUINO_EVENT_WIFI_STA_CONNECTED: +#else + case SYSTEM_EVENT_STA_CONNECTED: +#endif + // Подключились к STA + SerialPrint("i", "WIFI", "Connected to AP: " + WiFi.SSID()); + // TODO если подключились, но не получили IP что будет? + break; +#if defined(LIBRETINY) || defined(esp32c6_4mb) || defined(esp32c6_8mb) + case ARDUINO_EVENT_WIFI_STA_GOT_IP: +#else + case SYSTEM_EVENT_STA_GOT_IP: +#endif + // Получили IP от роутера + // wifiReconnectTicker.detach(); + ts.remove(WIFI_SCAN); + ts.remove(WIFI_CONN); +#ifdef LIBRETINY + SerialPrint("i", "WIFI", "http://" + ipToString(WiFi.localIP())); + jsonWriteStr(settingsFlashJson, "ip", ipToString(WiFi.localIP())); +#else + SerialPrint("i", "WIFI", "http://" + WiFi.localIP().toString()); + jsonWriteStr(settingsFlashJson, "ip", WiFi.localIP().toString()); +#endif + // запускаем MQTT + mqttInit(); + SerialPrint("i", F("WIFI"), F("Network Init")); + // Отключаем AP при успешном подключении + WiFi.softAPdisconnect(true); + break; +#if defined(LIBRETINY) || defined(esp32c6_4mb) || defined(esp32c6_8mb) + case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: +#else + case SYSTEM_EVENT_STA_DISCONNECTED: +#endif + // Отключились от STA + SerialPrint("i", "WIFI", "Disconnected from STA"); + // Завершаем задачу проверки сети + ts.remove(WIFI_CONN); + if (wifiConnecting) + { // если у нас ещё не закончились попытки подключения, то перезапускаем задачу + Serial.print("."); + checkConnection(); + // wifiReconnectTicker.once_ms(WIFI_CHECK_INTERVAL, checkConnection); + } + else + { // если попытки подключения исчерпаны, то переходим в AP + startAPMode(); + } + break; +#if defined(LIBRETINY) || defined(esp32c6_4mb) || defined(esp32c6_8mb) + case ARDUINO_EVENT_WIFI_SCAN_DONE: +#else + case SYSTEM_EVENT_SCAN_DONE: +#endif + // Завершилось сканирование сетей + Serial.println("Scan completed"); + scanInProgress = false; + handleScanResults(); + break; + } +} +//------------------------------------------ +// Обработка результатов сканирования +//------------------------------------------ +void handleScanResults() +{ + ssidListHeapJson = "{}"; + _ssidList.clear(); + _passwordList.clear(); + jsonReadArray(settingsFlashJson, "routerssid", _ssidList); + jsonReadArray(settingsFlashJson, "routerpass", _passwordList); + int16_t numNetworks = WiFi.scanComplete(); + if (numNetworks <= 0) + { + SerialPrint("i", "WIFI", "no networks found"); + return; + } + + // Ищем известные сети + int connectNumNet = -1; + // SerialPrint("i", "WIFI", "Count found: "+numNetworks); + for (int n = 0; n < numNetworks; ++n) + { + String ssid = WiFi.SSID(n); + jsonWriteStr_(ssidListHeapJson, String(n), ssid); + for (size_t i = 0; i < _ssidList.size(); i++) + { + if (ssid == _ssidList[i]) + { + Serial.printf("Found known network: %s\n", _ssidList[i]); + if (connectNumNet < 0) + connectNumNet = i; + } + } + + // if + } + SerialPrint("i", "WIFI", "Scan Found: " + ssidListHeapJson); + if (connectNumNet >= 0) + { + // ts.remove(WIFI_SCAN); + connectToNextNetwork(); + } + // checkConnection(); + // connectToSTA(_ssidList[connectNumNet], _passwordList[connectNumNet]); + WiFi.scanDelete(); +} + +void WiFiUtilsItit() +{ +#if !defined LIBRETINY +#if defined(esp32c6_4mb) || defined(esp32c6_8mb) + WiFi.setAutoReconnect(false); +#else + WiFi.setAutoConnect(false); +#endif + WiFi.persistent(false); + WiFi.setSleep(true); +#endif + WiFi.mode(WIFI_STA); + WiFi.onEvent(WiFiEvent); + jsonReadArray(settingsFlashJson, "routerssid", _ssidList); + jsonReadArray(settingsFlashJson, "routerpass", _passwordList); + + if (_ssidList.empty() || _passwordList.empty()) + { + SerialPrint("E", "WIFI", "No networks configured"); + startAPMode(); + return; + } + currentNetwork = 0; + connectionAttempts = 0; + connectToNextNetwork(); +} + +void connectToNextNetwork() +{ + // все сети перебрали + if (currentNetwork >= _ssidList.size()) + { + SerialPrint("i", "WIFI", "All networks tried"); + ts.remove(WIFI_CONN); + startAPMode(); + return; + } + + wifiConnecting = true; + // connectionAttempts++; + + const char *ssid = _ssidList[currentNetwork].c_str(); + const char *pass = _passwordList[currentNetwork].c_str(); + // Пробуем подключиться к сети + SerialPrint("i", "WIFI", "Connecting to: " + String(ssid)); + WiFi.begin(ssid, pass); + +#if defined(ESP32) + WiFi.setTxPower(WIFI_POWER_19_5dBm); +#elif defined(ESP8266) + WiFi.setOutputPower(20.5); +#endif + // проверяем статус подключения и перебираем сети если таймаут не вышел + checkConnection(); + + // wifiReconnectTicker.once_ms(WIFI_CHECK_INTERVAL, checkConnection); +} + +void checkConnection() +{ + ts.add( + WIFI_CONN, 1000, + [&](void *) + { + connectionAttempts++; + if (WiFi.status() == WL_CONNECTED) + { + connectionAttempts = 0; + wifiConnecting = false; + return; + } + + if (connectionAttempts >= (_ssidList.size() > 1 ? TRIESONE : TRIES)) + { + SerialPrint("i", "WIFI", "Max attempts reached"); + currentNetwork++; + connectionAttempts = 0; + wifiConnecting = false; + } + + if (wifiConnecting) + { +#ifdef ESP8266 + if (WiFi.status() == WL_CONNECT_FAILED || WiFi.status() == WL_WRONG_PASSWORD) +#else + if (WiFi.status() == WL_CONNECT_FAILED) +#endif + { + SerialPrint("E", "WIFI", "Connection failed, wrong password?"); + jsonWriteInt(errorsHeapJson, "passer", 1); + currentNetwork++; + connectionAttempts = 0; + } + + // wifiReconnectTicker.once_ms(WIFI_CHECK_INTERVAL, checkConnection); + } + + if (!wifiConnecting) + { + connectToNextNetwork(); + } + }, + nullptr, true); +} + +//------------------------------------------ +// Неблокирующее подключение к STA +//------------------------------------------ +void connectToSTA(const char *ssid, const char *pass) +{ + if (isNetworkActive()) + return; + SerialPrint("i", "WIFI", "Connecting to ... " + String(ssid)); + // SerialPrint("i", "WIFI", "pass connect: " + _passwordList[i]); + WiFi.begin(ssid, pass); +#if defined(ESP32) + WiFi.setTxPower(WIFI_POWER_19_5dBm); +#elif defined(ESP8266) + WiFi.setOutputPower(20.5); +#endif +} + +void ScanAsync() +{ + // bool res = false; + int n = WiFi.scanComplete(); + SerialPrint("i", "WIFI", "scan result: " + String(n, DEC)); + + if (n == -1) + { // Сканирование все еще выполняется + SerialPrint("i", "WIFI", "scanning in progress"); + } + else + { + SerialPrint("i", "WIFI", "start scanning"); + WiFi.scanNetworks(true, false); + } +} +#else +// ESP8266 void routerConnect() { #if !defined LIBRETINY @@ -126,9 +385,14 @@ void routerConnect() } SerialPrint("i", F("WIFI"), F("Network Init")); } - +#endif bool startAPMode() { +#ifndef ESP8266 + wifiConnecting = false; + currentNetwork = 0; + connectionAttempts = 0; +#endif SerialPrint("i", "WIFI", "AP Mode"); WiFi.disconnect(); @@ -137,9 +401,9 @@ bool startAPMode() String _ssidAP = jsonReadStr(settingsFlashJson, "apssid"); String _passwordAP = jsonReadStr(settingsFlashJson, "appass"); if (_passwordAP == "") - WiFi.softAP(_ssidAP.c_str()); + WiFi.softAP(_ssidAP.c_str(), NULL, 6); else - WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str()); + WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str(), 6); IPAddress myIP = WiFi.softAPIP(); #ifdef LIBRETINY SerialPrint("i", "WIFI", "AP IP: " + ipToString(myIP)); @@ -154,6 +418,7 @@ bool startAPMode() WIFI_SCAN, 30 * 1000, [&](void *) { +#ifdef ESP8266 std::vector jArray; jsonReadArray(settingsFlashJson, "routerssid", jArray); for (int8_t i = 0; i < jArray.size(); i++) @@ -166,59 +431,16 @@ bool startAPMode() WiFi.scanDelete(); routerConnect(); } +#else + ScanAsync(); +#endif }, nullptr, true); } return true; } -#if defined (LIBRETINY) -boolean RouterFind(std::vector jArray) -{ - bool res = false; - int n = WiFi.scanComplete(); - SerialPrint("i", "WIFI", "scan result: " + String(n, DEC)); - - if (n == -2) - { // Сканирование не было запущено, запускаем - SerialPrint("i", "WIFI", "start scanning"); - n = WiFi.scanNetworks(false, false); // async, show_hidden - SerialPrint("i", "WIFI", "scan result: " + String(n, DEC)); - } - - else if (n == -1) - { // Сканирование все еще выполняется - SerialPrint("i", "WIFI", "scanning in progress"); - } - - else if (n == 0) - { // ни одна сеть не найдена - SerialPrint("i", "WIFI", "no networks found"); - n = WiFi.scanNetworks(false, false); - SerialPrint("i", "WIFI", "scan result: " + String(n, DEC)); - } - - if (n > 0) - { - for (int8_t i = 0; i < n; i++) - { - for (int8_t k = 0; k < jArray.size(); k++) - { - if (WiFi.SSID(i) == jArray[k]) - { - res = true; - } - } - // SerialPrint("i", "WIFI", (res ? "*" : "") + String(i, DEC) + ") " + WiFi.SSID(i)); - jsonWriteStr_(ssidListHeapJson, String(i), WiFi.SSID(i)); - // String(WiFi.RSSI(i) - } - } - SerialPrint("i", "WIFI", ssidListHeapJson); - WiFi.scanDelete(); - return res; -} -#elif defined (ESP8266) || defined (ESP32) +#if defined(ESP8266) boolean RouterFind(std::vector jArray) { bool res = false; @@ -264,67 +486,85 @@ boolean RouterFind(std::vector jArray) } #endif -boolean isNetworkActive() { - return WiFi.status() == WL_CONNECTED; +boolean isNetworkActive() +{ + return WiFi.status() == WL_CONNECTED; } -uint8_t getNumAPClients() { - return WiFi.softAPgetStationNum(); +uint8_t getNumAPClients() +{ + return WiFi.softAPgetStationNum(); } -uint8_t RSSIquality() { - uint8_t res = 0; - if (isNetworkActive()) { - int rssi = WiFi.RSSI(); - if (rssi >= -50) { - res = 6; //"Excellent"; - } else if (rssi < -50 && rssi >= -60) { - res = 5; //"Very good"; - } else if (rssi < -60 && rssi >= -70) { - res = 4; //"Good"; - } else if (rssi < -70 && rssi >= -80) { - res = 3; //"Low"; - } else if (rssi < -80 && rssi > -100) { - res = 2; //"Very low"; - } else if (rssi <= -100) { - res = 1; //"No signal"; - } +uint8_t RSSIquality() +{ + uint8_t res = 0; + if (isNetworkActive()) + { + int rssi = WiFi.RSSI(); + if (rssi >= -50) + { + res = 6; //"Excellent"; } - return res; + else if (rssi < -50 && rssi >= -60) + { + res = 5; //"Very good"; + } + else if (rssi < -60 && rssi >= -70) + { + res = 4; //"Good"; + } + else if (rssi < -70 && rssi >= -80) + { + res = 3; //"Low"; + } + else if (rssi < -80 && rssi > -100) + { + res = 2; //"Very low"; + } + else if (rssi <= -100) + { + res = 1; //"No signal"; + } + } + return res; } #ifdef LIBRETINY String httpGetString(HTTPClient &http) { - String payload = ""; - int len = http.getSize(); - uint8_t buff[128] = { 0 }; - WiFiClient * stream = http.getStreamPtr(); - - // read all data from server - while(http.connected() && (len > 0 || len == -1)) { - // get available data size - size_t size = stream->available(); - - if(size) { - // read up to 128 byte - int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size)); - - // write it to Serial - // Serial.write(buff,c); - - //payload += String((char*)buff); - char charBuff[c + 1]; // Create a character array with space for null terminator - memcpy(charBuff, buff, c); // Copy the data to the character array - charBuff[c] = '\0'; // Null-terminate the character array - payload += String(charBuff); // Append the character array to the payload - - if(len > 0) { - len -= c; - } - } - delay(1); - } - return payload; + String payload = ""; + int len = http.getSize(); + uint8_t buff[128] = {0}; + WiFiClient *stream = http.getStreamPtr(); + + // read all data from server + while (http.connected() && (len > 0 || len == -1)) + { + // get available data size + size_t size = stream->available(); + + if (size) + { + // read up to 128 byte + int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size)); + + // write it to Serial + // Serial.write(buff,c); + + // payload += String((char*)buff); + char charBuff[c + 1]; // Create a character array with space for null terminator + memcpy(charBuff, buff, c); // Copy the data to the character array + charBuff[c] = '\0'; // Null-terminate the character array + payload += String(charBuff); // Append the character array to the payload + + if (len > 0) + { + len -= c; + } + } + delay(1); + } + return payload; } #endif \ No newline at end of file diff --git a/tools/patch32_ws.py b/tools/patch32_ws.py index 86df29dc..33214618 100644 --- a/tools/patch32_ws.py +++ b/tools/patch32_ws.py @@ -26,7 +26,7 @@ oldData = fr.read() if not 'if WIFI_CLIENT_MAX_WRITE_RETRY (10)' in oldData: shutil.copyfile(mainPyPath, mainPyPath+'.bak') - newData = oldData.replace('#define WIFI_CLIENT_MAX_WRITE_RETRY (10)', '#define WIFI_CLIENT_MAX_WRITE_RETRY (2)') + newData = oldData.replace('#define WIFI_CLIENT_MAX_WRITE_RETRY (10)', '#define WIFI_CLIENT_MAX_WRITE_RETRY (5)') newData = newData.replace('#define WIFI_CLIENT_SELECT_TIMEOUT_US (1000000)', '#define WIFI_CLIENT_SELECT_TIMEOUT_US (500000)') with open(mainPyPath, 'w') as fw: fw.write(newData) From 9d32b0c33dfb516132a71c3f81a65a82c60c169d Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 15 Feb 2025 20:36:00 +0300 Subject: [PATCH 066/118] fix AnalogAdc --- src/modules/sensors/AnalogAdc/AnalogAdc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/sensors/AnalogAdc/AnalogAdc.cpp b/src/modules/sensors/AnalogAdc/AnalogAdc.cpp index f5a2cb51..564dd2eb 100644 --- a/src/modules/sensors/AnalogAdc/AnalogAdc.cpp +++ b/src/modules/sensors/AnalogAdc/AnalogAdc.cpp @@ -17,7 +17,7 @@ class AnalogAdc : public IoTItem { unsigned int _pin; unsigned int _avgSteps, _avgCount; unsigned long _avgSumm; - float adCresult; + float adCresult = 0; public: //======================================================================================================= From 2e8a7f111cfab06d8b23a0f3c7a60e62987c6855 Mon Sep 17 00:00:00 2001 From: Ilya Date: Sun, 16 Feb 2025 14:19:45 +0300 Subject: [PATCH 067/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B8=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D1=8F=20\\"=20=D0=B8=20\\n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTScenario.cpp | 11 ++++++++++- src/modules/sceninfo.json | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 34b6eb0f..754d12c5 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -707,7 +707,16 @@ int IoTScenario::gettok() { IdentifierStr = ""; LastChar = getLastChar(); while (LastChar != '"' && LastChar != EOF) { - IdentifierStr += (char)LastChar; + if (LastChar == '\\') { // обработка экранированных символов в строке + LastChar = getLastChar(); + if (LastChar == '"') { + IdentifierStr += '"'; + } else if (LastChar == 'n') { + IdentifierStr += '\n'; + } + } else { + IdentifierStr += (char)LastChar; + } LastChar = getLastChar(); } LastChar = getLastChar(); diff --git a/src/modules/sceninfo.json b/src/modules/sceninfo.json index 551f6d0e..53265548 100644 --- a/src/modules/sceninfo.json +++ b/src/modules/sceninfo.json @@ -7,7 +7,7 @@ "moduleName": "Scenario", "moduleVersion": "1.0", "title": "Сценарии", - "moduleDesc": "Сценарии позволяют реализовать индивидуальный алгоритм работы контроллера с учетом происходящих событий. Они представляют из себя описательный язык того, что нужно сделать при наступлении того или иного события, учитывая конкретные условия. \nВ базе языка - выражение вида: “Если условие истина, то выполнить одно действие, а если нет, то иное”. При этом проверка такого выражения будет осуществляться только при наступлении события связанного с элементом конфигурации, который упоминается в этом выражении. \nУсловием или действием может быть любое разрешенное выражение. Они все при выполнении возвращают значение. Выражение может состоять из: идентификаторов элементов конфигурации, чисел (целые, дробные и отрицательные), строк в кавычках, операций сравнения < > <= >= == !=, операций присваивания значений =, математических операций +-*/, логических операций &|, комментариев после символа #, функций (в параметрах которых так же могут быть любые разрешенные выражения), конструкции ветвления IfThenElse, группирующие блоки выражений {}", + "moduleDesc": "Сценарии позволяют реализовать индивидуальный алгоритм работы контроллера с учетом происходящих событий. Они представляют из себя описательный язык того, что нужно сделать при наступлении того или иного события, учитывая конкретные условия. \nВ базе языка - выражение вида: “Если условие истина, то выполнить одно действие, а если нет, то иное”. При этом проверка такого выражения будет осуществляться только при наступлении события связанного с элементом конфигурации, который упоминается в этом выражении. \nУсловием или действием может быть любое разрешенное выражение. Они все при выполнении возвращают значение. Выражение может состоять из: идентификаторов элементов конфигурации, чисел (целые, дробные и отрицательные), строк в кавычках, операций сравнения < > <= >= == !=, операций присваивания значений =, математических операций +-*/, логических операций &|, комментариев после символа #, функций (в параметрах которых так же могут быть любые разрешенные выражения), конструкции ветвления IfThenElse, группирующие блоки выражений {}, экранирование символа кавычек и переноса строки", "funcInfo": [ { "name": "getIntFromNet", From 9cbf5f0b388742c6404da211b77bda196c0fbdb0 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 17 Feb 2025 20:49:33 +0300 Subject: [PATCH 068/118] upd AnalogADC, fix asyncWiFi UDP --- src/Main.cpp | 17 +++++ src/modules/sensors/AnalogAdc/AnalogAdc.cpp | 80 +++++++++++++-------- 2 files changed, 69 insertions(+), 28 deletions(-) diff --git a/src/Main.cpp b/src/Main.cpp index e95706dc..91102283 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -236,12 +236,15 @@ void setup() { // инициализация задач переодического выполнения periodicTasksInit(); +#if defined(ESP8266) + // Перенесли после получения IP, так как теперь работа WiFi асинхронная // запуск работы udp addThisDeviceToList(); #ifdef UDP_ENABLED udpListningInit(); udpBroadcastInit(); #endif +#endif // создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке createItemFromNet("onStart", "1", 1); @@ -302,6 +305,20 @@ void setup() { } void loop() { +#if !defined(ESP8266) + static bool udpFirstFlag = true; + // Перенесли после получения IP, так как теперь работа WiFi асинхронная + if (isNetworkActive() && udpFirstFlag) { + udpFirstFlag = false; + // запуск работы udp + addThisDeviceToList(); + #ifdef UDP_ENABLED + udpListningInit(); + udpBroadcastInit(); + #endif + } +#endif + #ifdef LOOP_DEBUG unsigned long st = millis(); #endif diff --git a/src/modules/sensors/AnalogAdc/AnalogAdc.cpp b/src/modules/sensors/AnalogAdc/AnalogAdc.cpp index 564dd2eb..1df0f770 100644 --- a/src/modules/sensors/AnalogAdc/AnalogAdc.cpp +++ b/src/modules/sensors/AnalogAdc/AnalogAdc.cpp @@ -7,33 +7,41 @@ extern IoTGpio IoTgpio; // для добавления сенсора вам нужно скопировать этот файл и заменить в нем текст AnalogAdc на название вашего сенсора // Название должно быть уникальным, коротким и отражать суть сенсора. -//ребенок - родитель -class AnalogAdc : public IoTItem { - private: +// ребенок - родитель +class AnalogAdc : public IoTItem +{ +private: //======================================================================================================= // Секция переменных. // Это секция где Вы можете объявлять переменные и объекты arduino библиотек, что бы // впоследствии использовать их в loop и setup unsigned int _pin; - unsigned int _avgSteps, _avgCount; - unsigned long _avgSumm; - float adCresult = 0; + unsigned int _avgSteps; + unsigned int realSteps; + float _adcAverage = 0; + unsigned int _period = 0; + unsigned long _lastSoundingMillis = 0; - public: +public: //======================================================================================================= // setup() // это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора. // Такие как ...begin и подставлять в них параметры полученные из web интерфейса. // Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции: // jsonReadStr, jsonReadBool, jsonReadInt - AnalogAdc(String parameters) : IoTItem(parameters) { + AnalogAdc(String parameters) : IoTItem(parameters) + { _pin = jsonReadInt(parameters, "pin"); _avgSteps = jsonReadInt(parameters, "avgSteps"); - if (!_avgSteps) { + if (!_avgSteps) + { jsonRead(parameters, F("int"), _interval, false); } - _avgSumm = 0; - _avgCount = 0; + else + { + _period = _interval / _avgSteps; + } + // Serial.println("_period = " + String(_period)); } //======================================================================================================= @@ -44,10 +52,19 @@ class AnalogAdc : public IoTItem { // если у сенсора несколько величин то делайте несколько regEvent // не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции // и выполнить за несколько тактов - void doByInterval() { - if (_avgSteps <= 1) value.valD = IoTgpio.analogRead(_pin); - else value.valD = adCresult;/// - regEvent(value.valD, "AnalogAdc"); //обязательный вызов хотяб один + void doByInterval() + { + if (_avgSteps <= 1) + value.valD = IoTgpio.analogRead(_pin); + else + { + value.valD = _adcAverage / (float)realSteps; + //Serial.print("value= " + String(value.valD) + " \t"); + //Serial.print("adcAverage = " + String(_adcAverage) + " \t"); + //Serial.println("realSteps = " + String(realSteps)); + realSteps = 0; + } + regEvent(value.valD, "AnalogAdc"); // обязательный вызов хотяб один } //======================================================================================================= @@ -55,17 +72,20 @@ class AnalogAdc : public IoTItem { // полный аналог loop() из arduino. Нужно помнить, что все модули имеют равный поочередный доступ к центральному loop(), поэтому, необходимо следить // за задержками в алгоритме и не создавать пауз. Кроме того, данная версия перегружает родительскую, поэтому doByInterval() отключается, если // не повторить механизм расчета интервалов. - void loop() { - if (_avgSteps > 1) { - if (_avgCount > _avgSteps) { - // value.valD = _avgSumm / (_avgSteps + 1); - adCresult = _avgSumm / (_avgSteps + 1); - _avgSumm = 0; - _avgCount = 0; - } + void loop() + { + if (_avgSteps > 1) + { - _avgSumm = _avgSumm + IoTgpio.analogRead(_pin); - _avgCount++; + if (millis() > _lastSoundingMillis + _period) + { + realSteps++; + int sounding = IoTgpio.analogRead(_pin); + _adcAverage = _adcAverage + sounding; // IoTgpio.analogRead(_pin); + _lastSoundingMillis = millis(); + //Serial.print("adc= " + String(sounding) + " \t"); + //Serial.println("_adcAverage = " + String(_adcAverage)); + } } IoTItem::loop(); } @@ -76,10 +96,14 @@ class AnalogAdc : public IoTItem { // после замены названия сенсора, на функцию можно не обращать внимания // если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть // создание и контроль соответствующих глобальных переменных -void* getAPI_AnalogAdc(String subtype, String param) { - if (subtype == F("AnalogAdc")) { +void *getAPI_AnalogAdc(String subtype, String param) +{ + if (subtype == F("AnalogAdc")) + { return new AnalogAdc(param); - } else { + } + else + { return nullptr; } } From 33d19bea97e65979bb2ec862897d532760204b02 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 17 Feb 2025 22:32:08 +0300 Subject: [PATCH 069/118] open src EctoControl --- platformio.ini | 34 +- .../EctoControlAdapter/EctoControlAdapter.cpp | 2 +- .../exec/EctoControlAdapter/lib/ModbusEC.cpp | 517 ++++++++++++++ .../EctoControlAdapter/lib/rsEctoControl.cpp | 633 ++++++++++++++++++ .../EctoControlAdapter/lib/rsEctoControl.h | 3 - 5 files changed, 1165 insertions(+), 24 deletions(-) create mode 100644 src/modules/exec/EctoControlAdapter/lib/ModbusEC.cpp create mode 100644 src/modules/exec/EctoControlAdapter/lib/rsEctoControl.cpp diff --git a/platformio.ini b/platformio.ini index ce9d468f..00fd3a7f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,19 +10,13 @@ lib_deps_external = [env] extra_scripts = pre:tools/prebuildscript.py -[common] -build_flags = - -L./src/modules/exec/EctoControlAdapter/lib - -lrsEctoControl - -I./src/modules/exec/EctoControlAdapter/lib - [env:esp8266_1mb_ota] lib_deps = ${common_env_data.lib_deps_external} ${env:esp8266_1mb_ota_fromitems.lib_deps} ESPAsyncUDP lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp8266_1mb_ota="esp8266_1mb_ota" framework = arduino board = nodemcuv2 @@ -45,7 +39,7 @@ lib_deps = ${env:esp8266_1mb_fromitems.lib_deps} ESPAsyncUDP lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp8266_1mb="esp8266_1mb" framework = arduino board = nodemcuv2 @@ -68,7 +62,7 @@ lib_deps = ${env:esp8285_1mb_ota_fromitems.lib_deps} ESPAsyncUDP lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp8266_1mb_ota="esp8266_1mb_ota" framework = arduino board = esp8285 @@ -91,7 +85,7 @@ lib_deps = ${env:esp8266_2mb_fromitems.lib_deps} ESPAsyncUDP lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp8266_2mb="esp8266_2mb" framework = arduino board = d1_wroom_02 @@ -114,7 +108,7 @@ lib_deps = ${env:esp8266_2mb_ota_fromitems.lib_deps} ESPAsyncUDP lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp8266_2mb_ota="esp8266_2mb_ota" framework = arduino board = d1_wroom_02 @@ -137,7 +131,7 @@ lib_deps = ${env:esp8285_1mb_fromitems.lib_deps} ESPAsyncUDP lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp8266_1mb="esp8266_1mb" framework = arduino board = esp8285 @@ -160,7 +154,7 @@ lib_deps = ${env:esp8266_4mb_fromitems.lib_deps} ESPAsyncUDP lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp8266_4mb="esp8266_4mb" framework = arduino board = nodemcuv2 @@ -184,7 +178,7 @@ lib_deps = ${env:esp8266_16mb_fromitems.lib_deps} ESPAsyncUDP lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp8266_16mb="esp8266_16mb" framework = arduino board = nodemcuv2 @@ -207,7 +201,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_4mb_fromitems.lib_deps} lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp32_4mb="esp32_4mb" -Wl,--wrap=esp_panic_handler framework = arduino @@ -231,7 +225,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_4mb3f_fromitems.lib_deps} lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp32_4mb3f="esp32_4mb3f" -Wl,--wrap=esp_panic_handler framework = arduino @@ -256,7 +250,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp32cam_4mb_fromitems.lib_deps} lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp32cam_4mb="esp32cam_4mb" -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue @@ -282,7 +276,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp32s2_4mb_fromitems.lib_deps} lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp32s2_4mb="esp32s2_4mb" -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=0 @@ -333,7 +327,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp32s3_16mb_fromitems.lib_deps} lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp32s3_16mb="esp32s3_16mb" -Wl,--wrap=esp_panic_handler framework = arduino @@ -360,7 +354,7 @@ lib_deps = ${common_env_data.lib_deps_external} ${env:esp32_16mb_fromitems.lib_deps} lib_ignore = LT_WebSockets -build_flags = ${common.build_flags} +build_flags = -Desp32_16mb="esp32_16mb" -Wl,--wrap=esp_panic_handler framework = arduino diff --git a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp index 27e7ca73..2069027f 100644 --- a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp +++ b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp @@ -3,7 +3,7 @@ #include #include -#include "rsEctoControl.h" +#include "lib/rsEctoControl.h" // class ModbusUart; Stream *_mbUART = nullptr; diff --git a/src/modules/exec/EctoControlAdapter/lib/ModbusEC.cpp b/src/modules/exec/EctoControlAdapter/lib/ModbusEC.cpp new file mode 100644 index 00000000..79af9485 --- /dev/null +++ b/src/modules/exec/EctoControlAdapter/lib/ModbusEC.cpp @@ -0,0 +1,517 @@ + +#include "ModbusEC.h" + +ModbusMaster::ModbusMaster(void) +{ + _idle = 0; + _preTransmission = 0; + _postTransmission = 0; +} + +/** +Initialize class object. + +Assigns the Modbus slave ID and serial port. +Call once class has been instantiated, typically within setup(). + +@param slave Modbus slave ID (1..255) +@param &serial reference to serial port object (Serial, Serial1, ... Serial3) +@ingroup setup +*/ +void ModbusMaster::begin(uint8_t slave, Stream &serial) +{ + // txBuffer = (uint16_t*) calloc(ku8MaxBufferSize, sizeof(uint16_t)); + _u8MBSlave = slave; + _serial = &serial; + _u8TransmitBufferIndex = 0; + u16TransmitBufferLength = 0; + +#if __MODBUSMASTER_DEBUG__ + pinMode(__MODBUSMASTER_DEBUG_PIN_A__, OUTPUT); + pinMode(__MODBUSMASTER_DEBUG_PIN_B__, OUTPUT); +#endif +} + +void ModbusMaster::beginTransmission(uint16_t u16Address) +{ + _u16WriteAddress = u16Address; + _u8TransmitBufferIndex = 0; + u16TransmitBufferLength = 0; +} + +// eliminate this function in favor of using existing MB request functions +uint8_t ModbusMaster::requestFrom(uint16_t address, uint16_t quantity) +{ + uint8_t read; + // clamp to buffer length + if (quantity > ku8MaxBufferSize) + { + quantity = ku8MaxBufferSize; + } + // set rx buffer iterator vars + _u8ResponseBufferIndex = 0; + _u8ResponseBufferLength = read; + + return read; +} + +void ModbusMaster::sendBit(bool data) +{ + uint8_t txBitIndex = u16TransmitBufferLength % 16; + if ((u16TransmitBufferLength >> 4) < ku8MaxBufferSize) + { + if (0 == txBitIndex) + { + _u16TransmitBuffer[_u8TransmitBufferIndex] = 0; + } + bitWrite(_u16TransmitBuffer[_u8TransmitBufferIndex], txBitIndex, data); + u16TransmitBufferLength++; + _u8TransmitBufferIndex = u16TransmitBufferLength >> 4; + } +} + +void ModbusMaster::send(uint16_t data) +{ + if (_u8TransmitBufferIndex < ku8MaxBufferSize) + { + _u16TransmitBuffer[_u8TransmitBufferIndex++] = data; + u16TransmitBufferLength = _u8TransmitBufferIndex << 4; + } +} + +void ModbusMaster::send(uint32_t data) +{ + send(lowWord(data)); + send(highWord(data)); +} + +void ModbusMaster::send(uint8_t data) +{ + send(word(data)); +} + +uint8_t ModbusMaster::available(void) +{ + return _u8ResponseBufferLength - _u8ResponseBufferIndex; +} + +uint16_t ModbusMaster::receive(void) +{ + if (_u8ResponseBufferIndex < _u8ResponseBufferLength) + { + return _u16ResponseBuffer[_u8ResponseBufferIndex++]; + } + else + { + return 0xFFFF; + } +} + +/** +Set idle time callback function (cooperative multitasking). + +This function gets called in the idle time between transmission of data +and response from slave. Do not call functions that read from the serial +buffer that is used by ModbusMaster. Use of i2c/TWI, 1-Wire, other +serial ports, etc. is permitted within callback function. + +@see ModbusMaster::ModbusMasterTransaction() +*/ +void ModbusMaster::idle(void (*idle)()) +{ + _idle = idle; +} + +/** +Set pre-transmission callback function. + +This function gets called just before a Modbus message is sent over serial. +Typical usage of this callback is to enable an RS485 transceiver's +Driver Enable pin, and optionally disable its Receiver Enable pin. + +@see ModbusMaster::ModbusMasterTransaction() +@see ModbusMaster::postTransmission() +*/ +void ModbusMaster::preTransmission(void (*preTransmission)()) +{ + _preTransmission = preTransmission; +} + +/** +Set post-transmission callback function. + +This function gets called after a Modbus message has finished sending +(i.e. after all data has been physically transmitted onto the serial +bus). + +Typical usage of this callback is to enable an RS485 transceiver's +Receiver Enable pin, and disable its Driver Enable pin. + +@see ModbusMaster::ModbusMasterTransaction() +@see ModbusMaster::preTransmission() +*/ +void ModbusMaster::postTransmission(void (*postTransmission)()) +{ + _postTransmission = postTransmission; +} + +/** +Retrieve data from response buffer. + +@see ModbusMaster::clearResponseBuffer() +@param u8Index index of response buffer array (0x00..0x3F) +@return value in position u8Index of response buffer (0x0000..0xFFFF) +@ingroup buffer +*/ +uint16_t ModbusMaster::getResponseBuffer(uint8_t u8Index) +{ + if (u8Index < ku8MaxBufferSize) + { + return _u16ResponseBuffer[u8Index]; + } + else + { + return 0xFFFF; + } +} + +/** +Clear Modbus response buffer. + +@see ModbusMaster::getResponseBuffer(uint8_t u8Index) +@ingroup buffer +*/ +void ModbusMaster::clearResponseBuffer() +{ + uint8_t i; + + for (i = 0; i < ku8MaxBufferSize; i++) + { + _u16ResponseBuffer[i] = 0; + } +} + +/** +Place data in transmit buffer. + +@see ModbusMaster::clearTransmitBuffer() +@param u8Index index of transmit buffer array (0x00..0x3F) +@param u16Value value to place in position u8Index of transmit buffer (0x0000..0xFFFF) +@return 0 on success; exception number on failure +@ingroup buffer +*/ +uint8_t ModbusMaster::setTransmitBuffer(uint8_t u8Index, uint16_t u16Value) +{ + if (u8Index < ku8MaxBufferSize) + { + _u16TransmitBuffer[u8Index] = u16Value; + return ku8MBSuccess; + } + else + { + return ku8MBIllegalDataAddress; + } +} + +/** +Clear Modbus transmit buffer. + +@see ModbusMaster::setTransmitBuffer(uint8_t u8Index, uint16_t u16Value) +@ingroup buffer +*/ +void ModbusMaster::clearTransmitBuffer() +{ + uint8_t i; + + for (i = 0; i < ku8MaxBufferSize; i++) + { + _u16TransmitBuffer[i] = 0; + } +} + +/** +Modbus function 0x03 Read Holding Registers. + +This function code is used to read the contents of a contiguous block of +holding registers in a remote device. The request specifies the starting +register address and the number of registers. Registers are addressed +starting at zero. + +The register data in the response buffer is packed as one word per +register. + +@param u16ReadAddress address of the first holding register (0x0000..0xFFFF) +@param u16ReadQty quantity of holding registers to read (1..125, enforced by remote device) +@return 0 on success; exception number on failure +@ingroup register +*/ +uint8_t ModbusMaster::readHoldingRegisters(uint16_t u16ReadAddress, + uint16_t u16ReadQty) +{ + _u16ReadAddress = u16ReadAddress; + _u16ReadQty = u16ReadQty; + return ModbusMasterTransaction(ku8MBReadHoldingRegisters); +} + +/** +Modbus function 0x10 Write Multiple Registers. + +This function code is used to write a block of contiguous registers (1 +to 123 registers) in a remote device. + +The requested written values are specified in the transmit buffer. Data +is packed as one word per register. + +@param u16WriteAddress address of the holding register (0x0000..0xFFFF) +@param u16WriteQty quantity of holding registers to write (1..123, enforced by remote device) +@return 0 on success; exception number on failure +@ingroup register +*/ +uint8_t ModbusMaster::writeMultipleRegisters(uint16_t u16WriteAddress, + uint16_t u16WriteQty) +{ + _u16WriteAddress = u16WriteAddress; + _u16WriteQty = u16WriteQty; + return ModbusMasterTransaction(ku8MBWriteMultipleRegisters); +} + +// new version based on Wire.h +uint8_t ModbusMaster::writeMultipleRegisters() +{ + _u16WriteQty = _u8TransmitBufferIndex; + return ModbusMasterTransaction(ku8MBWriteMultipleRegisters); +} + +uint8_t ModbusMaster::readAddresEctoControl() +{ + _u16ReadAddress = 0x00; + _u16ReadQty = 1; + return ModbusMasterTransaction(ku8MBProgRead46); +} +uint8_t ModbusMaster::writeAddresEctoControl(uint8_t addr) +{ + _u16WriteAddress = 0x00; + _u16WriteQty = 1; + _u16TransmitBuffer[0] = (uint16_t)addr; + return ModbusMasterTransaction(ku8MBProgWrite47); +} + +/* _____PRIVATE FUNCTIONS____________________________________________________ */ +/** +Modbus transaction engine. +Sequence: + - assemble Modbus Request Application Data Unit (ADU), + based on particular function called + - transmit request over selected serial port + - wait for/retrieve response + - evaluate/disassemble response + - return status (success/exception) + +@param u8MBFunction Modbus function (0x01..0xFF) +@return 0 on success; exception number on failure +*/ +uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) +{ + uint8_t u8ModbusADU[24]; + uint8_t u8ModbusADUSize = 0; + uint8_t i, u8Qty; + uint16_t u16CRC; + uint32_t u32StartTime; + uint8_t u8BytesLeft = 8; + uint8_t u8MBStatus = ku8MBSuccess; + + // assemble Modbus Request Application Data Unit + if (u8MBFunction == ku8MBProgRead46 || u8MBFunction == ku8MBProgWrite47) + { + u8ModbusADU[u8ModbusADUSize++] = 0x00; + u8ModbusADU[u8ModbusADUSize++] = u8MBFunction; + } + else + { + u8ModbusADU[u8ModbusADUSize++] = _u8MBSlave; + u8ModbusADU[u8ModbusADUSize++] = u8MBFunction; + } + + switch (u8MBFunction) + { + case ku8MBReadHoldingRegisters: + u8ModbusADU[u8ModbusADUSize++] = highByte(_u16ReadAddress); + u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16ReadAddress); + u8ModbusADU[u8ModbusADUSize++] = highByte(_u16ReadQty); + u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16ReadQty); + break; + } + + switch (u8MBFunction) + { + case ku8MBWriteMultipleRegisters: + u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteAddress); + u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteAddress); + break; + } + + switch (u8MBFunction) + { + case ku8MBWriteMultipleRegisters: + u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteQty); + u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty); + u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty << 1); + + for (i = 0; i < lowByte(_u16WriteQty); i++) + { + u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[i]); + u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[i]); + } + break; + } + + // append CRC + u16CRC = 0xFFFF; + for (i = 0; i < u8ModbusADUSize; i++) + { + u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); + } + u8ModbusADU[u8ModbusADUSize++] = lowByte(u16CRC); + u8ModbusADU[u8ModbusADUSize++] = highByte(u16CRC); + u8ModbusADU[u8ModbusADUSize] = 0; + + // flush receive buffer before transmitting request + while (_serial->read() != -1) + ; + + // transmit request + if (_preTransmission) + { + _preTransmission(); + } + for (i = 0; i < u8ModbusADUSize; i++) + { + _serial->write(u8ModbusADU[i]); + } + + u8ModbusADUSize = 0; + _serial->flush(); // flush transmit buffer + if (_postTransmission) + { + _postTransmission(); + } + + // loop until we run out of time or bytes, or an error occurs + u32StartTime = millis(); + while (u8BytesLeft && !u8MBStatus) + { + if (_serial->available()) + { +#if __MODBUSMASTER_DEBUG__ + digitalWrite(__MODBUSMASTER_DEBUG_PIN_A__, true); +#endif + u8ModbusADU[u8ModbusADUSize++] = _serial->read(); + u8BytesLeft--; +#if __MODBUSMASTER_DEBUG__ + digitalWrite(__MODBUSMASTER_DEBUG_PIN_A__, false); +#endif + } + else + { +#if __MODBUSMASTER_DEBUG__ + digitalWrite(__MODBUSMASTER_DEBUG_PIN_B__, true); +#endif + if (_idle) + { + _idle(); + } +#if __MODBUSMASTER_DEBUG__ + digitalWrite(__MODBUSMASTER_DEBUG_PIN_B__, false); +#endif + } + + // evaluate slave ID, function code once enough bytes have been read + if (u8ModbusADUSize == 5) + { + // verify response is for correct Modbus slave + if (u8ModbusADU[0] != _u8MBSlave || u8ModbusADU[0] != 0x00) + { + u8MBStatus = ku8MBInvalidSlaveID; + break; + } + + // verify response is for correct Modbus function code (mask exception bit 7) + if ((u8ModbusADU[1] & 0x7F) != u8MBFunction) + { + u8MBStatus = ku8MBInvalidFunction; + break; + } + + // check whether Modbus exception occurred; return Modbus Exception Code + if (bitRead(u8ModbusADU[1], 7)) + { + u8MBStatus = u8ModbusADU[2]; + break; + } + + // evaluate returned Modbus function code + switch (u8ModbusADU[1]) + { + case ku8MBReadHoldingRegisters: + u8BytesLeft = u8ModbusADU[2]; + break; + + case ku8MBWriteMultipleRegisters: + u8BytesLeft = 3; + break; + } + } + if ((millis() - u32StartTime) > ku16MBResponseTimeout) + { + u8MBStatus = ku8MBResponseTimedOut; + } + } + + // verify response is large enough to inspect further + if (!u8MBStatus && u8ModbusADUSize >= 5) + { + // calculate CRC + u16CRC = 0xFFFF; + for (i = 0; i < (u8ModbusADUSize - 2); i++) + { + u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); + } + + // verify CRC + if (!u8MBStatus && (lowByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 2] || + highByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 1])) + { + u8MBStatus = ku8MBInvalidCRC; + } + } + + // disassemble ADU into words + if (!u8MBStatus) + { + // evaluate returned Modbus function code + switch (u8ModbusADU[1]) + { + case ku8MBReadHoldingRegisters: + // load bytes into word; response bytes are ordered H, L, H, L, ... + for (i = 0; i < (u8ModbusADU[2] >> 1); i++) + { + if (i < ku8MaxBufferSize) + { + _u16ResponseBuffer[i] = word(u8ModbusADU[2 * i + 3], u8ModbusADU[2 * i + 4]); + } + + _u8ResponseBufferLength = i; + } + break; + case ku8MBProgRead46: + _u16ResponseBuffer[0] = (uint16_t)u8ModbusADU[2]; + _u8ResponseBufferLength = 1; + break; + } + } + + _u8TransmitBufferIndex = 0; + u16TransmitBufferLength = 0; + _u8ResponseBufferIndex = 0; + return u8MBStatus; +} diff --git a/src/modules/exec/EctoControlAdapter/lib/rsEctoControl.cpp b/src/modules/exec/EctoControlAdapter/lib/rsEctoControl.cpp new file mode 100644 index 00000000..431f6322 --- /dev/null +++ b/src/modules/exec/EctoControlAdapter/lib/rsEctoControl.cpp @@ -0,0 +1,633 @@ +#include +#include +#ifdef ESP32 +#include +#endif +#include "rsEctoControl.h" + +struct IoTValue +{ + float valD = 0; + String valS = ""; + + bool isDecimal = true; +}; +uint8_t _DIR_PIN_ = 0; + +void modbusPreTransmission() +{ + // delay(500); + if (_DIR_PIN_) + digitalWrite(_DIR_PIN_, HIGH); +} + +// Pin 4 made low for Modbus receive mode +// Контакт 4 установлен на низком уровне для режима приема Modbus +void modbusPostTransmission() +{ + if (_DIR_PIN_) + digitalWrite(_DIR_PIN_, LOW); + // delay(500); +} + +//======================================================================================================= +// setup() +RsEctoControl::RsEctoControl(String parameters) +{ + node.preTransmission(modbusPreTransmission); + node.postTransmission(modbusPostTransmission); + + if (parameters != "") + { + DynamicJsonDocument doc(4096); + DeserializationError error = deserializeJson(doc, parameters); + if (!error) + { + if (doc.containsKey("DIR_PIN")) + _DIR_PIN = doc["DIR_PIN"].as(); + if (doc.containsKey("addr")) + _addr = doc["addr"].as(); + if (doc.containsKey("debug")) + _debug = doc["debug"].as(); + } + } + if (_DIR_PIN) + { + _DIR_PIN_ = _DIR_PIN; + pinMode(_DIR_PIN, OUTPUT); + digitalWrite(_DIR_PIN, LOW); + } + + // 0x14 – адаптер OpenTherm (вторая версия) + // 0x15 – адаптер eBus + // 0x16 – адаптер Navien + uint16_t type; + readFunctionModBus(0x0000, type); + if (0x14 != (uint8_t)type || 0x15 != (uint8_t)type || 0x16 != (uint8_t)type) + { + _SerialPrint("E", "EctoControlAdapter", "Не подходящее устройство, type: " + String(type, HEX)); + } + + uint8_t addr = node.readAddresEctoControl(); + _SerialPrint("I", "EctoControlAdapter", "readAddresEctoControl, addr: " + String(addr, HEX) + " - Enter to configuration"); + + getModelVersion(); + getBoilerInfo(); + getBoilerStatus(); +} + +void RsEctoControl::begin(uint8_t slave, Stream &serial) +{ + _modbusUART = &serial; + node.begin(slave, serial); +} + +void RsEctoControl::initFunction(void (*publishData)(String, String), void (*sendTelegramm)(String), void (*SerialPrint)(const String &, const String &, const String &)) +{ //, const String & + _publishData = publishData; + _sendTelegramm = sendTelegramm; + _SerialPrint = SerialPrint; +}; + +void RsEctoControl::doByInterval() +{ + // readBoilerInfo(); + getBoilerStatus(); + + getCodeError(); + getCodeErrorExt(); + if (info.adapterType == 0) + getFlagErrorOT(); + // getFlowRate(); + // getMaxSetCH(); + // getMaxSetDHW(); + // getMinSetCH(); + // getMinSetDHW(); + getModLevel(); + getPressure(); + getTempCH(); + getTempDHW(); + getTempOutside(); +} + +// Основной цикл программы +void RsEctoControl::loop(bool isNetworkActive, bool mqttIsConnect) +{ + _isNetworkActive = isNetworkActive; + _mqttIsConnect = mqttIsConnect; +} + +// Исполнительные комманды +void RsEctoControl::execute(String command, std::vector ¶m) +{ +} + +bool RsEctoControl::writeFunctionModBus(const uint16_t ®, uint16_t &data) +{ + // set word 0 of TX buffer to least-significant word of counter (bits 15..0) + node.setTransmitBuffer(1, lowWord(data)); + // set word 1 of TX buffer to most-significant word of counter (bits 31..16) + node.setTransmitBuffer(0, highWord(data)); + // slave: write TX buffer to (2) 16-bit registers starting at register 0 + uint8_t result = node.writeMultipleRegisters(0, 2); + if (_debug > 2) + { + _SerialPrint("I", "EctoControlAdapter", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(reg, HEX) + ", state: " + String(data) + " = result: " + String(result, HEX)); + } +} + +bool RsEctoControl::readFunctionModBus(const uint16_t ®, uint16_t &reading) +{ + // float retValue = 0; + if (_modbusUART) + { + // if (!addr) + // addr = _addr; + node.begin(_addr, (Stream &)*_modbusUART); + uint8_t result; + // uint32_t reading; + + if (reg == 0x0000) + result = node.readHoldingRegisters(reg, 4); + else + result = node.readHoldingRegisters(reg, 1); + if (_debug > 2) + _SerialPrint("I", "EctoControlAdapter", "readHoldingRegisters, addr: " + String(_addr, HEX) + ", reg: " + String(reg, HEX) + " = result: " + String(result, HEX)); + // break; + if (result == node.ku8MBSuccess) + { + if (reg == 0x0000) + { + reading = node.getResponseBuffer(0x03); + reading = (uint16_t)((uint8_t)(reading) >> 8); + _SerialPrint("I", "EctoControlAdapter", "read info, addr: " + String(_addr, HEX) + ", type: " + String(reading, HEX)); + } + else + { + reading = node.getResponseBuffer(0x00); + if (_debug > 2) + _SerialPrint("I", "EctoControlAdapter", "Success, Received data, register: " + String(reg) + " = " + String(reading, HEX)); + } + node.clearResponseBuffer(); + } + else + { + if (_debug > 2) + _SerialPrint("E", "EctoControlAdapter", "Failed, Response Code: " + String(result, HEX)); + return false; + } + + if (reading != 0x7FFF) + return true; + else + return false; + } + return false; +} + +bool RsEctoControl::getModelVersion() +{ + uint16_t reqData; + info.boilerMemberCode = readFunctionModBus(ReadDataEctoControl::ecR_MemberCode, info.boilerMemberCode); + info.boilerModelCode = readFunctionModBus(ReadDataEctoControl::ecR_ModelCode, info.boilerModelCode); + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_AdaperVersion, reqData); + info.adapterHardVer = highByte(reqData); + info.adapterSoftVer = lowByte(reqData); + return ret; +} + +bool RsEctoControl::getBoilerInfo() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_AdapterInfo, reqData); + info.adapterType = highByte(reqData) & 0xF8; + info.boilerStatus = (highByte(reqData) >> 3) & 1u; + info.rebootStatus = lowByte(reqData); + if (ret) + { + _publishData("adapterType", String(info.adapterType)); + _publishData("boilerStatus", String(info.boilerStatus)); + _publishData("rebootStatus", String(info.rebootStatus)); + } + return ret; +} +bool RsEctoControl::getBoilerStatus() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_BoilerStatus, reqData); + status.burnStatus = (lowByte(reqData) >> 0) & 1u; + status.CHStatus = (lowByte(reqData) >> 1) & 1u; + status.DHWStatus = (lowByte(reqData) >> 2) & 1u; + if (ret) + { + _publishData("burnStatus", String(status.burnStatus)); + _publishData("CHStatus", String(status.CHStatus)); + _publishData("DHWStatus", String(status.DHWStatus)); + } + return ret; +} +bool RsEctoControl::getCodeError() +{ + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_CodeError, code); + if (ret) + { + _publishData("codeError", String(code)); + if (codeExt) + _sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)codeExt)); + } + return ret; +} +bool RsEctoControl::getCodeErrorExt() +{ + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_CodeErrorExt, codeExt); + if (ret) + { + _publishData("codeErrorExt", String(codeExt)); + if (codeExt) + _sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)codeExt)); + } + return ret; +} +bool RsEctoControl::getFlagErrorOT() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_FlagErrorOT, reqData); + flagErr = lowByte(reqData); + if (ret) + { + _publishData("flagErr", String(flagErr)); + switch (flagErr) + { + case 0: + _sendTelegramm("EctoControlAdapter: Необходимо обслуживание!"); + break; + case 1: + _sendTelegramm("EctoControlAdapter: Котёл заблокирован!"); + break; + case 2: + _sendTelegramm("EctoControlAdapter: Низкое давление в отопительном контуре!"); + break; + case 3: + _sendTelegramm("EctoControlAdapter: Ошибка розжига!"); + break; + case 4: + _sendTelegramm("EctoControlAdapter: Низкое давления воздуха!"); + break; + case 5: + _sendTelegramm("EctoControlAdapter: Перегрев теплоносителя в контуре!"); + break; + default: + break; + } + } + return ret; +} + +bool RsEctoControl::getFlowRate() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_FlowRate, reqData); + flow = lowByte(reqData) / 10.f; + if (ret) + _publishData("flowRate", String(flow)); + return ret; +} +bool RsEctoControl::getMaxSetCH() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MaxSetCH, reqData); + maxSetCH = (float)lowByte(reqData); + if (ret) + _publishData("maxSetCH", String(maxSetCH)); + return ret; +} +bool RsEctoControl::getMaxSetDHW() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MaxSetDHW, reqData); + maxSetDHW = (float)lowByte(reqData); + if (ret) + _publishData("maxSetDHW", String(maxSetDHW)); + return ret; +} +bool RsEctoControl::getMinSetCH() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MinSetCH, reqData); + minSetCH = (float)lowByte(reqData); + if (ret) + _publishData("minSetCH", String(minSetCH)); + return ret; +} +bool RsEctoControl::getMinSetDHW() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MinSetDHW, reqData); + minSetDHW = (float)lowByte(reqData); + if (ret) + _publishData("minSetDHW", String(minSetDHW)); + return ret; +} +bool RsEctoControl::getModLevel() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_ModLevel, reqData); + modLevel = (float)lowByte(reqData); + if (ret) + _publishData("modLevel", String(modLevel)); + return ret; +} +bool RsEctoControl::getPressure() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_Pressure, reqData); + press = lowByte(reqData) / 10.f; + if (ret) + _publishData("press", String(press)); + return ret; +} +bool RsEctoControl::getTempCH() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempCH, reqData); + tCH = reqData / 10.f; + if (ret) + _publishData("tCH", String(tCH)); + return ret; +} +bool RsEctoControl::getTempDHW() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempDHW, reqData); + tDHW = reqData / 10.f; + if (ret) + _publishData("tDHW", String(tDHW)); + return ret; +} +bool RsEctoControl::getTempOutside() +{ + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempOutside, reqData); + tOut = (float)lowByte(reqData); + if (ret) + _publishData("tOut", String(tOut)); + return ret; +} + +bool RsEctoControl::setTypeConnect(float &data) +{ + bool ret = false; + if (writeFunctionModBus(ecW_SetTypeConnect, (uint16_t &)data)) + { + // TODO запросить результат записи у адаптера + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setTypeConnect"); + } + return ret; +} +bool RsEctoControl::setTCH(float &data) +{ + bool ret = false; + uint16_t d16 = data * 10; + if (writeFunctionModBus(ecW_TSetCH, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setTCH"); + } + + return ret; +} +bool RsEctoControl::setTCHFaultConn(float &data) +{ + bool ret = false; + uint16_t d16 = data * 10; + if (writeFunctionModBus(ecW_TSetCHFaultConn, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setTCHFaultConn"); + } + return ret; +} +bool RsEctoControl::setMinCH(float &data) +{ + bool ret = false; + if (writeFunctionModBus(ecW_TSetMinCH, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setMinCH"); + } + return ret; +} +bool RsEctoControl::setMaxCH(float &data) +{ + bool ret = false; + if (writeFunctionModBus(ecW_TSetMaxCH, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setMaxCH"); + } + return ret; +} +bool RsEctoControl::setMinDHW(float &data) +{ + bool ret = false; + if (writeFunctionModBus(ecW_TSetMinDHW, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setMinDHW"); + } + return ret; +} +bool RsEctoControl::setMaxDHW(float &data) +{ + bool ret = false; + if (writeFunctionModBus(ecW_TSetMaxDHW, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setMaxDHW"); + } +} +bool RsEctoControl::setTDHW(float &data) +{ + bool ret = false; + if (writeFunctionModBus(ecW_TSetDHW, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setTDHW"); + } + return ret; +} +bool RsEctoControl::setMaxModLevel(float &data) +{ + bool ret = false; + if (writeFunctionModBus(ecW_SetMaxModLevel, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setMaxModLevel"); + } + return ret; +} + +bool RsEctoControl::setStatusCH(bool data) +{ + bool ret = false; + enableCH = data; + uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); + if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setStatusCH"); + } + return ret; +} +bool RsEctoControl::setStatusDHW(bool data) +{ + bool ret = false; + enableDHW = data; + uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); + if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setStatusDHW"); + } + return ret; +} +bool RsEctoControl::setStatusCH2(bool data) +{ + bool ret = false; + enableCH2 = data; + uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); + if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, setStatusCH2"); + } + return ret; +} + +bool RsEctoControl::lockOutReset() +{ + bool ret = false; + uint16_t d16 = comm_LockOutReset; + if (writeFunctionModBus(ecW_Command, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, lockOutReset"); + } + return ret; +} +bool RsEctoControl::rebootAdapter() +{ + bool ret = false; + uint16_t d16 = comm_RebootAdapter; + if (writeFunctionModBus(ecW_Command, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + _SerialPrint("E", "EctoControlAdapter", "Failed, rebootAdapter"); + } + return ret; +} + +const String RsEctoControl::getChipId() +{ + return String(ESP_getChipId()) + "-" + String(getFlashChipIdNew()); // + "v" + String(FIRMWARE_VERSION); +} + +uint32_t RsEctoControl::getFlashChipIdNew() +{ + // Cache since size does not change + static uint32_t flashChipId = 0; + + if (flashChipId == 0) + { +#ifdef ESP32 + uint32_t tmp = g_rom_flashchip.device_id; + + for (int i = 0; i < 3; ++i) + { + flashChipId = flashChipId << 8; + flashChipId |= (tmp & 0xFF); + tmp = tmp >> 8; + } + + // esp_flash_read_id(nullptr, &flashChipId); +#elif defined(ESP8266) + flashChipId = ESP.getFlashChipId(); +#endif // ifdef ESP32 + } + return flashChipId; +} + +uint32_t RsEctoControl::ESP_getChipId(void) +{ +#ifdef ESP32 + uint32_t id = 0; + for (uint32_t i = 0; i < 17; i = i + 8) + { + id |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; + } + return id; +#else + return ESP.getChipId(); +#endif +} + +RsEctoControl::~RsEctoControl() +{ +} diff --git a/src/modules/exec/EctoControlAdapter/lib/rsEctoControl.h b/src/modules/exec/EctoControlAdapter/lib/rsEctoControl.h index 91ce2d93..edd88518 100644 --- a/src/modules/exec/EctoControlAdapter/lib/rsEctoControl.h +++ b/src/modules/exec/EctoControlAdapter/lib/rsEctoControl.h @@ -19,7 +19,6 @@ class RsEctoControl //: public ModbusMaster { private: ModbusMaster node; - String _license; uint8_t _addr; uint8_t _debug; Stream *_modbusUART; @@ -45,8 +44,6 @@ class RsEctoControl //: public ModbusMaster bool enableCH2; bool _isNetworkActive; bool _mqttIsConnect; - int md = 0; - int md2 = 0; uint32_t getFlashChipIdNew(); From 4ef929bb2338288b636530bfdb3599485b491f3d Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 21 Feb 2025 17:50:41 +0300 Subject: [PATCH 070/118] not lib ecto --- .../{lib => }/AdapterCommon.h | 0 .../EctoControlAdapter/EctoControlAdapter.cpp | 673 ++++++++++++++++-- .../EctoControlAdapter/{lib => }/ModbusEC.cpp | 4 +- .../EctoControlAdapter/{lib => }/ModbusEC.h | 2 +- .../EctoControlAdapter/lib/librsEctoControl.a | Bin 678102 -> 0 bytes .../EctoControlAdapter/lib/rsEctoControl.cpp | 633 ---------------- .../EctoControlAdapter/lib/rsEctoControl.h | 110 --- .../EctoControlAdapter/{lib => }/util/crc16.h | 0 .../EctoControlAdapter/{lib => }/util/word.h | 0 9 files changed, 608 insertions(+), 814 deletions(-) rename src/modules/exec/EctoControlAdapter/{lib => }/AdapterCommon.h (100%) rename src/modules/exec/EctoControlAdapter/{lib => }/ModbusEC.cpp (99%) rename src/modules/exec/EctoControlAdapter/{lib => }/ModbusEC.h (99%) delete mode 100644 src/modules/exec/EctoControlAdapter/lib/librsEctoControl.a delete mode 100644 src/modules/exec/EctoControlAdapter/lib/rsEctoControl.cpp delete mode 100644 src/modules/exec/EctoControlAdapter/lib/rsEctoControl.h rename src/modules/exec/EctoControlAdapter/{lib => }/util/crc16.h (100%) rename src/modules/exec/EctoControlAdapter/{lib => }/util/word.h (100%) diff --git a/src/modules/exec/EctoControlAdapter/lib/AdapterCommon.h b/src/modules/exec/EctoControlAdapter/AdapterCommon.h similarity index 100% rename from src/modules/exec/EctoControlAdapter/lib/AdapterCommon.h rename to src/modules/exec/EctoControlAdapter/AdapterCommon.h diff --git a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp index 2069027f..c721fa1f 100644 --- a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp +++ b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp @@ -3,13 +3,17 @@ #include #include -#include "lib/rsEctoControl.h" +#include "ModbusEC.h" +#include "AdapterCommon.h" +// #include "Stream.h" +#include + // class ModbusUart; -Stream *_mbUART = nullptr; +Stream *_modbusUART = nullptr; #define UART_LINE 2 - +uint8_t _DIR_PIN = 0; // Modbus stuff // Данные Modbus по умолчанию @@ -17,25 +21,26 @@ Stream *_mbUART = nullptr; #define MODBUS_TX_PIN 19 // Tx pin #define MODBUS_SERIAL_BAUD 9600 // Baud rate for esp32 and max485 communication -// void modbusPreTransmission() -// { -// // delay(500); -// if (_DIR_PIN) -// digitalWrite(_DIR_PIN, HIGH); -// } - -// // Pin 4 made low for Modbus receive mode -// // Контакт 4 установлен на низком уровне для режима приема Modbus -// void modbusPostTransmission() -// { -// if (_DIR_PIN) -// digitalWrite(_DIR_PIN, LOW); -// // delay(500); -// } + +void modbusPreTransmission() +{ + // delay(500); + if (_DIR_PIN) + digitalWrite(_DIR_PIN, HIGH); +} + +// Pin 4 made low for Modbus receive mode +// Контакт 4 установлен на низком уровне для режима приема Modbus +void modbusPostTransmission() +{ + if (_DIR_PIN) + digitalWrite(_DIR_PIN, LOW); + // delay(500); +} // ModbusMaster node; -RsEctoControl *rsEC; +//RsEctoControl *rsEC; class EctoControlAdapter : public IoTItem { @@ -48,16 +53,43 @@ class EctoControlAdapter : public IoTItem uint8_t _addr = 0xF0; // Адрес слейва от 1 до 247 uint8_t _type = 0x14; // Тип устройства: 0x14 – адаптер OpenTherm (вторая версия); 0x11 – адаптер OpenTherm (первая версия, снята с производства) bool _debugLevel; // Дебаг - //uint8_t _dir_pin; + + ModbusMaster node; + uint8_t _debug; + //Stream *_modbusUART; + + BoilerInfo info; + BoilerStatus status; + + uint16_t code; + uint16_t codeExt; + uint8_t flagErr; + float flow; + float maxSetCH; + float maxSetDHW; + float minSetCH; + float minSetDHW; + float modLevel; + float press; + float tCH; + float tDHW; + float tOut; + bool enableCH; + bool enableDHW; + bool enableCH2; + bool _isNetworkActive; + bool _mqttIsConnect; + + public: EctoControlAdapter(String parameters) : IoTItem(parameters) { - //_dir_pin = 0; + _DIR_PIN = 0; _addr = jsonReadInt(parameters, "addr"); // адреса slave прочитаем с веба _rx = jsonReadInt(parameters, "RX"); // прочитаем с веба _tx = jsonReadInt(parameters, "TX"); - //_dir_pin = jsonReadInt(parameters, "DIR_PIN"); + _DIR_PIN = jsonReadInt(parameters, "DIR_PIN"); _baud = jsonReadInt(parameters, "baud"); _prot = jsonReadStr(parameters, "protocol"); jsonRead(parameters, "debug", _debugLevel); @@ -73,163 +105,200 @@ class EctoControlAdapter : public IoTItem // Serial2.begin(baud-rate, protocol, RX pin, TX pin); - _mbUART = new HardwareSerial(UART_LINE); + _modbusUART = new HardwareSerial(UART_LINE); if (_debugLevel > 2) { SerialPrint("I", "EctoControlAdapter", "baud: " + String(_baud) + ", protocol: " + String(protocol, HEX) + ", RX: " + String(_rx) + ", TX: " + String(_tx)); } - ((HardwareSerial *)_mbUART)->begin(_baud, protocol, _rx, _tx); // выбираем тип протокола, скорость и все пины с веба - ((HardwareSerial *)_mbUART)->setTimeout(200); - rsEC = new RsEctoControl(parameters); - rsEC->begin(_addr, (Stream &)*_mbUART); + ((HardwareSerial *)_modbusUART)->begin(_baud, protocol, _rx, _tx); // выбираем тип протокола, скорость и все пины с веба + ((HardwareSerial *)_modbusUART)->setTimeout(200); + //_modbusUART = &serial; + node.begin(_addr, _modbusUART); + + node.preTransmission(modbusPreTransmission); + node.postTransmission(modbusPostTransmission); + + + if (_DIR_PIN) + { + _DIR_PIN = _DIR_PIN; + pinMode(_DIR_PIN, OUTPUT); + digitalWrite(_DIR_PIN, LOW); + } + + // 0x14 – адаптер OpenTherm (вторая версия) + // 0x15 – адаптер eBus + // 0x16 – адаптер Navien + uint16_t type; + readFunctionModBus(0x0000, type); + if (0x14 != (uint8_t)type || 0x15 != (uint8_t)type || 0x16 != (uint8_t)type) + { + SerialPrint("E", "EctoControlAdapter", "Не подходящее устройство, type: " + String(type, HEX)); + } + + uint8_t addr = node.readAddresEctoControl(); + SerialPrint("I", "EctoControlAdapter", "readAddresEctoControl, addr: " + String(addr, HEX) + " - Enter to configuration"); + + getModelVersion(); + getBoilerInfo(); + getBoilerStatus(); } void doByInterval() { - if (rsEC) - rsEC->doByInterval(); + // readBoilerInfo(); + getBoilerStatus(); + + getCodeError(); + getCodeErrorExt(); + if (info.adapterType == 0) + getFlagErrorOT(); + // getFlowRate(); + // getMaxSetCH(); + // getMaxSetDHW(); + // getMinSetCH(); + // getMinSetDHW(); + getModLevel(); + getPressure(); + getTempCH(); + getTempDHW(); + getTempOutside(); } void loop() { - if (rsEC) - rsEC->loop(isNetworkActive(), mqttIsConnect()); // для новых версий IoTManager IoTItem::loop(); } IoTValue execute(String command, std::vector ¶m) { - if (rsEC) - rsEC->execute(command, param); - else - return {}; if (command == "getModelVersion") { - rsEC->getModelVersion(); + getModelVersion(); } if (command == "getModelVersion") { - rsEC->getModelVersion(); + getModelVersion(); } if (command == "getBoilerInfo") { - rsEC->getBoilerInfo(); + getBoilerInfo(); } if (command == "getBoilerStatus") { - rsEC->getBoilerStatus(); + getBoilerStatus(); } if (command == "getCodeError") { - rsEC->getCodeError(); + getCodeError(); } if (command == "getCodeErrorExt") { - rsEC->getCodeErrorExt(); + getCodeErrorExt(); } if (command == "getFlagErrorOT") { - rsEC->getFlagErrorOT(); + getFlagErrorOT(); } if (command == "getFlowRate") { - rsEC->getFlowRate(); + getFlowRate(); } if (command == "getMaxSetCH") { - rsEC->getMaxSetCH(); + getMaxSetCH(); } if (command == "getMaxSetDHW") { - rsEC->getMaxSetDHW(); + getMaxSetDHW(); } if (command == "getMinSetCH") { - rsEC->getMinSetCH(); + getMinSetCH(); } if (command == "getMinSetDHW") { - rsEC->getMinSetDHW(); + getMinSetDHW(); } if (command == "getModLevel") { - rsEC->getModLevel(); + getModLevel(); } if (command == "getPressure") { - rsEC->getPressure(); + getPressure(); } if (command == "getTempCH") { - rsEC->getTempCH(); + getTempCH(); } if (command == "getTempDHW") { - rsEC->getTempDHW(); + getTempDHW(); } if (command == "getTempOutside") { - rsEC->getTempOutside(); + getTempOutside(); } if (command == "setTypeConnect") { - rsEC->setTypeConnect(param[0].valD); + setTypeConnect(param[0].valD); } if (command == "setTCH") { - rsEC->setTCH(param[0].valD); + setTCH(param[0].valD); } if (command == "setTCHFaultConn") { - rsEC->setTCHFaultConn(param[0].valD); + setTCHFaultConn(param[0].valD); } if (command == "setMinCH") { - rsEC->setMinCH(param[0].valD); + setMinCH(param[0].valD); } if (command == "setMaxCH") { - rsEC->setMaxCH(param[0].valD); + setMaxCH(param[0].valD); } if (command == "setMinDHW") { - rsEC->setMinDHW(param[0].valD); + setMinDHW(param[0].valD); } if (command == "setMaxDHW") { - rsEC->setMaxDHW(param[0].valD); + setMaxDHW(param[0].valD); } if (command == "setTDHW") { - rsEC->setTDHW(param[0].valD); + setTDHW(param[0].valD); } if (command == "setMaxModLevel") { - rsEC->setMaxModLevel(param[0].valD); + setMaxModLevel(param[0].valD); } if (command == "setStatusCH") { - rsEC->setStatusCH((bool)param[0].valD); + setStatusCH((bool)param[0].valD); } if (command == "setStatusDHW") { - rsEC->setStatusDHW((bool)param[0].valD); + setStatusDHW((bool)param[0].valD); } if (command == "setStatusCH2") { - rsEC->setStatusCH2((bool)param[0].valD); + setStatusCH2((bool)param[0].valD); } if (command == "lockOutReset") { - rsEC->lockOutReset(); + lockOutReset(); } if (command == "rebootAdapter") { - rsEC->rebootAdapter(); + rebootAdapter(); } return {}; } @@ -255,9 +324,477 @@ class EctoControlAdapter : public IoTItem ~EctoControlAdapter() { - delete rsEC; - rsEC = nullptr; }; + + bool writeFunctionModBus(const uint16_t ®, uint16_t &data) + { + // set word 0 of TX buffer to least-significant word of counter (bits 15..0) + node.setTransmitBuffer(1, lowWord(data)); + // set word 1 of TX buffer to most-significant word of counter (bits 31..16) + node.setTransmitBuffer(0, highWord(data)); + // slave: write TX buffer to (2) 16-bit registers starting at register 0 + uint8_t result = node.writeMultipleRegisters(0, 2); + if (_debug > 2) + { + SerialPrint("I", "EctoControlAdapter", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(reg, HEX) + ", state: " + String(data) + " = result: " + String(result, HEX)); + } + if (result == 0) + return true; + else + return false; + } + + bool readFunctionModBus(const uint16_t ®, uint16_t &reading) + { + // float retValue = 0; + if (_modbusUART) + { + // if (!addr) + // addr = _addr; + node.begin(_addr, _modbusUART); + uint8_t result; + // uint32_t reading; + + if (reg == 0x0000) + result = node.readHoldingRegisters(reg, 4); + else + result = node.readHoldingRegisters(reg, 1); + if (_debug > 2) + SerialPrint("I", "EctoControlAdapter", "readHoldingRegisters, addr: " + String(_addr, HEX) + ", reg: " + String(reg, HEX) + " = result: " + String(result, HEX)); + // break; + if (result == node.ku8MBSuccess) + { + if (reg == 0x0000) + { + reading = node.getResponseBuffer(0x03); + reading = (uint16_t)((uint8_t)(reading) >> 8); + SerialPrint("I", "EctoControlAdapter", "read info, addr: " + String(_addr, HEX) + ", type: " + String(reading, HEX)); + } + else + { + reading = node.getResponseBuffer(0x00); + if (_debug > 2) + SerialPrint("I", "EctoControlAdapter", "Success, Received data, register: " + String(reg) + " = " + String(reading, HEX)); + } + node.clearResponseBuffer(); + } + else + { + if (_debug > 2) + SerialPrint("E", "EctoControlAdapter", "Failed, Response Code: " + String(result, HEX)); + return false; + } + + if (reading != 0x7FFF) + return true; + else + return false; + } + return false; + } + + bool getModelVersion() + { + uint16_t reqData; + info.boilerMemberCode = readFunctionModBus(ReadDataEctoControl::ecR_MemberCode, info.boilerMemberCode); + info.boilerModelCode = readFunctionModBus(ReadDataEctoControl::ecR_ModelCode, info.boilerModelCode); + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_AdaperVersion, reqData); + info.adapterHardVer = highByte(reqData); + info.adapterSoftVer = lowByte(reqData); + return ret; + } + + bool getBoilerInfo() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_AdapterInfo, reqData); + info.adapterType = highByte(reqData) & 0xF8; + info.boilerStatus = (highByte(reqData) >> 3) & 1u; + info.rebootStatus = lowByte(reqData); + if (ret) + { + publishData("adapterType", String(info.adapterType)); + publishData("boilerStatus", String(info.boilerStatus)); + publishData("rebootStatus", String(info.rebootStatus)); + } + return ret; + } + bool getBoilerStatus() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_BoilerStatus, reqData); + status.burnStatus = (lowByte(reqData) >> 0) & 1u; + status.CHStatus = (lowByte(reqData) >> 1) & 1u; + status.DHWStatus = (lowByte(reqData) >> 2) & 1u; + if (ret) + { + publishData("burnStatus", String(status.burnStatus)); + publishData("CHStatus", String(status.CHStatus)); + publishData("DHWStatus", String(status.DHWStatus)); + } + return ret; + } + bool getCodeError() + { + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_CodeError, code); + if (ret) + { + publishData("codeError", String(code)); + if (codeExt) + sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)codeExt)); + } + return ret; + } + bool getCodeErrorExt() + { + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_CodeErrorExt, codeExt); + if (ret) + { + publishData("codeErrorExt", String(codeExt)); + if (codeExt) + sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)codeExt)); + } + return ret; + } + bool getFlagErrorOT() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_FlagErrorOT, reqData); + flagErr = lowByte(reqData); + if (ret) + { + publishData("flagErr", String(flagErr)); + switch (flagErr) + { + case 0: + sendTelegramm("EctoControlAdapter: Необходимо обслуживание!"); + break; + case 1: + sendTelegramm("EctoControlAdapter: Котёл заблокирован!"); + break; + case 2: + sendTelegramm("EctoControlAdapter: Низкое давление в отопительном контуре!"); + break; + case 3: + sendTelegramm("EctoControlAdapter: Ошибка розжига!"); + break; + case 4: + sendTelegramm("EctoControlAdapter: Низкое давления воздуха!"); + break; + case 5: + sendTelegramm("EctoControlAdapter: Перегрев теплоносителя в контуре!"); + break; + default: + break; + } + } + return ret; + } + + bool getFlowRate() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_FlowRate, reqData); + flow = lowByte(reqData) / 10.f; + if (ret) + publishData("flowRate", String(flow)); + return ret; + } + bool getMaxSetCH() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MaxSetCH, reqData); + maxSetCH = (float)lowByte(reqData); + if (ret) + publishData("maxSetCH", String(maxSetCH)); + return ret; + } + bool getMaxSetDHW() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MaxSetDHW, reqData); + maxSetDHW = (float)lowByte(reqData); + if (ret) + publishData("maxSetDHW", String(maxSetDHW)); + return ret; + } + bool getMinSetCH() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MinSetCH, reqData); + minSetCH = (float)lowByte(reqData); + if (ret) + publishData("minSetCH", String(minSetCH)); + return ret; + } + bool getMinSetDHW() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MinSetDHW, reqData); + minSetDHW = (float)lowByte(reqData); + if (ret) + publishData("minSetDHW", String(minSetDHW)); + return ret; + } + bool getModLevel() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_ModLevel, reqData); + modLevel = (float)lowByte(reqData); + if (ret) + publishData("modLevel", String(modLevel)); + return ret; + } + bool getPressure() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_Pressure, reqData); + press = lowByte(reqData) / 10.f; + if (ret) + publishData("press", String(press)); + return ret; + } + bool getTempCH() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempCH, reqData); + tCH = reqData / 10.f; + if (ret) + publishData("tCH", String(tCH)); + return ret; + } + bool getTempDHW() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempDHW, reqData); + tDHW = reqData / 10.f; + if (ret) + publishData("tDHW", String(tDHW)); + return ret; + } + bool getTempOutside() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempOutside, reqData); + tOut = (float)lowByte(reqData); + if (ret) + publishData("tOut", String(tOut)); + return ret; + } + + bool setTypeConnect(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_SetTypeConnect, (uint16_t &)data)) + { + // TODO запросить результат записи у адаптера + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setTypeConnect"); + } + return ret; + } + bool setTCH(float &data) + { + bool ret = false; + uint16_t d16 = data * 10; + if (writeFunctionModBus(ecW_TSetCH, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setTCH"); + } + + return ret; + } + bool setTCHFaultConn(float &data) + { + bool ret = false; + uint16_t d16 = data * 10; + if (writeFunctionModBus(ecW_TSetCHFaultConn, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setTCHFaultConn"); + } + return ret; + } + bool setMinCH(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_TSetMinCH, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setMinCH"); + } + return ret; + } + bool setMaxCH(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_TSetMaxCH, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setMaxCH"); + } + return ret; + } + bool setMinDHW(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_TSetMinDHW, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setMinDHW"); + } + return ret; + } + bool setMaxDHW(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_TSetMaxDHW, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setMaxDHW"); + } + return ret; + } + bool setTDHW(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_TSetDHW, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setTDHW"); + } + return ret; + } + bool setMaxModLevel(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_SetMaxModLevel, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setMaxModLevel"); + } + return ret; + } + + bool setStatusCH(bool data) + { + bool ret = false; + enableCH = data; + uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); + if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setStatusCH"); + } + return ret; + } + bool setStatusDHW(bool data) + { + bool ret = false; + enableDHW = data; + uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); + if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setStatusDHW"); + } + return ret; + } + bool setStatusCH2(bool data) + { + bool ret = false; + enableCH2 = data; + uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); + if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setStatusCH2"); + } + return ret; + } + + bool lockOutReset() + { + bool ret = false; + uint16_t d16 = comm_LockOutReset; + if (writeFunctionModBus(ecW_Command, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, lockOutReset"); + } + return ret; + } + bool rebootAdapter() + { + bool ret = false; + uint16_t d16 = comm_RebootAdapter; + if (writeFunctionModBus(ecW_Command, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, rebootAdapter"); + } + return ret; + } + + + }; void *getAPI_EctoControlAdapter(String subtype, String param) diff --git a/src/modules/exec/EctoControlAdapter/lib/ModbusEC.cpp b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp similarity index 99% rename from src/modules/exec/EctoControlAdapter/lib/ModbusEC.cpp rename to src/modules/exec/EctoControlAdapter/ModbusEC.cpp index 79af9485..1b74d552 100644 --- a/src/modules/exec/EctoControlAdapter/lib/ModbusEC.cpp +++ b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp @@ -18,11 +18,11 @@ Call once class has been instantiated, typically within setup(). @param &serial reference to serial port object (Serial, Serial1, ... Serial3) @ingroup setup */ -void ModbusMaster::begin(uint8_t slave, Stream &serial) +void ModbusMaster::begin(uint8_t slave, Stream *serial) { // txBuffer = (uint16_t*) calloc(ku8MaxBufferSize, sizeof(uint16_t)); _u8MBSlave = slave; - _serial = &serial; + _serial = serial; _u8TransmitBufferIndex = 0; u16TransmitBufferLength = 0; diff --git a/src/modules/exec/EctoControlAdapter/lib/ModbusEC.h b/src/modules/exec/EctoControlAdapter/ModbusEC.h similarity index 99% rename from src/modules/exec/EctoControlAdapter/lib/ModbusEC.h rename to src/modules/exec/EctoControlAdapter/ModbusEC.h index 64105d60..0f5f1f79 100644 --- a/src/modules/exec/EctoControlAdapter/lib/ModbusEC.h +++ b/src/modules/exec/EctoControlAdapter/ModbusEC.h @@ -20,7 +20,7 @@ class ModbusMaster public: ModbusMaster(); - void begin(uint8_t, Stream &serial); + void begin(uint8_t, Stream *serial); void idle(void (*)()); void preTransmission(void (*)()); void postTransmission(void (*)()); diff --git a/src/modules/exec/EctoControlAdapter/lib/librsEctoControl.a b/src/modules/exec/EctoControlAdapter/lib/librsEctoControl.a deleted file mode 100644 index f1a36c0eb056ef96a581aea2305e6dbd08e5bb01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 678102 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

1?62Nt7Pu-nl34>-;)ox9 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 -#include -#ifdef ESP32 -#include -#endif -#include "rsEctoControl.h" - -struct IoTValue -{ - float valD = 0; - String valS = ""; - - bool isDecimal = true; -}; -uint8_t _DIR_PIN_ = 0; - -void modbusPreTransmission() -{ - // delay(500); - if (_DIR_PIN_) - digitalWrite(_DIR_PIN_, HIGH); -} - -// Pin 4 made low for Modbus receive mode -// Контакт 4 установлен на низком уровне для режима приема Modbus -void modbusPostTransmission() -{ - if (_DIR_PIN_) - digitalWrite(_DIR_PIN_, LOW); - // delay(500); -} - -//======================================================================================================= -// setup() -RsEctoControl::RsEctoControl(String parameters) -{ - node.preTransmission(modbusPreTransmission); - node.postTransmission(modbusPostTransmission); - - if (parameters != "") - { - DynamicJsonDocument doc(4096); - DeserializationError error = deserializeJson(doc, parameters); - if (!error) - { - if (doc.containsKey("DIR_PIN")) - _DIR_PIN = doc["DIR_PIN"].as(); - if (doc.containsKey("addr")) - _addr = doc["addr"].as(); - if (doc.containsKey("debug")) - _debug = doc["debug"].as(); - } - } - if (_DIR_PIN) - { - _DIR_PIN_ = _DIR_PIN; - pinMode(_DIR_PIN, OUTPUT); - digitalWrite(_DIR_PIN, LOW); - } - - // 0x14 – адаптер OpenTherm (вторая версия) - // 0x15 – адаптер eBus - // 0x16 – адаптер Navien - uint16_t type; - readFunctionModBus(0x0000, type); - if (0x14 != (uint8_t)type || 0x15 != (uint8_t)type || 0x16 != (uint8_t)type) - { - _SerialPrint("E", "EctoControlAdapter", "Не подходящее устройство, type: " + String(type, HEX)); - } - - uint8_t addr = node.readAddresEctoControl(); - _SerialPrint("I", "EctoControlAdapter", "readAddresEctoControl, addr: " + String(addr, HEX) + " - Enter to configuration"); - - getModelVersion(); - getBoilerInfo(); - getBoilerStatus(); -} - -void RsEctoControl::begin(uint8_t slave, Stream &serial) -{ - _modbusUART = &serial; - node.begin(slave, serial); -} - -void RsEctoControl::initFunction(void (*publishData)(String, String), void (*sendTelegramm)(String), void (*SerialPrint)(const String &, const String &, const String &)) -{ //, const String & - _publishData = publishData; - _sendTelegramm = sendTelegramm; - _SerialPrint = SerialPrint; -}; - -void RsEctoControl::doByInterval() -{ - // readBoilerInfo(); - getBoilerStatus(); - - getCodeError(); - getCodeErrorExt(); - if (info.adapterType == 0) - getFlagErrorOT(); - // getFlowRate(); - // getMaxSetCH(); - // getMaxSetDHW(); - // getMinSetCH(); - // getMinSetDHW(); - getModLevel(); - getPressure(); - getTempCH(); - getTempDHW(); - getTempOutside(); -} - -// Основной цикл программы -void RsEctoControl::loop(bool isNetworkActive, bool mqttIsConnect) -{ - _isNetworkActive = isNetworkActive; - _mqttIsConnect = mqttIsConnect; -} - -// Исполнительные комманды -void RsEctoControl::execute(String command, std::vector ¶m) -{ -} - -bool RsEctoControl::writeFunctionModBus(const uint16_t ®, uint16_t &data) -{ - // set word 0 of TX buffer to least-significant word of counter (bits 15..0) - node.setTransmitBuffer(1, lowWord(data)); - // set word 1 of TX buffer to most-significant word of counter (bits 31..16) - node.setTransmitBuffer(0, highWord(data)); - // slave: write TX buffer to (2) 16-bit registers starting at register 0 - uint8_t result = node.writeMultipleRegisters(0, 2); - if (_debug > 2) - { - _SerialPrint("I", "EctoControlAdapter", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(reg, HEX) + ", state: " + String(data) + " = result: " + String(result, HEX)); - } -} - -bool RsEctoControl::readFunctionModBus(const uint16_t ®, uint16_t &reading) -{ - // float retValue = 0; - if (_modbusUART) - { - // if (!addr) - // addr = _addr; - node.begin(_addr, (Stream &)*_modbusUART); - uint8_t result; - // uint32_t reading; - - if (reg == 0x0000) - result = node.readHoldingRegisters(reg, 4); - else - result = node.readHoldingRegisters(reg, 1); - if (_debug > 2) - _SerialPrint("I", "EctoControlAdapter", "readHoldingRegisters, addr: " + String(_addr, HEX) + ", reg: " + String(reg, HEX) + " = result: " + String(result, HEX)); - // break; - if (result == node.ku8MBSuccess) - { - if (reg == 0x0000) - { - reading = node.getResponseBuffer(0x03); - reading = (uint16_t)((uint8_t)(reading) >> 8); - _SerialPrint("I", "EctoControlAdapter", "read info, addr: " + String(_addr, HEX) + ", type: " + String(reading, HEX)); - } - else - { - reading = node.getResponseBuffer(0x00); - if (_debug > 2) - _SerialPrint("I", "EctoControlAdapter", "Success, Received data, register: " + String(reg) + " = " + String(reading, HEX)); - } - node.clearResponseBuffer(); - } - else - { - if (_debug > 2) - _SerialPrint("E", "EctoControlAdapter", "Failed, Response Code: " + String(result, HEX)); - return false; - } - - if (reading != 0x7FFF) - return true; - else - return false; - } - return false; -} - -bool RsEctoControl::getModelVersion() -{ - uint16_t reqData; - info.boilerMemberCode = readFunctionModBus(ReadDataEctoControl::ecR_MemberCode, info.boilerMemberCode); - info.boilerModelCode = readFunctionModBus(ReadDataEctoControl::ecR_ModelCode, info.boilerModelCode); - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_AdaperVersion, reqData); - info.adapterHardVer = highByte(reqData); - info.adapterSoftVer = lowByte(reqData); - return ret; -} - -bool RsEctoControl::getBoilerInfo() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_AdapterInfo, reqData); - info.adapterType = highByte(reqData) & 0xF8; - info.boilerStatus = (highByte(reqData) >> 3) & 1u; - info.rebootStatus = lowByte(reqData); - if (ret) - { - _publishData("adapterType", String(info.adapterType)); - _publishData("boilerStatus", String(info.boilerStatus)); - _publishData("rebootStatus", String(info.rebootStatus)); - } - return ret; -} -bool RsEctoControl::getBoilerStatus() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_BoilerStatus, reqData); - status.burnStatus = (lowByte(reqData) >> 0) & 1u; - status.CHStatus = (lowByte(reqData) >> 1) & 1u; - status.DHWStatus = (lowByte(reqData) >> 2) & 1u; - if (ret) - { - _publishData("burnStatus", String(status.burnStatus)); - _publishData("CHStatus", String(status.CHStatus)); - _publishData("DHWStatus", String(status.DHWStatus)); - } - return ret; -} -bool RsEctoControl::getCodeError() -{ - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_CodeError, code); - if (ret) - { - _publishData("codeError", String(code)); - if (codeExt) - _sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)codeExt)); - } - return ret; -} -bool RsEctoControl::getCodeErrorExt() -{ - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_CodeErrorExt, codeExt); - if (ret) - { - _publishData("codeErrorExt", String(codeExt)); - if (codeExt) - _sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)codeExt)); - } - return ret; -} -bool RsEctoControl::getFlagErrorOT() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_FlagErrorOT, reqData); - flagErr = lowByte(reqData); - if (ret) - { - _publishData("flagErr", String(flagErr)); - switch (flagErr) - { - case 0: - _sendTelegramm("EctoControlAdapter: Необходимо обслуживание!"); - break; - case 1: - _sendTelegramm("EctoControlAdapter: Котёл заблокирован!"); - break; - case 2: - _sendTelegramm("EctoControlAdapter: Низкое давление в отопительном контуре!"); - break; - case 3: - _sendTelegramm("EctoControlAdapter: Ошибка розжига!"); - break; - case 4: - _sendTelegramm("EctoControlAdapter: Низкое давления воздуха!"); - break; - case 5: - _sendTelegramm("EctoControlAdapter: Перегрев теплоносителя в контуре!"); - break; - default: - break; - } - } - return ret; -} - -bool RsEctoControl::getFlowRate() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_FlowRate, reqData); - flow = lowByte(reqData) / 10.f; - if (ret) - _publishData("flowRate", String(flow)); - return ret; -} -bool RsEctoControl::getMaxSetCH() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MaxSetCH, reqData); - maxSetCH = (float)lowByte(reqData); - if (ret) - _publishData("maxSetCH", String(maxSetCH)); - return ret; -} -bool RsEctoControl::getMaxSetDHW() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MaxSetDHW, reqData); - maxSetDHW = (float)lowByte(reqData); - if (ret) - _publishData("maxSetDHW", String(maxSetDHW)); - return ret; -} -bool RsEctoControl::getMinSetCH() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MinSetCH, reqData); - minSetCH = (float)lowByte(reqData); - if (ret) - _publishData("minSetCH", String(minSetCH)); - return ret; -} -bool RsEctoControl::getMinSetDHW() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MinSetDHW, reqData); - minSetDHW = (float)lowByte(reqData); - if (ret) - _publishData("minSetDHW", String(minSetDHW)); - return ret; -} -bool RsEctoControl::getModLevel() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_ModLevel, reqData); - modLevel = (float)lowByte(reqData); - if (ret) - _publishData("modLevel", String(modLevel)); - return ret; -} -bool RsEctoControl::getPressure() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_Pressure, reqData); - press = lowByte(reqData) / 10.f; - if (ret) - _publishData("press", String(press)); - return ret; -} -bool RsEctoControl::getTempCH() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempCH, reqData); - tCH = reqData / 10.f; - if (ret) - _publishData("tCH", String(tCH)); - return ret; -} -bool RsEctoControl::getTempDHW() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempDHW, reqData); - tDHW = reqData / 10.f; - if (ret) - _publishData("tDHW", String(tDHW)); - return ret; -} -bool RsEctoControl::getTempOutside() -{ - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempOutside, reqData); - tOut = (float)lowByte(reqData); - if (ret) - _publishData("tOut", String(tOut)); - return ret; -} - -bool RsEctoControl::setTypeConnect(float &data) -{ - bool ret = false; - if (writeFunctionModBus(ecW_SetTypeConnect, (uint16_t &)data)) - { - // TODO запросить результат записи у адаптера - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setTypeConnect"); - } - return ret; -} -bool RsEctoControl::setTCH(float &data) -{ - bool ret = false; - uint16_t d16 = data * 10; - if (writeFunctionModBus(ecW_TSetCH, d16)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setTCH"); - } - - return ret; -} -bool RsEctoControl::setTCHFaultConn(float &data) -{ - bool ret = false; - uint16_t d16 = data * 10; - if (writeFunctionModBus(ecW_TSetCHFaultConn, d16)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setTCHFaultConn"); - } - return ret; -} -bool RsEctoControl::setMinCH(float &data) -{ - bool ret = false; - if (writeFunctionModBus(ecW_TSetMinCH, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setMinCH"); - } - return ret; -} -bool RsEctoControl::setMaxCH(float &data) -{ - bool ret = false; - if (writeFunctionModBus(ecW_TSetMaxCH, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setMaxCH"); - } - return ret; -} -bool RsEctoControl::setMinDHW(float &data) -{ - bool ret = false; - if (writeFunctionModBus(ecW_TSetMinDHW, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setMinDHW"); - } - return ret; -} -bool RsEctoControl::setMaxDHW(float &data) -{ - bool ret = false; - if (writeFunctionModBus(ecW_TSetMaxDHW, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setMaxDHW"); - } -} -bool RsEctoControl::setTDHW(float &data) -{ - bool ret = false; - if (writeFunctionModBus(ecW_TSetDHW, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setTDHW"); - } - return ret; -} -bool RsEctoControl::setMaxModLevel(float &data) -{ - bool ret = false; - if (writeFunctionModBus(ecW_SetMaxModLevel, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setMaxModLevel"); - } - return ret; -} - -bool RsEctoControl::setStatusCH(bool data) -{ - bool ret = false; - enableCH = data; - uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); - if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setStatusCH"); - } - return ret; -} -bool RsEctoControl::setStatusDHW(bool data) -{ - bool ret = false; - enableDHW = data; - uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); - if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setStatusDHW"); - } - return ret; -} -bool RsEctoControl::setStatusCH2(bool data) -{ - bool ret = false; - enableCH2 = data; - uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); - if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, setStatusCH2"); - } - return ret; -} - -bool RsEctoControl::lockOutReset() -{ - bool ret = false; - uint16_t d16 = comm_LockOutReset; - if (writeFunctionModBus(ecW_Command, d16)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, lockOutReset"); - } - return ret; -} -bool RsEctoControl::rebootAdapter() -{ - bool ret = false; - uint16_t d16 = comm_RebootAdapter; - if (writeFunctionModBus(ecW_Command, d16)) - { - ret = true; - } - else - { - if (_debug > 1) - _SerialPrint("E", "EctoControlAdapter", "Failed, rebootAdapter"); - } - return ret; -} - -const String RsEctoControl::getChipId() -{ - return String(ESP_getChipId()) + "-" + String(getFlashChipIdNew()); // + "v" + String(FIRMWARE_VERSION); -} - -uint32_t RsEctoControl::getFlashChipIdNew() -{ - // Cache since size does not change - static uint32_t flashChipId = 0; - - if (flashChipId == 0) - { -#ifdef ESP32 - uint32_t tmp = g_rom_flashchip.device_id; - - for (int i = 0; i < 3; ++i) - { - flashChipId = flashChipId << 8; - flashChipId |= (tmp & 0xFF); - tmp = tmp >> 8; - } - - // esp_flash_read_id(nullptr, &flashChipId); -#elif defined(ESP8266) - flashChipId = ESP.getFlashChipId(); -#endif // ifdef ESP32 - } - return flashChipId; -} - -uint32_t RsEctoControl::ESP_getChipId(void) -{ -#ifdef ESP32 - uint32_t id = 0; - for (uint32_t i = 0; i < 17; i = i + 8) - { - id |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; - } - return id; -#else - return ESP.getChipId(); -#endif -} - -RsEctoControl::~RsEctoControl() -{ -} diff --git a/src/modules/exec/EctoControlAdapter/lib/rsEctoControl.h b/src/modules/exec/EctoControlAdapter/lib/rsEctoControl.h deleted file mode 100644 index edd88518..00000000 --- a/src/modules/exec/EctoControlAdapter/lib/rsEctoControl.h +++ /dev/null @@ -1,110 +0,0 @@ -#pragma once - -#include "ModbusEC.h" -#include "AdapterCommon.h" -// #include "Stream.h" -#include - -struct IoTValue; - -// static void publishData(String widget, String status); -static void (*_publishData)(String, String); - -// static void sendTelegramm(String msg); -static void (*_sendTelegramm)(String); - -static void (*_SerialPrint)(const String &, const String &, const String &); //, const String& itemId = "" - -class RsEctoControl //: public ModbusMaster -{ -private: - ModbusMaster node; - uint8_t _addr; - uint8_t _debug; - Stream *_modbusUART; - - BoilerInfo info; - BoilerStatus status; - - uint16_t code; - uint16_t codeExt; - uint8_t flagErr; - float flow; - float maxSetCH; - float maxSetDHW; - float minSetCH; - float minSetDHW; - float modLevel; - float press; - float tCH; - float tDHW; - float tOut; - bool enableCH; - bool enableDHW; - bool enableCH2; - bool _isNetworkActive; - bool _mqttIsConnect; - - uint32_t getFlashChipIdNew(); - - uint32_t ESP_getChipId(void); - - const String getChipId(); - - bool readFunctionModBus(const uint16_t ®, uint16_t &reading); - - bool writeFunctionModBus(const uint16_t ®, uint16_t &data); - -public: - uint8_t _DIR_PIN; - //======================================================================================================= - // setup() - RsEctoControl(String parameters); //: ModbusMaster(); - - ~RsEctoControl(); - - void begin(uint8_t slave, Stream &serial); - - static void initFunction(void (*_publishData_)(String, String), void (*_sendTelegramm_)(String), void (*_SerialPrint_)(const String &, const String &, const String &)); //, const String& - - void doByInterval(); - - // Основной цикл программы - void loop(bool isNetworkActive, bool mqttIsConnect); - - // Исполнительные комманды - void execute(String command, std::vector ¶m); - - bool getModelVersion(); - bool getBoilerInfo(); - bool getBoilerStatus(); - bool getCodeError(); - bool getCodeErrorExt(); - bool getFlagErrorOT(); - bool getFlowRate(); - bool getMaxSetCH(); - bool getMaxSetDHW(); - bool getMinSetCH(); - bool getMinSetDHW(); - bool getModLevel(); - bool getPressure(); - bool getTempCH(); - bool getTempDHW(); - bool getTempOutside(); - - bool setTypeConnect(float &data); - bool setTCH(float &data); - bool setTCHFaultConn(float &data); - bool setMinCH(float &data); - bool setMaxCH(float &data); - bool setMinDHW(float &data); - bool setMaxDHW(float &data); - bool setTDHW(float &data); - bool setMaxModLevel(float &data); - bool setStatusCH(bool data); - bool setStatusDHW(bool data); - bool setStatusCH2(bool data); - - bool lockOutReset(); - bool rebootAdapter(); -}; diff --git a/src/modules/exec/EctoControlAdapter/lib/util/crc16.h b/src/modules/exec/EctoControlAdapter/util/crc16.h similarity index 100% rename from src/modules/exec/EctoControlAdapter/lib/util/crc16.h rename to src/modules/exec/EctoControlAdapter/util/crc16.h diff --git a/src/modules/exec/EctoControlAdapter/lib/util/word.h b/src/modules/exec/EctoControlAdapter/util/word.h similarity index 100% rename from src/modules/exec/EctoControlAdapter/lib/util/word.h rename to src/modules/exec/EctoControlAdapter/util/word.h From 36ea71c2706d12fcdb8685abf2ac6afc404f112c Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 22 Feb 2025 18:32:41 +0300 Subject: [PATCH 071/118] fix ecto modbus --- .../EctoControlAdapter/EctoControlAdapter.cpp | 1505 ++++++++--------- .../exec/EctoControlAdapter/ModbusEC.cpp | 6 +- .../exec/EctoControlAdapter/modinfo.json | 8 +- 3 files changed, 760 insertions(+), 759 deletions(-) diff --git a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp index c721fa1f..c8c7e1f2 100644 --- a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp +++ b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp @@ -40,771 +40,768 @@ void modbusPostTransmission() // ModbusMaster node; -//RsEctoControl *rsEC; +// RsEctoControl *rsEC; class EctoControlAdapter : public IoTItem { private: - int _rx = MODBUS_RX_PIN; // адреса прочитаем с веба - int _tx = MODBUS_TX_PIN; - int _baud = MODBUS_SERIAL_BAUD; - String _prot = "SERIAL_8N1"; - int protocol = SERIAL_8N1; - uint8_t _addr = 0xF0; // Адрес слейва от 1 до 247 - uint8_t _type = 0x14; // Тип устройства: 0x14 – адаптер OpenTherm (вторая версия); 0x11 – адаптер OpenTherm (первая версия, снята с производства) - bool _debugLevel; // Дебаг - - ModbusMaster node; - uint8_t _debug; - //Stream *_modbusUART; - - BoilerInfo info; - BoilerStatus status; - - uint16_t code; - uint16_t codeExt; - uint8_t flagErr; - float flow; - float maxSetCH; - float maxSetDHW; - float minSetCH; - float minSetDHW; - float modLevel; - float press; - float tCH; - float tDHW; - float tOut; - bool enableCH; - bool enableDHW; - bool enableCH2; - bool _isNetworkActive; - bool _mqttIsConnect; - - + int _rx = MODBUS_RX_PIN; // адреса прочитаем с веба + int _tx = MODBUS_TX_PIN; + int _baud = MODBUS_SERIAL_BAUD; + String _prot = "SERIAL_8N1"; + int protocol = SERIAL_8N1; + uint8_t _addr = 0xF0; // Адрес слейва от 1 до 247 + uint8_t _type = 0x14; // Тип устройства: 0x14 – адаптер OpenTherm (вторая версия); 0x11 – адаптер OpenTherm (первая версия, снята с производства) + bool _debugLevel; // Дебаг + + ModbusMaster node; + uint8_t _debug; + // Stream *_modbusUART; + + BoilerInfo info; + BoilerStatus status; + + uint16_t code; + uint16_t codeExt; + uint8_t flagErr; + float flow; + float maxSetCH; + float maxSetDHW; + float minSetCH; + float minSetDHW; + float modLevel; + float press; + float tCH; + float tDHW; + float tOut; + bool enableCH; + bool enableDHW; + bool enableCH2; + bool _isNetworkActive; + bool _mqttIsConnect; public: - EctoControlAdapter(String parameters) : IoTItem(parameters) - { - _DIR_PIN = 0; - _addr = jsonReadInt(parameters, "addr"); // адреса slave прочитаем с веба - _rx = jsonReadInt(parameters, "RX"); // прочитаем с веба - _tx = jsonReadInt(parameters, "TX"); - _DIR_PIN = jsonReadInt(parameters, "DIR_PIN"); - _baud = jsonReadInt(parameters, "baud"); - _prot = jsonReadStr(parameters, "protocol"); - jsonRead(parameters, "debug", _debugLevel); - - if (_prot == "SERIAL_8N1") - { - protocol = SERIAL_8N1; - } - else if (_prot == "SERIAL_8N2") - { - protocol = SERIAL_8N2; - } - - // Serial2.begin(baud-rate, protocol, RX pin, TX pin); - - _modbusUART = new HardwareSerial(UART_LINE); - - if (_debugLevel > 2) - { - SerialPrint("I", "EctoControlAdapter", "baud: " + String(_baud) + ", protocol: " + String(protocol, HEX) + ", RX: " + String(_rx) + ", TX: " + String(_tx)); - } - ((HardwareSerial *)_modbusUART)->begin(_baud, protocol, _rx, _tx); // выбираем тип протокола, скорость и все пины с веба - ((HardwareSerial *)_modbusUART)->setTimeout(200); - //_modbusUART = &serial; - node.begin(_addr, _modbusUART); - - node.preTransmission(modbusPreTransmission); - node.postTransmission(modbusPostTransmission); - - - if (_DIR_PIN) - { - _DIR_PIN = _DIR_PIN; - pinMode(_DIR_PIN, OUTPUT); - digitalWrite(_DIR_PIN, LOW); - } - - // 0x14 – адаптер OpenTherm (вторая версия) - // 0x15 – адаптер eBus - // 0x16 – адаптер Navien - uint16_t type; - readFunctionModBus(0x0000, type); - if (0x14 != (uint8_t)type || 0x15 != (uint8_t)type || 0x16 != (uint8_t)type) - { - SerialPrint("E", "EctoControlAdapter", "Не подходящее устройство, type: " + String(type, HEX)); - } - - uint8_t addr = node.readAddresEctoControl(); - SerialPrint("I", "EctoControlAdapter", "readAddresEctoControl, addr: " + String(addr, HEX) + " - Enter to configuration"); - - getModelVersion(); - getBoilerInfo(); - getBoilerStatus(); - } - - void doByInterval() - { - // readBoilerInfo(); - getBoilerStatus(); - - getCodeError(); - getCodeErrorExt(); - if (info.adapterType == 0) - getFlagErrorOT(); - // getFlowRate(); - // getMaxSetCH(); - // getMaxSetDHW(); - // getMinSetCH(); - // getMinSetDHW(); - getModLevel(); - getPressure(); - getTempCH(); - getTempDHW(); - getTempOutside(); - } - - void loop() - { - // для новых версий IoTManager - IoTItem::loop(); - } - - IoTValue execute(String command, std::vector ¶m) - { - if (command == "getModelVersion") - { - getModelVersion(); - } - if (command == "getModelVersion") - { - getModelVersion(); - } - if (command == "getBoilerInfo") - { - getBoilerInfo(); - } - if (command == "getBoilerStatus") - { - getBoilerStatus(); - } - if (command == "getCodeError") - { - getCodeError(); - } - if (command == "getCodeErrorExt") - { - getCodeErrorExt(); - } - if (command == "getFlagErrorOT") - { - getFlagErrorOT(); - } - if (command == "getFlowRate") - { - getFlowRate(); - } - if (command == "getMaxSetCH") - { - getMaxSetCH(); - } - if (command == "getMaxSetDHW") - { - getMaxSetDHW(); - } - if (command == "getMinSetCH") - { - getMinSetCH(); - } - if (command == "getMinSetDHW") - { - getMinSetDHW(); - } - if (command == "getModLevel") - { - getModLevel(); - } - if (command == "getPressure") - { - getPressure(); - } - if (command == "getTempCH") - { - getTempCH(); - } - if (command == "getTempDHW") - { - getTempDHW(); - } - if (command == "getTempOutside") - { - getTempOutside(); + EctoControlAdapter(String parameters) : IoTItem(parameters) + { + _DIR_PIN = 0; + _addr = jsonReadInt(parameters, "addr"); // адреса slave прочитаем с веба + _rx = jsonReadInt(parameters, "RX"); // прочитаем с веба + _tx = jsonReadInt(parameters, "TX"); + _DIR_PIN = jsonReadInt(parameters, "DIR_PIN"); + _baud = jsonReadInt(parameters, "baud"); + _prot = jsonReadStr(parameters, "protocol"); + jsonRead(parameters, "debug", _debugLevel); + + if (_prot == "SERIAL_8N1") + { + protocol = SERIAL_8N1; + } + else if (_prot == "SERIAL_8N2") + { + protocol = SERIAL_8N2; + } + + // Serial2.begin(baud-rate, protocol, RX pin, TX pin); + + _modbusUART = new HardwareSerial(UART_LINE); + + if (_debugLevel > 2) + { + SerialPrint("I", "EctoControlAdapter", "baud: " + String(_baud) + ", protocol: " + String(protocol, HEX) + ", RX: " + String(_rx) + ", TX: " + String(_tx)); + } + ((HardwareSerial *)_modbusUART)->begin(_baud, protocol, _rx, _tx); // выбираем тип протокола, скорость и все пины с веба + ((HardwareSerial *)_modbusUART)->setTimeout(200); + //_modbusUART = &serial; + node.begin(_addr, _modbusUART); + + node.preTransmission(modbusPreTransmission); + node.postTransmission(modbusPostTransmission); + + if (_DIR_PIN) + { + _DIR_PIN = _DIR_PIN; + pinMode(_DIR_PIN, OUTPUT); + digitalWrite(_DIR_PIN, LOW); + } + + // 0x14 – адаптер OpenTherm (вторая версия) + // 0x15 – адаптер eBus + // 0x16 – адаптер Navien + if (_addr > 0) + { + uint16_t type; + readFunctionModBus(0x0000, type); + if (0x14 != (uint8_t)type || 0x15 != (uint8_t)type || 0x16 != (uint8_t)type) + { + SerialPrint("E", "EctoControlAdapter", "Не подходящее устройство, type: " + String(type, HEX)); + } + } + else if (_addr == 0) + { // если адреса нет, то шлем широковещательный запрос адреса + uint8_t addr = node.readAddresEctoControl(); + SerialPrint("I", "EctoControlAdapter", "readAddresEctoControl, addr: " + String(addr, HEX) + " - Enter to configuration"); + } + getModelVersion(); + getBoilerInfo(); + getBoilerStatus(); + } + + void doByInterval() + { + // readBoilerInfo(); + getBoilerStatus(); + + getCodeError(); + getCodeErrorExt(); + if (info.adapterType == 0) + getFlagErrorOT(); + // getFlowRate(); + // getMaxSetCH(); + // getMaxSetDHW(); + // getMinSetCH(); + // getMinSetDHW(); + getModLevel(); + getPressure(); + getTempCH(); + getTempDHW(); + getTempOutside(); + } + + void loop() + { + // для новых версий IoTManager + IoTItem::loop(); + } + + IoTValue execute(String command, std::vector ¶m) + { + if (command == "getModelVersion") + { + getModelVersion(); + } + if (command == "getModelVersion") + { + getModelVersion(); + } + if (command == "getBoilerInfo") + { + getBoilerInfo(); + } + if (command == "getBoilerStatus") + { + getBoilerStatus(); + } + if (command == "getCodeError") + { + getCodeError(); + } + if (command == "getCodeErrorExt") + { + getCodeErrorExt(); + } + if (command == "getFlagErrorOT") + { + getFlagErrorOT(); + } + if (command == "getFlowRate") + { + getFlowRate(); + } + if (command == "getMaxSetCH") + { + getMaxSetCH(); + } + if (command == "getMaxSetDHW") + { + getMaxSetDHW(); + } + if (command == "getMinSetCH") + { + getMinSetCH(); + } + if (command == "getMinSetDHW") + { + getMinSetDHW(); + } + if (command == "getModLevel") + { + getModLevel(); + } + if (command == "getPressure") + { + getPressure(); + } + if (command == "getTempCH") + { + getTempCH(); + } + if (command == "getTempDHW") + { + getTempDHW(); + } + if (command == "getTempOutside") + { + getTempOutside(); + } + + if (command == "setTypeConnect") + { + setTypeConnect(param[0].valD); + } + if (command == "setTCH") + { + setTCH(param[0].valD); + } + if (command == "setTCHFaultConn") + { + setTCHFaultConn(param[0].valD); + } + if (command == "setMinCH") + { + setMinCH(param[0].valD); + } + if (command == "setMaxCH") + { + setMaxCH(param[0].valD); + } + if (command == "setMinDHW") + { + setMinDHW(param[0].valD); + } + if (command == "setMaxDHW") + { + setMaxDHW(param[0].valD); + } + if (command == "setTDHW") + { + setTDHW(param[0].valD); + } + if (command == "setMaxModLevel") + { + setMaxModLevel(param[0].valD); + } + if (command == "setStatusCH") + { + setStatusCH((bool)param[0].valD); + } + if (command == "setStatusDHW") + { + setStatusDHW((bool)param[0].valD); + } + if (command == "setStatusCH2") + { + setStatusCH2((bool)param[0].valD); + } + + if (command == "lockOutReset") + { + lockOutReset(); + } + if (command == "rebootAdapter") + { + rebootAdapter(); + } + return {}; + } + + void publishData(String widget, String status) + { + + IoTItem *tmp = findIoTItem(widget); + if (tmp) + tmp->setValue(status, true); + else + { + if (_debugLevel > 0) + SerialPrint("i", "NEW", widget + " = " + status); + } + } + + static void sendTelegramm(String msg) + { + if (tlgrmItem) + tlgrmItem->sendTelegramMsg(false, msg); + } + + ~EctoControlAdapter() { + }; + + bool writeFunctionModBus(const uint16_t ®, uint16_t &data) + { + // set word 0 of TX buffer to least-significant word of counter (bits 15..0) + node.setTransmitBuffer(1, lowWord(data)); + // set word 1 of TX buffer to most-significant word of counter (bits 31..16) + node.setTransmitBuffer(0, highWord(data)); + // slave: write TX buffer to (2) 16-bit registers starting at register 0 + uint8_t result = node.writeMultipleRegisters(0, 2); + if (_debug > 2) + { + SerialPrint("I", "EctoControlAdapter", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(reg, HEX) + ", state: " + String(data) + " = result: " + String(result, HEX)); + } + if (result == 0) + return true; + else + return false; + } + + bool readFunctionModBus(const uint16_t ®, uint16_t &reading) + { + // float retValue = 0; + if (_modbusUART) + { + // if (!addr) + // addr = _addr; + node.begin(_addr, _modbusUART); + uint8_t result; + // uint32_t reading; + + if (reg == 0x0000) + result = node.readHoldingRegisters(reg, 4); + else + result = node.readHoldingRegisters(reg, 1); + if (_debug > 2) + SerialPrint("I", "EctoControlAdapter", "readHoldingRegisters, addr: " + String(_addr, HEX) + ", reg: " + String(reg, HEX) + " = result: " + String(result, HEX)); + // break; + if (result == node.ku8MBSuccess) + { + if (reg == 0x0000) + { + reading = node.getResponseBuffer(0x03); + reading = (uint16_t)((uint8_t)(reading) >> 8); + SerialPrint("I", "EctoControlAdapter", "read info, addr: " + String(_addr, HEX) + ", type: " + String(reading, HEX)); + } + else + { + reading = node.getResponseBuffer(0x00); + if (_debug > 2) + SerialPrint("I", "EctoControlAdapter", "Success, Received data, register: " + String(reg) + " = " + String(reading, HEX)); + } + node.clearResponseBuffer(); + } + else + { + if (_debug > 2) + SerialPrint("E", "EctoControlAdapter", "Failed, Response Code: " + String(result, HEX)); + return false; + } + + if (reading != 0x7FFF) + return true; + else + return false; + } + return false; + } + + bool getModelVersion() + { + uint16_t reqData; + info.boilerMemberCode = readFunctionModBus(ReadDataEctoControl::ecR_MemberCode, info.boilerMemberCode); + info.boilerModelCode = readFunctionModBus(ReadDataEctoControl::ecR_ModelCode, info.boilerModelCode); + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_AdaperVersion, reqData); + info.adapterHardVer = highByte(reqData); + info.adapterSoftVer = lowByte(reqData); + return ret; + } + + bool getBoilerInfo() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_AdapterInfo, reqData); + info.adapterType = highByte(reqData) & 0xF8; + info.boilerStatus = (highByte(reqData) >> 3) & 1u; + info.rebootStatus = lowByte(reqData); + if (ret) + { + publishData("adapterType", String(info.adapterType)); + publishData("boilerStatus", String(info.boilerStatus)); + publishData("rebootStatus", String(info.rebootStatus)); + } + return ret; + } + bool getBoilerStatus() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_BoilerStatus, reqData); + status.burnStatus = (lowByte(reqData) >> 0) & 1u; + status.CHStatus = (lowByte(reqData) >> 1) & 1u; + status.DHWStatus = (lowByte(reqData) >> 2) & 1u; + if (ret) + { + publishData("burnStatus", String(status.burnStatus)); + publishData("CHStatus", String(status.CHStatus)); + publishData("DHWStatus", String(status.DHWStatus)); + } + return ret; + } + bool getCodeError() + { + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_CodeError, code); + if (ret) + { + publishData("codeError", String(code)); + if (codeExt) + sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)codeExt)); + } + return ret; + } + bool getCodeErrorExt() + { + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_CodeErrorExt, codeExt); + if (ret) + { + publishData("codeErrorExt", String(codeExt)); + if (codeExt) + sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)codeExt)); + } + return ret; + } + bool getFlagErrorOT() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_FlagErrorOT, reqData); + flagErr = lowByte(reqData); + if (ret) + { + publishData("flagErr", String(flagErr)); + switch (flagErr) + { + case 0: + sendTelegramm("EctoControlAdapter: Необходимо обслуживание!"); + break; + case 1: + sendTelegramm("EctoControlAdapter: Котёл заблокирован!"); + break; + case 2: + sendTelegramm("EctoControlAdapter: Низкое давление в отопительном контуре!"); + break; + case 3: + sendTelegramm("EctoControlAdapter: Ошибка розжига!"); + break; + case 4: + sendTelegramm("EctoControlAdapter: Низкое давления воздуха!"); + break; + case 5: + sendTelegramm("EctoControlAdapter: Перегрев теплоносителя в контуре!"); + break; + default: + break; + } + } + return ret; + } + + bool getFlowRate() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_FlowRate, reqData); + flow = lowByte(reqData) / 10.f; + if (ret) + publishData("flowRate", String(flow)); + return ret; + } + bool getMaxSetCH() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MaxSetCH, reqData); + maxSetCH = (float)lowByte(reqData); + if (ret) + publishData("maxSetCH", String(maxSetCH)); + return ret; + } + bool getMaxSetDHW() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MaxSetDHW, reqData); + maxSetDHW = (float)lowByte(reqData); + if (ret) + publishData("maxSetDHW", String(maxSetDHW)); + return ret; + } + bool getMinSetCH() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MinSetCH, reqData); + minSetCH = (float)lowByte(reqData); + if (ret) + publishData("minSetCH", String(minSetCH)); + return ret; + } + bool getMinSetDHW() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MinSetDHW, reqData); + minSetDHW = (float)lowByte(reqData); + if (ret) + publishData("minSetDHW", String(minSetDHW)); + return ret; + } + bool getModLevel() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_ModLevel, reqData); + modLevel = (float)lowByte(reqData); + if (ret) + publishData("modLevel", String(modLevel)); + return ret; + } + bool getPressure() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_Pressure, reqData); + press = lowByte(reqData) / 10.f; + if (ret) + publishData("press", String(press)); + return ret; + } + bool getTempCH() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempCH, reqData); + tCH = reqData / 10.f; + if (ret) + publishData("tCH", String(tCH)); + return ret; + } + bool getTempDHW() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempDHW, reqData); + tDHW = reqData / 10.f; + if (ret) + publishData("tDHW", String(tDHW)); + return ret; + } + bool getTempOutside() + { + uint16_t reqData; + bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempOutside, reqData); + tOut = (float)lowByte(reqData); + if (ret) + publishData("tOut", String(tOut)); + return ret; + } + + bool setTypeConnect(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_SetTypeConnect, (uint16_t &)data)) + { + // TODO запросить результат записи у адаптера + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setTypeConnect"); + } + return ret; + } + bool setTCH(float &data) + { + bool ret = false; + uint16_t d16 = data * 10; + if (writeFunctionModBus(ecW_TSetCH, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setTCH"); + } + + return ret; + } + bool setTCHFaultConn(float &data) + { + bool ret = false; + uint16_t d16 = data * 10; + if (writeFunctionModBus(ecW_TSetCHFaultConn, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setTCHFaultConn"); + } + return ret; + } + bool setMinCH(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_TSetMinCH, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setMinCH"); + } + return ret; + } + bool setMaxCH(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_TSetMaxCH, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setMaxCH"); + } + return ret; + } + bool setMinDHW(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_TSetMinDHW, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setMinDHW"); + } + return ret; + } + bool setMaxDHW(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_TSetMaxDHW, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setMaxDHW"); + } + return ret; + } + bool setTDHW(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_TSetDHW, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setTDHW"); + } + return ret; + } + bool setMaxModLevel(float &data) + { + bool ret = false; + if (writeFunctionModBus(ecW_SetMaxModLevel, (uint16_t &)data)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setMaxModLevel"); + } + return ret; + } + + bool setStatusCH(bool data) + { + bool ret = false; + enableCH = data; + uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); + if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setStatusCH"); + } + return ret; + } + bool setStatusDHW(bool data) + { + bool ret = false; + enableDHW = data; + uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); + if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setStatusDHW"); + } + return ret; + } + bool setStatusCH2(bool data) + { + bool ret = false; + enableCH2 = data; + uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); + if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, setStatusCH2"); + } + return ret; + } + + bool lockOutReset() + { + bool ret = false; + uint16_t d16 = comm_LockOutReset; + if (writeFunctionModBus(ecW_Command, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, lockOutReset"); + } + return ret; + } + bool rebootAdapter() + { + bool ret = false; + uint16_t d16 = comm_RebootAdapter; + if (writeFunctionModBus(ecW_Command, d16)) + { + ret = true; + } + else + { + if (_debug > 1) + SerialPrint("E", "EctoControlAdapter", "Failed, rebootAdapter"); + } + return ret; } +}; - if (command == "setTypeConnect") - { - setTypeConnect(param[0].valD); - } - if (command == "setTCH") - { - setTCH(param[0].valD); - } - if (command == "setTCHFaultConn") - { - setTCHFaultConn(param[0].valD); - } - if (command == "setMinCH") - { - setMinCH(param[0].valD); - } - if (command == "setMaxCH") - { - setMaxCH(param[0].valD); - } - if (command == "setMinDHW") - { - setMinDHW(param[0].valD); - } - if (command == "setMaxDHW") - { - setMaxDHW(param[0].valD); - } - if (command == "setTDHW") - { - setTDHW(param[0].valD); - } - if (command == "setMaxModLevel") - { - setMaxModLevel(param[0].valD); - } - if (command == "setStatusCH") - { - setStatusCH((bool)param[0].valD); - } - if (command == "setStatusDHW") - { - setStatusDHW((bool)param[0].valD); - } - if (command == "setStatusCH2") - { - setStatusCH2((bool)param[0].valD); - } +void *getAPI_EctoControlAdapter(String subtype, String param) +{ - if (command == "lockOutReset") + if (subtype == F("ecAdapter")) { - lockOutReset(); + return new EctoControlAdapter(param); } - if (command == "rebootAdapter") { - rebootAdapter(); + return nullptr; } - return {}; - } - - void publishData(String widget, String status) - { - - IoTItem *tmp = findIoTItem(widget); - if (tmp) - tmp->setValue(status, true); - else - { - if (_debugLevel > 0) - SerialPrint("i", "NEW", widget + " = " + status); - } - } - - static void sendTelegramm(String msg) - { - if (tlgrmItem) - tlgrmItem->sendTelegramMsg(false, msg); - } - - ~EctoControlAdapter() - { - }; - - bool writeFunctionModBus(const uint16_t ®, uint16_t &data) - { - // set word 0 of TX buffer to least-significant word of counter (bits 15..0) - node.setTransmitBuffer(1, lowWord(data)); - // set word 1 of TX buffer to most-significant word of counter (bits 31..16) - node.setTransmitBuffer(0, highWord(data)); - // slave: write TX buffer to (2) 16-bit registers starting at register 0 - uint8_t result = node.writeMultipleRegisters(0, 2); - if (_debug > 2) - { - SerialPrint("I", "EctoControlAdapter", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(reg, HEX) + ", state: " + String(data) + " = result: " + String(result, HEX)); - } - if (result == 0) - return true; - else - return false; - } - - bool readFunctionModBus(const uint16_t ®, uint16_t &reading) - { - // float retValue = 0; - if (_modbusUART) - { - // if (!addr) - // addr = _addr; - node.begin(_addr, _modbusUART); - uint8_t result; - // uint32_t reading; - - if (reg == 0x0000) - result = node.readHoldingRegisters(reg, 4); - else - result = node.readHoldingRegisters(reg, 1); - if (_debug > 2) - SerialPrint("I", "EctoControlAdapter", "readHoldingRegisters, addr: " + String(_addr, HEX) + ", reg: " + String(reg, HEX) + " = result: " + String(result, HEX)); - // break; - if (result == node.ku8MBSuccess) - { - if (reg == 0x0000) - { - reading = node.getResponseBuffer(0x03); - reading = (uint16_t)((uint8_t)(reading) >> 8); - SerialPrint("I", "EctoControlAdapter", "read info, addr: " + String(_addr, HEX) + ", type: " + String(reading, HEX)); - } - else - { - reading = node.getResponseBuffer(0x00); - if (_debug > 2) - SerialPrint("I", "EctoControlAdapter", "Success, Received data, register: " + String(reg) + " = " + String(reading, HEX)); - } - node.clearResponseBuffer(); - } - else - { - if (_debug > 2) - SerialPrint("E", "EctoControlAdapter", "Failed, Response Code: " + String(result, HEX)); - return false; - } - - if (reading != 0x7FFF) - return true; - else - return false; - } - return false; - } - - bool getModelVersion() - { - uint16_t reqData; - info.boilerMemberCode = readFunctionModBus(ReadDataEctoControl::ecR_MemberCode, info.boilerMemberCode); - info.boilerModelCode = readFunctionModBus(ReadDataEctoControl::ecR_ModelCode, info.boilerModelCode); - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_AdaperVersion, reqData); - info.adapterHardVer = highByte(reqData); - info.adapterSoftVer = lowByte(reqData); - return ret; - } - - bool getBoilerInfo() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_AdapterInfo, reqData); - info.adapterType = highByte(reqData) & 0xF8; - info.boilerStatus = (highByte(reqData) >> 3) & 1u; - info.rebootStatus = lowByte(reqData); - if (ret) - { - publishData("adapterType", String(info.adapterType)); - publishData("boilerStatus", String(info.boilerStatus)); - publishData("rebootStatus", String(info.rebootStatus)); - } - return ret; - } - bool getBoilerStatus() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_BoilerStatus, reqData); - status.burnStatus = (lowByte(reqData) >> 0) & 1u; - status.CHStatus = (lowByte(reqData) >> 1) & 1u; - status.DHWStatus = (lowByte(reqData) >> 2) & 1u; - if (ret) - { - publishData("burnStatus", String(status.burnStatus)); - publishData("CHStatus", String(status.CHStatus)); - publishData("DHWStatus", String(status.DHWStatus)); - } - return ret; - } - bool getCodeError() - { - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_CodeError, code); - if (ret) - { - publishData("codeError", String(code)); - if (codeExt) - sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)codeExt)); - } - return ret; - } - bool getCodeErrorExt() - { - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_CodeErrorExt, codeExt); - if (ret) - { - publishData("codeErrorExt", String(codeExt)); - if (codeExt) - sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)codeExt)); - } - return ret; - } - bool getFlagErrorOT() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_FlagErrorOT, reqData); - flagErr = lowByte(reqData); - if (ret) - { - publishData("flagErr", String(flagErr)); - switch (flagErr) - { - case 0: - sendTelegramm("EctoControlAdapter: Необходимо обслуживание!"); - break; - case 1: - sendTelegramm("EctoControlAdapter: Котёл заблокирован!"); - break; - case 2: - sendTelegramm("EctoControlAdapter: Низкое давление в отопительном контуре!"); - break; - case 3: - sendTelegramm("EctoControlAdapter: Ошибка розжига!"); - break; - case 4: - sendTelegramm("EctoControlAdapter: Низкое давления воздуха!"); - break; - case 5: - sendTelegramm("EctoControlAdapter: Перегрев теплоносителя в контуре!"); - break; - default: - break; - } - } - return ret; - } - - bool getFlowRate() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_FlowRate, reqData); - flow = lowByte(reqData) / 10.f; - if (ret) - publishData("flowRate", String(flow)); - return ret; - } - bool getMaxSetCH() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MaxSetCH, reqData); - maxSetCH = (float)lowByte(reqData); - if (ret) - publishData("maxSetCH", String(maxSetCH)); - return ret; - } - bool getMaxSetDHW() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MaxSetDHW, reqData); - maxSetDHW = (float)lowByte(reqData); - if (ret) - publishData("maxSetDHW", String(maxSetDHW)); - return ret; - } - bool getMinSetCH() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MinSetCH, reqData); - minSetCH = (float)lowByte(reqData); - if (ret) - publishData("minSetCH", String(minSetCH)); - return ret; - } - bool getMinSetDHW() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_MinSetDHW, reqData); - minSetDHW = (float)lowByte(reqData); - if (ret) - publishData("minSetDHW", String(minSetDHW)); - return ret; - } - bool getModLevel() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_ModLevel, reqData); - modLevel = (float)lowByte(reqData); - if (ret) - publishData("modLevel", String(modLevel)); - return ret; - } - bool getPressure() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_Pressure, reqData); - press = lowByte(reqData) / 10.f; - if (ret) - publishData("press", String(press)); - return ret; - } - bool getTempCH() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempCH, reqData); - tCH = reqData / 10.f; - if (ret) - publishData("tCH", String(tCH)); - return ret; - } - bool getTempDHW() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempDHW, reqData); - tDHW = reqData / 10.f; - if (ret) - publishData("tDHW", String(tDHW)); - return ret; - } - bool getTempOutside() - { - uint16_t reqData; - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_TempOutside, reqData); - tOut = (float)lowByte(reqData); - if (ret) - publishData("tOut", String(tOut)); - return ret; - } - - bool setTypeConnect(float &data) - { - bool ret = false; - if (writeFunctionModBus(ecW_SetTypeConnect, (uint16_t &)data)) - { - // TODO запросить результат записи у адаптера - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setTypeConnect"); - } - return ret; - } - bool setTCH(float &data) - { - bool ret = false; - uint16_t d16 = data * 10; - if (writeFunctionModBus(ecW_TSetCH, d16)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setTCH"); - } - - return ret; - } - bool setTCHFaultConn(float &data) - { - bool ret = false; - uint16_t d16 = data * 10; - if (writeFunctionModBus(ecW_TSetCHFaultConn, d16)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setTCHFaultConn"); - } - return ret; - } - bool setMinCH(float &data) - { - bool ret = false; - if (writeFunctionModBus(ecW_TSetMinCH, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setMinCH"); - } - return ret; - } - bool setMaxCH(float &data) - { - bool ret = false; - if (writeFunctionModBus(ecW_TSetMaxCH, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setMaxCH"); - } - return ret; - } - bool setMinDHW(float &data) - { - bool ret = false; - if (writeFunctionModBus(ecW_TSetMinDHW, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setMinDHW"); - } - return ret; - } - bool setMaxDHW(float &data) - { - bool ret = false; - if (writeFunctionModBus(ecW_TSetMaxDHW, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setMaxDHW"); - } - return ret; - } - bool setTDHW(float &data) - { - bool ret = false; - if (writeFunctionModBus(ecW_TSetDHW, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setTDHW"); - } - return ret; - } - bool setMaxModLevel(float &data) - { - bool ret = false; - if (writeFunctionModBus(ecW_SetMaxModLevel, (uint16_t &)data)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setMaxModLevel"); - } - return ret; - } - - bool setStatusCH(bool data) - { - bool ret = false; - enableCH = data; - uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); - if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setStatusCH"); - } - return ret; - } - bool setStatusDHW(bool data) - { - bool ret = false; - enableDHW = data; - uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); - if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setStatusDHW"); - } - return ret; - } - bool setStatusCH2(bool data) - { - bool ret = false; - enableCH2 = data; - uint16_t stat = enableCH | (enableDHW << 1) | (enableCH2 << 2); - if (writeFunctionModBus(ecW_SetStatusBoiler, stat)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, setStatusCH2"); - } - return ret; - } - - bool lockOutReset() - { - bool ret = false; - uint16_t d16 = comm_LockOutReset; - if (writeFunctionModBus(ecW_Command, d16)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, lockOutReset"); - } - return ret; - } - bool rebootAdapter() - { - bool ret = false; - uint16_t d16 = comm_RebootAdapter; - if (writeFunctionModBus(ecW_Command, d16)) - { - ret = true; - } - else - { - if (_debug > 1) - SerialPrint("E", "EctoControlAdapter", "Failed, rebootAdapter"); - } - return ret; - } - - - -}; - -void *getAPI_EctoControlAdapter(String subtype, String param) -{ - - if (subtype == F("ecAdapter")) - { - return new EctoControlAdapter(param); - } - { - return nullptr; - } } diff --git a/src/modules/exec/EctoControlAdapter/ModbusEC.cpp b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp index 1b74d552..dd88f86c 100644 --- a/src/modules/exec/EctoControlAdapter/ModbusEC.cpp +++ b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp @@ -429,8 +429,12 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) if (u8ModbusADUSize == 5) { // verify response is for correct Modbus slave - if (u8ModbusADU[0] != _u8MBSlave || u8ModbusADU[0] != 0x00) + if (u8ModbusADU[0] != _u8MBSlave) { + // Serial.print(u8ModbusADU[0], HEX); + // Serial.print(" != "); + // Serial.println(_u8MBSlave, HEX); + u8MBStatus = ku8MBInvalidSlaveID; break; } diff --git a/src/modules/exec/EctoControlAdapter/modinfo.json b/src/modules/exec/EctoControlAdapter/modinfo.json index 01c3c690..459168cd 100644 --- a/src/modules/exec/EctoControlAdapter/modinfo.json +++ b/src/modules/exec/EctoControlAdapter/modinfo.json @@ -11,12 +11,12 @@ "page": "Котёл", "descr": "Адаптер", "int": 60, - "addr": "0xF0", + "addr": 240, "RX": 18, "TX": 19, "DIR_PIN": 4, - "baud": 9600, - "protocol": "SERIAL_8N2", + "baud": 19200, + "protocol": "SERIAL_8N1", "debug": 1 } ], @@ -37,7 +37,7 @@ "title": "EctoControlAdapter", "moduleDesc": "Управление отопительным котлом через адаптер EctoControl по протоколам OpenTherm, eBUS, Navien. Посредством Modbus RTU. Разъем 4P4C: 1-Желтый(красный)+12V; 2-Белый-GND; 3-Зелёный-A; 4-Коричневый(Синий)-B", "propInfo": { - "addr": "Адрес slave", + "addr": "Адрес slave, что бы узнать адрес - в конфиге адрес 0 и смотреть лог (требуется проверка)", "int": "Количество секунд между опросами датчика.", "RX": "Пин RX", "TX": "Пин TX", From 67a6eba8827e3d41e16cd232d6a534111a48ca33 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 24 Feb 2025 19:50:42 +0300 Subject: [PATCH 072/118] fix ecto writeRegister --- .../EctoControlAdapter/EctoControlAdapter.cpp | 27 ++++++++++++------- .../exec/EctoControlAdapter/ModbusEC.cpp | 22 +++++++++++++++ .../exec/EctoControlAdapter/ModbusEC.h | 4 +-- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp index c8c7e1f2..660269d2 100644 --- a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp +++ b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp @@ -329,11 +329,11 @@ class EctoControlAdapter : public IoTItem bool writeFunctionModBus(const uint16_t ®, uint16_t &data) { // set word 0 of TX buffer to least-significant word of counter (bits 15..0) - node.setTransmitBuffer(1, lowWord(data)); + //node.setTransmitBuffer(1, lowWord(data)); // set word 1 of TX buffer to most-significant word of counter (bits 31..16) - node.setTransmitBuffer(0, highWord(data)); + //node.setTransmitBuffer(0, highWord(data)); // slave: write TX buffer to (2) 16-bit registers starting at register 0 - uint8_t result = node.writeMultipleRegisters(0, 2); + uint8_t result = node.writeSingleRegister(reg, data); if (_debug > 2) { SerialPrint("I", "EctoControlAdapter", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(reg, HEX) + ", state: " + String(data) + " = result: " + String(result, HEX)); @@ -585,7 +585,8 @@ class EctoControlAdapter : public IoTItem bool setTypeConnect(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_SetTypeConnect, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_SetTypeConnect, data16)) { // TODO запросить результат записи у адаптера ret = true; @@ -631,7 +632,8 @@ class EctoControlAdapter : public IoTItem bool setMinCH(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_TSetMinCH, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_TSetMinCH, data16)) { ret = true; } @@ -645,7 +647,8 @@ class EctoControlAdapter : public IoTItem bool setMaxCH(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_TSetMaxCH, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_TSetMaxCH, data16)) { ret = true; } @@ -659,7 +662,8 @@ class EctoControlAdapter : public IoTItem bool setMinDHW(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_TSetMinDHW, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_TSetMinDHW, data16)) { ret = true; } @@ -673,7 +677,8 @@ class EctoControlAdapter : public IoTItem bool setMaxDHW(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_TSetMaxDHW, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_TSetMaxDHW, data16)) { ret = true; } @@ -687,7 +692,8 @@ class EctoControlAdapter : public IoTItem bool setTDHW(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_TSetDHW, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_TSetDHW, data16)) { ret = true; } @@ -701,7 +707,8 @@ class EctoControlAdapter : public IoTItem bool setMaxModLevel(float &data) { bool ret = false; - if (writeFunctionModBus(ecW_SetMaxModLevel, (uint16_t &)data)) + uint16_t data16 = data; + if (writeFunctionModBus(ecW_SetMaxModLevel, data16)) { ret = true; } diff --git a/src/modules/exec/EctoControlAdapter/ModbusEC.cpp b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp index dd88f86c..029e448b 100644 --- a/src/modules/exec/EctoControlAdapter/ModbusEC.cpp +++ b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp @@ -253,6 +253,28 @@ uint8_t ModbusMaster::readHoldingRegisters(uint16_t u16ReadAddress, return ModbusMasterTransaction(ku8MBReadHoldingRegisters); } +/** +Modbus function 0x06 Write Single Register. + +This function code is used to write a single holding register in a +remote device. The request specifies the address of the register to be +written. Registers are addressed starting at zero. + +@param u16WriteAddress address of the holding register (0x0000..0xFFFF) +@param u16WriteValue value to be written to holding register (0x0000..0xFFFF) +@return 0 on success; exception number on failure +@ingroup register +*/ +uint8_t ModbusMaster::writeSingleRegister(uint16_t u16WriteAddress, + uint16_t u16WriteValue) +{ + _u16WriteAddress = u16WriteAddress; + _u16WriteQty = 0; + _u16TransmitBuffer[0] = u16WriteValue; + return ModbusMasterTransaction(ku8MBWriteSingleRegister); +} + + /** Modbus function 0x10 Write Multiple Registers. diff --git a/src/modules/exec/EctoControlAdapter/ModbusEC.h b/src/modules/exec/EctoControlAdapter/ModbusEC.h index 0f5f1f79..c9cd6fb0 100644 --- a/src/modules/exec/EctoControlAdapter/ModbusEC.h +++ b/src/modules/exec/EctoControlAdapter/ModbusEC.h @@ -52,7 +52,7 @@ class ModbusMaster uint8_t readHoldingRegisters(uint16_t, uint16_t); uint8_t writeMultipleRegisters(uint16_t, uint16_t); uint8_t writeMultipleRegisters(); - + uint8_t writeSingleRegister(uint16_t, uint16_t); uint8_t readAddresEctoControl(); uint8_t writeAddresEctoControl(uint8_t); @@ -76,7 +76,7 @@ class ModbusMaster // Modbus function codes for 16 bit access static const uint8_t ku8MBReadHoldingRegisters = 0x03; ///< Modbus function 0x03 Read Holding Registers static const uint8_t ku8MBWriteMultipleRegisters = 0x10; ///< Modbus function 0x10 Write Multiple Registers - + static const uint8_t ku8MBWriteSingleRegister = 0x06; ///< Modbus function 0x06 Write Single Register static const uint8_t ku8MBProgRead46 = 0x46; ///< EctoControl function 0x46 Устройство возвращает в ответе свой текущий адрес ADDR static const uint8_t ku8MBProgWrite47 = 0x47; ///< EctoControl function 0x47 высылается ведущим устройством ведомому с указанием сменить свой имеющийся адрес на заданный // высылается ведущим устройством единственному устройству на шине с неизвестным адресом From 27f2e67e8e3e26af0887ad0fabf2340761c09ed6 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 24 Feb 2025 20:16:00 +0300 Subject: [PATCH 073/118] fix wifi 8266 --- include/utils/WiFiUtils.h | 3 ++- src/modules/exec/EctoControlAdapter/modinfo.json | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/utils/WiFiUtils.h b/include/utils/WiFiUtils.h index 96fed80f..9620b7f8 100644 --- a/include/utils/WiFiUtils.h +++ b/include/utils/WiFiUtils.h @@ -4,6 +4,7 @@ #include "MqttClient.h" boolean isNetworkActive(); uint8_t getNumAPClients(); +bool startAPMode(); #ifdef ESP8266 void routerConnect(); boolean RouterFind(std::vector jArray); @@ -13,7 +14,7 @@ void WiFiUtilsItit(); void connectToNextNetwork(); void checkConnection(); void ScanAsync(); -bool startAPMode(); + #endif uint8_t RSSIquality(); //extern void wifiSignalInit(); diff --git a/src/modules/exec/EctoControlAdapter/modinfo.json b/src/modules/exec/EctoControlAdapter/modinfo.json index 459168cd..d02ab116 100644 --- a/src/modules/exec/EctoControlAdapter/modinfo.json +++ b/src/modules/exec/EctoControlAdapter/modinfo.json @@ -203,7 +203,6 @@ "defActive": false, "usedLibs": { "esp32*": [], - "esp32c3m_4mb": ["exclude"], - "esp82*": [] + "esp32c3m_4mb": ["exclude"] } } \ No newline at end of file From a7a02db13d0a61d3eaecce44fc45b5389aed7b25 Mon Sep 17 00:00:00 2001 From: Ilya Date: Mon, 10 Mar 2025 23:15:56 +0500 Subject: [PATCH 074/118] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D1=8F=D0=B5=D0=BC=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83?= =?UTF-8?q?=20=D0=B2=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B2=D1=85=D0=BE=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D0=BF=D0=B5=D1=80=D0=B8=D0=BE=D0=B4=20=D0=B2=20nowInT?= =?UTF-8?q?imePeriod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/virtual/Math/Math.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/modules/virtual/Math/Math.cpp b/src/modules/virtual/Math/Math.cpp index d726d2dc..979031f6 100644 --- a/src/modules/virtual/Math/Math.cpp +++ b/src/modules/virtual/Math/Math.cpp @@ -37,9 +37,16 @@ class IoTMath : public IoTItem { int h2 = selectToMarker(endTime, ":").toInt(); int min2 = selectToMarkerLast(endTime, ":").toInt(); + int sumMin1 = h1 * 60 + min1; + int sumMin2 = h2 * 60 + min2; + int nowMinutes = _time_local.hour * 60 + _time_local.minute; - return nowMinutes >= h1 * 60 + min1 && nowMinutes <= h2 * 60 + min2; + if (sumMin1 <= sumMin2) { + return nowMinutes >= sumMin1 && nowMinutes <= sumMin2; + } else { + return nowMinutes >= sumMin1 && nowMinutes <= 24 * 60 || nowMinutes >= 0 && nowMinutes <= sumMin2; + } } From 78742d90a190a73ffb643ac3072a2f6ed20fceb0 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 10 Mar 2025 22:09:42 +0300 Subject: [PATCH 075/118] fix EctoControl --- .../EctoControlAdapter/EctoControlAdapter.cpp | 25 +++++++++++-------- .../exec/EctoControlAdapter/ModbusEC.h | 2 +- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp index 660269d2..ea4700cc 100644 --- a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp +++ b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp @@ -130,8 +130,9 @@ class EctoControlAdapter : public IoTItem if (_addr > 0) { uint16_t type; - readFunctionModBus(0x0000, type); - if (0x14 != (uint8_t)type || 0x15 != (uint8_t)type || 0x16 != (uint8_t)type) + readFunctionModBus(0x0003, type); + type = type >> 8; + if (0x14 != type && 0x15 != type && 0x16 != type) { SerialPrint("E", "EctoControlAdapter", "Не подходящее устройство, type: " + String(type, HEX)); } @@ -331,12 +332,13 @@ class EctoControlAdapter : public IoTItem // set word 0 of TX buffer to least-significant word of counter (bits 15..0) //node.setTransmitBuffer(1, lowWord(data)); // set word 1 of TX buffer to most-significant word of counter (bits 31..16) - //node.setTransmitBuffer(0, highWord(data)); + node.setTransmitBuffer(0, data); // slave: write TX buffer to (2) 16-bit registers starting at register 0 - uint8_t result = node.writeSingleRegister(reg, data); + uint8_t result = node.writeMultipleRegisters(reg, 1); + node.clearTransmitBuffer(); if (_debug > 2) { - SerialPrint("I", "EctoControlAdapter", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", reg: " + String(reg, HEX) + ", state: " + String(data) + " = result: " + String(result, HEX)); + SerialPrint("I", "EctoControlAdapter", "writeSingleRegister, addr: " + String((uint8_t)_addr, HEX) + ", reg: 0x" + String(reg, HEX) + ", state: " + String(data) + " = result: " + String(result, HEX)); } if (result == 0) return true; @@ -360,7 +362,7 @@ class EctoControlAdapter : public IoTItem else result = node.readHoldingRegisters(reg, 1); if (_debug > 2) - SerialPrint("I", "EctoControlAdapter", "readHoldingRegisters, addr: " + String(_addr, HEX) + ", reg: " + String(reg, HEX) + " = result: " + String(result, HEX)); + SerialPrint("I", "EctoControlAdapter", "readHoldingRegisters, addr: " + String(_addr, HEX) + ", reg: 0x" + String(reg, HEX) + " = result: " + String(result, HEX)); // break; if (result == node.ku8MBSuccess) { @@ -396,9 +398,10 @@ class EctoControlAdapter : public IoTItem bool getModelVersion() { uint16_t reqData; - info.boilerMemberCode = readFunctionModBus(ReadDataEctoControl::ecR_MemberCode, info.boilerMemberCode); - info.boilerModelCode = readFunctionModBus(ReadDataEctoControl::ecR_ModelCode, info.boilerModelCode); - bool ret = readFunctionModBus(ReadDataEctoControl::ecR_AdaperVersion, reqData); + bool ret; + ret = readFunctionModBus(ReadDataEctoControl::ecR_MemberCode, info.boilerMemberCode); + ret = readFunctionModBus(ReadDataEctoControl::ecR_ModelCode, info.boilerModelCode); + ret = readFunctionModBus(ReadDataEctoControl::ecR_AdaperVersion, reqData); info.adapterHardVer = highByte(reqData); info.adapterSoftVer = lowByte(reqData); return ret; @@ -440,8 +443,8 @@ class EctoControlAdapter : public IoTItem if (ret) { publishData("codeError", String(code)); - if (codeExt) - sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)codeExt)); + if (code) + sendTelegramm("EctoControlAdapter: код ошибки: " + String((int)code)); } return ret; } diff --git a/src/modules/exec/EctoControlAdapter/ModbusEC.h b/src/modules/exec/EctoControlAdapter/ModbusEC.h index c9cd6fb0..3ddcea57 100644 --- a/src/modules/exec/EctoControlAdapter/ModbusEC.h +++ b/src/modules/exec/EctoControlAdapter/ModbusEC.h @@ -82,7 +82,7 @@ class ModbusMaster // высылается ведущим устройством единственному устройству на шине с неизвестным адресом // Modbus timeout [milliseconds] - static const uint16_t ku16MBResponseTimeout = 2000; ///< Modbus timeout [milliseconds] + static const uint16_t ku16MBResponseTimeout = 500; ///< Modbus timeout [milliseconds] // master function that conducts Modbus transactions uint8_t ModbusMasterTransaction(uint8_t u8MBFunction); From 7627874766bf18196b2a2867cf79d700d9e5913b Mon Sep 17 00:00:00 2001 From: Mit4el Date: Thu, 13 Mar 2025 20:01:57 +0300 Subject: [PATCH 076/118] event onWifi --- src/classes/IoTItem.cpp | 2 +- src/utils/WiFiUtils.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index 33984eda..f3ccfc10 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -178,7 +178,7 @@ void IoTItem::checkIntFromNet() { if (_intFromNet >= 0) { // если время жизни истекло, то удаляем элемент чуть позже на следующем такте loop // если это было уведомление не об ошибке или начале работы, то сообщаем, что сетевое событие давно не приходило - if (_intFromNet == 0 && _id.indexOf("onError") == -1 && _id.indexOf("onStart") == -1 && _id.indexOf("onInit") == -1) { + if (_intFromNet == 0 && _id.indexOf("onError") == -1 && _id.indexOf("onStart") == -1 && _id.indexOf("onInit") == -1 && _id.indexOf("onWifi") == -1) { SerialPrint("E", _id, "The new data did not come from the network. The level of trust is low.", _id); } _intFromNet--; diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index 7b2c2441..4c3d8ff6 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -46,6 +46,7 @@ void WiFiEvent(arduino_event_t *event) SerialPrint("i", "WIFI", "http://" + WiFi.localIP().toString()); jsonWriteStr(settingsFlashJson, "ip", WiFi.localIP().toString()); #endif + createItemFromNet("onWifi", "1", 1); // запускаем MQTT mqttInit(); SerialPrint("i", F("WIFI"), F("Network Init")); @@ -380,7 +381,7 @@ void routerConnect() SerialPrint("i", "WIFI", "http://" + WiFi.localIP().toString()); jsonWriteStr(settingsFlashJson, "ip", WiFi.localIP().toString()); #endif - + createItemFromNet("onWifi", "1", 1); mqttInit(); } SerialPrint("i", F("WIFI"), F("Network Init")); From f254fbe7aa475782c0ab481df02d932bbd55efd6 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sun, 16 Mar 2025 12:16:34 +0300 Subject: [PATCH 077/118] =?UTF-8?q?=D0=B0=D1=81=D0=B8=D0=BD=D1=85=D1=80?= =?UTF-8?q?=D0=BE=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=81=D0=BA=D0=B0=D0=BD=20?= =?UTF-8?q?=D1=81=D0=B5=D1=82=D0=B8=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D1=83=20=D0=B2=D0=B5=D0=B1=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Main.cpp | 1 + src/WsServer.cpp | 9 ++++++++- src/utils/WiFiUtils.cpp | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Main.cpp b/src/Main.cpp index 91102283..48c82c0b 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -146,6 +146,7 @@ void setup() { jsonRead(settingsFlashJson, "pinSDA", pinSDA, false); jsonRead(settingsFlashJson, "i2cFreq", i2cFreq, false); jsonRead(settingsFlashJson, "i2c", i2c, false); + jsonWriteStr_(ssidListHeapJson, "0", "Scaning..."); if (i2c != 0) { #ifdef ESP32 Wire.end(); diff --git a/src/WsServer.cpp b/src/WsServer.cpp index a711a3ce..4d9edf27 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -177,8 +177,15 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) jsonReadArray(settingsFlashJson, "routerssid", jArray); #ifdef ESP8266 RouterFind(jArray); -#endif sendStringToWs("ssidli", ssidListHeapJson, num); +#else + //String ssidScan = "{Scaning...}"; + ssidListHeapJson = "{}"; + jsonWriteStr_(ssidListHeapJson, "0", "Scaning..."); + sendStringToWs("ssidli", ssidListHeapJson, num); + ScanAsync(); +#endif + } //----------------------------------------------------------------------// diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index 4c3d8ff6..b6a18d56 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -120,7 +120,7 @@ void handleScanResults() connectNumNet = i; } } - + sendStringToWs("ssidli", ssidListHeapJson, -1); // if } SerialPrint("i", "WIFI", "Scan Found: " + ssidListHeapJson); From 9dca608181edfcbaf31463a28ce3a1ae92a35787 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 17 Mar 2025 00:32:18 +0300 Subject: [PATCH 078/118] fix scanning wifi --- src/Main.cpp | 2 +- src/WsServer.cpp | 20 ++++++++++++++++---- src/utils/WiFiUtils.cpp | 24 ++++++++++++++++-------- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/Main.cpp b/src/Main.cpp index 48c82c0b..d05248f9 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -146,7 +146,7 @@ void setup() { jsonRead(settingsFlashJson, "pinSDA", pinSDA, false); jsonRead(settingsFlashJson, "i2cFreq", i2cFreq, false); jsonRead(settingsFlashJson, "i2c", i2c, false); - jsonWriteStr_(ssidListHeapJson, "0", "Scaning..."); + //jsonWriteStr_(ssidListHeapJson, "0", "Scaning..."); if (i2c != 0) { #ifdef ESP32 Wire.end(); diff --git a/src/WsServer.cpp b/src/WsServer.cpp index 4d9edf27..e8201934 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -143,6 +143,10 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) sendFileToWsByFrames("/widgets.json", "widget", "", num, WEB_SOCKETS_FRAME_SIZE); sendFileToWsByFrames("/config.json", "config", "", num, WEB_SOCKETS_FRAME_SIZE); sendStringToWs("settin", settingsFlashJson, num); +#ifndef ESP8266 + ssidListHeapJson = "{}"; + jsonWriteStr_(ssidListHeapJson, "0", "Scanning..."); +#endif sendStringToWs("ssidli", ssidListHeapJson, num); sendStringToWs("errors", errorsHeapJson, num); // запуск асинхронного сканирования wifi сетей при переходе на страницу @@ -157,6 +161,12 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) sendStringToWs("errors", errorsHeapJson, num); // если не было создано приема данных по udp - то создадим его addThisDeviceToList(); +#ifndef ESP8266 + settingsFlashJson = readFile(F("settings.json"), 4096); + settingsFlashJson.replace("\r\n", ""); + Serial.println(settingsFlashJson); + WiFiUtilsItit(); +#endif } // обработка кнопки сохранить настройки mqtt @@ -173,17 +183,19 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) // запуск асинхронного сканирования wifi сетей при нажатии выпадающего // списка if (headerStr == "/scan|") { +#ifdef ESP8266 std::vector jArray; jsonReadArray(settingsFlashJson, "routerssid", jArray); -#ifdef ESP8266 RouterFind(jArray); sendStringToWs("ssidli", ssidListHeapJson, num); #else //String ssidScan = "{Scaning...}"; - ssidListHeapJson = "{}"; - jsonWriteStr_(ssidListHeapJson, "0", "Scaning..."); + //ssidListHeapJson = "{}"; + //jsonWriteStr_(ssidListHeapJson, "0", "Scanning..."); + //Serial.println("Async scan:" + String(ssidListHeapJson)); sendStringToWs("ssidli", ssidListHeapJson, num); - ScanAsync(); + if (ssidListHeapJson == "{\"0\":\"Scanning...\"}") + ScanAsync(); #endif } diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index b6a18d56..a583dbbb 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -9,7 +9,6 @@ #ifndef ESP8266 std::vector _ssidList; std::vector _passwordList; -volatile bool scanInProgress = false; // номер сети, для перебирания в момент подключения к сетям из массива volatile uint8_t currentNetwork = 0; volatile bool wifiConnecting = false; @@ -79,10 +78,17 @@ void WiFiEvent(arduino_event_t *event) #else case SYSTEM_EVENT_SCAN_DONE: #endif + if (WiFi.scanComplete() >= 0) { + Serial.println("Valid Scan completed"); + handleScanResults(); + WiFi.scanDelete(); // Очищаем только при успешном сканировании + } else { + //Serial.println("Empty scan or error"); + //WiFi.scanDelete(); // Принудительная очистка буфера + } // Завершилось сканирование сетей - Serial.println("Scan completed"); - scanInProgress = false; - handleScanResults(); + //Serial.println("Scan completed"); + //handleScanResults(); break; } } @@ -120,11 +126,11 @@ void handleScanResults() connectNumNet = i; } } - sendStringToWs("ssidli", ssidListHeapJson, -1); // if } + sendStringToWs("ssidli", ssidListHeapJson, -1); SerialPrint("i", "WIFI", "Scan Found: " + ssidListHeapJson); - if (connectNumNet >= 0) + if (connectNumNet >= 0 && !isNetworkActive()) { // ts.remove(WIFI_SCAN); connectToNextNetwork(); @@ -142,11 +148,13 @@ void WiFiUtilsItit() #else WiFi.setAutoConnect(false); #endif - WiFi.persistent(false); - WiFi.setSleep(true); + WiFi.persistent(true); // Сохраняет текущую сеть при сканировании + WiFi.setSleep(false); #endif WiFi.mode(WIFI_STA); WiFi.onEvent(WiFiEvent); + _ssidList.clear(); + _passwordList.clear(); jsonReadArray(settingsFlashJson, "routerssid", _ssidList); jsonReadArray(settingsFlashJson, "routerpass", _passwordList); From 37d9c2224a98dec1e812e60fbbf5daa26a0728e2 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 22 Mar 2025 12:02:58 +0300 Subject: [PATCH 079/118] =?UTF-8?q?fix=20BLE=20=D0=B8=20Wifi=20=D0=BE?= =?UTF-8?q?=D0=B4=D0=BD=D0=BE=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/WiFiUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index a583dbbb..5b7bf79d 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -149,7 +149,7 @@ void WiFiUtilsItit() WiFi.setAutoConnect(false); #endif WiFi.persistent(true); // Сохраняет текущую сеть при сканировании - WiFi.setSleep(false); + WiFi.setSleep(true); #endif WiFi.mode(WIFI_STA); WiFi.onEvent(WiFiEvent); From fc50947ff393ba5cf7037c6be548972eb9b01f5d Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 22 Mar 2025 12:07:07 +0300 Subject: [PATCH 080/118] =?UTF-8?q?newWeb=20=20upd=20=D0=BF=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=20=D0=B2=D1=81=D0=B5=D1=85=20=D0=BF=D0=BB=D0=B0=D1=82,?= =?UTF-8?q?=20=D0=A4=D0=B0=D0=B9=D0=BB=D1=8B,=20=D0=BD=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_full/build/bundle.css.gz | Bin 5778 -> 6083 bytes data_full/build/bundle.js.gz | Bin 61085 -> 47185 bytes data_svelte/build/bundle.css.gz | Bin 5778 -> 6083 bytes data_svelte/build/bundle.js.gz | Bin 61085 -> 47185 bytes src/Main.cpp | 4 ++-- src/WsServer.cpp | 6 +++--- 6 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data_full/build/bundle.css.gz b/data_full/build/bundle.css.gz index 29ab1fa8a017fa2f98a827856929bbbfc7ce51ef..3e925814ebc300add11e53a0232a9a8eae8b9387 100644 GIT binary patch literal 6083 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 literal 5778 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 UwEvmg#WWOfVGv3(hKGvsFSdL@;{X5v diff --git a/data_full/build/bundle.js.gz b/data_full/build/bundle.js.gz index 105e6deb7d6686f39d3c82ab47860d03069bbc2e..4a1fc2b551cd777b1d97db5150e89043cb8cb30e 100644 GIT binary patch literal 47185 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 literal 61085 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 z zWM5?gPSXSTmiT?_aT-(~t{_Hzm;y5%{(|CXh(rKB*K%OfFvdElGYixuqoV|`;cZ5x zE9vg@*&q+HEQ!L@yKvSbqp7-MnowZ|V>kwFz^1#WCf#XQG_jJOt+JAT|K_)E|K~Tq zZN2#?;3@z3=67%Y{_S74fU*43+rNN>zkT!fko1ple*gAwpv2q1di!tQ{^gtBiWX%2 zBUJpKpa>Lbz4tGj=8ePxALt`SVvG;;DI+n*hfp)A&^v1e`Y0Q@S(l4|Viywg%9t@^ z0Z&M#SOTUC?7F$}8bykqRctIX*jQ$>u{HBLN`O1n`;bWH6!4rUnk^AeLKbTF0i(o{ zst<`N&}w~HgF2(>$eq?ZG38E714gT<>IB^agfml^odCtlpH`ii8l9NdI?;%oqs7Qw z)Vr|YE-V7Z+=c1_rVGS_*z7_KWfxT!7Dg8qwJtOgz-TsdXZ0@3xC^u3Arp`40;UVZ zy4>tS4rOOm7iLBmW>yy@>j|0lWIVeJULGNTgwfbwLK#mn!n*WV9w?QX5|w|X9Pdn) zO4#T)OP&{P3gm1^SjothP&DN_O8AYUuZS@#L z4fW8g5Thwyp+kdodVI;`-M;GN-TJV}d;KGwyjwr!$@}7x$-8s${zm+mj=Egj=^* zmD}N$jSVus5FCLtjhwNwmSFPmlOt72dWWLUvf8G@g=2oI2INhOP&pH zNFb0%5(n`m{-e0=KhljTygGJc(Tr4|nn!N9N>o{BrpoP8~VzJdXvkxd9R=&@1)9pkhx9dUtO1Z*Iwa`R(A0mL>dD za33^#D{8d3!oJc=*xSV}qwj3$6tO0=@uNsQj}T#zR8{#5(H&Z1h+|0WsOR^WdIqo? z@W~L#H-|s?O0Y}`M~jLT0=Pm&M=7(y0v}=x&~ZHBt|dVVI>+U)ZP{Bjd0k_f zt@^&BR?|2_qss7vL;cYO`U02RC=K$ke@?X$7vka)BtZ^$SLbbs4DvY9yL_2WjX=l& zpj@lgd18xbia*nFCmFQeZq!o*d}cmjjf^&7yMK!9z3 z?+t!n^&eS()T-wv@3!jsStP!TVA4$7?+Hfvz94iTDAQyM(7Pg?FU|EwIqivO>mtnwB9o7jbb}s0NE?hew{Q+b>a-(ANN|l!@>6P zVEfbFca)I}XLa?`7FNO zEXnj&K{H59uvYD0`294TLng)2HROH^1E{iDm@IhxG3CgU6a_Q>B}&44pTtxOVhTk3vN1>kOZLUowRrz; zEZ$E&@r!^37c=rE9?dthfk!K* zUI`-zQXGaFIt9{yQ{A`OLhU6rPE0FEWr#^fbpRQneZY>Hb1f)O=TWxbQs+B*XHL4n ztDl@eX1Q?yeLq_Q!hm6m8+GG6Du}zuXHq2}f=qJp4{$@U5ZbqIZbv&ebQwT{xUsH& z>XzA8&v&2EVK1aw1W`H#RpP5JKikcY_;?2ZVK06+zj?8d3Lk9s`g7le~7mRC6b{_4B!!?ipaPUkLP9 zXksfboi*szwK_7LpO;>RaA{EM)Ts8Z$I@~@SWn1c$@8^(82g`TlO&z#QfR8;~J z4|$j4WBOhfxeg@{%lwooWWnmZxH$rC2tzBz*(AVIlEWGB^bF@d2r_RE5?(E*crGZy zKtrq?6=3~Y8L9Qfs@aU~^+e?W##IYijMG0eM!v`Z5MgVun00BZW`uMw*MD-RCXc zGX$g$Y|#D4`H0*icvrGp>JX+r-YN~fs0hRT>G;L$e&>_P*sj(rKNwR<$$sr8zQo{ zcP1(#Yx^cgWNp_&yMB44hGb|Lx*_20j(qFm+fI*L-s#s`{@GPp-WjMaRu#X#Qbl8I z^)dbYN)6mv{qnE>^@XSXqHdTRx8Jx(uh&NK(e!HgBwjLFatNYCx`kkT`&YGM~z36~qJkAsuy zxly>!g)Id&Vg;3Kwiq3-GBAzw)0on7orV=ctbh+0KE!D7W-@!K9VL+>krX{ox3;%# zlm2?Xvvu?Kt=^sfU;|^t(YIcAH$~drRIs}#ReshOo4VbVRQjXq#8cL0SEeQPv}w(YUC)mi+KHOmQN${plep=+puf5F_Jr~` zqtwJA=Q3S&Usgz+&C3I@ZsrQncylCRd5P?6!PR=?Vf;H;eX3N9rHt>Q2gB&lYBw$bNSf9cGAg)kY|xaVf67iK zD6U@>5;63VUen4mnj4EmxmqO3WmzK;N6K))U{B+-qhiDhML8`Eao6~(YnOy@0S8@c z0W%k?xtQpk@?*~T<58@?5C;(tp1y!xtjCJ2TPNZnRVk?j@WKRmKUZ7@%F(cv0?z05(D6Of1i$xwG2Cur@L8Be7Mpy#tSaUR8H%Fjo61Q9)TG17RFTAegb&;x7rdX_d4t;VFiMOl*AljocI+j_t>VbX^{Jy7{UitUbCS@{K>oh&go`q3?a5;w`n_ID9s;(Hdzr0cLH4qIrhhuP zu@?_+Xwmt=zG`96>s=9dFW?;#yKnCbn&{=oEoN5tB=GKUTwRrrTL;S&Dws3J)$HfZUa%N5g z$(+)6V@{3CXFUT+R~bljH3otnd6?o*m^&7qb9W5}fzCX6>aS!Fx%TAENtn=l-c$zn zTKZ2fq<{4NiQ0+4b4%soab9Co+1PLZS!yZq%y{A0N+SVR)s0u$3vV`uu^aj|sS|#R zL#stH7BZQig$jey>go^JvB^WFY{Uy=NU`NtSW>X7(@izfR zT8Rg%D)w(It@i<{*kHks)BZQ4V(YJb!(X{6zp}8uQY}evv0Jj(;hJK<@l^tA#yAj`%^ zmb#ZKp)ts^PnvX3gF6{Vm{H~epX7ny^&rOwmLc;%88S0!Vy>GwG}}L=%$GXzk(qg) zGM`mibLl>|z1Ck)iEqsk5A6~kQ;DxPHohhz`FvGUE8d9*7TKO{MQT%iVU9m@JpSc5^AQ~ai@B%#^Adkv;yGB)nTzbmqgpuoKL0$U zwU5WZTGet%B);IEZz<~`@LRQNQUKpQlK9P_qQuYf;ZxjQ@EwTt&+rhoOw08zJ@JZ= z^N@Cmif{1!P-lOIuaETWFTIKQ&Qj~*eHS$W_u8lD=d9j=0{02(cdMMARJ&MwQW*}J ztvJ9Oq0(T^*fzJx@`t8M%7i8{pchQF92lZx7(L*y*@DzYB`ZL9Q#x{j2kb9dm}d__ z>kn3h47(##dZ0ePR0FD`Mm5yK+E97(L>)m?=|{EFgc(@eMwOu*c+LKcf`g-ipLyc3 zilr8nKp1^J`daJIUk4-|1T#cLo6k+H;d9U$0G-^gS!?)OX$`a}^(ik(J?^e9Ks~Id zeQGa2J#JWRYN}ITY&v!yU`}4*iJI{Dq10GDmRMiuFrRyfsCY))XO=dzf4Mdj;8Din zWL4)lwb0=N@hDAQTCP7Oodb(rXaDxb26^#8nw1!6u)EsYORKeAYzxZH^n&xU72RTS4ZHm(zP7z@WG9?DJ{0lwgB3BGjWG>vk+ zM>zQCZke};s|R&A)xEprq0RzHa0p3n{;xN`fAddwH_O9&truy_`qxnWv)Pr4zWMji z@_%{r|GoL$+rNC5N`Lp}@8A3uD*oM@-(J1ie}F3g_08YH-+zR!{_ctuLD=2`sJwGw z_>KhR9Gt=x7w*N#>L3^;<;IKa(1g3{KZAnWyETt;;*4S=*>QMi-_Ha1RJ(x+O|qX7$W z&?3IlGl(vZFl>Ru?^Af9K~quua;OAw#$Cu*^~hND$W~R4)rkUuX{#PH6ytMXyoV^p z(@JjB{GhP5(*~55TWMPjY1??}>b#2WjYzU{I0duIf;uaiV*&jwDt=fP!Z!{iLoB@E z$+(z|@DIqF7~1sR6N+|C(d9zv$XDn=!(0mAqMDw9r>Bs@SEUE)^GoPyzqh6Q_j=Ae z{25F}*GJd8JSN}09xz*Gj%LiC=fixu*Xa}DI&oG{40_wQb*s6c>Gj0cR&T3kK!%S> zl8l~@O47VN#lB0(6oF*!fQh?fJSqwQc2O^hJd~RFD*DhBdI}CnN1-y<*{T4iX{2C? z;clQbs6Jd_6ZPRakZpZ?+pJnjVg%H+2?0wMI*fEnDZF=s-AlH&*;pJIjr3Qf`3XvM zBBYrs1$QWaGtA$`{5i|qo1@sv0y3e!M1!8(1vEO1p^OMd1 zU9QAxc6!RAI|UL`2&i^w}1KeuUqtD$L9UpH@|=TzqUYd{OidqSRP^d;RRaQS^)hg80r6r<428wL4y!@OJ{gN`XAo>H+%xX0UQkNOgEU<8vH*& z(fNxvzXLVow*Xp>?&O9W+WdoKDs{Tetk&lL^XBi~{u?zZYvvAPAPxTzto%oL&0=>@vpBUh3nZG+?r2v_<=ucNNbn?MH;+v#^cX}Ubl=@&>AcI*xyHBX z_fU?rvICFNtw8~2?%2Pk-MLry ziE%lW-a~pXrcoN^arXSA^fO9X6j444%g|4_z+v{pz)SQ&lc%|YobWi>r7!x2 z=5{y%2)CDI<;TU`-?uUj(B)GJXt%D)g_Rc8mUyn>dw}=EeCcRNni;5q80isFoaosM z*cGTL^d_p8@F)^dH=YIfr+tFk@cMW#aNM0QibGNy+&(fYywC3he+E5tb*6Z69}L$U z@(v(V$|AC;Ub9amR=vi}b1}LWpt5&1&lZ#O@t?hT z;Y_?6P^7rwd!zFgdv2L8qVxSQDWY>?j4$@iJEIq~wmb4)bYIMFcq4ckM;}kd?H8R1 z=6ECAu7krbfw(=lHu?k483 zgzC3IB+imB?KP;p*=xWjyxFhJ^6pXb43Pgx{$w7d*oJp$39^@l5sX(FR;95YF2|jB zA14vMxeloRL!F1t5!~1srL*0`I6)32nSL6`kAC&#BiRJg3cLgV8kXI|JlYSyuIxgo zG|57s19%}Rhupo|m(Mh6G?z!m*(;+t;FWfda@zK$dbIQeaMmTj*NNy-!7c&MTYl@h zVR4#Hna#fr1Q+7P-)ol95~Jr z+C4kUW{U)155|gr9T*T#yW&C;e6ND4XG~dVF!9krmY@0#C;=FU>YwEce2G%{yA-Hk z){>Yw{a7fB^D}V}CP@UXj3<1XAyM)?D?n>Q-ilnwPrB-HDf<%z-_VU$Ue z4Vi~qjDXuaZQWd)7Pwt;_SvlMY!F}}w-M07dAXN_=_`1O@*DsZjL(jW1K-JBy(|`> zb%XM|oOr&>EV@UK0$(?`hl(c#QsKlYQg8g?kVVLcO)E4D)A~J3UWt>}gdRWp_&Kt{ z2%J%ve;jN5HuI?6e)t#32iUUOCl*sqIl?h3@!*X2uMJq*!l<$7Uo1;Qx%0I=~oYE`quyMgYpl0frX` z)%Mvkaq0TRwQGjw780%;!foXcVsw$t<;P_Wb{(-Ba0D{P;y~{&bYNGN8|{i4=CZ~? zo6oCBByqahxh0^4GS~6+VmFWCi2sH9D(>OEs$JcUXibEXvE2mF@uOS^uO=tg56QTjCf4<21gNO~A7*}a{K4Q7 zoL`{^JjYw_>6YHU*{ot|p$GQHhMQM0IR<#IGfs4r=OxyjhaamBotA#l{|~@DD7G5z zK}X_gOG&g)o>dc7F(M9?Tq_h!u`hPSfp{*qMJML=&=!1#p3`fN9z)pmP#^9CxPO?y z6%)81Dhg`bgi?|K7uEdyH7Q~|M89hU5Tg81T5+aLW{bm>N5%U)Awa75!D}EMDum%c zFc;MtNY0!KOxCa<&x# zfg&oq6t9CCtOE?ID%`PG&mmWXVz)50{DCS5thaXlGU5&8{N=zCJDv!vYkonPSNus4 zU+<@cd9|Mq(Y5{(duzHZjQjf)5ntJ_3X^}ncEmSH{XE3DtUiw}RGPI*dGbFw#ZUfW zmx~ZpcKoZbW%>ZPXNu}|S&wdLYq2$yW*{d)e>ypcIPsKH=mwRo82(ZfQ?KrFjVHEvfO4 zl(8VIMA98nZuEW>Z6aXKjMjVGO(-GEj&GzYsQZ)RkC8(JN&*ywMB`okZJ)RJu^(Vp z|J3~)HKVVHr-Y3G&Ct(>Z9?ErT=g1T1G z_lbd66MJG-JQkbcfwTqRh$?G)IW2^qyO zMArrzUhYI?uZmjMaK5(U!fz5*fM2veO4w^UmUe%5_3MlNZ+>NJfw`rUsbl5GqK!DW zF&rNM2G^NCATN-CwfGI;@FA``ZriXmaXJ9GRyg~;1fL^{;e zVcgV+iO4otf?8RMTe)fCutvGJM@MgyT6B+o&RW(7v!|IzBn(1~rwYdNi?R~l@#D7)8Tr)4 zt_@}A!!^I7y$_YfZ)W$i{Lz>zYlG;Kg<;K5#n+$qmu#axH&REU@{=8jO7BRt2OEi6 z>PU?IWJls~ux`(#c6o2QRNb7$<*k99b1_72C=V8dbY$FTbF&loVtA#`lFA$pu@o-2EZp{nGszE`Bl!| z=3tJ46%J-F0FL@}W@U8r5nG|J^X1^iD#Q}|ldRsc+B+QF<=`0y^B4fnj`%H@MPnS7 zIauW21qVwQEa8i>4VYjm2Q2u$8`PC)+Zv8Ku@i=A+n$chV&pMgQ^Y3RVIH8NTgfn; zWoxyHk#e0O% zV7k>%>jv$1tz|@j6&sM33xX!r4*`!PfpHEHII(ap*`EULbFX51_gm@q?&>b(iUA+^>_(l z_fys-6}o8`((4b4^eoB5U2*#M^rZSu^KF6OX};~?9j=rOy0B(!nfn%X_Fx!#@%XY;r!(QxvCbz@(R zZ|psnU>`O9NfYqnKf)dAQ@m1UZDLDwJ#Z^z{$7OwV>_)zMIX7GG29Vjdb%J(%UvZ_ z?=PmA8MZs!zjg6JnYtRLb%{K$r1nYWoO`F%hwN0U3_GoB9kbXWh$LO|6=HQcmCT zidnZXWhbtCMe|9YN}chFtL*UXp|gjSW7c_i$_t1ggkll1h*M$7A4m)Ye?QV%mT!Az zHj+d1h{j!YSh&1hAMTC`pJCMMNAPDc8jr73SGQ2 z@rDVT=wVDpn-z{C4Eh?2e;hW9ACuNEJqoIR%Fw99 zMn82VIzQQw==6@n{$L|9k~$JAKiQF3=^cr=!A4>xbtLZoWJls|??~JkY$WDWM`H2x zk@zu7mlk`6V|lRQ7)-jf^qr+kv+*1DL0$)L~JS8$czZ za;vRC8iFSm1y4yi(_HM@NS6xSYF!mrHDplaJ$TL|$A|oGT&E!wZg+WA+)%3}(ksq@fsTF-s}PuNu>vR|1K)Es(&@ zuG2)KNFrr+sZgi45Y8eN>6ut6u#!@MCJ>9H%qkVS+gk`{4~z6nC>2=jEr1h;1(I`V zUzP+8Se``{FI2dc$1z5c#hP`QdS=?hiMn}B@hr|Q`8xX(;C_Jv20k=4lOql;O+Eij zf~_<6@#$~W$x}zDR!C7Aef8LqLL}a(&s#S{>=w|~5bdL%ZhPXMw(h)|DMFetL z;2RO0tRQeyB8V$+{bmSE&ZoZuX*=dCkR$OFc9A7%(Nhk)AS8J^TP7395;SD6*m~`t z!*Le44-Spu;z6N-`;jcwHf-K4aGd@YY@C#0!!#7q`BC>zfX9{^$(G`?#~H9Cee?_k zPv_1sCGgl827dMAvBJJ1WyG)@TcR%yXNkVxiFr5_giS{#gh4~#K-2VNk`2zML`*j> ziHKBO77=x@tk8iH#MEmsqF#JnoM>u}cIKCX8Vke1{Ke1D!h9)tmLe61MuWO`E7>)4 zVlm#X_~A54c)kU`-~(U=zDVH=GC3H7*AV+AL)-)^5WdQ1i>H^vaXbD)_iIeE%Ayf? z!Z!S2AKUOCIWxUQXT5VYE4O$e!~RrQS0lC==lO3js}$W~JTgrM7Q?vZ)F~~%g-mIs zi1%>y!e-lVHoOML4kyj|K_@LQu3RllT)TdKLgCcc7(8TSa8H|(lOZ}4zINpj6|VO$ z9B|>fW_e1yWqK^YrR=o;FWK9ur;M9kCaGZzVheF|o83&?X3=3At2IXG`PoKNtpT$K zbZPt`e6R3cHY*m?Z##SadMB?THv{J#5i zwnd*@fT?a(s}zG$1% zPgZ!tdC84s>>s%kyHw^~bc$uSa^EW*_vp+ht1*E%(ekopKkRp{s2CF4;WFfD&{qkIzv;lyMn=3kaAXcm!BNDVPDcjDQv;B(OG0 z$u!vLXa%8Cmt7uR2F5GXs(TSjS#*`^-bc}!0rmpHP9nHe>N%Qt8Ksu6)Txx1imsqp zSlpRaEO|yNmAY@Ne+xzB)%@h6fH1s+7HiRour|&!uL$ikCbVn3EDX}hDM?~VOQ~YZ ze%1!F4mgeY_EO!QShJZ*dv#`;GAmK0Z)Vmgb3e-LLpmv^6zABJ)*PGA07=1n(6_eo zX|P9DYp05clFwE$+R6m2To8 zumw~Pkrxk~3(=)*bo2se?RlxJWr>~AGl4@tKG~$j(GX7QGvsLf|Nj1e{2G0&pYE7F zn_?T(y8vDdT-(xW1}gdtFOX<^GhnIiKX>T~DKz$$4R^Y)@Dh9cp9ZhuW7K-U1(!^z z1}%g}E|ziD;6*28uYnZ9@rIr0vW68iINJZ!9nAenm^}EgIwjZePIce$FOcC^boy znP6^abAFXAuF?&>v`67*ar(T;b@bS28KzmBU{hXYXHZZI{=mv2(}14Cd8dIk3Jl*) zRE6v$eSdLmV*IkUP|)|96$C%1S7Z&3!pmFlW&d50Us0@uM$0gB;0&&}QVO0IHOy6o zy1~Jq2?eEfde0d9256+le9pEhAVXQ*B+2TE6rYOZc9yNn)J1M_9uE5oq+ns4ptz%Q z%`HFQX&vfhT{sNJfWz-la%@ep=wx>qt@3l`+aq*#l=<|P3B|P27~n5pyMZVaaO|(x zgBI3GmDYjor(t7JX~~SS0y3qYu+?ZwH-m;CV}*=t`SAAu)_)EDS#`>w++!WNnAK)`tbiR)fqOMI?qgwXsGe7F{ zE!}4e6dy0^SY}Qa-r&kN*wSQ`Z|bXjQ(rYKO{y>(WLEMFuiW$Fv{v0pyb&mCfgzST zc)TONu@UMD;g92duDGK>~kz&ZUg?T|Rc%a1qoYtf{ zi_5SNuX+K=5W^FDrP?PJNjdHx2j>LVqWn002y zt0#W%!zKotgTH&D^nP$&H9<1jFbmD((z z)o3HZagAdk@jMlfS&p1v}=)qOLb>HhCjr4;noZUQ(< z-Bk-wd|JUSXiQ|G&#!5S;+`8gydlpW>PoDv1Yel=KYQFaru zTYOaH+K_orH~fR1s+>;l=?q`KUg5JFqALsQt3WLDb@OxBsc-T1O@g{uBm`i-M9P># zs))j+Q4+{T@)gk%d>l$0%@>1dSiamhHYCGgpq%Juk#aHZDAl~pG&WOaZES27ugQct zTb!Yc)o7t6?b&oXz(k8TVbvC;V?AkRcFMZVHnUTUJYnCaQX$`5_A%xYWaDP$DN8sT ztUz{dIz7#tt}rPo346N4-Z1Ryd_v#O&RgHm;q4OFJ|$|1XA&T3aOaDv*cDABoUEZ2 zRNPvoT~;Z@2#=l6T0lvYwKR}Q8VGK0waNlE>_W%3fJn~IWiPTt)%)3=P4{tM5llw8 z5&jUra`bJF5a(|ss{0eFNDb_GdozBDj})|U6o$L8vDt&+jLkMZ@tBRxkWNnsgGLub zOrIx3Oq-{KMU*cIO^`1Oix|Udj0i9+xrpe(+DfjL;uX=e7>b1{%S!FmKvrtkBP+G3 zLc&Vz(a+CH?RJvM(Oc&fOEo+d-qMPE1B@DQrbMl~=m7g0Sdhrc{%54qX;x)HxOIY6 z*=bDy!}x}H;do~ttDM$Qxlco_ehvLkJVVlIs)Xlg%~sOst?`qs+@?;maw}^?hH^hE zH!resGt)|x){4>^eJtOu@Ruu5cl{K<#5%OS+0@lSqJ}|?&QuNL{4|Nd3GPo@3HPUs zA&k~!Vm2_X@f{4=-1K@1M}3Xk@Ndi7qfg>J+M}PsOK8$H!Pni?SL~_&3D`;@RS1uv z5+X(d`S^met7vI|cLVo_M;lHw)DZz6_ch(-UVYCf%Wyc9zu}=hCjb0ziO#?6e*Qfp z?GB0bDVRnsH_ioFZ#ZO+|B;T9Z^+-v4}fks9J{maJgjI*(ST!9inbIL zDSRnvQdFhbm7*!dz7#uBbfh?x;y{WKDV|GlPl|0R=A_t=VnvEoDQ2Wtm*S2TccpkH z#k>>?QY=fcD8&mYmZZ2T#hMg*QaqGmR*J{KG)wV7id#}VlH#@$Po%gHM}sR|mkbrg zcRaKJ_FOUygP(F*g^_h|s3G^=0Dsrj?*sKaP`_mzj-A#4CY4lD+n4yW75{AF??(Ka zz{~1)%`K7jb6fqc!aA7kNH@g9icW0cFJJu%LTaJrI_%?xlEV7vC>&+Lak$F=ag=-? zlXqQb(oP0)oELC6o3fK#Ox|~$OLnq{$vdud*-j2Ix#K!l>}1#=z1AK*Oq_Q%TI{3| z2l?S<((oE7G3%&9;sfh(>w(^_Xu9mWCz}(L&j!_x={iXsQ@$XP^tWAf7XA^k^BPgZ zQjgpAHKH{@)I+I!Y_`ALEfV7B8DSi+0N}#XL=bNn+a=>bFhxh@jA@H; zXc+C5BTU$k-J{T0&*@1DrpN6X^&j49h4vOuQfw3*g zG<3^nfo@}9bOSjszO__*cjW+0F{X#%J9~m8n}o50R#0JsRbLK_{=HQ6H+qM=kANy| zoaf}gowuipNeH76)#SV&So5F>NP&}+b5Oycf^YxOlDfvQ`?^qv3w6W@2iqKMV6edtp;yq#8ewO2p>-~_&X(5e zY-zo2SXx(sYgk~|WnE~I3oWvN^&%QrV{j9Ln_>-vHL=IA4|SngE;K71bFj(50}LLB zTNvCDj~Mp0F7$*8JrVagK%*B7T?$>4J!8Z}2{f0eOIS)n zI&zmHB*CZkgmQc?wh&dYtSVSW*}jUr(2*sIETOcY))vbAx!7J*!9!I6gtJmb9_z>^ zMMyJ1>rBG+OD(aef+rNaFHw{2I?vUXR&N2WZ($ZIsg>^j(kN=nM@Li0e09wk7>6#0(P;(v9 zX((xu-eIt<@$GZk&2G^@!?pB1;LeA0$hnjzm-_#TZx6el~~G) zQL1%BSN~i`R&``XM;3HsSx5GCYKP#xnjmw_`-l z45Q;euqk5~O)!+o!g#*T&CQv3^^uyE;zV>U5_lE323)nay@jpeZ)*o=_CW}5~aBf(7Na2&v?Xb8ZQ}XIfAbewfyAekAVW)YhnY;>9 z6RKG#N~4<|r58lPLrvq%dXd2|g@4;msdbip9M%g@dB8(|?gy}ygKjwSa)o;u;)?2U zNhaGZ`Zui>o=e|}#~N%#NYVcW%rWZ!hzgUInm=nCh@z@K#giB=vOV7|%VQUhFn z-$i#jfbU5ROSGW<#De};R00!op%(1J1Qh?OED+cL!LUETXhXS*nUB*KOr(1Zvr??1FkvrFcxXh=rdy== zN8_ywE%Hx~|AbSIPb)vjbU&ks`78AJANx+sEa7NaX>FQ)Pg+swzCWT;x8vOVlpqb8 z0+$U4JR>Qz;%77fidLfm(6>a%U&GYmZ#26EYNU30KVvH0)0UCL=1#h=WiHw_0DMj| zjhvLt(IJrVL&@?OPC0;-18G_wjX=tX)Rsphxt}|KuZ~GT{d?uoSKe*(<_1M`K!#jc zMh7vP3xYi!HBeL|%n!2Dt4;0jXdy0ZIy{PP1728;K;R^X3g6ieh_K8Q&col4VfA78 zJ9;LRzau>^hG~a6uxaj&?hZP2GXqcE!?dZprKS!oJ9R?Z+}%o_yW3InljPiCjdkxV zrccWAoxcZt=5JHaUo<$IgHPb&K__r;;0X*<)x>CfK~o3^MU;>>g{F~)Ifv~yy&{vd z2$i126xPmp3R|+z9HP++Pof?k(+uXcN$jy!={t*_9BdlDqf7%;N-tWd!WvGhF^CXj zj+Bt7zuw5H&zT+Ua*0)4bcT!0u-mX1R%Xxix(!px>;?T?-_c~8a+Vojk%J`;ZgLB2 zx~V;G3hsCu%yK|V?Z>Rt-ZYfjx9p~v>QLq*hPlnbeGa7LR^XZiO^{=X1OuO4b>c7nUq%`cT4uT7Xl0x&CDp%5!tQ5rOTAmP8L!UO5Fl(0xWp@0gTR)wTl$1M%OT;V}n z;kB*l5effA6^=-!p~Ow<1qM{OZ&gTIcBBOW%oUEP3Wt=avX(EQuw2ucJr%lIpXcdF zRYs%>o8!b?8PTmcu_+^>6(^#V&W>bZZpZfR(N4apMP>4JSij-!d)aJXk=tReZr}LA zxLmr*`02uy(kq_`bzv(~DIbQJG}W?B-f5J8nkw08sNWBV`h;h)6`-^CfQ?JYw#4cl zDa$?N12j-bhAKZ)UvO&~Lwdqf=!!XQ4tkk~89+yKEz=#C7rO&<3i5VFp4!T(kbtRH3k>sQEhIQSqja|QzY3;i~72nx+#!7A3N_pCSYRxbKSbq~| zkarhOVm*&uB(IIuVT!oZ0o9~B9zbP5+}8jrds$ZAKvZXg{EhHwur-Z;VB?pd&SDOK z;D7+46KD}6=E07Po;)Ojte8!3fwzx7?yV3uvn+0&@~)T1)QYaOO;HY zd{7!4l&-XP!{p~w1M)Jp5c)meQ?0cQie-vImrKoX)^)u(;=n4!Hued!DiGe#Ge16p zu4){KuI6I&BX?($NQ1}Yj67^lqfZgs6w>%{Gb@jN*W#{5kQ0Ku&ly<=sYW1zx+Kv5 zoKD78^;kq8mj(Ksi_-IWX;i}!!CVpOdM--GmTHDOy{n>(t<=b!UeAEVKHo&!p_ALr zhZXZQ5N+}qp><#t@@dvUa~`!sV9x{*}%5LT3TaP8RjofDwf(5@MlApVIB2}l(KrDg7_;}LTbaq zRLC1?4N50aNY}3Gs^L(s>uRC!LlIaXSDq9WwMe+Cn~0szT@o>2xGZ8?aD|-S6|ah( zl?s%djvn!JtRTkV>UeatUkWn2q4P3m7hj@mv+j+%%~HJqOvD0(LZ$k67#Hz{6)BOxG{Ge5>H{9{IUqQu4k#yVLPf4Xn`Yy|1!tsY$(R#iew##Mc zcadG!eMaxAU!f~b+u!c1tbp;_CNcT8dx*~YplN{qBSQb(Ec*KRPpD#rf?pqh)O`a@ ze{lTKh0Gk)gdPn4eEeU!Z;$_M6g&Pf(~Ujrxn$)~~} zS>JQ~5#w2^R2bJH>O--|pLV}MxjNUMSqO?TQ1tFZqwK%OTOlDrf3EbcuP3F z>3)R+i3Qss42{>4(eV5mRE=s}RypJBb(K3)D)=RK=4uU>W`@%W2ImLx9Q8yHeUJA;UyIPL=7f+RVK7B@)m}l z2GA^p9qLzt7HS5^4pD~TPz!|mk9p}>;_SYL|HDGS_A+X{>#l7B&n0U`YsF`}pHZ9S z;*!RSmjTRV<`QLQ;DU=20)2Q*pfF_S+K%S)V|0WKATX_8;@tPnW3-204rP{$bU%mu zx7j1%dV}rPRS59OTQ<2@S19~tqyDl{f7z(#xKWR8l#vO@G(#uiLx67sZiBglOv|}2 z69lEscs-;L?{y8QH4V27^duSG{eC^EdG)sA0+$Z=47k++2hY{C@mhyz6=y>Dj#SAt z2N@Q;;a2io{Du$rYt9TEFV~uG!^OAQhO}uHE;U8psY5Uw7UhwsI*svW$%zDEa6H@+$449AsyMb~aC_;9xp%?Qwn+ z4X?V0L7y+Ud07iu2O0FXx_~TJF6*^2&)rT2rfk1naVr_w%8bZdKAXRR1!PZw-$DUW zRW(Xjdj{_8R6%y+rF)e9Eq~oDbaqj;0HZ>+gag#l_9|4@$V+)Nj&=Pu8mN0a&)l*c zhgL$kgYpdEsPnA3Q5X4Xdn1Msm)s>cDL**~ z#bJ1w{G{-U{N(7n$WIP!i&+uq?+tW18x5l#F4a z(k8@9adHcz+E%XN9OjmEFc1)_kI!Dkk}Hxtdw7-!I;ZlCe+L38gihTCcklQ^m|OeWjo`0u0tQNC{t-xW%m zF@{fiV~yQRQ>v`M$WkAM)N0tt!-nqv7(}7l*D^ko%lJDGi{_>t*PuqJSvnkJEv`*5 zt7t+~8v`!Rb-he;Y!cnKG{-KX9HqgxH62i7w1bP8g?8X?O`9xbtd)T=4d8~cjsy#X* zsPYaP4^idYcIA2uvGQ#p?O~mS66ye>v0Y~U8-E8dI!8Pl-iTi%4t5#1q#KLCqE6$V zasCWoF^50!uz@8*>Bw$Tq)GFjly6=9@^@1R{tt( zaK;B3)g0?FTR#k8 zQ~By&K4tb@IqQ3-W-=4rz>#f+bazJe8q6nN3Q=oGS_2vu$A#;-8|=HmJr7SS)=%Qs zFM!vAY2vvnJEgGWl{0uXMa>^(c;CW z*(`abT{jqS1-lnZe*I#pEo&EfD~Xp)7>FXO7-2a#U0G{YirLkB>l;~7gX7i>;36$B-;u&b71_AV#x?2?~Wrp zaCz={>-ls}_3|aG`(idJD#{)Kk#56OHeFKPCggTo+yMbD{?Qe<=QmoV3as-~B`(fpq`90R zwJav(f%P$F*3fOTIyTON<@S_s5)IffWmAn-iVg+V_YsvBs3k7t6Q88g1U?NAH&8iO zij-&D!zs`1h2l9W&uHOJ2y4X_j`GGPm>WdYfnQtFA6}YDh&na~s^C)p3RVWH;7VM< zRfwilv^s1>*ZNd6Gi*iI`&6_(WJQ-I`c!o1=O<6P+yC5~55==n&%Mj%c<%k2J-1OBK=nFugF95juVC|{Z7gG*b zlY06l+vG%HicG`bFHGP~;VHhcALzqu_J$9W>ol?b)A9@Ul>^tYO$e5g6T-4lyj)(v z>!+-dhKUVqjYJq9x#U&c!+TZWzTk3K5N0mj2?R^?|d}|un@5)Mj zCwxlpB7mZx!f+J`%edbtNfejYTjPqJY`flm2t%@*q}Lws{YiQqs$`A}EfC;sA2O+a zS5&4omk<({KzK2GKwLo&4flwepil=hCWIa`Dz&>?QcG@`7A!v`TYhLP$&afvv{W~xrqv=_B=xe~KxQUL0xXaK^Dzh# z4E7J)>|}N)^SJp7@;}OXR27SCw$#3JeX{}fUb#sYs}2uOojP@1Rg`j||No^N@K6p! zc{%Xz8_0o^f1z^Vwcc2&$z}99oH~Nt1o6}l<+4tG?RKtR z-9HWb-AYAYA0#Ulrevct^UHt2oN7!|{vpd%AEik_UWHYBTNzq&t?S=?`86#O_ziCD zrqk=M{}(w=e~&raxESECl#2dmm1y6xgz=Ht0VQ~iXh4=Rh>VOI>;i-IYR|QNGK%Ng zH_||Y^W_HOty~Y2STG+x=5fC1Sqr*T_%qvy`U&Q?>}MV|PcedL2v5xxI*Ubf$C6|X zsVvogd}k61#i$=Cm>$CX_S8XkbEo#hDgt?VdExWX_DUUGy6&v1MK){#oS$|`V~MvzmnzT+sO zesK0?ghStkr~VRkB^fg~u>-HXYLHTs5 zY4jrMczu716>3~2Bd&1K`FEhzwyY-oVF2##mL)B-!2k43m|^Ok)JKyY35A;)-r;Jr9I$V zGx%!XIs5#1q28bQVfec2JDV)nVis%S zLOZoyIS$%ax$bgC9=C;+Zyw9^pgt}@C_JcxZLuHeLAlNyeb7s+{L&pO73e8F++Vct zlrwCIT~1HQ@d55*4>x%P!tM2yb&|6&$l3KOxq^6DiuFpxW|qc&Ix>AnM>3^(%5(RY z<+$4eu-*!Fpn~@uv<12QY}Yd-K3?V|K95+jy|S%a76$RQmiXH!@wWk=7bZS0wD8|# z;lIsXV+emPDGGl&#`5UNwNU~{G@*+2Ryf3E4si|X`1rMce-o*!({EfByURKVAP3Oh#$tPJ!k2AJKBXMjy~0tJSJiqNL$|DxW2lnbn8a0baAL@|CQTCy_eotCJ3#3_0_! zRkE&xj=>myiR7^_kDVMlY-H?E&HxkAc;sCfT@y|7vESuYm~1``Y-2KQ%(vC_Z{U_q zmwwJmqd(dJI0b;ygX@3z@~bbuCJsfH25kkx-(Q$$g1ad~uzx6d6HNW79_~)q(nXD$ zw&r6sOF^e#eqrJs@spMC4p|HgXa>XCqaXn=@lYgr_3xM8w#&*m%zS(rOw@G?g|3?l zNwt5Tr9cuDT0uUwk%dlbhi10l#2U${ZV&({I75Ms!c0xo2@zZBb}^@oH*-Q07}TX2s9WZqBG7MbM|!!$r(#>$#D-cvb1AZS9Cc6o zeo{RP;`G$(@A-XX>O?#xJ4pJ@*h~LR`Oe5o{}jFS>xsPuj}*_aOGqhulLwplAqd$- zoQ#5dlLL2x;GQM+Lj?CmgL{_;=U@1p(=<5q_qzUB0A`q29R>U@2Y3|$ze#LbTJuf= z{!qY^)-NYwXB6Cr9Jn0>_b#z%$H^5ia)!C9z! zlB;^6s&-4NuI8$)s;YyMsyn%=JF050r0QC(>YA#`rtdVqq28Wh4_^K`>h*Z*eWmhV z8pC+GQK@Xu<+yzvJ{6}|BOoSKR<97Nw2D^ogiVYY4<5qS# zkIU|}%O)GHI{d;n*s&aE6pHixZ>6$2 z+HT<7%F8f<^X>2rd!uhS%G#C68n;AhQnO1%p=l=TH11x2*V}kaOwP5b@CBX_s~d%- z9|(B~v!QqeljBF+rC?gCt}tWO+D>j$f>eI5^p#R+Nw*9RZ2Qj3&!6Wx;$-X}F!7W} zeuMyb6(C4W4N9-Y&(DWcKN29{>Wd?Bu3IKGj(_QSEJTW5v6h&)av}?z<)^!0dj)^0 z9R6zAc!850=nGViGUO@8xsdrB3UUGHr#aA61HBr{s@zr29s=b`@E@s=|t z;C+I4pO|>#1>47wW+IChsFeV+YYN#l zM)uOwyDu}O*K$u;(@3jwSD`VaVJ#Pr(ZGIwhkStJwOShDd*XSP-(uga=Q?72<^9V0 zDodr7{oZ9=is%0KB_6vL2u=GvyBy!UY(JvjwX(5dZ%8--jYeNtC>v~{Y`8nDrYQ>r z%LR(sP4f|(P9reHN%V#<#s6=)9jq9j`fGq!zU$L-zNWF$miv0E=L)RBq2cZ1* zHkmD-Cz1NTL6mxQ<>pzKbsw;m%{AGGAc^nvXl2Skl=(b{`Y*@HFj3aqx-C zT7S3d10V2~qJIb68;$Ovvi4-#8uE4~m|JV#12W~eI&rf7J5VM_@d=exmamL#cKYzJ zXK2Hmd42oPX&nN)9lD91>cV4D_ve8QwiFuE1?tI$Do)yZTgg6q}CYydSmc zjwTfm#+qo;ogYszVo6M_YZbQL=}fTg&Jqsk;+wJgEBRzom^{UpgEKzS+*T0>j-N1kN@*l4M@a0!u zes%o^OEg*-ef*Op=32S!)-7N#FoZ9}xu97qad4KZ34b?HD?!{lsXU{A_Rn7nDqNyg z=sq|vI}CWx-acj(txE(P0oun29iMh#J8FNWIQXjlm4ZMd*f~72*F}*vTMeORbYMwi zHlG)2CNFHt1k9vn@TM?l@5Lb*JjQoPvZE~e_*Amvt z#i{y|H(zZ|%~$8AYVdy@{>|R&)w~5LT98Hc`c$J=_vWBrP8Zgu7JIYxMj@OQxK?j= zY3dyQSu>=L^X>DX3y&7olB(bHaX(PAD$9GL2FiaL0NS0 zW1TuD#UMw@)=7?Bj%Z@#7%RtUvG9ARx%ZZBG6JCrdrK5DGBs0RW}t=q*w#fWaBFmS z*^23`R76t~Ll}Z8Tct7(Ul#@0eF0^c1xbC0;)^&^jj#UKjjt#W9*r+Xz9ueUkX^PK zpu-NS@zr?{c46psK&$R$w#})2b2V$0?6*~KG~05+t&C<}(~4Tw#t?>O-=+4Iio+(U z?dPJe%o2%%yJz_V&txFb44wJKkY^!~R(4<6AThzs_3vObnC6nxQADE=6fYM+q17S1 zz$QZR>W~|PBplVZZcYP_R6HT)`NZKRBtM z3}lgD+~45IUeOC7NTk6~t4i1N2%|*D26m%373gJ>=b%KqWR&O!YQ%YX zQphIzEq^G-$_Lj#RGjYZ1*w0mr`6a$fE!9d*OKW_>R*yVf48<6~Oh~k&uT>ts{ zj}s%RwC*2)>hUPMjbs!Y2eID zcswM~MrcTsK)VQR^-W|C@bpAqE1$HDvP>V(LfgUxah!4V^VVxZDn_Fabb>=jy})f%9MEw zEdzQ*IbyNF9I5j2h?Fe0|n>+0W|?oy)nO3 zgmW++PM6^vC^&}*XKro*uoY zw0v^1BSCId`;~mJWYCVzA)GRNyyn)Xl4XOL|l!CBT!D)7aCcG3^kWf12wm?l-(vo z-ITtg@$(S)vZ%Xd_Ir#DEg;lV8}+@+(It!TQ8BiRT%!kA2NUN(_s~xh*$MRq7-snS z6m<=qg5L*zM3u2O=Gy`zHQ@{VN-$h6w2dzX!*#PQIHBP+TC7+CovFQaDX!4d9&R>e z@1QALpF_e%5-Uk}C{*??SDNQaNyiVpIEc0{QZB^^DYDvhs8}r;;v$v-un?QaVM_L} zhK@cVr>u$r+XCa*xta4q&3VNLu8|0ioENA>@Qm{q8Ar_5?iu%u{vac&jm!yCo35a{ zhu29#`})0kv_o|bMQxX;?T9;JrLt7N*HAT(5n*aCl3J`vI=J`&YG{^JD)r{vl7^gc zyAkTEhKX$G7gF4VF#{sFWk3Ws4v35K66bkXB5^WHA;+*y^eiMn_YtiffNRO|TYj42 zWrHtYp714*3EnLY)aSE-05Af4{3fF=SY(LmviVKrSN2+tm}@LH4IyPB>Jp+L#pdct zbE7&L<}P9Gh~|P)SQ&_X6PMoP=aP2k<2(0lS?8kRCOGly1%CEcdW=SU%Iwld2VDfzyw?^+-180LgtK7nn{p1)Ec4#z3Kc&k;5f>@)bMe&l_+>^kQ7$g%i83}PN;c+8#`ulgwOG${*J2|-aV~-+ z>3Cts??3E&@iCSFa{yB$fKnov2NRLhKdQIr5uZy65XQM2PgqDD?! zK0D?cW3c6GroTk9Uy`?h7nE-h?B0z1n5ON8Z_lJepbW2Owssal*awc(y$*fqkW$t_Hr+{na7;{{_Jln6%YKN^j- zrntduK{3mPP=O&q;CcQ2u?oXN9bno41Hmg`*u)ISLJSqI=BfocQ93E`8Z`*+nI*>5w zq%JWPJ zH;N8bImIfWhgG_G8ib(fS<17V`;>3bSO{+2PX=E2;Qn1YSmKPTUt;xBtb0KXG0-#Z z%0SO_H6Q5t2TD5n{#x%`iD^fB1m}@%y{%er7h3<<>mRQF`sLq4tKWb54Z`{I>+2uB z{5wl7G27G-9x4bA3lK^jN4P-`wtuPHzf$dA725yq`j20J1yB9M^tinnq2!Gw_DR;wAE@zL zs=S892cT^cpRDDU@k4F3kpBQb9h?6q>{N#_%`Kq2xJdFV>8uB!%=-Ok;CH9?FQ*;688;=Kx`iLqw`tsG>z2vcaOPwH*0=ATbt_P4uM=u-wZycfMXgR z9`=28BgLFd)C>L2(SCG6#XV7oQSPUqx^WQ2Wss)DxUlAQ7S^Qe?Xfktvzi_9TTto4 zvGpJ3>Prim?z|e?=2g~)l~XExGPeGctbQLC~}|X;ZfO1RtBBl!A?iWHQYgZo@%@)f|JAOwf$7z+2PSJThF-WlKEx;psX4D zjx;Smtb=rispPmnixUVO=9-p+(AG?roX@f1euVx%zMg|?$&B)A&i*(u>CZYVSPQ_W zs7&Ch!YfW$Io9*UF#w_j4jKBULx2aEy7e4!48u;}Vo47F(UTyK=B_2SN z;H!^(c#Ma~xb_gQo|DWxhBJlrrC8^~Cr17mAD-d?bPzm%A_8+9PPx$X#CYGgd{}eD zd(fK12B=gZv3HN`4#=9=Pl8V{{8?WSMs(S=j4^a*m5YN9Z?8lt{8jnEEgRG+ zQlx~`5+oyd02cWI?o(+FY#Hz!K1QAeextSh zr_?g>VdaBvJff=6Y)jqr0ek5~#!HT{@4Wx~Sy}lz_)>qfba60;(~wq5?|;vFzn2m! z{i1r0=rKDRMgUg!ODg-Sva$#$Waw-0(zUe=!P6Kc;o_7pnACU%43C*zAz2dGFOSf1 zy-Z2{Q(9l%4p3i4(+8_0I>iz!5Sdbj$}X=yNJxXSc^O7XYZqKv9T5r35K)#OV-rejGAn5_vy!lRFE}7%t4RbTvI)5RAf-&P z`#v33X6r33cpwYFIzVo!o`&4sH{d^%2x3wmF1HG&0x(ORbT{M_RE1xfHQ6d}V)6cQ z7VuhF!6io$f>Q$GWxj`&fqTSJD(uvK5Zd=BpBMc+M=7q@^{YKE>DfFG*-q@cO65YvK@pjgp?1CG#*+V|p=l1p~&* zkSaQouuQqPkl3sEq95>ecHA0RBJjp*IV<@+n75%lR|D%PsbU^hHI24tr4q_gzBA)m zpJBe(hcP7Bes-U%*e_DtPX*V@0C&`3(z5xSbQqY!Y^MERYY!9Y31 zrQ;Tqv9RE0O|+QI8w9i_<*pC9Yv1}w7TM8~F&wAAY5MnV*)<{ z|B`l-WUv)D`F3>}*Xz{--s{}=*mUkl#^Kj8&?02zyb)?IQ`GlC zFdo{L6mg&)Su-#RKf+0YVkYr+aO_6_{xv-1HS24_qG61q#Rpthfhyz-d*|;A~<68UuXx}oB3k~EXY&A(3WDJqp;h7=4JCG6HqZ$n8 zmHiA9b;lK=gfRrx&#>3LZuiL5?4ITEpzo$|%K%@gOsiMs0+_Oa_reagT7}-h37cOpufQ;G<0O=+Q8m$& zb8%6J!g{f;w3o$HV^tC9LQ~R5#4%930OkN!Bn{4kN27?S*I|-n;oyjOMp6d6 zPAhj^A0l9$-X;OufQdT;Y^H-S=v)Z{mmZM`fX{(KkO9voSqa-LV9-4C66i_=0L+6j z!GKAN1ZzrIJRMK+_ytfxvd5d#xI`ddBvF9by&p^hz6t7$0bXS;NYMI{!Lk-G3D`wY zm@=?Ne3Aj11q_-8?5&_lS9&f%BNLgb3r@P+qQLy10 z^_3a`vER=RfE<%9Z<2w*Wk`{sEk&G`s6V5Skv7TAB&bx(=~pQaygF@NDGxp<4*+p} z*KdPjIS4v9Z}6F#vT^Ae*i(2!lXsn_WiE%&7Gn29;qrd$dq+bg3lW^C$~lk*p2-NF zxV)!~ZVF%C9>`bthJY`cU!>VM;!Qx{mF6E8}O<#P4NWY;EGvb9ao1Dtr3*~ z-9&C+e0?ye_D4TD7-(ZZrPtBjl(aLAEb9-c0d#s^oF5f(T< zbgf-$CN%J>iBKXjTX$xxwnc6R-}EqqhF;4`z)+E01d{f5N~Ke&j|1j3|J!*tROfT? za-g~&aflJwIHPP#EDqBoew6q*4X=Jvb=Esa zsyjs&4zj>iCc1E^ihW9DMv=eo=qQP*U}z+GVdxNenN9n6WzNCC)R(Nv;{&)JKf=jH zRn@tDcj2PSrf1&9P0RN{DVUr1uu*FhOD}gHRrkX-S>>P(xNrrJA_J7J z*(l5zp}F#*CKD4TBb3Zp$tYEvuk%z^DK5-ia!w=iu@Fen55XRQI4w8^m}p;N`s+O@ zIQs^ZZ>$>$nO1Rk95meL#8dgC)HK|&_^IB^9YL2ZpfS~1AQ>@G@FpImUHBjE|!m#V%mPf*(8->~SvN0s}E6>ayqBQ^uvVoo}4 zYI^RzLk^EZ(~i+}RK4U~?6=T2Qa$zt^d2cX6=akrad%OH!70nv-WRBICqx&tEvssu zcrvs%#dAkunE50~vAS9>`sllU(uqMqqa%Ci>GXjrVn01@wu8QDFeT#HyR06>(Xp-Y zHj37TZC~Ny7+f3&@BuR?>jRtDDHA6VJb0%wVa)x7ot!izr%jXQSrL1@f8VDA$<$6;M6a!IupU zk~v3^^+2b~!3t=SNSgpVJ#LE;6*0gdU~8l}Hq`sXRPT)pw*fLEIfkvf>1lN7^*>uP z1-hT17;uDXa^{?u)28!MZaFqhZpmJBj&qKL55U5xGYWs&(N&@#_F(RZ9+^3kKJX1Q z)YL(!KsSH5{-^7|;^&e7di{r~>;L)X@2~$nb^U+jl0f>L&Xml+`X2MX zaN{e-Dx)<<@sx_g#PC3yI}GjJHoVUA4TMd}nv^22zO2|Q2}+nN=cqn3xRJ8sKbtPu zW4wzpGIdK?V0kh=PJvY>>5Ch>LeWctIX+3#9HwU(=|=XFnI2)mus~n1s-}U0nEM?{ z-5eJ`)e3;lbAW(5(V2gaq$j?+VuNP{G}a);Lrikf4e20a7VvOMN4RDY_PUC1w;B5f z!3F5I*39c_(4~_QPJ|T(eGEP&l}gGh2x3RD{e-%tTEJGRSo>a#6#*_NH`=P=7$ap~ zKK4@3hPb{gvIHibw5;S9bU#aQI;$1MGQ|V{wJc0gw}#7p?rr>uu%EGJskQJ6FE3vO zrhkgv^YF$l7!K1PH)Y;BTqr-v*h(s6rhV2I$i=+N%725RxpX>5Fx;SEqj|!N%B&(Xj&Fv z{FuB5no83$KnPgE?-oU>a-ke7a>PpxVZFkx!_is|qjTGt#o{7^Z<-9gi43k{jZ#U5 z5{exmFq}?QbkOf7{?yC-69hiq>@?0?$~+>Xz65aOEpGJiJE#Q#9?6N7nB;ICP4rWivGI*v!3QM2!Wbzgh{5bA{LCy?|kJ26# z12?#jc^28N$A&(XbPDRw6TEqfHm0n>>kE;OQ!GHCCB;`w_X10@dM3#-c+ZKrCO}^Q z^_fP=7)XsWNb8f#0izR1_K1<8KDtk?Lt;C7=BHFTykNRRkTuM-rT6&7-8hP4|MQjg ziBz(ZwMu; ze$}3xF9WfM%!BF~X0`B!wfe7(KHRI+i%~_^X@t1zwU8^mSf4(R;(ixbbAeW|{C@$6 K8`yqIIs*VF5Tlv^ diff --git a/data_svelte/build/bundle.css.gz b/data_svelte/build/bundle.css.gz index 29ab1fa8a017fa2f98a827856929bbbfc7ce51ef..3e925814ebc300add11e53a0232a9a8eae8b9387 100644 GIT binary patch literal 6083 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 literal 5778 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 UwEvmg#WWOfVGv3(hKGvsFSdL@;{X5v diff --git a/data_svelte/build/bundle.js.gz b/data_svelte/build/bundle.js.gz index 105e6deb7d6686f39d3c82ab47860d03069bbc2e..4a1fc2b551cd777b1d97db5150e89043cb8cb30e 100644 GIT binary patch literal 47185 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 literal 61085 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 z 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 K8`yqIIs*VF5Tlv^ diff --git a/src/Main.cpp b/src/Main.cpp index d05248f9..0e4272cb 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -276,9 +276,9 @@ void setup() { }, nullptr, true); - // ловим пинги от WS (5сек) и дисконнектим если их нет (20сек) + // ловим пинги от WS (2сек) и дисконнектим если их нет 3 раза 3сек*2прохода = 6сек ts.add( - PiWS, 6000, [&](void*) { + PiWS, 3000, [&](void*) { if (isNetworkActive()) { for (size_t i = 0; i < WEBSOCKETS_CLIENT_MAX; i++) { diff --git a/src/WsServer.cpp b/src/WsServer.cpp index e8201934..7cb72fb0 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -59,9 +59,9 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) //----------------------------------------------------------------------// // Страница веб интерфейса dashboard //----------------------------------------------------------------------// - if (headerStr == "p|") { - standWebSocket.sendTXT(num, "p|"); - //Serial.printf("Ping client: %u\n", num); + if (headerStr == "/pi|") { + standWebSocket.sendTXT(num, "/po|"); + Serial.printf("Ping client: %u\n", num); ws_clients[num]=1; } // публикация всех виджетов From 769d6fc7f1f4cfbc3f6db7903bbddebd570c29b3 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Wed, 26 Mar 2025 19:08:53 +0300 Subject: [PATCH 081/118] =?UTF-8?q?WEB=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=20=D0=B2=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_full/build/bundle.css.gz | Bin 6083 -> 6171 bytes data_full/build/bundle.js.gz | Bin 47185 -> 49721 bytes data_svelte/build/bundle.css.gz | Bin 6083 -> 6171 bytes data_svelte/build/bundle.js.gz | Bin 47185 -> 49721 bytes include/StandWebServer.h | 2 ++ src/StandWebServer.cpp | 41 ++++++++++++++++++++++++++++++++ src/WsServer.cpp | 34 ++++++++++++++++++++++++++ 7 files changed, 77 insertions(+) diff --git a/data_full/build/bundle.css.gz b/data_full/build/bundle.css.gz index 3e925814ebc300add11e53a0232a9a8eae8b9387..cb7a83a5f94142c4cc930bfd3ee0002fe5d97d18 100644 GIT binary patch delta 6020 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 diff --git a/data_full/build/bundle.js.gz b/data_full/build/bundle.js.gz index 4a1fc2b551cd777b1d97db5150e89043cb8cb30e..e8df792bf1fb1250096545997bc402f21afe679f 100644 GIT binary patch literal 49721 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 literal 47185 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 diff --git a/data_svelte/build/bundle.css.gz b/data_svelte/build/bundle.css.gz index 3e925814ebc300add11e53a0232a9a8eae8b9387..cb7a83a5f94142c4cc930bfd3ee0002fe5d97d18 100644 GIT binary patch delta 6020 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 diff --git a/data_svelte/build/bundle.js.gz b/data_svelte/build/bundle.js.gz index 4a1fc2b551cd777b1d97db5150e89043cb8cb30e..e8df792bf1fb1250096545997bc402f21afe679f 100644 GIT binary patch literal 49721 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 literal 47185 zcmV)6K*+xziwFP!000003f#SaliN6wDER+<3KhGCL%1N8sQO_yWmw^Mx5xd%-92sh zuhD317KM`7W|3+Fa+NG`V{iB3?jqj1xQO@9MO?&1+}$VW+qZLXV&Cm<#QOy0Z*-9f zfCMS2Z1>E(?Rf2(5($7n0!U;g5{b;c^F(ApP^a_$Z2J9=EcJx^BlLI*iHXoag5qSr<$_NqG&% z9+N}P7!TzhV|=}quIuCogZ1@#y|vDi%T7M1YEBw8=j*kXvq>H=E_h}-^ij&;&2u7$ z5Ssh5f}b-^C1Xsz)NsZgr@rrJWR;xbI55VEfqD?W#gEl=a7TnQ9J3!Ps@hutFdl#`C=JRJ~az$vT|KQ8s3Ll#Q#pOE2?ddF6{V ziMdB8ROAVd6GB4Fsau^lK_2y?#Tsx(@PwBUGDyz7mw7Vj^cZ8@pCpA`nqe;>a|1gH zQ;lS!G0oWHNY4C==*rVy`zg<+az+dNKnBn?z#YMQ193MShyxZ7ITB;j;7E+u#Yk8^ z)ekyh^<$_W>vedc5J>vbe9p7UgISVJ8noi9M)xEWypSL8^St0NIO}zbkYEIQjgmpQ!}28T^IiPP553~baDp) zv75SlWAV?Qc+O19d3bnud3oty9{G7OJ?!^-y+iSG>QKA3ty(N=p+~OypT~Q zov<cnVxDI_lbs|>WD=#x zs|Y253WSg9`X51ypL;~}(TjYMNySC&HS?jh#&qF0&m_M>+=QZP0PX|H{gI8v1L)W* zcu*N1L&gW}%Obx>1R#aT)0f;MSneyf7t~|$&?Bp_)@$!8w%4N{_;SWG?;D$&{|gUqGzSLEQ^7mJ zb%nh*5z-LLnhx&o`|~27ixD3W6lL3EOdzG--}le*MK%FxE~A-BiRINujO|_(5^)+J ziS5=>Xf2~D&2@V#Gjm}=?db~R5&;<`uABH5UPeUqj+ZFrdNyoElG1U9=xim z_5{1v4S@Cf2{4T>&OJefTmdLR-q%lr(5(JSvU}2lv{#J7cEKJ(nE%Y`EPhzQRX?M2 zM(vVT2N-mT;%2Z+3X-*Rw(}*r`U79{l*hhmey=oE98Ta@1Sv}iWZ7i>F zc>%74G1W6KX_m`p{KrL?i~R z@Hm=#g<(+ZwKo|~ERGe9#()D+nw~}R3xSXz844Fvyh!HH6o7jHE%IE3g)gIG%H?{E zl|WiKh+H@F=J=vm*g3GUKqr zmAG!AY8%NhH4m&HuIug1{Tfi$o$CcG$M&;V5PI&q%{{6{$o+l2ZR?F)*Sl|6CVlAX z1*7(X=SiA+Jz}Sg_~B8o?v2+hxOL@5ZP9>mlNeE7T%>d4UfeUZm;sSJDz)wbnKBq;U}3aa@Xb31MIK)9!+ua=q735M_D|}3tIT`Ldg6=Z)*ts#v|pI z-h`BK8VS*f9+fo6%I0ip2gn=B^F{X9bnA7#M;_Wc{074^x!Ut#u$k3n|b zk_-#K*1O>BXKLS4jkTz#Rz?Qh0NA|i3SZ1obs=d$%5qQS|DHBx8J_2%Hv-kzfK*l6lp{8PB)|in9YC5l_ zmlQEq!zxIPW_wY!?X7h>vV)ov)YuRj85x;!RKUo3XQBkPx(a!~`XrJgIR?!VJRAgL zGN=l$URi2&!%A=&=7wt8*q(b5g$!Eh!|LpmCamH_F&m{csq`=fN*FPrud zJm>H|hYb5+k4m3s6O(w$A;WGzR1ygx%`Y5~WF>PBodZdzbBNnmz#Qf{gmTy2Yt-c+ zRvkcjLahzdyb^~%7Y3DN_1b|XtT-F>#wIx%C|wt@Vnld})f*uMShVB7f*^zz3r^SII91!TSEBlFq~3@$rD7D+a( z)tDgn`bie2iwPH=LlFT469y6r8tZBs4_d1sYGg-Z9HI_O%U@KMgs#eJ=rqaVnJf~H zRIAk+PmZ7`pxX_`71%>~3*pbGH%6AYDlO@1CYx&fAwQ6ztwOnw^`_C<vS&@%B zun0;Zv}clDNxCoTOUYJ`K7R7_i?6;91N!LxlSg5nKK|%2ydTjo9zG0@X|c#Q6<07C zKw0(2Lr_R~B&^f#KY29FTsH%qyV_jPDVHDe^JtOET1BSxp04YNBA(C$5F3e$kHyhH@ATBaGx*ge>UcrTD3Qe34g&2b3T z?dRDn60>*~WmC?ow0S-kGLoE~X(5>JF=*k7hYwx%rSxI2I0bCp`~=veonh6V5rSh? zY6Mzc+t-35c4(FenHS5EmkphQ&(kR8 zPUrx>0^xW95IJLSRZ<63p#u%OL=c5{DGy+1)XVet_E)@ouHVlj12#f{^?|Aqz@|ub zJ=otePK8PVHNZ*_lkn6aK?c`Ynh1ZI7aXm_jJdsTdvMYl-yyS)1^!Y8g+KY$3g+ zo_hp*wbX)@rwImUo7l)}maDfUew^ll3pmIf!LjYw!JfPBx%4vXs6r0i3#ju<@bugP z+^n;K2X&KamKWS1G-ce6Ws!c$m+Lk6FSv~KW0Xq$BxcDuJfn!Eszi;`Ug5fXsq1E1 zPG?zDgmC~mhg4I3_=n#gzIO=IK7hyHAFluK-ue%tsQc=E_jlui@X(jgEdjzJ_vZzN z1DBd%NKoxJrOKfQGd#Mk(W=F@@*v$N~q>N8=2Mj{9;SC;^t=gFQpH^)Ql)3R7A8% z6n?M-iVr=7X&_f}8TqQexJo{gOy|)Dl0A{$Y92|+i!5{;ip!Tz!o6N;)%@71`7=pd z#}=T8HLVRl^gffS&G15c4m^0IQ;TK`Av+L)0rT8Q%xcc-wDTKrU zfVZ=PN0Yc%T%75;%*X^3VHBa>4$~->i9QCd6VGd`atj8Rg1Wdyw`Kxo)$0dmN9d^Hd)peuG?t9R713Eh~?GsMGsFP8s!EA z_TRPO3*p(<>vU6mz)8Cx@5bKLwNu(aHy=HFjrMmbX@uxHY;jzO600%kQaNzKU%N6Ea)eagi{Y*pev-L2|x)azg&6(2L#WBDe8{0IxQ&a1f?Tr5A7)| z?Z`)UUtt5rB&u6+1h(~xa`w#ht+4u55UT7y3fTXcPL8rMSwW3MG4uqSlEEMZZid=P z&>@o06AW9Ux_*^Tp;~U4gn$SK8$Iv0u*1SaG@$BKMrnQU$O(=m^vGm-WE4R5xM0f0 zs8H#;S8!lujn0>qUIt{I{e6+D4l!H%T6bbvR@;c(JW?v#owtiB^9GsTRQhTmx-Kp z5Kt`fynL?Y#f;f7R;17g9YuW|Sc1}9l^_8Eqpilf{?2eFu632TnNy>}^tP#`=7Yl! zMW@&V2dZchR1}D-5qSq1Ho=^F+0Da=B{hKc-E&CiKal35tNnm^Xv(747yiXY;}8k z3fPj)k_oTBf0RtP_eKykR|xH%YB2%MuwXIbisRJU+oXCklb5V$vm=_Y<{^`0s2ASr z0ZE%k#TGU0jm8w0cmdk}lr{9LmM+nf*h7a5J$+aztGyhdjyL+l?|*+dJ|GSW>&^Y| ze-HZKoN+zOAjo{hrypI-z2|?}U!~>#^GeP}lh*<$zzyY}!#+I+5Gr9o>j4Gql=Be> zeLkTpCCwE^N*C}T!+g{mYp8n^?1l(RW~Emx2z`XmnDzvbMpCGOwpY-(hAN{S)ka<64zbnnO4)T=UXF70`oiig?;OQL)5ZR*;w6BwP|9bZp4!n=mtXj8?`l8-GGIMDi`%Rp?e98 zs~P?Edhe$3h9upwn)=wiRcmQj_%mFOp$BX8F>EPJd+oBY778se5{h%bA*@x?m$IV0 zmw~>R-BC*DBV|zmQ?ICinI;+g<0WU;et_g`r3os2k08HNN(>bVG zGY=T&T+f>gp;RY$sF`(O+?^!rfPsQ{gi9W^YP4cKRqip(E#5?^V^Fs$aRNtOHAYjX zo`I^&DUBP9fl#MLgR0bR8a0>%p^lb1sv>u2fk)+-N=kJIuJ|3Q`&Rvg!psW;a3uvDI6A~d{QjXv=9WW#T;gr zCi>u5(k~_bNYYeGO-J>%@wkTO#D?b7hURu@n^!+Vr7+TMFu?}sY`HaKm!1RGxS&b8 z^qe%wlyazk{>&59xe6TW1b58q5?)WM%)b4$?AJw8{pG27TQ=UVnnmp|GwR^jInI|(&VnV@uN~j-YMdc;z2i0-ZH+hyyvGCxu%7ar1^#Eq(=~7`#R7}xeTA*23t|&mY zzu-)kGzlfmL#af16y!538PLRQNc0~zBzlA-6in?SN>Vbul|U$n&7$kUKFP;4SQynZ zxc_d;;6q6t;WAKA^cr~mV{>0t+dLWg5;PjP4@xF9WYV?B(aE@kvqHdr&R%-XBzft; zj;DGQ@Hh)ld%E;sdj<>Q1=u>(g$n5%A* z>in<}GC5y%c{b@>cB^8%RV;uSPBbTTVz!)lZIgE(y)4 zGGC3W-6$t3Z!cc21D6xmee4w!`(ADFSLNW?1=E8}%`JnmBsB5S)FU(d%2@3y8>0g| z?YOzi+?H?loO-88bLk}w?0jWYvnCxgb0*jl*Gg;Ts|isf#?3n9W~iz$2%wLTK|27o zY+pJyOdoGz;=o*e8NHJ9M>(cR!^$OYo+6`0VGqj07iP$WK{7$; z-(;=}u=t2=h)3{L=xXZJwAOVj#%h#iEE}jk(Tp)R8&;J;u?1*6YBfeOnvE?@2D~($b#L0#qi-B1XZD%BFO^zT+-X)ij~iNT$O%3@bb?RNqk9 zbTn4x7zX*%N~yx7HvzOxHaX(pDDq+278&iRC8LcLB`>JJBbme_hJk$b zZVcoDNk2vgqQ;^})gS~^^}gR=C=YAWvO!ohi|~^yK=FISMcYo+wUovMi&$p;aQr;FW_O`?K$@vZ6sHG0$L?5 zyS>iYv^y=LWjE;Ib3TvaL@v9xPdc)QGLb-!Osdm~iX`gJlF5W;%#p={JNND$PLh}R zI=|04ola+?FBQ10t~7X01H6lFw2-+@!<#|OIm?R)FS;_HcViH&LWE82njG`tWjE+` zX7EQBKQ<3%>4KxEr{6`MCX)_IQ+(1rU!-X#%94vn@~)UCnd#H!-(NR5ff~tI(4-m8 z{3S2W)BLi#RNc_L1II0m&N$r6Ia@l^xyUC`+Et4}7b@};B*;k;rTMh+B^Gw58u3lO zQ_^`TcX1bm@4tIDe8nR?E|ThRn;az5Rn)1X;vk9El^4UpSMQ-$Fzf_XFzDI{2@BWt z3U%G0&=el)MG7z0>ti=T3ZK)emtr`FF2iGDQTTp~!V5*=bD-d&N!v|Yo2p|!CuVfo z6#ZL!b~Z*CWtyy#L)*h@%QQBFR^!l?X)+_z*x=c)e7|wp0hgq|{)?V=1kKZqe*3iJ z>tF0?$2UKd_o9Xvwq-wu%fiPkCJRYh_-KC{AGNd)-@O|(`9{+38{8AS5i}^vZyNXl zl5ZP-lWe|_t&L2E^v4%GlS3z&%WjcP^zJ^H&ZHsuu+=~5^_*~9ne#keh)|bIvPm+{ zv9NAQNDf=`o*$SLFgS(n|Kj4zY@9N+WHPm6p1`Ro!X+cQ5QG-%wU@Hd4+uG$2|5%+ zZ9*|g^^D>sXpFjWz1{?@H{rV39%J5LwXd$*7*;qs6t4TgJ;kC}_?mzc}n{=(-H6tBDI5;*bpNxZW$iSPe% zCh^#n64oB<;+*${>;_Ixvgq%T*8E-0fuTR zf5Jsv4C_bmk#OKR^qd*q#PE)V4}?V`|wnvVMzM`%Fz$BMY5R z?AYN7ORk5_&>(20Xg0K6oyRWweMK#tr zbLOz$lf@#7Bgxft!R?!Ba8MyXY`upL?0sR>Ug%urTHfw*?xfWE-bYi<{Cp;52vL96s4O=(08F@@)ql7LYZmgw}X04cZOQhv&Z9 zi-g`eL$Q%6^iiV}5fYxmwQRL#JJ)+QgY|Vq)8VwLXv$DHp$hTTz%B?0r>^TwRYg-% zkzONpMYG|os%XZLGg5`JYAz;(gfrLmW~!oD1(8}&bw&Hb{i>pUrY`&|WVfb|g!``R z?W?->nb}ZoJC#AqnV2OtF^g$pmeHhnV3YC6uh0SG1LNUol7lIvurA68u5LO?R;VW` z4i2<4iQXQQl|Ko6RV&MZYQou-<(5EwxiU6L=6Wf&&W+)~UzzUr8s2P*o!=gqi(=a< zv8zbAy#c#SCU6%*;2!Hze7O*_uwb4pV$_;6WsYNC993uHLQ{5@aX5PHIVGPArLIL*Ah0 zbV_G*{|$1-r4kO%6~lq!?2rr^;=n$fgaTVn@T?7X#4)}{Z0TJZo{Um1o_4XWs2qn&x!cF|a8K^lXZv z<`IgTMiUQjZOwZcFOZ_1c?(q&}}Db&kion4|@DE2S=U z3ZnbeGCHValzk95_TNfI*(WqORZ7Z4D_O9LOQ_;faa)6;_(?=Bb&&-W*@;tsA+ctm z8#{-_{tPsde?c??2rb-(ohH|5h(~J2e5XzXWKu_#*cU*8<{oFOJc7Ry{W}Md3im#< zh7=OpoVg<^!d2MJIo)K=IV=2&1k6vtfc0vtc65V_7B_Oy^j)}Uv4x9*i5;F$04*JW zNt;maHE}AdPrw|{f8n~|Ap;*gU?sXkhlT$FxZRQInMpW?3xHLtoaHoS361qIM5=JJ zK~Hu$x#dOOm>ha(my?5-kcw9uy5HzRv77rAHm@rxURQt{i2`_Cp?O{1Ps7BbcVl8P zr^#+6rm9@<6||DXomgHC8dXvbiuDW~Q!F^Tz1L3Gqn}uYLn^r=Frz# zJ6rLLu!T@58Kz-stob_*(dPV|-9rbo_!V4>)t(6nvFk+724QOaP}x~8qr$=CIx%wg zor84Dn)!I&S2&?@zXS8%Ny%34tm%l4{j(&4k#DxI3=6{4b<@TSHQS1$EVeb(^1}+v zG^+KLA;87%0pQTUQA=fWbf9Rfui91s{jjjK_6-d<>#CCrctodF>av}* zNwg+n4c9|JqT57nD62~)6}^YGNF};02uEYP)+e)Ql3&*3A2luNuIo*N4hf`o-Lb(B zjN+MYUbzo(@;T3((qZ0v%xGKRVoqjENHXM$|7@!-q-xL%e)I zSHAD(^eU8e8FGq7-C;&&91aIUL5r)fpv5vwOPbVuONuz%7WM%6E93=PE4 zLJ?*qEvl+OjJJS=s?v5iFI1Vdx&3W5!l_j=_(@bnpwAGioO zFSrojvEFvcTDi<1tCz?GT24{bjoDq1BotjD1Fj?tU?5D=s`QLUleQy#Pc=iR`qlb$ z!-b3q9&?nTqC*YAQKDEyD{&8?udYgpV--5$<=mk!qe4GfR8$wZ;MrnZx*9_Lt$r!# z3SkPJNh0QHv<%_UXxrCk3n}wVbZ|ee>d;BMOY5BQ8TXvWojwivokyL1zoVZ|{XPv& z{l@!k|2DkhdvM#oy_o=CfImHyqs&zY^f-k67ZUkl1l};plD2_SgO+4dAYv9|!R^lR zH~k*`_IsZNN1fnQKlcN8hR1J?AK&gAe|FTlgTF!0xw91r<+@;BwPHz;GM`RU?m6m? ztD`+mJS%uMfvse@1zbb{ClJoAzCIINK8~)uU|VPP*B5X6`m}e$=d(9{estQqse;KH zE4Xudd}9rlZ_$I}JB=zvjv)*VHPwyv^j8@c0v!9tog@D^?)oQPKj`|myMDjx-#PC3 z!ExlD_$Qqn{OkHh{!!fZ13x(Rd;YN>9Q${U(_w!Z8@ z;n)vOyMFJ;Kk7o6u7C0w;Phz<%^%~3eQ3cy_KzCh9tE9V3~==Ttl-!`4!ZtP+V|h@ z_Wk!`NbEzUSo3jUe+w`NF?LG*uisULJ_}AeK|ek6gYFT4hMynb?)t~KVGvG_8vPEs zI66?p5mwOe`nQjv?z9U%?;iX8-`%htYC7F`)%p$ddc$(rwmz&0JnHlVSgc3*^yqz+ zaMTG-9z*IQ{rk=P4pC?TYD*Cp+fd7_;Ft3)@aXS2&&(3u*GWGg_@M_WhNW@3iBpuDH`(H`EX|_{bLMF-eUyszeJro$rmDYA(ChtbqmL@J)XsaM zmTiQ_W(9XTr!eey9-nqjKZ6I? z`UpuCQxeP0Qe|n6ig*b!R3#^=m+gZDSmD&d)wCKgJRmubE|PQ^cD~`oB+4S%5m6?( zfU)NTeId82dxoOXpc)!A-Wo6Uh--Y@*!mh+rbRLVnXHkhuK#W%!;VL6q+UeD3tnud zPjQFQPMs_YX9F0ui8T4o)T{2)G7L`ij){chPU-2k??)(+9{MzTz=>@l5%-By?#P7dI4#dr-TF z!549nr|Hvt4nAehK}`ZdQ|8f>e@E5t_i*-xG{PR9*maTS!lp7`Nbvj}Godz_@Q#-v zV!hjfL%x}+BX(VH^FwWzbfL-^SLj;F1)t1-%c#?-=uCK#e?{&Vu4^SM$zAZlV}U5k z0cyXEn^o;kx(WjYN=9(}4+p7}r!cEr5ET-xkp>qdlL^mca-Q(Q3jZV!IR=(4ucV@C z#~2*7D&xi}^(vW!nN=~pg18;E2js-=;gyiRY+Ztjx+4{#7^gujn!q{<53-OSOvUp75`z@RzV8z}XV$ zrgf{M9>r$WZvi2pG&-e#P8kuSbj*@bI;I&s0eFxE5Ms)(U_ppkkUUT!3pb(F;-3e; z<^8LJ47`P3kwds^qtcctZ3$^9<6TdvlAV}m(J)FQ@%G!L(63)~Cjo9L!S9@chGA(dJ0 z+6`6WpC_3L=7!Q3_mc@m>X{HSfSc6b7UWAz^otDcm6^sMzKrL{f~OqLP3TH@$G@Un zq2Gl^Tz69Wg54;9(HUx5Faf>uuFBxVaLd_NgB~cyk-N}w*Pz627?c=XAn5^!)c`Cq z^zsY#;*B17Q!wUUuYs!dYyxsK+y!{85h8iX!@Zy+Z}Fj~Xz%>p7TUI>q(#_Zp()F- zZBqz1fRe)2+VyM}zd=5MG3 zGyu8|@EIg<+rMQ%0yvSdfJe1M* zhe5B`sJ*qgj5{+M4ksq+;hk_jT!NZ-Ec8hg&Z6^o88$ZA01zqXS zbKzedLePpzIiuYfKP$N4@^_||XSnTntTyG|hSuM*U%){G^M!_n)CiuHo3{VzjsiYZaxO%UA4#Qr3s&$_F1P>yA3oe}o^oChz_^a2Qb)Zhiu0av-tzEW@A(7B_ zUdV$&9r+37&9mmDv5syvCnaUUNss18CiF0*hkeSsDXj1WU3WuR5`z=6d&-Y*Z5}+o z$}|4O`8l}kA_QWjw9!Uce?4_jylhX3(!0@BZK)KFUepkYVK2PkWN$8S$iB}kpu^orh4qA^0csJ`FZ8oiz6%G1y zwL^18K+mO4WR$rBQ4^`8>pE19F)mP=L9#(Rv|g<_QW!i^j>{@akX;lNM<3)@o?TgH z(+mHqd#rI^C>8&~9ld8hu1s09n*ZPq*t8t)ATQ{$lNe>?F6y&|j8)yzP@zj7FoqAG z<6{b_x4+`upsPXb9+#cq4tZXJnk`~G+QP`*D!Q9mB8H_}G5Ns8&7K&E$YUwLm0(<- zF%4=nw$`VpTtXbZ$GCqLfOR9j-i6n`d0j&8vdUdT?y_(0S#^U`npHL;5K4o4^1uo4 zy2#M!I$`2vTM_hx5Za@HM)V3|v3jGW=KUaOD4qU@`_WY*#_NDbS;tDLwva;d@>lfCN&9tncC%B5~Ysap% z3*Z^f=Xg<-_#!W42rB>zKNAR8zGk*HA+=UoNJXD zSkAQjq*-FTNptk^O_P)w*0G=$z%;Z7K>M`c<{TO_^#5Aoaf-Y|L zHY3vhO2=Q*mTfo~lSD*kDW7;5QFi-KFP>d`t*@^rr^jFh)#MK_lyF1&CZ5vtn+s0% zh*4c~gL1$Hw}V>|(k&<{#>1gNWW*deS%-kEVr-+P&Rk@PR9`p_qATA-SDStkEl^0J zaF!pieo*5qW^AA>x6u~Dr-4R6%b;dgx1EX{2E9hHyGK0}PS<>R)FVbj2Gd`dd|u1q zaHgli;(mqCUz`bEyo4xubw~gV=7V7wtz+JdN9wH8hIW7y?I*Ei_}T_v)};>k}OGv|^&odHyZ( z`w{*fTXE%3`OHB5PC3i)9$ww3x*@?aW~olsO^?QwQMP@;zq!)e0Jf~OjnSlK<>*jo zH?-Q@W+#c1#heB|uLm>K3#*bqNcr5HC5w4vOw(jJ-e%NLYgG2yT-&n%f~y^ywhS`K zb*1h)El`UnB_qJ-|Jdv9k zjoMCS`$uZ0-P`z1aMf02joZE&QR$=XA=Szzkdd0VRisgzXgPtCfmWg@-9mQv{rbNl zNGVxp$Qcq_h`S3HUdFbLrdVVd+$;&-ZXV=Cv2i-B*{x=^cvn#~TWFSG%meU^Xbh|G z_Q9DSn{wqt7=CFVqe+7+L7%_m#j+OXFfcU4ZLUII);*eXZ-c>On`B%OUz`G9S=ipV z#yJ>pWq3`@bsL~BVdGS$ZVPZ~%w$7wu*R`kAt7Fv)1O0K%~@}a67VZhg{3P8%|mr! zUIo5_2Sz>;V~}?gDxi;ayWUoicL=_kq83Q(o*z-4ieyZWlpte!|E18c1q~mQ44{Fh zkr)r~G8KHEjmy&9F0x0Xfxf%vZnI&v-LCOo*my5C@Lq(1P;W0=ud}o zk(6Z>OV1+9_A%xS$SteEYjOLPHt)wP+BS`MK1(v*aSkvDa9L9=6N;`)Pmm@xw6fk? zsAV^(QT4Pk3fX-$x7xg?rkOIRYIbL0(32gxN-k8UKznruZ8VU(6#H8={z|bAYl+`I z={1pQI||v;t1L;BV0zBgBjup0y5J`G?}5jGU34v2Z^?#MRoPS6QZK~l9W#r%!h40e zV0I(#W@alP)mEah#RZ!hq<|wizQ>wdO||ROO5cN^s>pS-kvs@=d0Y3`*pV6((Gvl; zmC)mS3xs#ti@*Df(Jj;ScH4KYUkeVwF0C6J_6DuHl3A@GXzoNHx;?*(cU2iDl;1;7 z!ityW)GO1_$Es+6Cg2pZS4eN@cM%fU_n!& z*1hH?5^J+DTUt67ZD!WQCO#gdu8Z;Erx3UewPj2K5QJg~WeWz?veeC%wauJl`0+r6 z8ip5;%aqa%+zRV0ML|k5fKu*K6q?YSc{sBtwMhpAb>QzI93SBZn zWZ~)fqA=v@C7%Q2`7L?i<=uoJRvH}3Xi7ylqscbqKA;vv>@>R&iONK$Bm7}p!P zR02j{3?2!Ezjx6JRVU!b(R%HHT8DLWoq{$<7^P2rb1%a1^{SLr)j}mNs$^V2@gB=7 zpL4UV*U-RXAWAZ^<=|jP_i4&-ad4ImTZ$}OPy;Ki#fXn-g!>QD*3lWw0+fqsLYkNf z{m^!RywnSOH+gJ=oT4pXEveaaK`L(&MxilCYyTk`yT=dM^ZixkUzHSomLoYXJI~3c zVz$jp%$;M8>jkc@;J2v}`TDb!4DM>zcOP7ipdmw+pr6hgjgbM@zwBA<8F z)p`%^X9e@Cj-|0^GO3b0uQ8mn-hkgt4}t-&7nSgmZhnj7tPJ=bOSMF!WLldLy#RG! zK_&dZ-I_V*q$|_aNhD?wY`2`yx!t+rfC4C6uWgaou6)To1qi8BoB=2vi|)xyXPXm+ z`kA3Ny(T}5z=?3Z7pj%ly+MWpk+laRQv-1mn1JG4^%qc{AStq;mQARY4#_|(545#L zbcJNgNQ5cF$j&zq}I|G7;w}NDjO3+eG77{u(3AgNotAMhl1P^P3vfV_d&%#9~e57 zcEzn64DGtIA);rbv86zp<-6V6C;EsdKRD3j+%9z&`!{UZir~zE3Z{MP-*G^n5N;OU zZXp1|a+@ds(%0%rv<~Pg$yVy0UCYEjA@l|Jv?O|JMABgA7k#Ch*98xPJ7~IL2rQ2?gf=&6NtRz!*L59qpTET4BtCHKOd+y6TTM&!9cCF@Vz*Ke??%k2BCF<&^mHZ7bY=|tht^EcLfK^1O^{% z4-EtO(^c_N!B`>A)5S$LP_d`1%a?MMPTafX8N#G% z0lyXY*g+4)tVpsKVXxWwDpZ$t6C~zQ3}jJWa-I#MG?`{yjNcV1*QiyePv%#hqxsbU z-u;vfj|7a>*awo?i{>3yJ{@z9M9y zzC>z+-~$aY;-0yj=pPfiOvhK0&H`5r|LyvIFFamE#Wcw@6sJ{J^_|--oyA_-{SmU@ zGM){l(L98)!+E(ZqIn2^bbV?Ut0TB8fmmUoN&)9JC>Oui>-7eZtdX}V56fj`M#fq@aMSy3Ci9&J&7d%@_}lZV($SmhOUsdv<>plWiXENyj2p#U zmHlu=gKh>|M7T4>JboY#k9y=+K_5H~b;Yep9In17x<~Z=ZUJ_a-JtT)UQEwC=fIMC z`zI&23a>}VfkU@s+}V|J3>m~JiPt~v-I51A>;YZ!hL0^!5CA7p?v+5I(zy!11)S%n zl>?pU*8SuCRZ$ugxl}l_zsiRWdfN@PeQx=@1Q~GCt(R&KHMSf>=!-fOltl_>y} zmxMm!plY3P@R;DObe!nWfxV)N5?y=!QOMo5oC3hJxhfC)+(^#AtJIb~ZsU^w#twHQ zcyy?vLvO~7HaV~qZ;AuI}o=rGl_fn}^BSLTX?wr=%owxXJ zK56)GR$(4n&}|-}ZVUxpC>y1?hHQT^KaS+k(KjNUP`NZ6o55j{f`4g@vR*m%fADTT zkw4?~hlWq&hClzujlfU#0>9CRx|zltr|ki+LZ0hJ-~*aWfK*8?9I68PIhF^Glb%Bj ze|LI7?39e8UUtSypX+$ru?dh~NH1?kMXwis!5l5Ps5rNYj8gCfXneLSrY!S$BP{OE z^W-kCWLLauM^JB2ttxJ16|1rtI~|f!bc~ImJ>e;-gINO6@%9oEE?twJH~YGWB}L7L zu3Nx&{}uy-?&GbwsZTIh)@Z3l8sT2WEACHho zZVJMo9#gaYa<=rI*6}y00t;()jecA}V zaH@kZ=$O=}&0y2&bfKH7AkWXL+8;3RDfKonLIPcXbSCn2A$bQj5#68z7bt?xW%sx< z>mD~7t;2b@+Mm>&E_eWfKz+X&X$Oj*c?$}$DIEHwHFk@-ydA~6qqa9)y}iLIqQ5}2 zw3`Bzq(+d_vR(u~5ro*d@D>pH?82Ks(6YIY)66FfCJj@kDs!fOF4fO7LO)rry)QPx zmmF^fE5TT;pKJ?O@)QX1)3+etIen@FXe98-&Q2% z*JB2OmUXI*!%{B-`IlG((7d(AG?)*dt$InkDc;FnY)Jq#)|xaSP5_!G?Ln*7$gVxX zCo06r7Y#=Aba(JEWvTo`Mv{kxiTb=V=*iY#WOc}?Ms%`b=mbva^c?!LLX25}wc?Cf zIh#RL`tKG*r3yvn1P-ghj}28*dp!d1*Xag^y`T|m%#L27ZG#jhqtIPNEy+CyRI(!| zm*MUoy&HFb%IO!)KqdBs1}1DtzrpmsygAxu&Gz3Af9sjf*Mnv~n-V|h5*YtzSU=t@ zEbQ9uUv7!z8JPkLw)CEXkN^eFP3n{_J?FptpALu$OYet&t0!vIIjxbC?Q?Db!Is|Gsw?%@VRl~nQBvBnYv|^Dl@J9GKho5uB6VK^vgQMx#S#J}5 z>+-*Hh)`_o88r4x!>7?-ZlFIxxBw=Pyles=-7x=h=j;Ix77A$~et`OZ&_JjaCfh3v zL734WTI}@afned_4)$X+ozHKKtA%zzsF6aYY|U5_WGsPF)xI6yXav>5id*bJ#gKZ3 zkXl7W@T;^vhL*MU{f~qm_3-vG!rH@&w{_qt3~!aw)X?=u??%@@=k&`aT~`CvB;+4f zLu~HIn&bC6y2mIu0i&{POvNa;J!Tmdbp`j|s)9Rp1@Dg;r()FawJQ42W+~NGGIh&O zR!SYMy}AD1u7A4zkFWps_1|Crr|W;Z{>k_KT2WI-FKg&wD$0|BDW;14s&pBlRJ(bh zcJo<#w=SBy`EB`TH=kqO4g7tzO{2viz@O`W%u(qK%Z0`bt6en7GQPG3{D1`{hPxr( zaSvxJfyggfUl9R5XVQyDa!dmnP^GPdS3C|c3E2prZmF=;WA3^+hU^tejaB8e?D6B; z9v@)>dk2pU8Wew8Ou9jwr$HyedzQRAU!;P!ce_yR2#U3JR2R$cv0)X7QBEb5atc8O z)?k7~bHzYFf%QgcT^C^nK7*eR(n_Jlm9^mLcs$I9Di$LscW6LDFK0McYKU|ywV)s& zTq^mkM`(tb)hy&@3aG?8C;=$T6owB7#sXqk+{0R9e+@f<6inWL7s^4;jJ`d0p#8zUpv?T z`ugu*|M#!|?)oR%x&DXif4=_d_5XDJ6BOuN|Ks()T>n2%{`J3q{dbV?&)5HQ{SUAI z-Sr&#u>^K8RKm-l{LxOwtS0>@z!8|uw60Fv?dMizW{~T4AgbM z!mEif(;KkO0uQl3#GEKwf|b%{iQi#~1=9gyH}b#6{0UPhYMc4r@;W>f4rBtpA8}16 z@!xf0e9e^V&~+n=0xn#4fv*L=PF#0_uPJ-x=^2>oD%CSpbZV|Ewh}XV!0N3;0T0-S zl~}+7Hf1GZ{QA5iQ#n~}AM{}|^b%hcp@Ewt`AQUJNSKkMJoMr=5V0mtOig-R5hkQcKt*jJAP!_)0}pEiVPV0rXv45|5ez3oZ_*jE$Z|j!wqaQTWR|nRFmTu9}!? zN06%hL?anU6Y!_JI>Ag!LVr}}#yIE#NVDFZ0Dj!eBeIG|WR^NW zi}a33#cnZ)!LQ*emnse%g>LHx{aOKwVOt4!H)@`ni5)CTyn#iD8(GxDH%#80x1GG( zf8OMM^b4K5+rQ+=``sHR@BN!6@6VdBN56~-`^C=9*Ke4cAb8uA74-hRnTmcHGqtg_ zg5EEA{=R+F{Pq8ei|dnL#+3bHC+GX-G>aM`7KR@?R_Sj7fdu3Mmk6)Zhab0}JK2$4tvS8K&{?5XZKTztvv&gPaXDP_91 zIT;kAd_45vuRr%vm~t-hRZTcN!SJMnVi`T{x`0aCocv0ql(QOux`zl$3Yw#~N-1j( zq-ZOX3e*5)mNKbe#T(Q}MO%$jRbmip-z(^LtorU9v`6(CqWk+I&B6DV@!m7~hL1}~ zj`KMWSFyYbW%)C7J9^%YPHw;GfDjUW^dvk~xALy!qD8@tlaE??otn|90*ro{Z+8}BgDw++m>eCjW z2qUf}jJ}d>(K_hKDD-KB0@pr&z?5ph0Zx0%YY+XW4TFs|TILJ+iO4f$v;nn15P>Nd z>I7{iX8C29+qN6Y4YnIF<~_z(?ffe9jy1H~4&3VYTgDo72B8kZW0`8e!5gN*b@^F- zX`RXCaLhEzFE`CMj^I?~UCcN16>HrAU~TmYT}+Sok+#%OHVy@?1|`u?weeVWm*hQ@) zJ}`^B?4EY4GydaVZ<{S;M%8s9hdTXZlcLP-8%g>?l0%(dr`y+8l5}3<5)pO!&2+Fa zSrkA*(Fnt2!rdf$ShJ10M^xW1+RViZNL9AtCJSSR!)ZZ>%prRW_bk@nYSt_SpE{9 zU(J((D?cOOG7fIX&hlx2iIDn`hg%)srvtub)0Jo+%(Q<(6Q|k{Hhh z-r=vj{^;oV^n>yG})PJ1f>mZ%go7WQSPH_V#rdV6hTTCXLk5zdZqjX(`s?^Rzq4hcsPj&W6@gO#H8 zTv!Py@pVr>sh!R?hX+o; zaGGpeM}#5*L(OlwG#`%FN2B`>x(~ZJLZ*gEO=+TVQq!wq}?e*|u?N ziDaO8x_x|f2gTR*$yK9P7O}SCKL|P%;UOc=tyE-jyr$sF__J*!(OFh~4dNxemP%ECp ziG))248dDpfr+8<=$}HnPXh|R_9XaTni#JgvU*vDW$J3SM7oV!vbg%j2i}ImbFhZ>Tz{loKjFv zHIs1^cb^MU^h%)2+$zmzY8?}$=9nneWv#>v1K!Tn7k0BlF;quIDIN|f&{V5C4~5_a z2VDj#;?k&2xiP@}Lgk0Wu&7!n*i?01S>$c87~6GFq`G8V3E2aFVGlUNlhBs?WIUqD z8b>s+w`6CThvG+uCr3NagPO+}qCO9@mDD#KQwcl|615t8&|HjaZ+hH&|I{riFV88$ zZ#o3-p3}MysdXTfGu?@l3?K;n5Cg=|y&QGd7(o6k13H80IJ@w$yMQWub)l#`ie^Ze8P9ULHI0~YRY%KLHTsce-7!}Z>&VULF1V$5^(biJCwF# z^Ia?RS?1+`&dPl87hReClRH}$=Jx*GxKQ&qE!1cKRtxpzuAM`@3ym6QdVRfyyjZgW z_{*5`guS;XVH>GDtBY?FIrE$|nZf15c(}~M%M49a77XefbzxHu5%buh#RYNQ$im3( za^f`Zw&1&R*^*c9>RPBWh;4dJL6;%uIbT`xm zyE@ffFvdL9r3}OL3@6$UBlISUEvg=Z`KqS?wCW+Pg+<|;#vEPl-rX@AZ=gE$z8L(f zj*gDTejKGKI3$50@b?t|-X5D1K5M8aZJ#)i*%_r(es25TXzYDpXcHN2xT`r!yJwSS zS6ry0hC&BDQ)e2+ox@y0flGZm9?FReQ%L*EfYg>ZkB!Q0w>S}S|k zAQ>J~m5(kRo~WTZ8IN$l#)N{0n3(+lfT(W69xE}5eN;V2#%bTpa79EwQtKJf?s6hR zPj!J@kyJFns@rkhjh45$mnmvDGvI-S#!Vbq?!pnKS7a5$^q4fzC9>Svj*fz{qGt+e zh+eHumZYG8Z9x5^ExNWaN%=vnT`U#Nn;Cc&qkS%Q)DagU98XSErwy7)wa zYY_;6uGDcpHGxPgP2L=t3C`!K*>LY%|JjY}A9R1TXpZr-hRCJ*xu;OYbse!dYo#O; z>qXz5t`p!;-Fj6n6RqmNbfbEG*~cr3Z*1n%f8Sz0b>XL|2+p!f5v&fPzX46}=PClAY~|TU z_7!XEVePju)U674^qm>>S$^rd``h_hQwS~C())Ou>}gRa%b6KwqAxS$uY2Q0_QS?T z=AqfhOt6Z1RmJ%Zw`Z7nX=gsb%ui~7rT4U{wf+c8d}){XyjkKAmiW$fzr#iH;U=dx zv{QTYN}AL-ooZ@qGTT%*-&xaQcTLKEooV7(Uo`c;Zh8G`Re63BaOa!A&3D#xc~ec7 zn>EdL*7V8FoG*9g?A+04|B5;y1kztYuYi9E%IQ@@MA@>h!PDm_imaTB{X|R5TC}NL zx4aQ?UH757oWIbQ^S@9;q?#*?s}6PQ7SIpO9Q?pMQFNp-frZ?u`axf5Gw|^8L{X6w z?XyK?KTtoP;MvDh`ibRM;3M_(C1!n2zpPG81bqafg7~e53KKtshx>59;K%jadj;;; zl8Uc?0It{;wJWx-;r+bI{uW*@tJm+znEu!h>%cbwuiLsUu7}GtHN#Lv7TkyL#U0s=7YWMi5i_vQ-)}1By3MWzaOdR{9H} zY@^sWgg!O4)U;*@!|#UQRWkH<47meU1QF2YLtAS2kdW{@*Y&6Qbi&)aGDn+H%E-(=grX&*N2dk-Nem*877m)_@EVtJ&ozLsG=B!H;kE$&s*f%KcD z874;WEIi?MCm;oNmG7pdIr_@BZyj1#a*F`NpT`Er+&o*mYHfnnYwf&HJXc@7z zE`B`F7eAggFMd3GOFt?**z>GGH0rk|8)J2U>WiDpZy=#KVAQ)>wiF39e=w1<6C~% zx$NF{?!9~AyN9y4_iGv{^#jhtSw2~A%=NRzTtD0D97m+FRQ%YIMgkxwzf;%GuLNZyvx&@wzE3WVhUXYbvc+eofG z!LI^UaNsH{2?5|!V3#<2Nh0-Zk`g7dF?10q03`xdU{!)3L~_G@eed{gc;b4)JF#(N zc6YpYW+L{ljcB*scH7;SzXJFb_LFR!b26*49w0%9YP-FyP!LsFnWs+WJI~{HXzSt7 z*276}J<<)8&+o^#9(7p8yJu&51D0_&TDP%%V6l#;l`*XyOPk6_n+E*VZe-d^s6%8< zAu!I6Sur_MyvuMt43x#!H^qb)7z?evpt=Zu3S9^vW>j>zfl1Rh7^cI#f)^2H5iPz! z)I0$-PaqawnQqG0LrlF=aZ1YX!#0COuT-us_80pF`lgEBH)&d?8BJ+Fqtegk^**h0 zeW3v;7pLb#s-k%fHZ@h8Dk?QYkVyj-GAW$fIajCXrmHi~OXdY2vILp;BvZtqY{N!Y(7z4eUHlV*c>#Erbog%gM@04d z66!(Oo`nS434*^Keg#Nf!#^nIokTc;<~vQ@)rB;j1kL|v_@|4{WuuH}J1~M&1Vj?z zzNgA?r1WQ?Yr}sXetR`V5D-C;a1Yu{i)^SrB(-Qts*{=8W13Z~*Y8zXqa5v|CqtK?jIB@UQt8HMt!*G09Pr=Bf$V0pFXN$23dLb{Do5 zt=QHA(G26u@{`1}+*FUD&CKOFOO?|IR}*;CZYP0 zL?^%$@=QjBEZ&oQa!|8f%Xhr(6JBvJ1wvW^6kMeixiVXD*)xl*ZWdV=8;hL=*0D{| zktz+K!>yUq(81Qj zMoZDty4|+9ox?j8-H;KNQ#awy?QQVGD*;BZPv9xGApqf-tKVhE@KY{A_yJch72$IY z5vEx+rju@TnYa_T4HPb#CJa0DPpUx(^U{bHN%E0Jn{J%8F!ZFUIUet5tR+Gsn-t26 zn-Jyw6#SaF3G;q|6wyv&pyO@V@&g1I!8V#Ug#VH<4T$lN{y3q>O#V)jX?d&DUC_F#!&pvBd?Z7_6nenrOv&qHJ>bLd9%4dbo>OVFX^~K7by;j}3{n=y{ zo*0YZumhjZAy}B6`1+P%EO2mj`^^2!mA%@$r`>jxuv|1+(3KIjRm*MfKnE$+DF!@? zt*URpzy2J1nh4+QTE|Y);+|jV1Y6dz{mg&XwOycLT$uw;Obd29u)`p4kp~?5-mSH5 zxYIRDGZw;UARdWDNas?@=9=QAFE$?w5;Rs`Y(CZlh)>+|?S|9A`S!7QsE~6F7Uzf@-y}!p1}hrp=ivQjpL9K+7qIe-^M|@_1p~K6Xpeo% z;W=1Sgxqn0CX!={H5{2(A>#O5k*>VCX>(CY%Y*g0uIy=qeWa#=3ih<))q8FG8AkgY zq;VIh`VP&AGa6Z^fV$rF`~k!>Lrc`kso#Se+pTEYIfET$B8diP#b>g|RUFo|+HKn( zfEOe6Dj3OKF94gR!1iHQs?-Yd@?7v^o4yNQsB7FiwB3CuR2D9bv`$d{H6U87uC+Mt z29-N^pth}c0diZe)wKPB=Qrz!7X@)0GH(3L9fjVR_)OB`fa=3wCnl2=#pO7cCY$m`rKgAshisEkeuTN z;ILR>#k3w(20t_LWWr4JU_scGJ=l@?p&imKf~x1{#k;<7IV^2W#6f4cZ0o5P?L>tSfl7 zMH?Dw9Vih-MdSeA?C#a8VjZKPG!7-nL6Z%0676OZ0cWBI2Gf)+PBQ3B^u!RMs$#jO z5cecZ2UwJ7Go-lg0|JWj#9*4-B88cz!M3j;lal}|GhiDk0al`2Q}}$AHQ;&p0Dy4i z4l2wv2U?y&m~JplndZV=^Ps&cC{Hp$TZ+?ni}UjebPGyXj`Ml_7{ePuEMB9)Tehp? zcEf4tv|};3!EQ|y9Jki))$Ksnl!ewXRB$^na;>)QbN!hsJG;6Rhx^}xD(8J)i}iVI{#<&D=X zkH~``!T_q|$EP3+2hDqs%?9-bOlsyWn%tluH}Am-i3vo6fzAs~o!K#qSq86;S0`8@ z0zJ?Wzt{JC7y;wdiI*yZq$*yD`awfC@V6;`PvX7jn8<+iEyyh27v&E1Fv8gL>tVpG zxom?lV4}l*iKz$uGK&uRQ%pVJ7g>0?pC-_z8K#`#XIXS`pJVDSdj6cwlhRE@4J$N` z>wkGlg)=BmD{ux8rH6liSOBXZfCcdD;X733e{=CK7eA*Z0Os>Q<#wF=PL}un+v_3% zjC{kBPq(+T-mv@r_y8|{zz28_e1Ou_bh$J)H$R0DIj;)|AWGkz!P3`70ie?JGZ??; z|Bs&kOPTJa<>~7CI+m8F-`8c9d`cCEQsN@!N~-vgf^EbHxR4%Y>ZwOh#lM0b;_!Dc zgP?#s4E6Ih#Qqun`QjJDKVmo_+*5vY@t-ooz^5kdwB9K;4Am;bXGTUVL*$cMAUbB~JcUCZld6hQAdl@stdj*=2C0EC#_+@C; z_rNTXRTFF!g8(27j$D0=5N2-7Dy}Q7xgbbkJ*fGyD1~VgvaIvN7oXhe-uscN3>LxC zR8?y#mT2vIeEhfJyNjR0UI3#nab+ z`1C*D`CO{=Kb`VkxsG)~~LK&cWpL-)eQN zr>o=bc-0ZxA3OCN{F$tI?O?K;Yg*k&vQNLCwk8|fbW4F_C<<_zQI=fdK->dMt}VSz zC9EzC0maG8reNbEoyxEb>{sdWfPVI4E@n^Q=Ly@mdb5(xzane&jnF)PgC)jiXehs( zbXJ3(r||QXJp}$9szoCnSLtVoevatpE&RL%&#^6ioyrBae{B1Xuy9+3TF32#V&S$a zFYd#|3oxDEIXlx|gT0%lSkRKuT3t!GTaEj@348K4IGu*pZlzL~Cav8{WN`mbElKwF z>uS<8Cf!#H&VZTRPSOG&r41^)hUhmETO;g7n6VzuNZkdpCi)L%?k6)t8%P&3rQ=M; zLj#XESCQTO%WS)Mah7t8g;!wr{wgwiujp_C=dHkCucWE_E3$9jhA38NE|{`os9AM_mv;Kcin_q4jtn+5ezOs!Jx$ii-~x%OY^|0}R~!z=Xpi zdms(_A(cVj-Bj)FHVvclAc|Y`Kr!=skQuk=1)b0zP-j=ps#D939zHr(givv6H6Y7ymr`diWbSQ)&sXU&JA?>u3hw@LWE5;I->= z&7}v|TVqtniv(8WC^^mYbw6kLd-N<5XTz*dLI{@3ZxT;F`bTYE^P@6_*jb-8u-k2~ zpZ#&+vyc9H_doda-er9pMUIGnTW7ME>rNJsGJFXN&q~v6~NpDt4c0N#0_jx21kxgWePL zD)N(PM#Ng`t0u^cLJ^Z)^Htzdf`$@*y7-)4n3Aons4sjHp>+tc*!5ocufuOKraeiu zhJTQ*L&LAYR-8C^hVR%`#AYf7DH+()4-~2qc*v?EHd9}xh`T}w*4y`&V2u*`h?AI@ zR0tpAzzS?QG)agkfEtsRojP4Y9snJSZcf_DO*wWaYeCS*2NHxMuFg|9?tO0$(7p7D z(Hif>*v+ho*7vq1TIrf-j#m@?%$ivF-qyrQx+eC=tBH-wnppeZ*2G%6Cbq|`iKm%0 zvGn~GFD<33WA!G*OK;y>ytJ!;5scv_xP?eHMcT-1;mI`(VicDzH9@|#1wPxd+;h+8 zlwpE?`e{MaJ_wq&^cAI)Z#SG1Mf!v|NAUAZksWP=>}X40i^{zSB#){%$p&#!C^=dM z$8L|4*%9P zQT#zHkpq%Pc!Ts}-XIuLH!f;X%#s6?xF=1VgG@{4K#1JO&kX|OadSs%2$`wlB#KZ>lBV6fHjEzDce<*UFCz&vi<`x^t~JTwYi3?Ut}b??txgFRy2d z{@P_bXp0`3M~Y0DLrN^1KgwisKE=3gJhd~0ZxtII*X zUHlv^t^OD*n_*b)2A7$xZ(e3t9*ih@BZlQEtMSrkt8r?7M@q;etn!3$xE&gYOM_K! zl=b(lF#EyM`^f_a1iR-laC;>M;9s zv@1tSud&bGuobqY>NQNl6YK}KOSd(RJrwsM8X8*__f8k?mgHR>?v6~IZX3so@}iVd0d<)B_ zX@K-D&wy``I`|~4^<}2rD!B4kw%t*DhL30GJysN)0l>MYW3vnZ-BmGX#$?o~Sg27M z0M@Hwa*WTL=0INpB?u%>D2U<%I3(_4@|!Su#T>wyaRZZ|g~{85iB7oU%lZ7W2*Hzy z7oJNaXJ-U;$;@Xl4bUYtRyWaSy>jP{c3XDggl*@ggc@V!n;0|Sn=s#&IWlKXyRFBE zjiMjbDq5(**U(Du*_iLXGR{$5cI#9moJ_N;q%5o!L(GcHyBaZjDk0pOkisotKJ^BE z-Y7ubp#bZdV*G^NCJc$ho~x^qe(O1aW5Jmk#-YgZ%Vc!$adL;i>3Nt(qCs)jQ*R?U78f9aObKjP3Q68tO7@Ugfv<~y( zmfjUP>Pcllh#RQdQI=*T`d?C>-c88UlYoHpNi)Z(xS3=4C798QXCxau@;b9{%>dq43pZEE5WUH)hkmD;@C27HlV<-@zSz z%6Bqp!6khj6ZTuL^ZD0EKw0;~Iih*BF;FYA(h7_9$JRs*zXTJs%&w-16VFP-tKzY^ zrCes)NOk?m>4Z66WEm+63})MBQZ`E3p3J0L7rPkL^9kT9oMGPQ%Y zS39JAd&rKopPns>O*_^B+!?pETz|3zbw3-gw4i0xy}tZT#mJ)W@to2Fa@IlMwR_yo zfhEXfDaXC;WGUC5oX)i-r{graZ@Gbk%WIsx66(sg+ZK0@ZD~r=@O-sq6tkdMaL+h` z^cY4rB~kZDAGpo|+SJU(VuvPevmz+FBgYKhNkVGBxSw zYh+jQ9FE*i3)olfdNdI5(L>6yNt|lMC3IQsk~l%9lrjxY176MUr&9jVTc!zx?lhY{c+|(6c;Gd zr@@52A)_C~-XKINA7i3Jo|M_tP$GYRtI-xUB7z=PXn?6ea^2e;Irt(!Wp{YdUt6dg@& zGKUclLiG;(`~ls4Bu=^13Z-{BEI0gi_-^=n(EMD28K`Ao2C6UBau+{GwuZmC_(cv= zQ}*yc^Q+-+Ark~s_y+<_|1zhjp1xH+Yxq?mH~hacwNkms#49d-7D2MBjDm9oq0p$z zvK$<0hksDMT;bs>1n&@M;%`E9EPz&|7#}0gNrfMUs$e=1+Zjh*we9_2q&d_hmp!=B z9IE((In?`_L$!mLITY9@kQr3nK6YyMV<+I!465bz*I~OZ?4Vq`zlwP(fR;sBR4WJq z)9>0oY+wYIzE!WU+Q;iIlC{#dQJCHvVM|p{q}y(N+gob4iHo4pC1`l@SONasL}Q9L zMt{_qnjZvcpF*&2A?R-rB{~L!>93(HAqxQW-=Vca@4?AY#R$DpJ)IoXIXZrQ0iHKF zv8-)9FXX}l=O2f^gE=@6z~cHV?tTbK@X zvJCBneOuhnPIU5wg_}q5euh7!zH3Vh3L$w3`vu_E{Y>NLOj_3Bvcq$s%4g!VTMOQw6RP{qqVFo^{gy9 zBC}#IYa1cBEjRD!U0u6FHdSX@YS8^^q!1=2poD)00gwKY665?Hg>}CGC8-Lfio=`u z6B|i}9Y=83ipkvPvtJS!$x4W$DSaG!?T`bAoZ~)b56MYEz|zomwsUyR%cXlDix^bgo1~{Wq9o z(UJ07*qY*OjUd?XE`EwzS%AR)WtLsp!KHR(SH0@u7Xm;#8X2%x&U#UQ#EYC!FZ$nM z4auT(_%ZF-JelrXVdpk=m7SXhk`U;G1X-@YFH77x4Mj0^B_V=Q;C$?`j@TEgi68t3`1hkyKz znQmOWo-gGz6OrS_m~CE<*^7U|<>VbgzWf!~ZM}DgxSI1UbdVckymM{F{{dpF!dVPN zGT%AB2cz~OnTEUxGu{mB-d%~_%U-bu>=FBvan5YcT+RZ{e9qdOd7L?%)i|>_>v2}+ ztjk%0vnFRP&N`eOaCXAk1ZT&b^*I}GcF5U2XKy%r%-ITOPdMA+Y=g6BoNaTq#@Tbu zo^tk(vsKQPI6LC(EobYTEpxWX*?rD-IeWp`4ri}9d&$`=&K_{~h_g>Q<2JKxG*u`Z zxL^b9+GrY9EgbMg@f+F)2Qufe?Zdq5(6$W}>#|*V8hhieI{Snv%ME2j%Iq4rT{U1Rf zcJaBy`5_DOq&-3xZ4m~#Z)adGA1RkN-UCJj9wKhvA}{L^1Iv=zO@Q0C0f-rL>_$0W zD3>?F?Taoy)djF36m*E$rDI+sT48W2&JqT!b;-{tZVCVA<8}%+7dfK$}`6i_ti2Q(YKq)7b0%oKg zN|~UP13RBTpp;`uIkEHk6H4h*%7mTIPf*H$QVtbP_G8yKQ#1b+>jaJThJVU!E11W`+Pwi@>*MlT8=KdOEM8Y`fY(vzRViMRX!E0a-Ol3m z=?(Dud|Y0ijm_&(7O%@U!0Yx(R2U)}((ugB$ecWhoi&EnPNH^8jT$L03X z*xY(Ni(Ts`*sYDtZabNCG{22Zep}s*X$+yykxH^?*m!r5fysGKBXVd>DMM? zLy$eAwiP7MRKn-7Y@1VIluC;WM_$zM0_D_b)(+BYDpn5(bOiyFV2g{UylC<8$lHNg zUn+i4${n74laCH~cnD5Df_UrVG@N`i!NX&5^3gF5&&SC}eI6c^l}GSlgYXj%#V4W+ zUR=D97mx7*rSjN$KsHaswn73Mf&j|v#l^O~Si=jH;A4LRIX)G87!p_&1W>jwE{^2I zTf9JNKlUw<`BSmYkidOG0QCUk;)T4}!3)$3U_S%>faqc&fk$}tDL*^Yxoy4?Lt1zP zfPcWJJZ9uSjoR{j-Uk0wJ*Hg{&i)`)mbqNab&1vi%QTp)lnJm*LK}hkwpgI#^D$pS zOM&?wGGEEp#(Zh*1!mo3Z6&LRS>sv_%=U_TN;U_xCA1xciNKkoWUOJvgc^jv4mbnJ zR!o_(*s#ye^oDJsPD4nOGWJ(;GH94m51xeh^cAEH;5i(>Cj*7(pU(EFJ(6 z7@T@j5NS#xF-6H@3y8FAvrB3eBqB%c2@ru{thWS_mLw8Wt1NbaNXIrCq;w(Sm>@C% zL}0+{9YLfciNusJiw8jDz&4wtq9J*jAaV>uU~1401d#(tB&M=iJOLsnw%H2B(+m#7o!3bjy@sCOoSgKdV__%A)y4r-tdGo zOX)V~8?I+*$1wL(&U#AjI_8e4%`n?CXLTi87qi9nX_)UNXI&-VD-QYohBr0fI}+P| zB|YXdJvN%+w*uM z6JQ@49=G%X6?e+D`@Rh@YiDQrlO#xt@N@N&ey$0WnDUfNQnFFlyn&i+MkXoQX2ENA zKenMRiFJ2H7br7^L>i~MQsU{!%8QD0Gm5M(Njw>)!lELBL=jOZP$p4J<1DL9f3ghiM=FTHkT@H>sFkihN$!UBN|5ET0Z6)Z*x1olv6I%SxZVI6gd z5$eN)`^x1FD*nNEi~P)gbMXskdi1c)0r1ns&xXGpetq#zBO7KHc~q>lcGPcAT2aYw ze}$zUs1{U^z!jSUn+ynCB`Jtq-%tgJxf%?B{(>{P>L%`#Yht92GNzJW>L^dh+(~|` zMMZl`hAt(kMoz-!=$Pm8$DHIbl+x$V8Hj@^JkrkWURFR%%naxF~AYC_dWLv6!elwRk_R&>g> zn`pwuM{Yugk7z?MdZ9*?)uWohT-AsvYn73$=#Ht;eovVOsFdD%pu)PIRO3B`82u)d zcp{5#P|*zn4%;AQ_C^{wOenJ-D!5NHjpLJ5%CJN~Z|P^9-molRwMnnqWcTT3mwr&G z{eqO*JBm{KW&Bk%>)^vzl;;8cd`dr@(_3sV-{*3Ap-^$-g)cAKQk_i-Zci$>9a3=D zc>L{7xke8ynX4x+y7HnSIB4Q~#b%2-1*W$!U2M6O^bV$rjhB*sfaxcoU7g@5P~u`* z-c%}u!le+Ut(=lAm8R0Nr4ost9>&sUGSUe5_+>0@E+dU13F5>QCEm?Q1kAW9n6!^4 z){?_T5o|>xNERE!gYNa4ihK$NfXt_-dvo+qpuB&CeGBNIl&z7%PiB{oo<9PXKGt#! zTq%pb!d1pth@RF_1`w_uDHz$O!NVrfGI(jEY5H;&Cr1ica*pCR#R~H9- zaS#z4aPwG*n}i2Op`#zf2%?r9<^p{n2o40nYf4n{_enxwxhyq%;@6h?JXc;cc{p`N zcvvkS&RbDphli6^ln7QjCtRS8$FV&INuOF!Cf}_VIzjWcri~Q24Rk+#;tQg3*(&3` zwW`o7Uz+PyHB>2|1i38LvP?c`TeU+eI}N1&a3EKBnzq^i_ueMs60|LeeI6>y5$!@| z3eZsHuk|f3w3I5n#1;BbZ8ij*XF(bw-Hkz{2LRSK2y}$FaS_}LF8tseI>T)VHNoX-b@=PE*&P$T*XBRQY<_lg42u8ow$hquk* zLOc4_wt__Jnc`#H#zL^yt}eo#LRa??zYcDoLOg?EIzsHhMfiRK9bITgthR~Ob`__A z1(|Nj*Po}bCxZl<&i-i3Kr3Li;3~|(xsQk$=>I(<2EK_Q1}c#b2{*9j`Sue#2&|?Z zNaR2jfvOz`_4DGOel>t7ee5-ZWJJ{{AYwA4DnMabgf(dSRwr1tZFdE?VD(B5zR9#% z-Mm%G45pe9BDIW&bFmPq>NhEXaezFhJ{pA?S0wnkIA&Z5#ci4bt41JhVO=P=asWOT zre_95oki@qC@^XweCr&ARwX>WRD~(9dH_0?dJdRxZPr832&n|CXT=e1hdWnuMURl$ zDA;K`gldD=+$tJbF;Cltelr=rGb%U_ORQ&zVr6K9d0DZ{S2^X{wabu_ z`qKIsS#EXd`sIYSdaQzQr+Ye~TEeI?l(ZVAW7d)pV%I&s9(LWEfbAo8oibyTS!}jQ zVAT~P6uM~^O$;+iaMW3fs5-~eL%(#6YY*F-EV0Q_RRyP8`TN6`dvb*yUZ{RhyVCHj z4v3i?JtzczjrrzJL@2R|Q$YGUzhl=O{uATu?6Dqz(5SlYc)fg00oIy1e^%8P+;(7|`n}32Xk#3=V0SF1tyQ!&{AD5);(|kP+g}gA zKt1y}V1FQ<;a_<8D}c!w{!U|B*Y_Gu+b;CFbx`FZ>LX~de=5<*V-PPFKhv0ZxF7Ut zH9H8zg!nr|g!m#25&ne+!LRpm?C#qq04J&qe>ME#;-4Y+AJn2>Ui^XphlhW@_@%@x zzm;1-N`SfgFBkvw@av0zQHovsEC$n#;H(H`N00%eYL|8fU~uv|5TmDGA_~kulZG15 zGJ#L4UMF5FV8H=j{2Q3$b7&zdwc39I)1-*?uf-=e_OWi0CBLM4#!Cdrka(IZxL?HO7L~N#aK#!e+i%-0Z^e5&^~G-pls88P8Ibz!;vaI;_%K&0 z5^Bk}xM<iZ66^3BVheuI?@N_KMX? z&seY)Z9On5UDMYCV=<`kbJjGSLdWXrI_@0d0L~f4Kj^{Mi?e#({GasFC!g2`Yv=P2 zgTN45xcZq1>F0(KiY|fMA|UePq3<*R8G9EEG;fv8&)I3vI|ypNb6{6`TtD`ldalTN zMj=c-Ux2+z?_BS3UGsaIfviAfny2T6c`pj9PCGLQXJZ?@<$L`c9J|)wOsH$Fmpilv zxvuXWJ9WFB<6drp>xO15KmndA@DtY~<$Bv9cvjCx0@}o>eXjk4B2otCHb_JF>?%?T z#-P%3>qu+jl%E%X)=$EUdUo)}uJOX5JqUEypca5yr&hD+5NS8pPP+O}PEUcr`T0+n z*3^uJzzhn$-ECVKLBfSFJFtlk&PA;lMsyx{J`R3*sTks?m&ytJ^rwG+XWWOQ&s0kR zTfOp3Rr*2V`+g^?)wpnhwPkakrUV$nX0J;045raz3O(?${>teQ4xca~JO7U_*vV|t?{h~#?| z=+6V)W~+?H)mkdpegZVL;rShDz)#7JYTjEj2l{ic;73zl)x0+qi?yMaYnlW7siDSK zmE|xlYT{d#Qs08wwUx-cJv7{ZW)Ad+Xnmy^%A$HdGJc*b7DJQg$OsyYqcl-c1ceN2 z-<1L=C8#Lr`EypcYg@kM*6c~wbL||7w4_OZ3`pJrQ-SWuil{L?$d| zy&i8nt{_KA!lpnxk(^L8&jfqPc;`K);d0dS+9YZVypHX;_P@7JtWLLW7iwN7X%8I+ zDQ&!W^)+Pmb>#slVfK3?)d#^|KcEi#q7IWhiaJat$LsOO;lHFwcIRMnHfaGX%(OdP zJj#e>D=kOLC+*Optr&tJ9HCPf2~Opr{+47 zWk8(jOilyVRA+Kt*Z~II@_E9HFkv&`lFfjdhOp`A9!0WuD3ZNLc7Gn&{cY(zaLK9` zWLKq9b^3`AZ8~}*9Wr!F?^9vf7*uNi>d7IWUrGl&U7_L|p~>L(*_pluwrRc4!pz>A zm61Wi6fzOpP+ZLB!R%{06#^84M?MGBi02qtGCjScB}EM^6Q?0>PqFn<>If{pdW^@b zji^5b>Q7_T!!-hlH^JT!iTC5gWgPIA6=^TvMlI)3%elf{K&G4W-RJcA58?A4#y&q<3i11& zv441CsNEBH}-?@4b!Lq#xLF|urYy28RIFfNHv(VZ;jI+H0+o0A~t zaI5Xqt}@I41qQZeXmOL|OBm-|W(D(h^v3#Oz@Gk~toV3a>vdIGkqZ_qowKz7PtRZx z5SSc}g`pw?>xE1z{A1gH=E8DCCKV8|hdIzr)Oa=13I=X12ZvKIR)9yw0`~{h(5BV5 z9G+{~yw=h+(0K)wJ9oOC&#iXB@py-HcLmRH-m$vQ9jnJ%cW5lJ(~eiSD_|87Xsl!N zmRGN6&!25=Ypi8kb=warr%N?}HmRs_SV=Q-oU;S3KB#PLJ$qUR z&>qZb40LXsN3s!O-Y!6X-B_>--r=GyzVfsaG%H$CSfrg-4c60xLWi`?7>^M0M=9qu z0B(UMJ3nVVrTTmqj5l(e~@E1(5 zKTTpi1o?b`-O!G@p)Zo@n$Z^1hyEhFp=+EbX)gwg&^M^(mP>h;U=JbqVaWh{U=!cX z#M>yH!AoqlN5K*tPNtMeNP2 z2$d854MeC+MVu^M6>+jH&j4*BGvcH_B9dgeSel|pj-?_T7RC=J86WYfAdLPMK^pxL z!57sA;eKW?GB{t(!U>eOP|HMa0ZL-q3i!HPw@;ombnT92+%7ToDIN;(SQbT;)m2@< zY?Y`n4l5p%ovO-k)S2yw5n>=fOuXrQQ*dR~zkjZoioaq|)8TLqhj8eiN%Pd%neN4aaBAU1 z)J5mbQ*PRXoVgz>zwMj!-G5CWCrUL=1LbqBV6N`oeSkzhJzUK|q0R(mZ@zI)M! zR~KOeUVrQy1bYNE<$ItseC~VQLbq*kkeEAOLCh!nwtF1F)aoZDY&V~GlM{9zlIfaB znE(y@fadBCWo1!r69U{OAYZgUz->Wl5_fSnL3b`U=FNqij+%+xztX^;iw6GG-5&=2 z4+H;N13&l(1K<4{9r*6Y8TkHRY2eQ*1AqR9f&at6zt+HSe}sYW|BViO|KkjNFMHsF zzuJuteJeKf?e=y_^69CX07=raQ5Dzyf29QS(3zartk09;kgU=K&Aq z0Vh5WI3Hmi@cu^U0q^6?12sP>yDAlNfKLDQm8qrjd{IW*kQ&t#cVnnjtr43XLim`f z77lt&yPnU7_l;mt1G8*|!2M^is|I7`cagpNXb=fmJxPRJ3i=5|6%+g6?@)UBTd>;( zhk!q$Ir=x!*uJ8vp|QJYRgGi$0$&TO|m&IZVd&j&Cb3&V?4`@v6LT%U|Ntzx8So!F+15=*T z8kcn8URD=2A@mKYnd2B4UJN6{0oB5ZucKzqLyQcml?Kf=*PT7CYAoPZ%6wD(oLdK| zTE(8uLBpKFDCWLIG38)&_BIDUU8}C$`-Hc`M+fc6Ry`de{*ybrbuagso6Go@Ra^-( ze(j<%-nT3`e$ii}ugY)H-{l?px_oinxBuJlH^X-qKSl2s>|Gy1pb=cN^tH0*`jc~_ z$R~HWfA2@?w8X(aAO*1E#H_rW2w=sHnbS!CzoeariA0p8CPX}mVPSZ&xe4~QBNiUh}W z3Js^tZC_vZJn;Izyh>e#NK)G{p*snUZ++AmByNojGj3_DJrkH%Pl)UkXp8kxm9%Pc zTc>nz-dn2I?YdFm-ea$3wQYfO1imut6reJ8J=d;iYdzoV+IL<$w(DBjIc|lhare!= zhR?cwmA#3nq*r1pX|Y(8s)c}CycZO@z75a_kTqONqNnjCCQ5Gvs$RPe2ohkZ{bsLT zHTU=GkzSkTXFr^r>*CzhGE{_jO!mxyJ`sa<$7IVK=zT+gt#>J~SL(!tlfprL09LYq zDBNxek zMg6MZYM!0Vl**`QHS+luY!t57L&YhqWw0c%2_P2lzam)OL^^XHGT&_P#+O;FPp(?N zSzi#nt!|p8zlhaC^$;36yxH^BtpnV~jUA|?vhHFxESl)M-O$*f3)5Y2_M$|I(oRC;W(N^v|JISIvje zkW1z&9Gz*3JTmtVeAe-+>}_m{Tu)f-h;ak9fp%S;==$b55Pf65-RoD)qrHA|qN~T1 z`Y_XNNC}Y_=5Q1|dvgGB)Ra&Xm?P%%GSIiBo68b~&co|Bc)b##)O)Uw-}vTQdXF-C zI&+kwmiav4&T(ncu2QsVK22cAk1l$ZXbO_s(%{6S=cQ6-1EH?bKVEP!O6N-xBKw5P!oobsB+2KEJfM zR3MDVioQg`AR3lzDWBJ=OG7(NsM4beVb+}U%>IHHcYV_|y+v$5Nl#4qZ}&WP%7@$d zlutvJy;*z{7EO%eH{q232B!Qsg^s?WGPDxT{#!KrzoBlU%>I;;oc$@(q4@R0Z%;-( zjAAP;De|xh(NCk4mDuXh@Dt{7a_vaD)@(hPq;{2CArL{N_5yNjQTs2#r> zehoI68QV0tcf$J`-do{)%xZ3QKypGumv6y962PTGr z`G(#sXKy!BmbkclBxV4Y9EM_b*ZH_jb`|{C!FWwKlW00&&b<^_L1Hab{J3=^en85I zd)zHadUJqQ-|`3)gllzxl^vR7pPnzk`VKE9Q#viakl` zF2+2C$$-gYWX-qg z_huvSO!C7gO;Qrn37zzp%;GK6RIx=smF1A! z{Wv-M#IE%~@w;EQkDZzwu-!D_`!T}1=&a!D=wNd{B>W=5C%Q2QY$r|bMU31IkaK(; z9e-Yg9TtCOF6Hy6`eP4JT$|7Ll0!L5b>|b-fpU=S z;yDt53X~mK7OwbuOd7f_#ooOPkc7=x)=inUo{@DomUUNV?Pg@%iDli9SsNKyU&gY& zlv$hjg{>G$L*E=gH~(eLv42Y9SfmH=+0( z4EkgG$e>e+Zl}TfKDwO+FZ}3sK6lbqZcF7{IhoM3x&i_~iOd$^3rt540h#y%)0c+& zabvPgTk-7=qx!&w#ZIp7r1|_hX+f;e1K(o3t9xudznLyqzqSfHc6?&d&7b z09MdaBIJ~d32XuxX?ZOPPN3h~K0BKxt&;*HF!qv%k^~>X1(4EgNGf#6kFSTA-+`!0 zrMZ-@>xxB{(1ES1umf-di(O!_b*c7RCtVkGz7Td`Jw|#xgdLFS zrhNA~z&fP)AF+B8-^-VFJc>E`m~ zd|$at(-+*&{sOTyyT-yUe8H~z1#kn)cVMtx`31Z33%b!4?8Zp%hF>7l&HI;s!HE3; z@%rQPn0^_1%gc~ynQlrp&T&`^2QnPk ztG7@JIC@u$L%a{+)1-}ye)&GvU`vay7GH%CgbJ=&(pBMPK5m}k9*ELA@u z#@48vyFep3l82jZI@~-kByfy8+)zrU*fA0pu?c-0&ae~uCjIQv&kmEvpa$H&3~!r} zWDpAsHB{Yl2Exhya&T6*-?Za^!Ud5p(D^#LVO9PSgFbP)qy2Y(Zoo;bPSO&#L zrE4NsCWUTkn0r;$#F|C;(AL63T}RXntaifqH~`>Msp0FGS&!L)k_-SRl$o2pTWBV6 zJLsTxE%=j~*XcTK+rI-Jh7e?d#!f?|lPmE|*iw(TJl}bXX_cQW+m>$=xad#LSr(Sc zgSBn#oM27B!dAb_nhD4gCDaE@3St7y=XGi8E3}&sHp5?sQ_Qi|)>}rUb#|t=%)sVh zVuzLNX~Qtibyycv43rZE10||gdqlnJ?^C69yKQs(4ywI^JKAktzzSZk-$(`9mshZX z^&530_1h?L;*yusZ_VD+6?g^#vsYM?M_`g{P#V z@FeF(B{~!!@gyG`OcT?l5*`Y|If+z*Y05;ZgnWW{PRbJ_#H&`ofgqlfNF9X_G=t%q zV)#IW{s{B15*n&*@`6l;9MROQ1c>TFrsxSE4b?(PX(S~L*l7{)5lR56EurZDBO;xD zKKx2!Wx!h>{z+p~ao~0BoSm=_$*Ub@43+-l@5~{>$ujduWP|^6IIoHT?79VsY(Wj%_noY(!4cYn9WTW zrgOzyF;~hJbCY*lMQbKEU6>I`rBbfkDp^y7ncP&ESj^3}CQD^4>7u2zCg*eg$@!di z8~5Y%ScV{)m-)l^Lt)CXWA~T66OFY^K+3qSA%!wrl&5p$X_+tJzISL(N{Z!pIz%z= z`LNwv@!Fm*AEM5aX`r4=(1Dt-SzQPO4xUOGPv3YL6GA+`Jg(86UBy7dp}~h~tZxFS3(Li47`cKrq9?r+vq*d;Q8| z|J-aThPmOFUxwgbzAJ&ZlvrNsF=`<^4S{BMm+Pkrik6*$q7@*Dmd(&hjC6sj^2|sV3V=s2pRCLzWC`x*TcY%u*yI&R%*dML>k zDFC`dF%3uwIuF8P9nXGzZ>Cr+)U0+}2YmjxyuW)gSwjE9l9ZZzQfeOh28{0wAW(c3 zo&ic3Fu@=$ADj-`Ak}r%xZ*P;){Uo?K(6bjKxd27^D}d*J3$b-6F@TsW^o~iS|(70 zO};6bCIEkept=Zu3SHet;SAhB^ZDQ|5RkA5FTzg|LZ%@4>VUpF5JD!I9(om=muK%z z&rcVpq`)SujHGKOS@z=rnFXNwR|9~hZEs;pgCN5~_?+r!UKdIVA44=k0L7AB*xyG? zMAMf9`T?^EC(#U_USjPS^U#z{K^6?rT&pl9JPX?fi)RjlE(<1%d|p?$OY?MzU)QsY z=_RU(wj)QJmEltu#t@5Rq}gt7e;<&d!)4XC8yX8Y=%d{(M=`nm0ZjfMz~aTvAR^4z zjD`T7*JpKYOjGYpd@6q$8QH*osG{A;f*N}|0%|N6L8Iom4X2q!>EQ@U?a`E68^17% z+Uf{u&IoF4C*WChmPXLAM$icc0kmEQrK1s)>LVyYT*oXrZ%5E+jG!ZXP6ny<5u{q9 zDv98A(}b2U1Ds3k1DH#$aw*6;U#7R?>7Gn?;^{S+ZpG7kGQA#8@5=N>JiRH?TN(S6 zlW@OsLV{ZtE)du*O!7riJ4*6Ik`pD>M3NOH^+ZxVO6rQFMwHYPNi9n1s0LJWDMTE- zyK^&BWbSlUo`DMhMnnL|7?PeFBI(&=n&wN<34k;&Oqa_up#DkH@kY}ThBvr}`$Qh7T4b)C_K8bqig2^|2Tsi~Qn z>FJCLKNwA@MT8Edu)i~66P|^xXeY+0NOLmMtc)SC!uuNDTj6~V@9W`x7w;RY_RPciBDNEF zKKkI6fsjlN-G3T>bMY@=l`l;6Lj(Okh@<*#4Px4THT+W?KzYogUu+f&aAXN{O+6?e zC+7Qb63%Ra@llVLPe<42r*>GQDER`_d7*9vE!MUMUXP>13mx287o&^wy}2su2hV#! ztHSqYrmHtno#mO?s6v4eGi1bIuws;E%29@hH4|AgSV_#g_!t>AIYt!uZYua;N@W`% zUV%i9@6Ft;!iG0OaiZkeA|^vg$5dK?HlVEU)SEUBL?e{SRfd6Nd?fVyE^ z-t*kB=OuO6iZML&JYO2aM?H_2G1zqRuJT-I4?IOyp>s~pM;XHAA!jjzO_%OYPZg)5 z9J01etZjqca`XB5(%rJm0UeRGQ&r7gP(46Dgzvr;@4)~z^SjG{{-KgEmM!*vN?y_DY|`fM7Psb z7TBCSZZjMrGgSzp>iJ>998r|FvmbT-iayI=Q{}l?Ws*`EHIY$+m8MF?Ic1)UI5&}V zgU!y!tuql3Ut;2yd{?vG(&)zZf{ez6Q!69ex5p3xScuHhEu}W?OnmB^ovkvUxDMf> zD))V6)$6PF@wzK0&dybtYxh_2E%1iB@CLWO?Jc$2lnOKA>^!|imbzPIUE2o(C$|8I?ATjtcf*COC_2H2Fg^wW>oG@)fmdA3}do{q94Ki0&LjW(8H z#^lCwerkSxwx~3+^7$ryKFs=ab93d`+)r;Zu|^CQlh%j@CaNS8E6HFp<>~Ug@+MJh zCf3?_)ti<__on5<*t=ECXzLqk-SO({yQz@Pv3xWEI%j}>nor`Mn(QH4WlQXcy=Cic znQgNB>;>Cluh~oXialVDSiqUXS&c93>U?kdZk238Esjnq`TP?w0O-NpOf{cJ4R^Gv z*LlKdxm>O;Zu^yI{&@|X>`gQQkj20)p;n%)UWMOyeomZpxe2c^Sc98g9s%4mxw-e; zXKQ|ywRp^ux|8B+wt9A^-8s_)h|XfEQj~_(ugwlpe`&V(-s`H_guij58&bSmJfF8X z!M{f6dt_xOqd!y59?$1{lv4qa2t(i0;`#t37PM;}YXTWZhIb|{LM#?^L%|TxJ_)*( zd+(Dw_@gn!d9Vk0Cqe~bUn&Uu2?gPQM`N`wBHU9jR~sOm{jl_kEWMH_{a=RfhJU{J z$Klt*-(LI-=l~$&#ZNW%1SxEV6gDJLjs$4e;@8U7Mf_j2pec8>KZSx@B_^Jh+>I*2+YhL#ZV*a&auRe zz<9;+K*YJ4uy$45HBU~0xZkFBZ`D4w+g{hM=MDzB)sDmcL2lXeoxpYvy-)7conu6u zP~b(n?aAp}*M~o7;i8lJ3;EVCAs5sG3+eK<1zL&Z`76x5J*G&1*5 zlpB@DkhYxY4)6z@adX`^1m)(FQ&E_5az;x!=ZZEEjnj+M!?c|kNNEka2vEkL=VXrf zB1ujRy2twc@X0G0JCmiTj}54o0c^H*TfZgFeATlvu=`uoI_*hVqB`x#saXw;pB||l zcskZ`g)J4{PZf)@>xzKm_NZzKBacg3GsP?yWU&&(ffC&WOtV~t!l>R603#wTx4B+p zjzS=UVeIHVh&f&_;7GCSSPz)mrH2jrY0^)Nymu$yX9Apf;ch@b`|z_*!Ngna3H@xr z&lZIiZ-L7${A|O|Hd~{+=k)Uwex8C~EZnWq&l3DBu_L;Bi_#{4UW$Idu}zf z8&_f#XBW{3{7}1PnlAdv2?|CAiB}mumHS-yRNgHKpGt5>0@*~NWd$u=pxBC752xp> zX3iE_&#bXJ^olObuMN0rnsu+%gRWNyeV1BZz|oJa1=+v~gB?KL6L6E9Fi%0HT)9S4?Dvq?Yq;fr_8(@0xJ;>BV`U%khqgs z6mdKh#t)NsfCCyam6GK_%qSsrgUWsZAG!md^V%%3m+-}}VrTXT;2EP&mDs8oP}m&q z3E*VIVD#j+shz=@7UpK!b;60>Tm}Dzc{YJ^QRpZW@R%Mg>W?`f=YUgK2W7|=ovvw< zdj`FK)nJbRS1XDqtQ)7H;Qw_#|Ay(1q1y8@-}+=;Hpp zyTzixo^U*s-zw6=GJrp-*C{PQ8-<4FuUWO0j()*TL+1jZG@pO5#|wQ3k5e*DQ`{7M z+o}(?xW#SbRHlKpOxNyooij}?-Y^mMg9T7PfK|E;fsMcucH8OLUJnrC?J7M0S6G=! zJe?b?G*c`Z=jVoTZm_aFrFbBJ`f**2t*(PUV|VP1<+Q&$FJtiDESK4O%FEc*%QG-2 zi|Dy2ua#9sq?L^G^Qdb>lb>#I{dLm+VI%T?xNW$4xyUxa`=KA095%w7?b}*q9t09E3I~pB`2*+`rgqTw4m9P>f%0bYPPx)4 zb>u={Hcitl^Z|~~HeFDq!1vfn)J7!r0-4p3E`ytbRj;od+b)Mm)OKwjd?{>KV^CA4 z*dXA>(h@-iaAM(1yHmH1X);nKE_}3VRDhS)`TQgF{2%oe;XW*0G=X> z+?5_yFw9FO);DQ@8*Epx`?*y#DzW<#0M%%;_>M!k%mxZ!)#8Xq$5M#6kOYlEe2N_^ z#1$hWqOB$nY1$VcY4i}BX8WSvaKq~v=t~Wog>ha#!`>*bkLikufq0T&A#mz#XB_gg z?6FE-8pjCI;VqG+J<2#_=h%uuR#AZyVKsqB)3CgfH16b<1Zn6*>c$Gzd@7OX{Kjc( z(c(HByJ>Gwl5-{7EyTBCXc7jwa7M+jGJqYBdJ}Qo_0a=kj0%}&Pm~HtX(*{$(#iB1 zk6XQNeVo_aWn0Q?q*9Tnhj(%W_;x!!0%E;%VFeFEV#H%bh5rcoKwGtbW80?%uV!s*VOj3+pfY_k-372$&ztft7<3`u~lh^t87kbWj~kI&U{h# zw=$=vOnFSH46gMbOA;d+pOP1R+5Ey-?0lge)odHPL>szTIl@xox-7&r`cwfqymyR!zvN&Sfh4SYNw{w4iy^O;I?F${Ni{HUPs2~(pfw>1e8(7Qi zP_)9$d$(MWqw6ATDA*6q^$oUU2oBFDh-yf*^el=VY zbVig|Yj=3h8(8f#?RKKxVcVvnCMF}39;%W_0r+=_GRKzJhc!pgZ#oUvtEK558etaC z@h#V`1!vmreIdJlr0UC>z^;mc`$hub-kVv}^s1PDj!D`z+ z*JI#sIW)Zc!|+@5E&U>=ZeMcx@XO&leE4qodk6@WgIMLc;cqT}G5jWn!L%uK)fdA* z=Y$;_hPDFOIYY~;>lV~CwX&!TD+rvXtM66WhOux-#d17miYc(PAiG!KWOS~W6uP7I zMs&?MQ$?}|@D%1qZf16Yh4K0^zc;fuPFq~k6tcbqna&aCF-}jSs!Jg`9j3aVo2cK@ zb9RVImH_0+xHm`7yab^^jF8jNK~g_}s>gnJN++QdX~=;Ri8juQri(wUO%uH7(l2X^ zDeO%FzV5kiH=L8(+8yoon}Sov3%B6ZndUle(2525JSX>+w!!FN1$#;9J(R z+Xav@hsQ0_jiUW3#6{JF!crt@3@m6WTF|io{Edu)HP09JGJ~#N(GWBHe8G-=jXf6k zx3x(u&FsX-i%+qQb2LDp;f>Cu=PBL%cuVG$!v$@?6d*Sx><;Z0Q24w@oBuLuq49DG zbv&RF11?a=nOt>92q zTn;!Z*;58$)AlAO!J@66&+mYx5v|y>Xi8v^Jp$%3Yq*h^W^GgNP3j!(f2@~^#mS;^ zM=wrt<95+ty-&;{*d4`=k}r(-()mJNIv41CMsHvV{qC(2?k1$FEdpH=NsFl11AHsg z?ZE{^a->U~eNkg{C=x)qjgo{2hLVTCXSQ+rEG@NohEj_)Qe!=b=7SMiaJ{~6Os-)Z z@pvcSP&@esbaJUo6dPrL4+lje5Q8N}s{ibEVCUB2Z(#8Hw8lA-im=i=sGGy@c_Y4u z^lm~Cu4=(iO)ga6s?E$}-1=?A&kCsNv_swM8xRTg0VLx*Jn60w?BXlAAu&tEBEZ56 zs~#{*D1seBp-_0m5bBo$zVEB#gaSdI@7ef6(+OOCA`);iQPjmxLUl2W?^(8EJ{3$V zU$jNyp-6^ucBZ3t02i?bVEvA2%LoRJr^U}38Cxf4LRdEL>oy^Qu0>?M9Lr1b++vIeP3G^ ztYP|}fW3tRN2Y8)f?8tt@f;r3;YcTPkS{3=DjO1Dju5j&F>DN)I7-pPq2P019jgS% zdF@QQ%|}uyXHj}M&Xk*;x1(32MpYUV+Q3;-@%86IzBI>HfMgM@cJVuYbjSC6-#$Cl zesr7P{*hKGp8rTGxWwbq;!~$y;q1^JRBVRudlmOwZsc%HOz+Jg008x)y&k$Wfz?=t z9SCe>51pG1**<&29)~VYN1;R04tpvbnpT;`S%b4CXD!Y;oE>o1=j<_OTbw=PY@4$+ z&YpAjl(UDNt#Y=+)ngDKRr}^+pByfB0M6DpS2Mgew-E~!TXCMfjw~DyxfsT!n!Rg6 zW@+F`MnNJgS_z4oGw+3KB|gL11ui=B;(080SmiNo$f3!_{=tZ=N%rZ%G}{;NelE$b z$&04EI7p?0nV)e2e8%Y%Q(E$oB`+S1F5VHvSILA|;m;%fip(?4AqNhm>N$uX2&MKq z5Vfy-wuun6F?{CmKL9oBr`+;kPa4`C{(l1<@~#8js0L}kmgg7cq<}V|)oN&3bLs0V pD-`FK7A2?pCKiBdxX>UU+oaOGlpN5Q8)#UE3jp3S2pTbv0sw-#+C=~W diff --git a/include/StandWebServer.h b/include/StandWebServer.h index 419a4538..db177ca2 100644 --- a/include/StandWebServer.h +++ b/include/StandWebServer.h @@ -10,6 +10,8 @@ extern void handleFileUpload(); extern void handleFileDelete(); extern void handleFileCreate(); extern void handleLocalOTA(); +extern void handleUpdateOTA(); +extern void handleCors(); extern void handleLocalOTA_Handler(); extern void handleFileList(); //void printDirectory(File dir, String& out); diff --git a/src/StandWebServer.cpp b/src/StandWebServer.cpp index f28ed01d..79be8f59 100644 --- a/src/StandWebServer.cpp +++ b/src/StandWebServer.cpp @@ -92,6 +92,11 @@ void standWebServerInit() { HTTP.on("/localota", HTTP_GET, handleLocalOTA); HTTP.on("/localota_handler", HTTP_GET, handleLocalOTA_Handler); + HTTP.on("/update", HTTP_POST, []() { + HTTP.send(200); // Для CORS + }, handleUpdateOTA); + + HTTP.on("/update", HTTP_OPTIONS, handleCors); // Default handler for all URIs not defined above // Use it to read files from filesystem @@ -164,6 +169,42 @@ void handleLocalOTA() { String page = "

"; HTTP.send(200, "text/html", page);} + +void handleCors() { + HTTP.sendHeader("Access-Control-Allow-Origin", "*"); + HTTP.send(200); + } + + void handleUpdateOTA() { + HTTPUpload& upload = HTTP.upload(); + + if (upload.status == UPLOAD_FILE_START) { + Serial.print("Начало загрузки: "); + Serial.println(upload.filename); + if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { + Update.end(); + HTTP.send(500, "text/plain", "Ошибка: Недостаточно памяти"); + return; + } + } + else if (upload.status == UPLOAD_FILE_WRITE) { + if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { + Update.end(); + HTTP.send(500, "text/plain", "Ошибка записи данных"); + return; + } + } + else if (upload.status == UPLOAD_FILE_END) { + if (Update.end(true)) { // true - перезагрузка после обновления + HTTP.send(200, "text/plain", "Обновление успешно"); + Serial.println("Обновление завершено"); + ESP.restart(); + } else { + Update.end(); + HTTP.send(500, "text/plain", "Ошибка завершения обновления"); + } + } + } void handleLocalOTA_Handler() { String serverValue = HTTP.arg("server"); upgrade_firmware(3,serverValue); diff --git a/src/WsServer.cpp b/src/WsServer.cpp index 7cb72fb0..7a27698b 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -233,6 +233,40 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) sendStringToWs("settin", settingsFlashJson, num); } + if (headerStr == "/localt|") { + String timeStr = String((char*)payload + 8); + Serial.println("Время с фронта: /localt|" + timeStr); + + // Обрезаем дробную часть, если есть + int dotIndex = timeStr.indexOf('.'); + if (dotIndex != -1) { + timeStr = timeStr.substring(0, dotIndex); + } + + // Парсим UNIX-время в секундах + time_t unixTime = (time_t)timeStr.toInt(); + + // Создаём структуру timeval + timeval tv; + tv.tv_sec = unixTime; // Секунды эпохи + tv.tv_usec = 0; // Микросекунды + + // Устанавливаем время + if (settimeofday(&tv, NULL) == 0) { + Serial.printf("Время установлено: %ld\n", unixTime); + } else { + Serial.printf("Ошибка установки времени: %ld\n", unixTime); + } + // timeval tv2{0, 0}; + // timezone tz = timezone{0, 0}; + // time_t epoch = 0; + // if (gettimeofday(&tv2, &tz) != -1) { + // epoch = tv2.tv_sec; + // } + // unixTime = epoch; + // SerialPrint("I", F("NTP"), "TIME " + String(unixTime)); + } + //----------------------------------------------------------------------// // Страница веб интерфейса dev //----------------------------------------------------------------------// From f5ba8274889f4b597fbfd56134954a4881a0f3e8 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Thu, 27 Mar 2025 22:19:36 +0300 Subject: [PATCH 082/118] fix wifi bk7231n --- include/Const.h | 10 +++++++++- include/utils/WiFiUtils.h | 2 +- platformio.ini | 2 +- src/Main.cpp | 6 +++--- src/WsServer.cpp | 6 +++--- src/modules/API.cpp | 26 ++------------------------ src/utils/WiFiUtils.cpp | 8 ++++---- 7 files changed, 23 insertions(+), 37 deletions(-) diff --git a/include/Const.h b/include/Const.h index 691983f0..2010e944 100644 --- a/include/Const.h +++ b/include/Const.h @@ -104,11 +104,19 @@ WEB_SOCKETS_FRAME_SIZE создан для того что бы не загру #define MIN_DATETIME 1575158400 #define LEAP_YEAR(Y) (((1970 + Y) > 0) && !((1970 + Y) % 4) && (((1970 + Y) % 100) || !((1970 + Y) % 400))) +#ifdef LIBRETINY +//#define WIFI_ASYNC +#endif + +#ifdef ESP32 +#define WIFI_ASYNC +#endif + // задачи таскера enum TimerTask_t { WIFI_SCAN, WIFI_MQTT_CONNECTION_CHECK, -#ifndef ESP8266 +#ifdef WIFI_ASYNC WIFI_CONN, #endif TIME, diff --git a/include/utils/WiFiUtils.h b/include/utils/WiFiUtils.h index 9620b7f8..90934b90 100644 --- a/include/utils/WiFiUtils.h +++ b/include/utils/WiFiUtils.h @@ -5,7 +5,7 @@ boolean isNetworkActive(); uint8_t getNumAPClients(); bool startAPMode(); -#ifdef ESP8266 +#ifndef WIFI_ASYNC void routerConnect(); boolean RouterFind(std::vector jArray); #else diff --git a/platformio.ini b/platformio.ini index 00fd3a7f..5b6945af 100644 --- a/platformio.ini +++ b/platformio.ini @@ -456,7 +456,7 @@ upload_speed = 921600 monitor_speed = 115200 build_flags = -Dbk7231n="bk7231n" - -DLT_LOGLEVEL=LT_LEVEL_DEBUG + -DLT_LOGLEVEL=LT_LEVEL_FATAL -DLT_DEBUG_ALL=1 -DPROJECT_DATA_DIR="data_svelte" -DLT_USE_TIME=1 diff --git a/src/Main.cpp b/src/Main.cpp index d05248f9..18fd4a31 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -201,7 +201,7 @@ void setup() { initErrorMarker(SETUPINET_ERRORMARKER); // подключаемся к роутеру -#ifdef ESP8266 +#ifndef WIFI_ASYNC routerConnect(); #else WiFiUtilsItit(); @@ -237,7 +237,7 @@ void setup() { // инициализация задач переодического выполнения periodicTasksInit(); -#if defined(ESP8266) +#if !defined(WIFI_ASYNC) // Перенесли после получения IP, так как теперь работа WiFi асинхронная // запуск работы udp addThisDeviceToList(); @@ -306,7 +306,7 @@ void setup() { } void loop() { -#if !defined(ESP8266) +#if defined(WIFI_ASYNC) static bool udpFirstFlag = true; // Перенесли после получения IP, так как теперь работа WiFi асинхронная if (isNetworkActive() && udpFirstFlag) { diff --git a/src/WsServer.cpp b/src/WsServer.cpp index e8201934..a4f5268a 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -143,7 +143,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) sendFileToWsByFrames("/widgets.json", "widget", "", num, WEB_SOCKETS_FRAME_SIZE); sendFileToWsByFrames("/config.json", "config", "", num, WEB_SOCKETS_FRAME_SIZE); sendStringToWs("settin", settingsFlashJson, num); -#ifndef ESP8266 +#ifdef WIFI_ASYNC ssidListHeapJson = "{}"; jsonWriteStr_(ssidListHeapJson, "0", "Scanning..."); #endif @@ -161,7 +161,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) sendStringToWs("errors", errorsHeapJson, num); // если не было создано приема данных по udp - то создадим его addThisDeviceToList(); -#ifndef ESP8266 +#ifdef WIFI_ASYNC settingsFlashJson = readFile(F("settings.json"), 4096); settingsFlashJson.replace("\r\n", ""); Serial.println(settingsFlashJson); @@ -183,7 +183,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) // запуск асинхронного сканирования wifi сетей при нажатии выпадающего // списка if (headerStr == "/scan|") { -#ifdef ESP8266 +#ifndef WIFI_ASYNC std::vector jArray; jsonReadArray(settingsFlashJson, "routerssid", jArray); RouterFind(jArray); diff --git a/src/modules/API.cpp b/src/modules/API.cpp index c37672b5..6e4dde81 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -1,35 +1,13 @@ #include "ESPConfiguration.h" -void* getAPI_Cron(String subtype, String params); -void* getAPI_Loging(String subtype, String params); -void* getAPI_LogingDaily(String subtype, String params); -void* getAPI_IoTMath(String subtype, String params); -void* getAPI_owmWeather(String subtype, String params); void* getAPI_Timer(String subtype, String params); -void* getAPI_Variable(String subtype, String params); -void* getAPI_VButton(String subtype, String params); -void* getAPI_AnalogAdc(String subtype, String params); void* getAPI_BL0937(String subtype, String params); -void* getAPI_UART(String subtype, String params); -void* getAPI_AnalogBtn(String subtype, String params); -void* getAPI_ButtonIn(String subtype, String params); -void* getAPI_ButtonOut(String subtype, String params); +void* getAPI_BL0942(String subtype, String params); void* getAPI(String subtype, String params) { void* tmpAPI; -if ((tmpAPI = getAPI_Cron(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Loging(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_LogingDaily(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_IoTMath(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_owmWeather(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Timer(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Variable(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_VButton(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_BL0937(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_UART(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_AnalogBtn(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_ButtonIn(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_ButtonOut(subtype, params)) != nullptr) return tmpAPI; +if ((tmpAPI = getAPI_BL0942(subtype, params)) != nullptr) return tmpAPI; return nullptr; } \ No newline at end of file diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index 5b7bf79d..6ebcc37d 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -6,7 +6,7 @@ #define TRIESONE 20 // количество секунд ожидания подключения к одной сети из несколких #define TRIES 30 // количество секунд ожидания подключения сети если она одна -#ifndef ESP8266 +#ifdef WIFI_ASYNC std::vector _ssidList; std::vector _passwordList; // номер сети, для перебирания в момент подключения к сетям из массива @@ -397,7 +397,7 @@ void routerConnect() #endif bool startAPMode() { -#ifndef ESP8266 +#ifdef WIFI_ASYNC wifiConnecting = false; currentNetwork = 0; connectionAttempts = 0; @@ -427,7 +427,7 @@ bool startAPMode() WIFI_SCAN, 30 * 1000, [&](void *) { -#ifdef ESP8266 +#ifndef WIFI_ASYNC std::vector jArray; jsonReadArray(settingsFlashJson, "routerssid", jArray); for (int8_t i = 0; i < jArray.size(); i++) @@ -449,7 +449,7 @@ bool startAPMode() return true; } -#if defined(ESP8266) +#ifndef WIFI_ASYNC boolean RouterFind(std::vector jArray) { bool res = false; From 6765f265ac6f3cc71ef6d0252bdd11e97775b09c Mon Sep 17 00:00:00 2001 From: Mit4el Date: Thu, 27 Mar 2025 23:11:34 +0300 Subject: [PATCH 083/118] fix uart bk7231n --- include/classes/IoTUart.h | 2 ++ src/classes/IoTUart.cpp | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/classes/IoTUart.h b/include/classes/IoTUart.h index e45697ca..576f7b27 100644 --- a/include/classes/IoTUart.h +++ b/include/classes/IoTUart.h @@ -28,6 +28,8 @@ class IoTUart : public IoTItem { protected: #ifdef ESP8266 SoftwareSerial* _myUART; +#elif LIBRETINY + SerialClass* _myUART; #else Stream* _myUART; #endif diff --git a/src/classes/IoTUart.cpp b/src/classes/IoTUart.cpp index d6678634..f4b39e65 100644 --- a/src/classes/IoTUart.cpp +++ b/src/classes/IoTUart.cpp @@ -9,11 +9,11 @@ IoTUart::IoTUart(const String& parameters) : IoTItem(parameters) { jsonRead(parameters, "speed", _speed); jsonRead(parameters, "line", _line); -#ifdef ESP8266 +#if defined (ESP8266) _myUART = new SoftwareSerial(_rx, _tx); _myUART->begin(_speed); #endif -#ifdef ESP32 +#if defined (ESP32) if (_line >= 0) { _myUART = new HardwareSerial(_line); ((HardwareSerial*)_myUART)->begin(_speed, SERIAL_8N1, _rx, _tx); @@ -22,6 +22,10 @@ IoTUart::IoTUart(const String& parameters) : IoTItem(parameters) { ((SoftwareSerial*)_myUART)->begin(_speed); } #endif +#if defined (LIBRETINY) + _myUART = new SerialClass(_rx, _tx); + _myUART->begin((unsigned long)_speed); +#endif } void IoTUart::loop() { From 940f68a90f1cef39de4935bba3dcd677e02884ba Mon Sep 17 00:00:00 2001 From: Mit4el Date: Thu, 27 Mar 2025 23:15:30 +0300 Subject: [PATCH 084/118] upd version --- include/Const.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Const.h b/include/Const.h index 2010e944..155bcac5 100644 --- a/include/Const.h +++ b/include/Const.h @@ -2,7 +2,7 @@ #include "BuildTime.h" // Версия прошивки -#define FIRMWARE_VERSION 457 +#define FIRMWARE_VERSION 460 #ifdef esp8266_1mb_ota #define FIRMWARE_NAME "esp8266_1mb_ota" From efc4da0bb6ee3ff729e24ca630b157afbb5880b4 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 28 Mar 2025 20:43:10 +0300 Subject: [PATCH 085/118] *web* 2x, 3x chart, d&d OTA, Info --- PrepareProject.py | 8 +- data_full/build/bundle.css.gz | Bin 6171 -> 6511 bytes data_full/build/bundle.js.gz | Bin 49721 -> 51213 bytes data_svelte/build/bundle.css.gz | Bin 6171 -> 6511 bytes data_svelte/build/bundle.js.gz | Bin 49721 -> 51213 bytes data_svelte/widgets.json | 41 ++- include/Global.h | 1 + src/Main.cpp | 6 +- src/StandWebServer.cpp | 39 ++- src/WsServer.cpp | 8 +- src/modules/virtual/Loging2/Loging2.cpp | 415 ++++++++++++++++++++++ src/modules/virtual/Loging2/modinfo.json | 48 +++ src/modules/virtual/Loging3/Loging3.cpp | 427 +++++++++++++++++++++++ src/modules/virtual/Loging3/modinfo.json | 51 +++ src/utils/WiFiUtils.cpp | 6 + 15 files changed, 1030 insertions(+), 20 deletions(-) create mode 100644 src/modules/virtual/Loging2/Loging2.cpp create mode 100644 src/modules/virtual/Loging2/modinfo.json create mode 100644 src/modules/virtual/Loging3/Loging3.cpp create mode 100644 src/modules/virtual/Loging3/modinfo.json diff --git a/PrepareProject.py b/PrepareProject.py index 7e8a495d..6d480783 100644 --- a/PrepareProject.py +++ b/PrepareProject.py @@ -199,6 +199,7 @@ def updateModulesInProfile(profJson): configItemsJson['num'] = itemsCount configItemsJson['name'] = str(itemsCount) + ". " + configItemsJson['name'] itemsCount = itemsCount + 1 + configItemsJson['moduleName'] = moduleJson['about']['moduleName'] itemsJson.append(configItemsJson) else: # В первую очередь ищем по имени deviceName, чтобы для данной платы можно было уточнить либы. Если не нашли плату по имени в usedLibs пробуем найти её по типу deviceType if deviceType in moduleJson['usedLibs']: # проверяем поддерживает ли модуль текущее устройство @@ -208,9 +209,10 @@ def updateModulesInProfile(profJson): allLibs = allLibs + "\n" + libPath for configItemsJson in moduleJson['configItem']: configItemsJson['num'] = itemsCount - configItemsJson['name'] = str(itemsCount) + ". " + configItemsJson['name'] - itemsCount = itemsCount + 1 - itemsJson.append(configItemsJson) + configItemsJson['name'] = str(itemsCount) + ". " + configItemsJson['name'] + itemsCount = itemsCount + 1 + itemsJson.append(configItemsJson) + configItemsJson['moduleName'] = moduleJson['about']['moduleName'] with open("data_svelte/items.json", "w", encoding='utf-8') as write_file: json.dump(itemsJson, write_file, ensure_ascii=False, indent=4, sort_keys=False) diff --git a/data_full/build/bundle.css.gz b/data_full/build/bundle.css.gz index cb7a83a5f94142c4cc930bfd3ee0002fe5d97d18..de44f689bfa9f04e1abd637189ea8b417695831a 100644 GIT binary patch literal 6511 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 literal 6171 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 SmH>71JO2ehS+u?X!U6y`a1bT{ literal 49721 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 diff --git a/data_svelte/build/bundle.css.gz b/data_svelte/build/bundle.css.gz index cb7a83a5f94142c4cc930bfd3ee0002fe5d97d18..de44f689bfa9f04e1abd637189ea8b417695831a 100644 GIT binary patch literal 6511 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 literal 6171 zcmai&Wl$VSx`u;0gu&g0;2y#dEO>Ad0t5&eV2~h#Gq}419duwIxa;5!!GpV7AV_cz z_w3fG+O50y)^_!;_x+xy|8;dWLlpM2e=gi3L$A24R|!v?azufuClQgr4vWK$t3ZQg zl+=gnE|ive98`UTUBTt+$m0gZ-#%ApN?#H54LjM#=Eo^hD-qiA8n9HGmXYLOI%y)}SLUQ7_7KGWo#V ze9*cvNrJ?qKLXx+4nL0;UEg499TvE$eDZMYG(J-sbHWmT5L3?WhtumjyY{S9MJnV+jU`2jUHY?Izcxm<6y@LH}_J-5j(Ng)@rRk{E?mqP1}*T z!}EoR=Z%Jj@_DJA4s-~010K#l&m8nnDvFXN;}GdZbMTS$ihc$ettmUM-j7K-UXg&M zT(5+{Qk8P|a%`nGI72Ee#6>o`Z3gkmjSyvp^Dnw-GOs)VpP{j5lwukg^BnK=K^T47 z14WbK!^5cZ^C(h}w_)PL8^*tn;~5Y985~o#32&IjHIu~F@5Q;!(US>1ZZvATY5t416=X=(RFk6CLBH*wJgOCl7$s#3 z{|avP?N3^=M|~&briYYf-PJ?Z*(3_36f#{boAl#Jkdh7K{TX4PS_C2iLqNTeu&G{_w$jX;J6Tk*CBczCCSKyIvY}T_08b?QKlQbWr zBbiMx&H?RCWfs~1OBt8?*@uSg)Tj7|g$(yPYPABMZpyvyuE3Y7kO;l=kMyrNOxOOD zVWDv1Mzaqw(+-vWB8bfPXsJccrn6VRAq9_^Cy*XhmC3NbXt$%MQ&z4qOlF{T_!3UY zU73c3s&o|%01R7u$8A2y@A6u;=OMXERU{ZfOB#T~H_Jxx__L$-9=8GYo;HZ*^_oWm z;R^Q~SI#^3IO?0OhJG-IMpjEE{K&j_I2=8cm9pLWMlRVrO8nxaO0j0zEyEI>F^c0T zJ4|ZC650YBQRrFS!Abal(5dqmgL#EdlH2%Vkj>uesf^f63D*X5_ni5!TET)N*0AyYbg=up42OZ4RQflYE3}coiUX4mqjVqNb z9l|3ecEf#y=6HXUw+d`fo~}v~K%LIX^$dKvVT9BBRv^%LoTedLhn@ms>jk)m(U=cF5g27VY2O=v{&VnPEc?Gs)B zvm$r#197aZJxfr;0t9_3Fal=i)Q@f(XxqPC;1= zZYoydVMo1CjL|qC>mg9W#cS>kftH_vFIowi;#3f|-Oj4*&U{G^%noW9#e&DxI zLDLJ%Fj6gmwCGRhw*J=RHmQ7h_YF6$Qa>Aec9qj<5GE7qFnQmcV@Z2 z)ae`kte_MBy)pWGz(Mf>8vV_>XEr#W($X+*2mx8%u}?soQCrfq-$00wMO5~1aHcJY zu$jI|uaPpbh>DaGlx#@n-L%zAG~Ntkd?cM})l8n#mYzt=Y2+#@eoVJ9svJt6s%)_& zcqw!Kx_rV#xbTv)?dnx#^M?1F*3==XX(6_l{5%IjL>?(dEh{xdVq7WcmegzehvB=U zet0$g&LGq1Q2Zt;%hiPY8|4~OIw>gO@5YN$$Y`AW_bcFRi3O!;H3HBbbWPm8n#+8_ zp+5eUunEhF;}|@EJloZ(1WD>Boa(CJLs_%2g71v@eXxqV&Lj?AXN+`wC>f(!p78XM z7J03aBzWtiW`4%|LQv*l+n2;sthgYe^?eD=1SKG)8!>Xw##%;XC+@BQY1Z*+R{ITE z$t-h9nJ04HjY_2pf>52Jt;pFaF(o&7(4Xg6Bq9Ho2Fho`4AnV zZH81O=-RhZ|ci`Z$t*wt%qhR@JPH?RXZvWDP zh^R&GXkCuDkgH-{t7L%w?(B2{pZ-8ct4iQLI{K7#TkDMB33ntq<3qK13P> znC$+w8+(uN-}!LacqIoe5D2A@c6wu`{IQ^UpN`*0^+otSMJbt|RDj7rM+B#(P|hFT zVi`JotUhAwHCle6RI!1Ihv~~R+vZnv<$WPlMFIFxw`cA6cUcmWVNiy+@!ZvV3MXu6 znvHR4zA+uHHyFw;JASznU(1p&B{Ouv@Fn==3*g+xM$GT9i}F(e&LB~71q*&fMX4ah zDQ=yMoLYJ+VdZwmcyzAks@~64Ejwly_gi(bj7tM=)IWz=LTrCONbVjB9mzDc%6C$e0 z6FY2LV#65LVyfppXhd6ibl{*ia*$ad>l@ZK9t(yKWZ;Q1d}rL5pQ8_U7l?H$S9#}_IB%A zu-2kD^>EWpzDpKw;k2na=zEuKxIr6g#G2LXy|8;`!G6JYZgqTk7OvMJm|_jS7P@FV zs0~Mmhqk-BY5m;S6yRkK3Ghw9V-^V!ms5Htk4(tOUZ4KNdGokszJIPH()`RhYjD3S zhe5ikU7Dcvj|AjgE0IbyJ#tg4pLJ=%A-pr*%CXoQMm_Csoj^g=14{YP}R z8@lT%V%Dseu#ir<{~o#Uh;JV;#_PxMVRu-1&jy0OxRCs{E|N7HX&l?jle)Z+jJX!8 z;C%gKYES1ApVv06Lje|OAtx0eDg3On!JmyLV z6P2}NGqt=Pxg2=%`X!4q<1#G?z~p<>rrM$38d-+Ks2r)Hoa9c-=g#-R?fclJxTwz8?x8p4kbbgwCZ z2#FDVL4Y#k&+Jb4^#h3{4%i4MQuh6(&8|n&UhXU7q zZWr7l2qT|;*RYafpnHeH1XnHLyJC4YF=H2yrD?}esdCuw9K{h|IjZc@BeEK&$S;KD z9!CDQCGJe_qhvIWv5_O|a2dGKs9Cnjr7|?-7Oab$H646zk-YzfLJ&jm+Xl*d8!0G? ztV3IM>2u{Pl23B(pC`g6XgRDru$1gyqH(!quR(|Mr=HB1Ge5%2X3!=#sD+OR(?gxPmdV#8@$uFY14O3-0f8BCjMZm!d zwtOCzqf|k?x3si=M3zY+Eq^9-)oN~( z_U1edq}@?dJiY1pjQ(OEieaDCc9`fmUTUoCM~YOF>>s3BV~R!%?9d6+l82^nJLZBy zI&l4#=mi(Q@!6U{H$kDy48Vea?AVg6yi6dd5%k4sd#pbyt1Q^U5R&!MY;UVnOwWI& z1gvFPoK?-=?IkQuj=6*B{=JPK6LUxXINq!43TtO|!n!fbqhNl*iH}x_V7RS^l3b`N z6XJ#BO$v)&`HYV;_lEKHal^V8bab!hOAYEDW=f`;Z2K*;6moAhdk4%`j@xehd9o33 zyH}YzdAJD8Qw!@AA%fka6_$2a!{`iNg8-TM^qz4t5G=i0k>VW zoei}T^vYuG;(gS1qWxK)$z8}8za9AZeX&on%Yr)fMdFZ_|K@bj?{v66@MS&w_}T;B zs#SSkVs0PtAKPpu%99VfgKSybQ5zS^Q8bh<2`ZY>g^!%P`}EvI>+ceB)rl`W!zyf4 z31VE-!l@_q>4xswfJH$u6q(jhd3|+aKjv74^4fRxisv&=F<~f64^5UcEn~UZy6S+K zqUJ6jSl8ZtrtKo?dghl4H(#^TM#+Mc&vvZjL@1K7Tfzmm8NxR=8D8a zi#X19uhx@uB~6W>KU9$6$YN!OmQ>t7+*rIkscFBIwP&38x%@>GZ@D?y)2YyvcvF$WqX46`)BsURm+XWv?p$ z;|(~`=v||XXtV_($LW&5+z4J38Y3}+p{ZYmOWK*Je$}YDrR;p~l$GvY6&cfZ<%3X( zV6tP*kBV4tdE@Z5C1;HS@kHLzM2wy`eJ$W~2Q4givRlXAd5M_N<(!nI)1z%MABK=7 z6wjareV%-$#?KXNvKwK8*>;8X*Zbt>?)~e<)Wc?paoeBg&E11ZAnC|yvJfF_wsvH<8gr@;eJt>|E<1pVL7n3V&OiQAZ&2=j$ zZ#uPuIH-Mx8FtS?h`O;89>tcIWc!?$6W_I$!QDw2D+I)a&@b6#;kGg|8B)(Jia~4k z^2CC%wG#gHFXcE(0Y;#K+80UO-aHm;dd4-oE$(o<7gD9mSq{5fY&9?INV$7tD4t`N z7ff(6SfH<2oDn^2CPe;P9HC&ap_K63{r1gTA^!6;K`}b(pjhfBE}N>0^lN(I=OvFL zbZeIq#*&YHs43{)AIo*JG{=gGxBB;@12Xj5@@k2esGjs1S8f!(b=#A#Hzfj0K5XV5 z70s>29T2=@gS~GoBP=|e!}EGjGz(F>X~ZJzx%weJe%Bc=>U$fq(_$$2T(NN$>~)l6 zS~oC368kieJWVkCr-@s0mM94}CYRY;w2b>*C3LIYtEP3r2}n4PA;9Gzmwfj5QdPNz z3CE%R2DV-=e$kRGEDyBpo4OS;RYh|fnycAqD)!-eZ}*JYWFJg3D20Hhrrp- zc)t>fA4Vj-9Fp#6>Wd}Lye>*`UhQQ}_ZG^xHp?x0*CThkudi>%*;(t=!*UMz>=}|x{y5;32Zbn0ytXouA_Y`h~&RWy{-2)zwq_#OI$&$h}ism2AV+mOm4Q+6!o z&TbRo>?XoKhu3m};4)-F#2%|l#y$MF#kxG#$pW1Io!mhTPOEDPtWq#T|IU`pBs=Be zmDMP(s5HLLFNCNkk$m+W!SIk(!@!Qr027=FdHL}BA$YeD{*+hFvzOmy2#-WMc*<2Y zuMxM%GL@z$W>+4S!vVC~3beO=M=LEz%`@!nrk-^ie;5UQnCB&v%r*bIJ{7StBCgfq z$)y}=@9CbU^9h9b30HxIk=wD(?h4ywq;e}?`xHVa-Sqxc@4Q$j{x~B?% z8J>$Qc_ejD5&GGP)KOibq2Q^Gcu{`hO-AYMXFnf4zR#ZNHFTqU)Qd7u(M@j|54NuOMrC%(O1jbTPXV1oiBXN0u?lR$wm`3oq`e zIa+E6$a5VU1H7)Be+%79j{y>{=5CY)s4yigw@@-u`<*&r@Ax;XQruff{_G{(gJF{D&25lS5s?s(`-wOWuH$Dt*82UzV7SOt0-w zDy!}r{B>J*kp5z*V)AGA%)npVkB*)8p#{M$mLeE{-`0Rn{CK1L2BDU&(Rl@axjq;9 zt=)1^K_gRE393r|B>jH6287cxm{+Z$np|rS`Q;^=afw-n-y9Np@~Zjl~|CvaJ%#h&Pwvn;Yd6enE&zN5?*N)>BvG&BPkU%a82}l5xP(~7Go+-zlNM%Y@E@sKfN*9(i6A< z(KDTFE*#dM--+->4Ab;(B=$R!MQRvkw-UuVZ2Pd{4S+XpxM|@bTeXhfA0T4(4iOfVIk$Es*iBx5U2*}z#_EbRDRsF^TMb;%(s}ggX4EV;R zfAQi6o~ke{d7^kAR(bA}lTd*Q=SBHZk}d-7WR*?bo=x-^Q`bvg%zLUSSOkjl28;uy z#+)%8s{_XPW}|%HD-Z_f>&<3oojF&%d{oz*wQ9~cn;>ViB3+$xVLS9u&fzWa5|0p? zhl`TW8K;Udre7L3(}2@33_(V+Wx~o8hsk#bfo~1k> z6eEWNu+cX{%9e zGNpn&PSheiPp$&k7>W&Oy4&keNwsM1v}n70x$KF>Q);UddtEn4xSLHA5ZUaAlHyeK&g&SujgIaiwGER&K8 z^?5PlzVE(;B|k4NxNbu^-(56V45K61U?lD%LO*vpp0D{O?G8GPxPaH<& zF~-ywnure_7WG);4riWs$f*iviAsPw`F@~Zn2Rk>ExKPM`HC|>9(!Js`)M=MO;@D4 z&MoSGSr$uPs%zaJog=wwlHudAmz^(*QYAupacd^Oumjb_^kND5vW4+$%eLxlAm`aU zkm0ju8hnS#0T~WtD0$9P#b@kbKq}$;4RzjZ0##>!B4+%G^&@nF@bg@$&i! z7B9-ci_-;9U-Fq(Gb`@<+ya8k{qu&XdX7fJe3PIw4Jb~+NiFDyr`C9Ocg8g$nRA%>R! z2yEdeHkpoK#6Exro$(c9e9XQqi}OqZw#g#D-~qvM-?M|L8QgCIvi^Rv3BG3s1Nw2O z7F-0saV3u5LoYwr?)`U={#Bi>8~&QXR6OAdTl$s_nudO(=WKAm*tZ7FMwWShKAIJ4 zRbC?|kG{SCqeb0@zyCP-b~^g@@Q?yF(BB3ygrus{M5PPl6Nm`*LpGq_vH?{URQRQq zWobKe^i$o)PvNpy1|%RIj{1Qup_~=O*#{Ff9eo`x5|DQ`o8W7pp8+S72ZU4~)U8yP zi!A5Ck1gS2^i|#LS9P;6CG_hs&3RG=1iRP_^ly!90G&8sOoj6@IRn-JglDy!fv`@f z3{?06dFeBqMn=u@LqTO^e%YiSO=(jN5Ka3WF0}|kIS}Y%u6SvxtMT#oFzQ(I?^=_s zR5RBcHXll{br}z68c(Kl87t+`c%ch~d(-I_Nvdhx zd9n;R3Fld^co~!+v$l38OI;jlHd|_&HjWIg3kOMqW{=Vl zizn032MxKD>_I;Q<{oCimcEz=l8m_qP{QWKJP|@go5%)`_5tItw{eFM=3h9S#Sd$^ znr9Rxsaw+N0D~@3+#0dT)aies0uCDnn$wJ?G@&b8ptg@Q_W9_`pkB>$#=~2;SToyL zZK|$tkpZs7DK#^%s3_Dk{^KgiQ3#~01ZmcYxhc`(OuEye|mrCxKJ&AOriu97eeWrOP_vy#zRP6pFhSOEYl z@%>EKHc?Y*A6Q9zKRB3&4WPb1Hw#!z-RGbrbm{x;4YfhYTer*}b1?P&;77|l={JE{ zFnZHE&+n&@zxSo~pLCt#Ig=dE9{jyB1!+BYp1HXVB7;H`?se-z)(cD=i&2yM* z@@-e%l_95lN~ZxCm0>1SS@^zG0bqZ_0BMGc$23XHFcImZC}|m{E2)Zevj-#eHvy@> z3}&QC^F+$tO091hv=7J{C=f_i5uxxK+AOB3Td<3vS`l03(RmjE6Cf@eQxIc`wL_$dW3lBtE#k?c$P!Z}K;YJxShj|{M-1iS!b$N(Y zhftnSXNz`Li$kEegGxlRb|48W7L&o$CX10)%;A0q5ME*RRtNzW?Rl^u2%#kdiOvi+ zfEw^IU^*}v6kY*@F^kT4@D-hwnHc^8ZZ}**a*#+Y{IDr8~wg_$fse+XRDM4 zLBJ`p5M8FDd}ws8C^B}n6_QZB|7Ycx$7Mz6L1e!;kiL(jQ*JgO3~x3EQ3KsMu5)M; zq z)#**3CeRa5L`Tya>@mE>@MkiZB1>FXuD(&V&m6}5P{pp2=1MiYM@Nk?d76o`nD$^1 zR6uAi6uqVBrJ~o0tsi~zw&Ruz2-3z|N2*t^Cwpe)yj;Ek?MFu@+cCM5U)2_nT+x;7k#P}6=P7KvP> zi$t7pR;MkCrBsRH?7|4a{D46VUwr(r?_aAB28&a`=Iu{_J-QiA{elo2tI8nI`n;I& zSi+FSiakI;=@}e3NwN-Hc?^isf$;s{mSUGiki-rxGO3F4dJ>4SSMp_^q}+==z*is~ zPXHos8mueof!=mxU{?sD3|^{37#jWZ{8zWuyn1flFBAhdLV)#wUKPNmNOeI+su-tI zr+_|SZH7q(dXON48!XLacvj%bH*4FhnncR%Oz7F6sv$>+35PFKutSFHEI4He=R{FH zCF}toAE2sltm5al)~aH+)>`b#B>n~*_Enm)Qjf&EdXBph(jwWaroO&MU}uG@KtjE- zM*uJZyYmJ0e&xaVC_)bu0!=D<&efur$zWTtToXmDpayLl(G^p{IFd!Kf;FbZyfXMI zfScncuXGAQ^H9d35x%bhi`>c)NRSgsidq`XEK##gbu(*&F|lw;2qmQJs|O;*jIeXf%ImG$24~yY$Qzbxwj^Pi7m`ajb)LW(^VGwh`~E@&f_l1;M-L+EJ(E12dw`owHt?W+ zb|#9FdxRE@hp8&_-}39thKJ`|CFU{7m3fkjY!1&TV(BVT<8)B^{z2jU!pP}Nv_%*X zpz}yQ0x{nD(IF3VR6^t4jdk|rOL64 z1)j6lZFIR-QD$eEfHncO?SyZgO?hdar7t~dBihZhr^)gY4mm>B&ip!VJ;)6lu)cn+``H7;PgAq{0+SbOO1W%N1 zGrm%R2M+=1HPY`&s@@CUD_3BKfTuW#xb8i_|5dS4{K4}cDjuAZokHZ-?g81S4&_^y z@KG7BE6T5uRDq(&_66B3f`L!^h*>|+&GsGjQhb(`Tz@*xN~v%F;O#}plUZ7>&R>|i z?8rnEVU)4i4$~x6nK`p=66cLl%odZ^BJIgVarv>$Ge=%11K1CIKS(ZVHWpih9~Nz@{#5XLM3WqoBOEF(AR`43mZ zDrf2h_E0&dJP4Cpz^*2ys6B##Tmz9AFwM%KT@YOKi>{?Ji49?Ei*BG4q1^BoLb=hl ze4#*cfn|p@Xy_XvbmGJI>7#ZoXi0Q77}dCo^7CdTjA}*u#F&94(-5W zNxx7eJ`3Olx7od=Vy^Cl>^|6dr`@pFQ9F^Ij5oTyKMDD;~%GR(@<@;A~V&x3ahqYn` zgq~ZsWL_v4OSZ1)ty?lJmY||woUT!-Dj2AX@VzF5IkW^RH9^d5ibEDto8}P5ME8nu zx`GqW88kX)>&oEda)(TXJYutXtVRJ3k#d8WV__k_f29K0p43TWPxFVKO?cqNhGq1i zOU%2q)?19qd+@yK_0mNA4e}YoV{WbaJ5{E|Vw7tu??LY}Q;Qw~iY1;`&$YlPmv*`cT?5!WN~ z96qqq${J!z%dnYR=t%uS%dnYXrkodA)>M&}{0w9>y(tPT44@4HMQKSi!!rueCe!SL zO5F_vyT!)b{FCx)+#K-6J#0mpmg}^?)EgW60vuw&V#F24sk6B$%x)&HSlQ)AG-K^kCdE)Od@ul-wp5xg8r+*qDK7C6 z)cpl(DOeq4q9d}$9vKJbv{cobIYPZ)^2a~?;b?kDJQ6p%`#<~v6u>#-W|%>e`HG)? zbhQkg|MAwksBS&41#L9YEr9~uQ2se=)N=r#mKKa6P{LL@pKws<6S~&oTxrF02@fjH zCxfYhdO*Q6iJ)j!1@(e3X9%rn&k%VG(gPnWEzL0xaEOi%wM2BLkDxkoO6kZcrqfnj z!5OMblzUm``)f1PdfLr=8)V6#UR4XK4eZS_lW~LKTqO?bqA>3iw5COy4V)G0(aMap z@0@VRMi{DEs~f7eO>EVTc(MlNKhWIEPR zAGf!9Ese`?f$K32U~N8zJ%w$rTNc(rX(UEMaqhRIwR-vrR(3Zt&=n)TGVCp33>6QQ0(-MYjbIO}RKntII))MZX-+F}fZdJP)X zrS8(C#Uu#zjMPyVxkpPpE5}q)=~Hmc?@-^j9v%<<=4jmam-g)2h%C)UEpzv2sk==} zDpJwOiq7cVF}*0MoSGxzN2Pwm@v>+Pyt)csOW568}<-lBinyX>F#V43twKI@+h z2EBAu%A)Kqi%ck9+D|Sre)&OhkoUwliu*e=7A-IM?F!PUI_}vQN>H{Q7>JU zu$CVdc~Q1A`&h-t7e>SgfbyDfwF75xO4fretx z!t0;f8?(mf$-PHEWiwM=H*8%L$ zU_rbLV8H4^xeBtj`3NGv#n~i3?=NO$7nLvjQFIh(RLYy=dCsqTKdhw6=GT2LX1&XP zU5s~%Ws0B6e#$l4YphB%R&kmDI>GEU$R%OV35kXN$plLu8lCuHdm!}OG8jujvk+}Pgxy!BdSBTZ9oTB8?Oo=se7ol~J58FZ zAZuag2QD>h(=j_|l3n9k>5P0mA$r8PU5DHbRXqj~^zkvM2cVYSOUH%jt8Gji*^4@p z4;1}LO=;FLb4lCB$f!~{0Da4N5bHO5iQ;}#{cRvv3I?ZmFrLBTcRmqQNHMJ>OifN2 z<;#q%f&?`r$5TDU?l?IZU+XMN#O;~y&+xT{a!Gz}hfG=|lZ5`Q@O^+KL~KJmf~V3{ z)1(%SvST&XqqJaRr29k#V{9?5D}!PyP%1Y#e3-UFNIUKbX%kJ#ODgeDCJTt=Am6_m2l-ghuaJZ2u^3Q2 z2ocr2AGSEkHw|ssqAZ3-gqaY$eDw73XY6n8&$5diLd9Id4Ak3Fa!sUr=b7j)`Z6s! z2Xm|bNpE=te_r&511;2;g7Q3mkr(Mpcv$ua-h);f*%hCGT8XRvp!edee^w^f{b+#C z#WG1Vb=|*vr>Dw9$P9X9Q@vhNW=VgM&1PIMPn9d~J-B}~%Pt=D{vdk2UT>=}HMpIw zw3tr|yz_ptQiVyw+egfMQIs=Y_EoX$ryyCy2%FwEdG^E0el+MU;EySOVjo`QD~__B zd6z|=&3Y(K@mYVq%JW_#vhzgozFcO)_G$a?-?UkQ9?74eNjsdy1uy4$aoNAt-7w4p z$1P7@aJc>R;@YF$c`-}!zFrijP+8<4Le8=zFV0$DVquT!5#MG!6gXYU`)=gqH;R7SVxQQJs6|?S*FqSOeY*&piRDUlwlV?< zP$;=jV=r5(eko>Vf1jN#l%@Ev*}pRwc=4_>^CDfz*p$q~EITW(uxUvu4x95q7}*rC zIRyp4>imV>ItjgIgkCdG;oubEQi)oDptjir1)KbUkfWubM?u&o6q9t%C~kwMs0}v@ zPQrqdzAp|K3;wEo_5Iec!s(&({U-s}w}{~)v(qEr?{=|Es6ZnigQA7>`e^7EIK^f{ z;e$V8I#0Kz^X@NfI?ZJMCFYXkMBneE-7i3(9(|bLK5!!>7uXNE5~NbioCj zdT>xBKkmH89&CPL)L;gC^FpZpiz1(S9WCr-e|U6^iRl}Zt;bzWEr`~cI`1!~*sn8e z)T^aduL_#!pVSP`d63qdn-tWuI7;o*l^Lvd>dcH;ooZxgJ~h((92Ul$;l9A&lTwG?2b|`<5B6rk-a%KLL04}(=&*pCNhP$wV`b59yc{n>y%~vvB}1{1YV^^gln@fb z=4`1qZA-Ihvsm9$bT&S#D>`HPhP_5SJ+Lc6;xpe5&U8g*wj#4enu-?VMP1Q?A!no- zW%XRl2#FWIA1ri5iy9)mqMC{>#us%(7Yu1P)yVElABit~Ke*6!T`;?&+;uL4m@~6W zYGxPH%r2u@`^cu`wI8HI#z)p8)vN$(Na@^_E4aSws93I_s60G0jwJ>MOx3<6%xx`E z0M&%kE5|c|{&H=tkn9ap?wlOMk-xUyAGBQNokO&lQEr0sHZ`8_I9v+(}}yzs-xCPbzobj-Ah-@=8RxVSTIBoFVr3E zV~6y6)OjBeQsIVqV!0QZSeenn%ie>VhJd)B)Z_a^o5<=73B}4t^%tqRsrL=l=0UrL zqW$TR7JoH}?A|-&@3i;MIF%gs-Ui19)Zlk}`<*xv$CkW7m-LJ-=*1i4j!P{Zpf`p? z&)Xvzw8Vi6I12@~p5bX5?1)o*PuO*EX?gyL2cq50Nku!^x z0vmunm>cxKfn8E2BGvB}CL>HE6gKS~Yz8>)bo6_21@FhxwvMm19B`$NlIHp+(?6;H zNwhL<2A{ygTubV6%3VqQY_ka#AgRwANuA>XFD4m5-AQQ*or36o=9nGSGRg%A92ajT zqg)UgooX#*W|S;g#U)g6skyC1QT!yKm!`-HitNRyzmQn7GL0>vu|ETi)L#&d073`1 zVW-JW8sd@OG2d$v0h#ofCH4i7puNZ0DUaaq%>2$lq{6+=q9ui_T+ZB+HQ_2<=3Hzu z=bV+{c?JfkV8VK}Q#-oFMavtxXz?ywwA{f(!N?AeD1erZz^F}Xcc3_x^(SDE7ryj; zaFT%!0k9I&p`$W<3Eb}3_RJ=nz#YK4RnBr+u#Bc=7!qB$-C&^loZJqQeoBslqR+`; zN=VJCE!}T*q1?}XOPAM`HLokdlSB!;t~9)^>8E94vv*@+D^8RBOiWif=WA#sOM9uh z8nvpV92DyUeN)Uidgaj-qfZfV+{5Nz^83=FUS(>sNzLaLt9Ez==3}(hSFo;%c@It( z#yr+maoSr2o)=Jnpb+!yED+z*^->jsqSV=Fwku;Zay!>(Z`vU$+HG_4vJGOcS+ z4XAoth(5tW3*|s{dkdFp&7jmCT6x#I1Gk2%BQq1m3x(8fFXd*V)8XO)K8&XKX2Z!fW0RD$caXX7!7JrrHZ z8dSgxGLmrp%!LN*W*aXv6G4k94S$3gP!5d?yquKy(8$(3iT*LY?POrZHJ4+-%J=;toO;WL(6Bwde17 z#2EB*_5dB`;#Y7p)_5r-#H|yZ8^ncmMdfB)B&CPvb#mg}@(znBYv<#YU+Klx0}sr9 zuOK_U$rckn4PRseM!wy?wk(JX-!ED-)NU(Ls@&C7$Jr}1)2<%u2)DljUrbQ8HM-F3 zvl7PNTu??pN-hH8l7}wgI#9IJS7R)Iu2@*n__79^_4UaGJZgudc;8OBB-#+MmiHkb(On`pR`s=# zn%=`&qzXM3#FMF8>yt$?D=r)IkD3;J-Ss9yhXm4i@7Ur8YCqv_d~hX7CF#O6uRVx( z#gYrJa+wEQ;)D`k6@{W}>(8zxuhdR%JXx#cEH*PpouwWNbPY_ozH2)kuPg9MXI@J# z#^cF!S`lhpJk%MT6c;Mg23elGta&mFC^J`OTwV*8fm&?JDdeyor&vAVteHlO08TM^ z0ad}w!SoUKV9CR0*sP~{C@8Q@S-e-~`bnobe3*4V#Onui9fn~}uVO{7V@}bmI~H`o z;cy_9w7iN-T3*LRMYE=FS()a%ZbM&s>eQ~w==vp1p@9@yC}UC4vaSlmcn4Uhs_0gQ z7WY_DNv|S+G>SRB8peWN4`W$@!*^5NvdFLNDm9{aDzhbYg`A?Pyo^;vMXQ#xLfl-* zSs`w$1FkOauK=!&n6GE;4*{ib9$MscW?-*kPOo7|_3+@TQB_^pvl>&|U>J;DBhil$ z4qPpwvTlaY?6iP~mir+4sRv>#VnrA3gnO+4~S&A%d@rr`b8&^1I?JI;9t!MR({e&Y~f`gp`q9h1YzIPQu|z>->zZ zXGw{!1AubH-ixI4DB7k;bl1ttteC~a!JryRo<9Tf16Ki;C6^LB6z`O*wbu-?zD6d{ z@r$bO% ziF*KZc~wyytJsqlOOIY8rFn9ws3~yH#cEf&9zyf2d8z0cVT!$3CYO0~9mAo~uCHIL zlq!Vm;eK4#VUqTjHaYP_9(a#?LmCZxk9xyl&pe-oLmHiit@pd(U3kU!=x%s-I|04` zmwG5i*~<>-bO>EAWa`5N9AZ=z?E<3*EfZ%z#2m4nB*Hd(o+R9!BsC zk6)iWzS}$b?6`Lif1{{(ZzmAid%-Q;iX%m;;_NKvfv0b|ddBI*vyzJ$Y$dB5;35im zk@WWU^_k@AadH(zyE<#WK7Zrar-K_lU%c`2|QU4e~!_QCd_QR9AFbJo|t$s&+9380Q7%Ld|!@DO?cixAd z_fNv%_cyGEhEBI$jef(v-mqMDtq*4ck9)%i7V9xSJ$g?k9QUF-k0JGu`ThDmk7zUi zwWUnUU8rSO@WpZmJmx#jgei#AF$B(0Xy(mJIxceCYes`f;!X`(1KuH;t{@L5#yo@82Go3KYPMU4EVrHDsBo3HPQ~M z&^9B9v-9MPgBIxU>O3E%i=+hQ=1R@`_o#QsMOw`G@4x!wp>;nLfKN2j(9^>BLPH>@NSE4bG?g<-$<__TNW z8O+FTGOrx~fy27J+{UFZy=eGoICwl9^rGQs(Mj*LdBg?~C(#~%Ut5rAo0?YBrny<6 zEC-IwJ_^POYt(s$!RviM?__y3GFyRObZ^<>^la=QmGQf7J; z4`CB9JiL2b(J~%VxO^Ie79{BR;fR5Fm3Hs5ccmFIV#fk9M@YJumRR8TsiuT4XdsZ!&S zJ?zxJ%Dvb-&t|inJ59lKfj_Od7acFJJVb|9Z&gv`DqDK{fqRd@XBDUv+OAK{{((w% zJb*))JJyAD!MsAKVwEn?3kaOe0O2yk(moh+iS#vR1H2_kQ|+)cVe6}SK(FILW&Qi$ zbpiHZ&4V>=ffU6S;(~(HzPKsBETr=`E0eQ0p|}y^v$z;%*55B1#<|@KqIDj+We(O? zv2*sq`{=sy19-{A*+b+GU-1+idFFhs2)%ZT%NvTrMX3G55X!VH^89JB1g|nnRFeeY zXyJ^1OZD$}aQ22Y!X2K}_mSqprm|QmaQ>Y#sW+MMj+Y`*v)h70zJ;zM_5EP`Lt~h9 zuFF_&=tju}pDcjO=+mj>g$$DLirg=K-$}S8_rVK~1EQ)%sQtE{R*g&PI@S~@8Nv5I z9Hh>k!mM&hbO^gv8r+P`W?ZOjp7GL&F(nZ>MvgA8qOxws8XR>hSo5w2HUn?jl7XHDMp1jhk+r+NZI7O_ zz|*~0+m$QBtG)=Y=yfc^>%IuD^(uylVpmj#*RUkO-4f`gO{dQUOl@9wY&Tm@+O|6k`@7k93H|ZD@`77l3>D@aj;2!|*F|1b1z8+OKmA7+R3@@8_4LY$80-J-UV;P2?8W%L2Ryq@?e>ufX=e zg|n(!OFOe?Y%m9zUc`8i7T_IiiF<*38{PEC!`dEbq_XSXIHJnJc_wtkIF!bCn9VR) z&y0`}T%`_nAYWz!UQO_yj3vsOX!3cnl3WkYTQCPKy;^!`%P6;6*dCd^)$b{4>n?Gj=DSxH5;gEC ze1SsEx0<{)3E%A?bZ+r$=j}U9{FZQERx>1F8W!6Pg8;d;=9XYQynE@IEK##^;N=)} zZ|BOy5iodzE3<<}8c1}#kHMDq)Sv}}x(4&=){t*D{0)_W2Efz-UV|iV`*#dTM9(y{ zbY?=uxb14jWra?_87 z7$ia~4Al3$EDl-wLrIQ?;N#9oyUqHhwmXN>8$Z7tM12)53mIM=LEMU3Ib%E;KP$Q9 z>U&$uGu(DO)|>KROY860FW?}8`9e!WY6Z_)axrc9wKHWr@*>uR?mQELlTJ-p^b2sr zZ@0#E*_>YM;9X{?U!NbEt>NA}&9O3gnA%krp71wy$wP5ubVGUw&UC=u!0ztBei8Kj z*yubjiZUpV^wGef7kh{HP%()3@$C|Jn4diP!e|SL^|Kk#;gD3;sdYVzeM6PQt1iOW z34sX=4x;Y-v~6O5vS>>s!#LypQ)~_+&1liqoWj+gH;=yk)GAwy21)cUc>jvSu-Bg& zou@g$gGl9)E3XB;Wflhh`gLy|sMB$4&;)#Em)&AWB#fOG@}SrRe}Z`noH=Q&qucFC zDOhx8KyxG$W*Ca2A?5u7R(OWqyCE`(#R=6vtmEy?{4McK0h_AR^5ELecZs9g6^ax0wO9%{-svw6>=+Xtf;PjXd zzyb8Gg`q#L2z|zbEGVtd*q%ok7p=zx{G0WUx0}|>ibg}a-lI7qpy$#jGTPjM=!w+Q zbrUVe8W(8IAlafFMz7W$DU2Vfrd1s%$SsPBqYsL!z^zQU^dh|KpBUViTE%~O&+M5` zYEu@Y=0Cg#HZ3Q6$O}5{Bvx6ukNWH&V|BL-ROr(OjN#+w_?QFg-CFa0)HfjZPpV#Y zk36qH&6cn|ZDIIu9pFtb5zA7YuzXH8Kr{^=s6#Kt>mp;X@5Nalb|UB zn$TMijy0G(GrS)J4Xx9k@G!Z`mD8Oslgqv6O! z&y|ClvnIr))0at!0qZ!^-2tma(4)xDlh46O7e6WBP%tS);C&)467Zx22a`R#7Z76z zGCjyP6e*BaqnYo6NfM$cILGf`=>Xy&eGRpERgC`bRq-)+*b0WEdQJy4-$veni?`1> zDxT_+h!Q$Aa=dO2NxQ^!n>3kIo;Jm`9A-tYfVUV)fez`g%U}#-=qR@Kofe13nj_3j zeA5;#TKzbEJ2b1wkzmnC+^;Xaio-*+kDrL?16E=Xw+X!T%ll=YPeebOjztVVrgamP z+`#|^D!cXDj7aw@6RFJ@z~NxbGMT){`797boA*P#c*GfWzP_TIo`AJfn~lIw3UV{+ zX*<{jXMDtJIJreRV3xbVt?BI!l$6u)SRyiF4&XV2Zk1CPHBIJ9WJ-VGd5Erj8(m#8 zON`v1h{jod$c9mavzW1kw%kQq2($)@2P3N5&EIZfa}*6)#qJ*uY~Wq{;qic2Ng6DK zVe)w+vcu7z4xsxLK7a8-^6~=W={2zfFzgQoto*Vp&NIn_lK;5kQoWDv^|C^ITtc9> z?mmrlnh6VCdCRcC2-P-%OM2kl|{ptJ+<)+G-##k$q&y#b`z~T>Y z)>$+FL&>oRe?2%5K3k~zxLlh|pimEJc!q~|+aifU(FQ}{WU_;1tn*&m1Q@l0hYne6 zT)H5bkj5h>Fz9bowL2ty8w2Kxvg!b zV+`q0Xg7A++htCPl*JwzKW_#zHVdm3R7myQ9y!ZpVlCKIHQiDJ z+a?bx6Kczb5Y`(~7Nfv8FFVJjHhBxZ9YdCekbvE6!_V0Z9+0DmA8!WTuWOUb2Jc-B z$UIZqijT&eW%oyVLq6F0PIBE=ZM56HK~bx%+#xkODG;UFms*t7uNZNHlabN2XcdIG z|6cRIF$gmvw&VlPXsd~CCSv?rfKx+K*Og* z05tG4k<$_0xq|P-w5seSBzH7g=(~UJwj0*F@&@mvi}!L1?`13r4GzR+BkoILX%x<) z0oR>HQdM=-J%=p2r=2$-x2gxP!|m7R769Jlc4@r#StfYTJH&9oRYSFG(7G-?L7LQ3 z-Ue@>z1^Zl_0!twZEvAf*7kKa!<0dzvp*A~qwLAma-p^uI%qoRqJi3{|KD*ip!NT- zmiYZUgElhlMj>~4wZVxNOcz`~QVuGuD{jLC9|j!QMc;w-wrVL~wb_L$^+Gh?DRZbR zyw{iu);a3Fuv-bGw-T+LFqqyT1)Qkq1J>S=YUP&E4If5zMZPa4>M%0pT@__(<7!dF zOvGAyRmJURN89rDTlROKF}h=V-fov~)Ns)en6LGtqrs?irBXDCg!WEkGMJ9|eZ11j zIHCLjdK_k)RFW~M5OW4F@eFIm?5J_K4Ct_>9{{EAF8u%+M<7zcMK_C74zRKXY{}G- za8wZ)D*{RS<8iQ@P+G1#&LgKk-wW~;`u zPBHv=q=OQ}3&>?!w+G&b&6c7h71~K@uPPc%XwCwh**oN@pcxDA-Ofku+IB_@``77J zOVbKnvO;7Tm`J2BkI%;3u1fPU5G-RqgRoU z%V*qcXJFH4Hhfa!ATQN5;Gt12QoJ7+wRZd$0XYmK(qb}Z=&zz!z>Q1^cQXsPmRTHT z6m+q%q6iIK{e%cjDd4kfu(lT~%>)!o9YsJn#e;e}opPf#p*4zfCD&rzZl8G zLyOU_AahjQ7R0S^!YAbvB^LOtDjUG07I%#0Sw9B?LU9|ka>dAPly?r_Ycy{c=cJ=< zQWyaoxKswVVGJG#g}?XFSk)xp$H`_BfLe$3bCZImN*K;hfAb*0K=-KgqRpf#^1Q)t&ITiXzc`FWyjfH-$olzhj$YakL+RRfb(Y9Q0^2Pw_U`uXdFaf3vvEaYxAJE^(14Iy#TkL(vFzWu z=?HYDQD0bUGidX}1bhuQd!a^oJs1fb2+As z9U7yKKD1ZF7T8?OBQAg38LD$0ONVF`9K@^;z-35i4oiw^P7|_!J zJs!|#K=06K3L>t2z#yUkQ$|Z)Vr0@Vs!dTW^)1Qm(#6`8XSpL{A4zgswvDLG6$u?J zeProW(U-S#u*d7GmWVD$YfFKq&G-9v@7R;bz7wE>@Y`;wlT0e zfU%Xk%t1pxLiJ7zsw31#R-H|{xm2c&H}>we&2iD*d~2t$m0!7hqxR(D=xc%Fw%>R1 zRjt9T8ZoR@SFPI*@7#&Qle<;JBWyVo=EBpiG)F3}+_-V1TM9Qj(hr8+^OgYBdwtw2 zz)+J)>rw2<1-#(Jkf45LiYm?jZ^7%nWA1ook*-Yxsq77J+hTo$)YZh)rv)Q>h%s_B zCL@hhgOU9{8jKLygQ)g@0uh=*IBvmXl(lAz@vr9d`ADys_*YRBjr2;3f0ZWiufi{2 zrs@x(G@1>E^*8A;{Hs4ZN#GxTwodXqMpLbkd(+TfG<5D6I!6xrUL^*cwYNCoO5sRb z%HX5x$YBJ3`Z|y**fgX?zB(5p9iz&*qd8hh2s_1d5a;n4<1(4St*#iZi@qqX;9?!T z+JIHXmF{|T9~w+CFf$4LmFrJwPad@)4G5{d1IS|-3Gl32)vFQt5sw_?NKDH8T%6dbS+H-$=cX>5x?lDF% z_?nQ#=B}v=LI^a(ihK4BV|YT`GQCh!ItN@m{CAsc!0>pUlxLYRP@L9XHCJgTY|r%EIw+3!*oS z{*H0(;(|$TkM2mLcMPJkj=`p(gSAUWHuOR=%T^Lc&Em^&d1Y7NX)~_)?967=8CE+C zdm6=s+4>+}z#4g*@~~Xic4VBj0~f;IW-{Mt&@2k$iod(Osywr)e(Crda=f9cU$f)W zf%Ud{yEZcxH0le`BEr=w7VtxLbUYxxj)vfns4s8V;&A;%**~W5^-D0X>_@dT_wwvT z;2k=0@9@r@+hs5yR}ddR~DHxb6K*w}+ccn`Nz2O6u-4 zJDbV^0Lm*uA97H&E;%?>2-YT`bnL-iQHPUmoC9g(9y-1Q;Mv}&hkb6M7T|np#~!!k z3t(%9yA@?RHesZ<15Dc-*c3NT?mycdiG(!{wfB4a-WLNTZJd7B1zZow9@g89!O``_ zoi$nVV%aycAKwa<3_dcHn|(t7?QRf`ypF{Ip0go_aK|ro3Qn9;rrgmmeyG!ZUXZaW zeLLE5d;Fy1_PDH_-4+n*trc~^9&fBGYyMHx!JO<7~J z^{ut4p2IHhqR3{w0fTTaa%y&a!kCdjN@WiP9-tY~gojsCCbT7wAy1jP9ByFEG00zA z%SZ*|bvJ#=)fA&c7VGrO-dONU6H7d;gTJdF??!xY z=vB!)BWvjpzL`pL@NsCp(Q7$E70Xt{-=F8BUR|la{HYrqzC~#3keqcG&URdQNG>2b z!>FbB)WqooIvE^fHWa*}mT&gr537vY4}HIc@BS?Y1|8!&bJHBUuB#D(78GV_G96Ym z*Fo$H8!R+4L0-E->a$M3*B$xY;IH^wU@&`#59>0IPxnQ$c{?xo(j_pHI?Cr4@3w3| z<@D+PW&6?F1Q?;0^cj6fpU|iDQ~Jft;YMx>FQOj{yZmx?9emM57O4xY;8B|@La32C zy%lfdOaN~{kiSPEYjQ6!;h8JD6g7%ue~pMF<*rC%5KChQfk<>jHgL4x4hNDhc>3~1 zan*@j;>ogKi2NFp7j^Ol^YpqxSfeRMmB7f^r>(FOrzWg~3AcUPj-#y)MEbdoU;V7E z{UHNyS#J~lBr^3UFJzIg6z{>lryup;YDm<(?4R@&{gZa1O{DTp`?IFgCC?M%8uGJX zMIq{jN1t@YZq<}`1C;mlj;wEXWLQP=7l;FQQwWyA%AQ6%P2eYi;34P13SzpQ2QvuA zHV<){`HaD&Vd|OATO{ODqCt-dSS?%!klc zvn1XW$>lG$Bmf#`O&VyP05ng!gI2GRecPC)I(W;cEk^YD{;+D=xcZ4o6pu?A&w6h- zmz`nOnqXS(xNBoC@?vk`(VrDO%>k?vLCwk84i7VYx9~7^kToyzSRGhxteZL*5P-i) zw=f(;tte`4Toz-_q%j$V?m8X|?6r!0;l?a?|MK0q`{$f~)DFSoPH1EUvJ6{H|HGT( zm^N(x4Uxs3nS3*7&a*A?gDHWLoyN`M&BDSy4aMb-D5Z%luwvK2GY}G>z|y9kvFpJ5 z|Nl=9M1||%hkvX1qzzx1G4JwB^^=+EOO-cG*Zdt}ID^9l6YJI^P{Yy{34T@${{}Hq zO;FUDMW(=&!cWA0b=;lSf`Q zgO6^Qf3ZYU z5q1zYj3q{L_?`0#b1H4k) zgw(>oT{$f*UH|0W==vj0KWx)=Jz#A@{(e2gR#|8*2Aa4fljsiE!HFrAlj!c02`ZZk zetfG6?ll#>H)Wj4$#BrA=qHz@)G9($>U^(irH;|wy!zi?{prQ;;|KZjD`|3Zw z`coK&jiM%3foSPrYRZ#=^{9?(t92Q%(z|)7ck`mVTbJ$K{H}bvn@7vk_U`?IT^cP0 zp$mQgD~@_{SS~be85*M%ne`$z;)g6EDO_jyEe~+EGKgto^c4xFX5cgU`KYKB zT3j1APEMxde5|8Pf^vsOBo1M@t~ZOC)nukzkWo4j({TWQ!=(wwqwtkRgv9s+I3fwfG6q^xK&RDRC+L0= zVHT`uxfwJBA_)W;0qB)gdd-7_f~;W>y2G8dhFfZsG(+sD!$9&%Lw)!jd{7iQPsGhL zS2|U7HD`zp81*_xJ8SPNckNknqJ6agcAK31Z?FFJ`hR})r{1go{OV7y{^iv_z4}kD z|9$WEKfLR(^|-%$SbzkmJrknk_B{`J*AzW#Tw{;Bu+f5AHbKd9&R-@pEM zy;uL(d-We*{p+iLdHp}U`sY{w;q^a2ORxX_)xW;}yI22o&?07h2QiaK%)k;3?=t`% z;|vK+$at4fi8dkImG2NT-Wkk~cdO=^(WSwq9iZ`sh5G*Yc%L$5W(&4m;2SKEFfS3; zU|O|Z;`dl$#Z2(qt^DsWf5!AN;CBAkya~O91DSze%M=f*a0B4`DZUD=JoNpghqaj1T52}A!B+%GD{RP?bq`>fD>p4lLIl#fUU%tL&`FTlw}=Kwr6I? z={QKcP^5-HF+J;PO`4D{0U>pvfFPHt14ZicwJsEU&}W>CgQN>aqQOX*Myr!pfS2PwdxWzxihT~@%5qmft{IpV^HXAMJpNT6ELZ?KFBO8LVwaH z$~fo+&}Xwr0SvjBQHYvRh+68!{q|Zh**^6u+oxX8MS9PsVz-#W=-zM%O&15YLU(n8 zey4%OxU>Y^H?@z?iUz;r`TP1!^Edn}F0LyKMS#RFkV3k{7`F@GM zVX*W_PonHhBE(vWe4`!Dv8Sfza1k(XI-5HhrGlB>=44b(^65B$zu__{a8)UM)iVxH zFgyjJSjNn|DWKD~XTQ-b<*b3A=^_GCfC8zjSrXlmlwF-tiHacM>Xcad25nN=)h5-I zSj@TzO1c}Ze)|qeq-GV-TeoChfZsCfd1&$*KCK`*EtWi9r|K$J)z47zn2EQ#!F4qn zqT2@?{0K@Z1PRpY>fvMv7j1;n#4)+S5+YWuB$+*7uw_lPJiNnvand2 zBOKJp+OwO?W!lI%x8dgDRi6PHB~DEaVR_h1f<2cqge#6X3N))(luwj79xz2T}wQ*AhmU5j%7bW;RN5E}`LdPa-hI zjyMA9?t0y^SHd;j$dl`0r9PE~(B>OZ3j|6y<5Hict>vP)jC0qDBfG(h0|p)J$s5mI zA~-S7?mBvF+V7ZcG#P|?2#;g50Y`9{26z1z#iesPm&1Y6qPW~PueqJT-P49K{l-UKHvX|8bS%&DkKB%+_y=Yoiya`!8PM ze_Qa_lTa?+=_FJM`a3)cb#Q+`HOfa6(S2w)D95eSQ6XG2m)gjsZFF)OVE9X*I+rG# zJt&GV0~_=cIHCKNwcgO)L*Lo)s14nTiEx?c@t`+Y3{NhGCyxd{)h4M|9`)|jZ`U66 zqM>~);SFDMQ_|$+?V`C`G_ytDt6!a>nOoF3>;nV2%l>K4Iqg3g40c&n3aalydDI)8 z*c5Gm-%2vKsXXcpdi|lfPi692H=w9DY^Q^@$*Kerisl$L6RwrG!z#8ePEm6`YC9Ki zPu1C)ovf_+%E~cc5!=^_QgA-Qe$bMr(-M&0Iwd+DhtOAECr?=@n{^V)z_L0+z1g~1b76pCLvS`Hb*Q3;I0}sg>@&&8& zzyX~7OzQZR3Veuy-_u&ssvvhISR?$Q-Nd>f2--oQ4x<5f#q&(?8TeAZUh-nzvmxHd z+7syL0^I9iR#37;1nY`|Jv#~c)iNu&Hg7V|takPSe?n1Q2ITPG=?TAcyDo#*)^>ec zKZUCJ{nLlmMGQoe-4Xm;5$j?kIQn%koE)E=elXqK`Dk-G*xY?cj?UhwudtFUw59jYCBai^|TOxk0Jp#0P5$_SF;=aPAeoH_V#v2M1kb+H4eQ5YCNA zk3fw(?{!~#9*HLqK6PE8r=zlQAzE7WESQ*-b@v%cI)#lYWy6{rw1vzk0@VJ~A2c#*wNmpcDkC+;Ro0wQa;9Ycq65DXTfaRV?HNJAX zHmDW%BfR@~nW@G5N|o7*mEy7)U}wi^9AOs%JW}w|RHgm3)L){y18aL|3+}GW`MRmn zy323s18vB!;{)#v7x;4xB2kSss0cH7EkWnHE&U? zrsdnzbULVQ9#11}^LRS!*gT%SJ4mO;4oH*J6I1h@PR)zA0`YWvl+NGk!}prLb^G+< zZ7R4MZMS?S{+lxZy%2k@H0z5JBe~BW?f=+q8RqR!Eq)|+s}_rWb^l+l|3|cD`_t>c zd-cz+{&`oOpYN$N?bf;d>4&>NMYkn$P*8&L>m$)Q$k=0;s!((3T&OPXMeCxSzU6iz zS3%k?l3=M?K~4 zdb&2ODIRpCaLTB)x4HSvFf}!AiNS(K%e!iknp}B01-s+gujztPn^Q zu3><*btVs=J=2G`rTu<&PPsYIt#fa1aR55@t1@AiomU<=XQ(suoPIcOy3FenNKQ6~*-9pJOb?3Da?hYH#eW${@ zORi0zJK!(f0cU9U&~fvQ=dq%79t&G<_DlpQ8VNim-h24lIkIdHf87JAo6e*q9{$Sa z$ZFJHjC$*iZd|BmZ(69I{#z~7 z&-U$VnoWArI=>&9H58fKEN6v$iOF z({?75bLb>+C(sqZH&=Qj2q0ss0%H=5z)#+e5!2z2R3Z9`-_5%Q-yA5ZBnLYYI z&4^;04t;@(A_1z}%!qN5l@NMr3gnuqqRnN~j_+@^yvwar*|?Vi&r>vQEO9vzFt*poflRV_U-z z+_$_H?%qH{F2vxhT+%bWT6Sf_bGhU5XH3?cVoGEid zX|?N85Zp{!X-c)SyX~DA*tvpJ>^|Rn+Qr2N+X_vbP7QGq??#+<5}*A9L~Ij~8)n!g zAi2J>oVTtlKSgj|0wFQ#1J0)*5JjzMTp}~U`8>6I?!D_@+_?ThHA&0%7=PN5x^zDe zG^+T%Cs!{zDcQ_liOfldPYqwR^24*8hqS zkF5cpL<2qqUt8{>!QR%6SD=y&SA%G+2JFy2!{skpNWagK&L#TJ`;>k}Kc`>P59uTN z34NdbNPnUq(68vn8ZkmM7%e*eJ+7SLduHWi?KK1Ke#5}Ll76=>Yk$)cf4>7+`v(!= z$-*}%Yd6;m^!gl_R#xp+8bfzoEHcHGdy4%=7aN*lmwSr+)@4B_4hz~<_;)RSbz%yW z>QmHcm!j5a>l6Log0}lh%==Mw@?6`8y2fLyafrdY3H?N0;p^7=JF5s+%1+s$xb*#p zyLn<;kS*DD@bNDB)uC{XBSg$ZKZrU!!In3N?^^qz@9chPrq$$i70W#?6EXAB&3uTN zPa45b1)sK6@E>7`&)pJVwo817B_6pYK53VDA4@0*Zm)1L{SQ>4-1!irkpPw13 zZ!^2pKHpo@YJW|&V`V+D^)>e3>yB5!PL<1>fLm?@H{V;+X|ENlFoHsY5k)mkPd3B`0E zAm3??&dT+SGU5%Q)Z9-iOl&%{%~!TVUA$?!y6kjSU+3y#k1c)KDUE0Y#oKr^YF`7< z8WyRI+t_aj{nXy3Xlw!!Fs3E$DWIwth(2o$5 z5MvrCEd(jmI)VF1pTK>(U+?frULH8R|f1Xcog$^5D%&3*J{X^yGM@suvMrLD6TzWo>W-n_YSB+C>0DhyZ* z3+Qk$Na_qK5gHwFC^D|p5r>oi z?O$t_l~vglm6;Xw6{xSUpJeyF=MK1ophQI|>ax@yBH(a$IQ;hae((2M&`}4ziD-%@ zla7e{B;wEKQIWw0L?E;`n%h9jZ4YvL;+qIu87PKstHRK2Pd9Yin~*280*Tk)g) z_Ef8G+#deh@a^yqpWNiF+quvEoc5OyeZ4+$)Zs6OZ->7b{`>Hov!7fh(YM3zhF=YT z1HhHZll{~1tKn~lUn4=$+u=78Cd~Dx=8fAQIr1krd3gIr0%C!iPQD-12O}M0PwNYX)YWv`Fx8uC4Rgqfzy7eSdDih$(9HQ5y&HHJMhE| z7=AQHg*Uh1&2ZsS5j@%@d9+LNMt4c04VBOD>ANI=M6kxmiP?osg`eyquzg_bpoh(2 zSfGW?XM`;PNp&MZiW4;(AzB0xBo)^1c?f`5fBxP`PT zCfvXb8(Iv*VG_cNgxHO?0#VXD5j9UFwgNKTmahk2sioqy)OW;fhH#d0b*aD9kKrtR zo91wu{*?B!D*b%k?9(dR7aEgtab_XTRWz@~W~R%tbJJ?w5V71qC6S>MLK-bvODn%Vn zn*Z+Edl#7h>ODDBG8x?lv|t;6g9$k0(qNnea}S<3XyNbb^w_%Wa`Y_k9&#siV_ioW z^uZO$ZfUxjnu5BAQ{|kTZf1*81YOo-(dA-M(t=ClD`zk@Uo7U@u7gg+I0&9|jiAcX%M39`ca0h0QjG{|w}P z!(R=*8@@&Ey{`dRdG_D3i1_}?@a@^(1A!lM0=_%@F);oCg`c5|8uqylC+!YTXe$G0 zNE2wHULm@7cV}j*iMTgy_>v{GU7JWo2xQwtE&B8#bmiCz`q$yRv;T~ghd_3SRRc9Z zjE84G9=;p?4!IA%hI&x8b8&`2D#L#negk}l!`~`sUCKBk&v%Bp3ykyhQhEMA!*9>N zl#Mc`?Eu!Q2*ac+ke({9l9H~0X$=2y`2EE>f-nq{#Cz7}sOX9MLt5*ognF5wJ!Uwy zn%f0yNHCxBY7R90%?F!L9?J+qe$(*Uv9k;CegJI#ox3v78R?q3Ia-c(-czxyS;p?C zbgnFByp}sl`Xbb-_|u?0NEfmbTb5W((S(cE$%%O&cM~*R`0n(rc#|N5W{Mc(sX?V` zN|?cSXUZ7nsL`fjchS;z7s&dmugp(VD|1sl={7T0=q%M&H(pKT!LbR_Q=HKbbf)WU zJ*;YGuM;AaW~)ofer27&5sqCWwoGRtT(!cEud-a8Ka>G*|Lxh2&wdWW*U)L|J3-xP zPr;Ty*PWWnNtd)!15~*h7JC4(JI>)$Z1cNNJZPOWO#D>lxp>8r?l9WTeWfUCmqkVEXLth` zT@2OIE}w5np=iqX*sH|TRJO)U@T55VL5~+YLA}>@9~0acb!o{nr^j1CD4*?Qq+4^N z8a#VG3h_#!f)Z%mZv+EoIie}%nf)?_zj|Rmn|!uufdNI7>QeuR z%PcS+e=oLNzo=;Yimt>Df$g#nGebL-MM@}=8-720H~h`nPlw-OUeejez}&D@@kCep z1&cGTr!xLuhhLM;O~r^kf}jFU(SdcP3M|g0Kf2=_zCHU=7Ow&xPayd#dtmNpDzg@7 z`?m1@K~i^5@DWfwJQ>+peT5sf??Lti)AHDTOT|zXZ@u=2RAyT{B5g~l%u`IX78mY5 z-mfQxTaF92oGRS^Jp1YJ_rq`L{kgL*Rf{8Rmp7Q#kt`5M;1(qn}swY?XdCsSsQA^8kJxfVVODxkEpXFYdbe{5Hv{gx+is(mkc*iTVtF*5PNJ zEz{2%`ZrJ{knl2ocJXu_3=WJS-jWkq5&@~y>fkQHqwqN0ikH?U$w7TcEMp>2{0J=WxCe$rY# zwU#gBXxk$ywP&yiq9wIA!>WaIl+GkV< zpoaQWBPGDo`D)_c&p8LPe{{~4k?JC~4*U=BiGbV2;k)6lhwrrI88?n+Kgpf_t+HDD zF12%1>u2K4;!4`eXJmIXp=rT}Z`S{OjDD!`GOd0_Kk!`Jg8D_a1si`V+k%aY_W3qq zy`*^_>w@#D86-UnoldkQI44-nuue{l9QlxIibSY4PuK}Q_ir|t@yUL8d&HI8dBeLQ zhIh^sPUX5ZzzxgLyvyx}MzZG|z|p^c{`ham@!z;;Irh(yy129)16n0>ZfL-;PgSFs zAR77vA)IbrT*1PRT31irgyfS|y>N5ZJZJ8?JAw|586*#UcIaQkAUXRH86?BMM*c{u z-W?yd^TV%(zZ-ss6L#+G7vK-)>=$_M`10%*xwF5e$HRBS@5c*Ila_hzQ`6u&V)LoO z?2ShbZxuqvuLm8|`Ww@o;x|e$TLe7>sSix^30=HO2L;aIYJuPIn#k@)4&n%f6JZEZ zTcTtK?}^_ss=2-sdcoEquXq^Ji`)=Aid1R|7p4Q3J-f*2c2U@sv*XA)a98n-m99!c z#g0RFKM44ps9R}j4_bh~Nq9C!R*`nHirf%AU2ff+DDs-fA=5_fmDe!Ae8@%nyMcXJ^TaJ!c9Ey{fJ7P}5Vzkz_e6F=f#5>9$ z+?U){nbgHMEChtvHjFzY1**BGi#;^!MKb$@0K~M8TZN7jzP1f7;2ndt3e>1}NU&Mk z1Wqp?6XG_A#tUTI;57y&-gccZLXv81qZvz(1}XD^m;jIjC!US+Fd5~YPIu8z$ZI~q z&^FfsZ)0E+0+mqHFhBpix9dzDEl=$fr*2h`XHHK(|9tm9^{OYk|LOD3jjHuGhWUB) zHx+B?%7+d|v+>Ysp-y?7DZVyEi_cs=^a% z30QLA^SNc6T4w6&Tb8xRfnVx#|8rmVYWucv!%HYP#b`nPFvKUXw1a&UfIr8eTBvA> z2axOm?T*(l`<`D9`UT%P@R|+}!a^t7bPn7n;ghcGLmt+JG4QCc=(ZzQY(cm}LxqG_ zciJx8nTBIni}5p%C(^IXUK?hpMags_Ub?;UP-H=4WqacxK;C$v6}k=EXS`4k z`hGib>bA=S^_!_NyV4j{vJ2gV;I)#SZ!x_@#5N^MbZW7pb$SYvQ|@6m2sw&H4eRv2 zX*$usuaVE7zT@#6EGh!ZbwCrzb^J-@g+4m3yd}bwH#c1_Drse~UN;rBkFdHm3=q^E z)8X(5D0C}>QQ}^zzSnkAG8$RO;J~vPgoBDkL0Z@lguY!@>4I(gui`)=qrAn%vc3AOFC3lQ7!ou(TWg0Okh>3TP*XuS}7b9B?G*9`_$<5rAX5Jm>; zxV#nAE5_3&n_C7WR)VN30l)D~#lGR6d3#v{9TgkhC0R$M1^!`$^__w=xpaKcGTVJo=F!EU4ws9k~`kAq}-*)`hhQ-`448q9XJ?=!! ziV?iti+Z)18%4%x)vAbxQK92Tk<)Y&t~T|{fEtPIDIE_QS561n%}>kBhc!JI0I}mM zXkZQvoYjTy-PwYv(#5v)%~F{)M44UD&K6TE!od16SOYwrWrVwe`FP7cFHra|3Z_aH{u?%y@UW=8X84u{s>NcmP`#A@JzXr?^J-P_6$mxHJNpIHK64dY zTBx{9QxyeT410S{rEnBg8?!jNbt7KWQmGe>125z~r@iO4kB)INH-L^A;C$1ksM}{ZBdgkaX>ir~?(ECl@Y{;P{Pc`Vvxkoxnrl%Zcx~}k81!?n54r}?@52=dM;oISFHEk*Aw=5PWqdJuZj%(9U z%aYU3Gv5y1rZW`#UD$$H1>SOfleWn?8O^eXHc!nzRIeZ=su=7c*e+5$p+huFGi()) ziM4) z!3%)$#A1d#<;9U^K;m1F!D%N0vmgYPP6m>LU;KQIb>VsZ06aph?EINV}} zvQvv=EdZv!pghTRTrf93KR;hyQ2ZC5#N~QEZ(axg?XXuf)xH2zDxSKaFI+n)cz&(j ztGkhDD2D}0&aw!d7W)jR?S|ak@#SKy9w*{6e8KbU?%|V$o?XJnoLHe3L8fUQfPm%v zoLuXM8}rSM=7YH~{dF+3)tMINFzr~F9(C8GJm^~S)O08K{J>W7gZUYcskUtgcx+t~ ziLif%9n%>83$8lf3-7__VGWl)_i3qt!TzhWpALVMI1&D8`0oi)5k%>KfTc9|qq8q3 z$LswFglr~_z}>3c6c~m$oZCTayAY-340@WQZdf+}1C^>F6ksJM7r=I=`loM}rdecr zk}&vl->^g*-zWhewy;WyK*n6KP_vQ07f)YfWhrH3RLe*% zoRcYUyj*&8-t{2`K#}a^IdJ>-K1vAf+pyDNf@^tT@`6`~J*&br!QcgYrGfRnyBk%( zvgo}^{b3nc$DW?52(oiM6}5KPwD7kneh>9Na-FgP6lRo}zAw^<Gl+z73^>!s8-h zU!%o@g_h)>e|b6n`E8%wCI0zD=2>E@ytB*_S?4rU<(x$p%Q$Dq`N=F(gqd?JkzdX; zRhY1FN@6ty1EhKwoP_qbJgrh0muE8Bm0$ez@c`c&uhohxXB=JczreW$EXL0M{_JP8 zkie?&ZSJ{u*UKXB<o^IVSxtG>Fp+ z32}OWdE80zxbxoiMTL5d89q%iTvKah1cJPNx!3(GnxlOU|8v84!(ZWH`fD)j!vpj$ zs0>6g^d@=Bky?foe0ndRzlT7P4ZOXpnaY#`wOinEO~mMJe{m2 z)-!A3=;E5_>`%@7xmL%~Xmz}qtU9#)u~*N*zo}Z#j;6}FrqdPHBX>tFEho0~Rk)6e zg8cmg04mypY?*aR;dEgLDEw)$pPVs#X_yA~tMqt4KYMBRw2ryS9$may$>(2?Rmh{5 zPUR6xjn9}^OyaBtCE%S)dMQ(WDhF+H} zpI4yPaXX=yLvP57yKu1sR4dO*i=7HGq#|#LFKL%{YDa3$K41c*7b5{3l;?ljPGGq~P z^ByZ%74x1Ahevi#(!f9{gTA|=B9J#Mt8x!S4+8XjPeDB2)8NihTC_t)^n29Xl|wm& zjFPpyh%E?K#P~@7%p2nOt_A%P%mt2g7eI85>Gz*M@5(Xs7xt#)~5~JHgE=H zeq8+Qqkmrb!Jqdo>*L4^yZ&vRsba1>RZMn*6y>9TVla_p>>wo@%e2`~;AtDGU5DY$ z8gjnsyy1K)j4Fm(n$`oOsG^d=iBLbPxDmqO?%EqLbL`l6C$eXsNGuj_7ojOM2?Pp) zhVRaPA@wYO811-H5-}nu+evdJQn2@dlDaPwxrh``DeO6dDI|+KCw|(vtlS5=cIZ{a zs?$s|YpJg~AkG~{PIk#x0Ra)>ExtYbl3q9>Tw7INxQS06DRQyPz3?B0-ve&&4Jo8U+f9GH+p1r zCOa}VGHass7h4mp(VA#ZRulcqnppjdt%=pqn%JAHCLU$h#GSv`nz%Ds6Hg|qiKm%0 zvHq7WUs@lnj{8?BUwZT2@}(Vxy>7E85 zrw9l1(;t;I?SZ6e%Uo4bg>J(;RK!m%d!$K?kg((l2#>bRJ4w3jNS0BRC%GCW$$bzV zZJF!J+wcq@)B7ic{wF8q3dn+bs%VB7c3Wx?5$vw2K_oJ|qXv=8Xk7^^lg#LiN>x?@ zG0%}E<`Il08^l#+?hrEvZKT-_hQNMRXwkiBMplQ zRx=V{145FFR>eejMiXsERIrf-#RTgaZxIribX%sR7&{5k>~caae?%gS740z9j^2~> z^s*G3nRJ$uF`Jglmt;2eB6FNk|2?0*xX`G7`Xd_k?}pXCMzj8eQ8H5O=Z_R&vUA)2t~9dO1Rwdm0HHWdf!nA#|TSHi(QTjh#rg z6$rc*9h%?M!Pk)@+n)4AQnY#Zv{r(Q$Ur!04wc+`JcE z0&Wgi^VzEHt0?n&^jC*6Z=_dKm<2Atmjn56p;zxlOCaMRvdVYEZ!`7=ITNs)AiB)q zegaeo-&;oI;&f1NXFo%%)$g>l8PM|1x#0Dk^PuJX9}`+Wf*UW5$Bk3_ds0N6xB^YV z!`&DjE+MP!aro~!0sO{Bv;U-xX0f^XQgPwdt>Sxu(J}GD+|0ySbg|`WUjj|ueh=h$ z`&^W`I?TFR!)%OVBZG|CM%L#-Ke|x@Zn8CTFA2@=i+isNckA-54tLAI#Ra#GgC%)U zF{X&*?2U*@M$1b^fWD25iV-v#c*Txn@~-DMmy*jkixnGvx7;q~^CK4PqX_U3$Cv`! zgw8d=1&luUq(8^=z}>3nz=_b^iTmS^hxDGv$@~DkhK;&DADC+zpc#Wvsp1$!3wK`w z9pm$+Jpk`xEet+ToNW%^lqd;=W$>y!fJ37~9gM+G?16bCU2d-A^DBa3H`7gKZq#99 zhR^iOcn&jwX~$r78@V|uH*Xp@WEW1MJI~FiJ7K(o3FEzr<89hwW9Ez-rao*G1*uUn zVjaF=rI>rqefL&>kuom+gadhCh3`4-s_M`n^!UKCJ5h@Xv+}oya^Xm^#SIkqP9eEu3eYDJk_OX2<0SG}M5@9X`P zoOJ%bfBV0`x1Z55c6^gMQ+=8PPp62%`Ev3y{3Dr>g0UJwcMw4H?(D~x@v{2O*^ke@ zBrw&aiALaAlPCR`;oITwhrfPr=c(#4mgzioM?H=+1GN&ER-7#D4Q0G4YWOu^&@#K4beXc6lr?R$crHw<8&1un z@OTL{Qeur1@RV@;f-Y&G`~3`hE?9Ar@$x&AnqB|X zI!2IMBgTmO%$xE{8)%ObzqI-p8&C>aer#zwIb8&(Xt6LGyV?@xngmgTpjHBnqbjzdcCdDb{Ucza7+G)4n|}js#H8 z6~(3<>j3Vo8%C}_Rf4*o(MZDYW8VxR^oZ{;vMFN6KX!cLuNuj>^ugyq&T}K5Eb&IEC3lbdYgJAhv2$=-hd07 zT{~tYmi;zpKiZ(fdV>z@4LGGknmw6#l`>yVOr7v&i+&QUNyofHz>>#slNt*?gri;2& z&Rx}4@!f1I9I*@Yt;HSmRlKA7D&C2G6~h&5+ainYD87nC1PY@z)f^QkuT44ymf(5p zs2H|vOWRA^u^XCgo3?he>~5?6o450MbDOX*+k!38ymoYQGEFD&?0Gb9s*@9Z*UNm~ zd`X$Sq)aL=mtMxNe`&X9XNj+;&egTVi%4HEfRp|tlOf6rl=;(QLgA3nk+e4mS<1(l z>99=7bZRM{qL0$l`FC{(EVMhf7LOE9(L46e1)iey=^#`x88trI0huw*3Ne7k6Tda_ zTNl3#G5X_(d*XK$xCHRzwxJz&_M^)9A#%j8|wU}^#oM=-UdC#QgL$pZm%!|t6%!pU%p8F80S;o;(N$R`V+Cvb5(Ku-*f z6f#bPTFg)fOH%S8qT|$O0z;=qD^P!?tpuia z{c+oe*1W-FE1$n-qN zMyKS`w1#i%Pl9ioN$_nmX?)w@uMgk$`aIyxg*>YN3KK0_VSbOUh+)Pa^*^13NqcZv zLRIZm^FvW@o+V>6jOJ<6iWCz&etZ)BQ0yIpcEr=QJ4_S|+1Q1)x6odR&p; ze0)CFHa9&zye7k)3qX3)7lHILa2OYIxC-}+9ydKLtcGDu9M&5H<`WJQPo%HJQuTc} zUCVRx8QENx+%>Bx=TN+QlHyh5QN!<>Q}=A^@V@5dfH zl6RP$_j!!6H7WI4IA!fsx!uxI}nS6Nz1 z{shH+^xhrf;*w`Eu3TBcw=P}qpA5f4X&wr>{^;d>a4Bqb3K>0y5P2IYk=YA&kA2EM zW1KUWGoQ1FvyiiZvo>cQXEn|o&U&2HIcsp%<*dnBi?a@A`<(v-IeW_48fW)8Tjy+mvH2u^=otS<`5>MLSldC>a(B8*3(5C$iR$T4f{?p z6x79&k5EjYx&IX%AAf@3e+#n0vo9rg5`pg15RWdxI|gRxW)N8~E0 zvK%D^SdpdO03QY}uv2OyWNEe?i|YaZ7jmeiAz#=7v+Y{!9>(}I ziSe0od8LH}wyZC4gZnlI7M4^(&dJpSSEd~<3mI{HV0tbbCkW=H#A<8TAFZUo08b_L zs0=mby-r-x9+VWsw{?ouP-1np>#OOe;BgamkAy5muQsXEgW$`j^0d@4xcPk7MNL+R zo;KZlzDXhbB0lg&P{<*L05Z2jAqNz)@8H(<&6*H*4u>Eb6kr(qF7r>tOwfl$0%c??L;jq zG|O00G5`l|ZayWw|J*u7BrOgfiu0MG|hqf+c;D$pCH z5Jz#bSD@H+*J2wK>#h=ON4vh7Vx#lGv!5ZZ^s6lK`EQd&@;Mc0TPeoNxZuyA;0>4~ zDb}Z4gK2)suaYvPKUKatJ!0W-(Ey!5V!u~s9z57XGrWjQt|VUOP7EG%vdY@Hg0j{p zEo*J!vL0lWb@d9$I*t)+q^xNQ|M6vgl2z8HS5Vf+la}?t#ARL1D(lJ>l=W!RvaU~D z*5_GeeRc(9eK~1acP1|DXIW+S`4tq_<&&27(}_#l=2^vcuA;cLiHjSgV~#IxH?zF0 zNnS-IJ&Zn>U=!gQQ~e;U6AHL7dGYr$i~n%6y2l8pvg&zt@{iY>3sb+Iyzmb)3;+0o z3V-K=3codZ;ny<@fAm3xe{-3_6F7eI0`FuN_+=9Mf(w~i81VuRHp%m>r8u^J4!)l2 zLDR4ZP&+>6ox_?d-1aSLVt%8NsuzT=PEa@7m#&+;lh@6sN>tVI?vPyv5$z#!!6&We zJurd6hl-&k#PuL9T+}F$fU(!ept7bIR0_;G#BIt%ElSiPBl8v+nYR?~L;+ogxLY#O z14<+e%^wha{ec2s7k)M%?tPhPof54RYJHvDYOI5Sa>qPkEAX?zHYo00nP`U+?Xc(c zvrRuQ;pZiL20zc(3yOPBCi;{Teab$gAI|C5CALVAJ)^!CB+!&1P+YU%|+pa61Z z8Oz65=cpYpO_%vfnh4XR)DakOlSN9r5aXrP6c}%fg-W~tFzN;il&Ects;f0H z+6&fJqInoCrS2e}3C=tvVhtmv^dLka!5N6QG;PLG*F8BgyRMB&4IxgFL#)Fss{&)r z?7C!&(RGDIho<{jYCSXL(;mCbWCJ&0GYsuH#;Jej?6^U!Yu7WCi||vNje%5 zsEJIjLnbgcnEN7=eVK`-vspTXOb%W95ovTt1}8G>hLz#)D;aNI>Ob%Ro zi}XJvwo|7Us{%8Qc_6Ymh(Ad51_ygXN()9En=?o0HfV2eW~s+8_EXM!O6)qu*7Rl= zZH2SC60L#JbcGtmd&XHqiT8p-yg%bz4VdF-`>!+$L8cK*Q~b8X@0R#|Ab#(Q-}S^{ z5B~0m-+SWsQ}G*0=zbtC>hhwItd8|W5?oJ2!1YA-TTg_(^+eiRPsF^jvCcqd|5{!= zk{4U@VohG$kNpqHi@WmTp1k;!)8t-a+|_9go?Omd${$PX>6L4_&DDpwX4ebe%YE;a zD>t!3Ys*TBvNf3*OfHIl5pj8CB|7^VK|B$IA#@fazDovbxyFc1Q)Dus58jF9wP87# zA6CED*%xPq3w?52y%_a<%HGH-`$rI~wzA4T_^`4MvdZ3{wCrhL6=TZ&p8guUp1-;J z@La>?j1wPG&WPk|%ap1slQ$`OlT4SJbOdbD5wH(7q+8~Il6&Ra-OznwvAvTMb2Ux8 zGfhqg+p6vG^vnqJ&h)GdQlb$-&p?efFN2h53t)-7r){W9V%^;|1#^!j>D#HU6fcFc z@{%Ntj3jHzlA}kduq4SKl|oF3J1z_{zQ_2R_)d^k-N7jWfkde&f?iEc&bC{iFSnz;gDr*srly zuI2N%WdZdwN6hyfyxqiG==P5@364G%I_v+2^%qST-U+IfvtLM$Uw`T?%kUqtGYVsn zUqjy%yhiVaU!S*!iTikC#3kj=gq4Zt!ykW_qe6<_4u1=_UGN<+jugjn*?XS&I|ixm z_#cEI5XL9sTUOI9*c5EngRA+L{|#q=KY;OPhE`jE7zo3lKp50s^Aw-1B~KOBp8HpY zI+MtMF^zo(20v7|b$q>o8+)Vj3#H*)vd|lZTu`B0h#OE~0~qiu33#DgULmjndJ-`c z{OauI(2db1KL=c4XFnbOdieJ2KaXvgY^<03cCLUR2#zJc-Y5J+q(lg~FeXZZ#^R&o z^%d2ESdReZ^aot6RO2hJTodyGm8PzgfG}C|b5&GUQ~TVO06ZxX1P1Cr3A!!;MfvXs?#`se zd^B+}?`IWrMKE=>gQmRCBI;5=9V$`R-8gthqpvAefxh4>c)GSfE>D*NG|_mv-bkJ< zSuYA-*hMs5%ab?Gm)BhBcQYgf^R z2Oqf&yW`prkTKMVvU*gk%teh@pBO+i0yVl?*%7Gjjsj2>UQT*+Ibl&ub_W-aDE1>_ zq<=&}fkz6@-In>73fFH^il;K^8YNvLlDjn^b%!5B4J;FC;EjSBSWyVhXzIr&8x-L# z{XD0iZF<8?`Ko91Dnt;#&prD2R6!4XCeQz)Urv-w7Ot76M6BN?FSWP}1OZws<5*t2NGnVc)KKx9SS;}Z%a<=|7qk;!_xVVvaZ!yw-Aj4LQOzVQz{XH${$@ zl!i-UMbgxY-=|VfD}G;!-)AyEshh3Ii|ag|}sEfzy~B$k&z+<9sQ}k1;(0ErRUhS-&dOroiea! z)P;brxe$ne%5W_*k;=(O7Xq2ho1!6&bS_g#^R9_CT2r^?a>0QcHh?r?Fy-`kkYT5P zVb1w{M104>#Sb-Nh%BoM`Ea)=7#{=7Nql%<7Z-!%TLXouw{44$4XnjzH>fVbze3k+ zBfBHqK!t$!E(k{kO1OyMPo%tyK~mI!iW*dLT3D3fwtW5R2sLYzVvSnA6rHLu{GY?G zhQAwrmm~g_ug`u?V(#JZQ)(hz(idau_rV$ZC0Re0M_50zxE^2@0Is#TK$6JxZ>hwU z9C{+VZW<8}1HXx`aRw&eEy3m~iwNSJvInvk1*1^nh=mF=v3P4vEQ^oKkkQ-552QEe z>AMmp%0`OUv{bGxEk~90=oFH6?FP)XO}jf@zm#Ui5Ykq(R{XDm)KS)4uHl6prysh7 zea{Eo#&^TFxwgl7+igS`cJ}4j-visLd?eEJsW0q|?R}UqYFnS=*oeG({Ft4}_ z(JW8|3<>2$02h3Brc?zcCJ1TEN1nW>$qNTAfPAVBXAl>@*=fSGYOqz4oc-WlUwvS9 zLA$w7O$ZBl(oYK!54umopzAapA~R&&Ld|Kn1p%RTnq(Ms#anJw^+3K`qN7cq9vn(^ zw(*qXPU5mC4w}K^MNd0jbZy%N8@64J4jf&%lHDTLJz|}&>4AuQvXjwR> z8`g0{OtcN5)P_77;x-h&fouZW6k?eC^~7&Y{5nLZ#Uit=O%zAtnUG&cY;YkH@~w}^ zgdF}=^B}KiJjjX%XJSLH1)=-MjUuP%Mv@O%WylP4s^YdzRa^t+^@l+-N_&b=96hI9 z#k+hZ4Em89Zh0LyO_kj1wgabr*9$v+Cv?+<$$@{@YrC6n+pTf8Ua2R3>l;ML?1WAy zT5(-}6$e_q(uGR0UDkv?*}{fm9XsBc>qNU5e&x$Zx2yS;S1U|m%LUq9_0c%O+#+%B z>V&x?6t*+ujXq(pjVoFq)dl9=I6Tvv{2UVRCf?++OiJ}DZs#2;mGaPHhTa@;>;YA%$-9zUj3=yC5|KAA|hVmH6Ce4h29vrcSoKB_in(t$WWDRKqLdNI(zC#BwHk(@dCxEp#6r#8kmhz1NCF73>Kw@=iLZ zelzWVUdf;cL#>!f(GHqv`roX#YH3I)bZ)ZDcX{R7@~+I6^s8thP7O;+2Ry<(2}88LP97Q%qYs>SW(t%x1$H@{hab27;ufkbyj#S|J_#N<0#P0s!3*;m2fwwb!fry>q zu^V;QpH@QKFu-|+s9w$Y#fDpRy#u$Ni`?+Q4cDJmu=h{sqyh6!`Def|;V?i>xGyg^ z;ciFlxypS{pHTwVc{pM}i|pgDS2+gUi02pFj^nkBig5>jnF#H|*rhL!PGrC~_`<+6sTL;J+GNZo}sL^Z*MDThq>eXs)6p2~$H%Jfm)u;!a zuMFmf;T{g~J@*i3_l@B%hhLrj9mM{vniOPs=$K>p`?Ft2w?Nl&tC$n`Cir`l2>rd1 z48%B!7bJ9IfV{@UA4RytSdIctLm@MI`ZZDl{v9FtfKeXG>D22~R^VF4Fa8y*1Ua-8 zlIXv0L9&z-{jK=K#vayfI_1|?&v=Q9X_9juDiRX*A~)Rg10Gk;zYV`a#IbN>srh0W zegpSH>iMg)pMwPSx7f_!q3Iie!+eX){xyk1;T_N;D#q}ihTp_r@fI^C*(AVglb!+z z+)kGd_F(#jO)vB%QJL=~-8EL^Td^3tRa3zSjZ1+YRq-_|I|zP1Jj*U6wC>kP=!gzy zbE3b?Pupv|K5ywgp8Dc<oFykvu;uH#fB+eI7GH@wwHRl#cHKzEjmlC8CjKv9h#A~6jk^s zYua9+<8)0Ex0fI&;0(Qs^ zJXhiA@i+pVeFGIC*Gi|S>^SP}N43z~cPkBU9t2)JS7be_5C@+w!d|6!YBsoOggwK; zqCjQZ$ETKkJ2}hJ?hU*}x)yJRK|cp)vpaCuGz~wx;Oe zp6tJJYrOE<9Ym&YQ42t=OL-JzyWuwP9Cpnwj*lUO)6*}Q(KM{Z$c_r3+ig4OpUnp^ zmax%|PDQO)R&r>#H;JF2QZe>3R4S+Z41N07cM$$;{K3l&84oWyc$I!oJ-p|!i-(#B zf(5ceh2vctB-UcFV%&?pu19X@OEFbXLDM60Fz0l;t`j`#$j`0jgGUsqONSDt`U zhE!KleVzTO52?exsKay_MIEMt^?Ll9_%Cg{*4dw$!?4X!+yxhp6rjd_bE@C+xGS-! z<->N2Q9W$KXD{Tsd}=P&-Je>>#ciYTGmBd4IEPcQafF{TO=wM#&^6bYDg*y$XKDtR zM>|ss!dM~VPRLWX4k^%~PbegRl+dtawwVV%9ynuzJBNOHU^38SF7kniu1cxu^po%# zcFZno(p`&w`jEI!iDhF@s=bRRhkSmW5O%^j{32YfQu0ms*#skpCnqQ79l)UUV(7ZN zODOfe5<(dDO@(g&nJu1Za1XCxl5_UQfUSItp4&&KcZ6crz?NbL;`S5>xl%^}B=0e< zR~zO26moy6$f}rd1B*>$F${+d7hX_12*9DAw46^Z=L^8047cUGPwDg5 z;PcnC&rg;@{Qd`QZH$ng9hmE|pg$qp%N=b6_d{*-NpC<{H6UNDERe7S2S!;aKk2co zJ5|herbbMX52KvNowirI2-yp24s6W?vYRTGK=+;pqm9C`JL}IP_UR8QjgPpu4nswy zk&6}`ld~5Qo}U3e64@LMhOxQ>D~9klpu>3L!+J&F9`GE=JZLEC1=5KIek}*bQ$V)B zBWsa|18Qm8={p|JHC$e6nFgrFqRP#i-5}&nyWj=9Ln^*P5H@c*UGJvTVwLI%_olw5hBXH#=r!aUMwA?e9#mD?fQds>HsM2%VC=g&P>|Ov zIgGT*3(bHBrg2k9reNzF(AO727qsH0b()E5O6jJ;L^q{&21P|h2&Lo^XsYD#1M!xs z>uI@?=%A4DsE=y7Dr7|@$Vxj#9|Ym0lwo1WqEJzWX`Q^Jd17vd6G%v=ORt`%@oIE)Cm9T#8BPwi)AZh z%?rg)vpFfmjsV-uUt!&V>ugRMv>Oqp&(`Fw=^&`tVbD1zyl(Y`c< z{v!LKZyl%eUW%5WZ&24Qm-0Rtnt@mEk_A>sHolwD+eA2nm$+(=f@M2G8&&GWkLC;Sl{Es9$b;ypq#LjP zS=1fi29*X)n?%EW%-TAu&8QqpI&LOD_!ABM`DEZv-}+(T|1j_`HSn*0gn@tXXFBi?KF+}J|A_|vf->+I zei-;a4E#$C{J}>U`29cAf#3f)1OIjQzz2)SD-l_q--wnBKy#xPg}(zhHej6J zB{28#+*Mxpk28oK?|1Yr(Xj^CV}!&Q&FAUOfl@rfNYu0#M9;B2jD0j?f+@;Zgi~ z#=T=fddj2C(g!pqcA)_FM>5Yg`sn-UwF6V0(i-P<;fGmW*aqSc(oO5sTy2e-%LCoQ z)6hiSUK^>oq$-=+w?l4vyIfUScnDb}neRwH=gvMVSFxvaP)m>awBVs6iRXY-JIcXN z*Qpz~KjE$T(SCcXRX1)A|7rNu@V8{U0aWmx+~lp>xzGJv#$Q(QU!qwHm?!+=(n+O* z2bpm4r2m2@F26=InRjR+^VMbF{;$Jd4d0#p7>#DIcYR0(jp&l8FBLu4pPCm*KDo)m z+dopLB@Up15neY>!-jbYubZ!d@FX{J8eJ#xdFcs+@3#?vIO&{mVX5+Yj}U92K&%C- z+}>-L)3;`4iSkPYYKfsoK&^H*P)iIq-&*tlsAYNyQVSF@a7#KGxPtKsDlCcGN+M8L zTtLEbxk8Z`zd89dEJV%ptwm7RoC>W0*k}aSv0fc*og$AW0#OA*li=ANuy}AcG*^NE zXb8@)(@@DIt!_9ly_C{-bKD_B2XWg-FFVPm36R+bB04#1Wqs5otvTE^DIARcmg{x5 zZWVa&FsM0gSMV!>jSV{nDv+JPcPqx7UKn)Uo6kJg_Z{OD_d?XVd-m>D$R34N_Da)A zuWDLpv09X>g@`-67Ztjp3%m;uHC{`Sr}`R`gf}8pwOzMYVJp|LU+vbb_TFwiQEk%% z9mcbBT^yWR8Uq^!x9x#>p!ovAV83AoZc?LW}!+Gent%KTF5dID`3rQ&6AVa zQW-U^RzBZ?oxwy$ILq;;o599^0W~xJqarhLgc8tZ?8c^uG{zF@Jw^$ zvc3B_WOu?Ud!x;fM=9iv7&rhabnEI&*SC)#(^vMJ-G0?x-tDJny1K5`hpBE$%81%= z3@?cRMl%mA)%h64&}?M}<`Zcivrhh(@%j}JPA6`F0$)gQLi^6>E@k|D<|#=X`*F$) zD0hg zxY!gEYAo+EuWi!Q7SPnT1ykE3BT!7GTb7crfxJ z2mNi^kLg8P-oG%T^icyK$RaI2sAWs8ZU}**SBrEy@U-Y^OJM_o87iL=fkZ&=hK*Fua;iL zX;Z`aRXpdvf;sOf>o(~p`_1qz05dZ-YB5hP z-YeXlk+Bw=S)6VWuW`uK4h+(tz0=PziN_BTW=(B=@9ylF{7(Lcir9D2f;B2rE0rWgnj| z!U7eM3z2}xJ8ftmLM#Sy0>1*lxPn;JEB5J#`eMR!m@Vz|E{>YdZ(bpO_v*{1VSr~# za~UAu%|Bld@S4_w7n$*IB|f1it{<}F=eu)>T_;)alQt>M2ZiSS>vr*)ZL72-AojO} ztcxwD(;^QJrhFs3`vmn~+l>kbUdVe+d(Uk{w~pA+sI>l#CapgLY5ienqOr&ul-5Jk z6+PR?^`jt+*v4pfD_V9NklpprL?f1!IJ>)gcJ85D>w)rjukIdrH8)~AqZ!}TGTwoV z2cd~(Hh1HUpQp-+2G9}P9?kB#mfbdFw-=gd{_{M}?xoFl7pm;pX!4g@@@J6zRcNC5 z(aSjb3wu4ENA(}Oha%g2{$YA7XQ}T(Vo6Yrl3hGWBE^BS1b4ejTSo0>M17`3eI}ze@e5lTzeC?1nD+%s1bdOszYqsv zxV@Lp-y?5Fc)K-146%H9on@LJVbUb$s2kI}P<#%ceoZGCbt=j24A|`_w{u{>pWH6w z4%^CYshlgP1DZ}(kOwHvZxd#MnS@+mEA#oeo(z3Wyy+^e0I}0T^89dkaVO2^k4O{Z z#J2km>s{Pq^ZAX@boGn7Z$7^>nyztiU(V;Z^>otp;)Pv1pMORvp*9y|M~!gNqH1jc z{Q=zX!98|z#g89)Y{agv1a8WUEy`jG84iH=>(0rE`50&pTB_4N@}0M(2F(Gj!JRa% zfqCu8$;k|9o)iLtiI+T!T+}=TS;CW(lesvn*qC2m4>7*S)+|<`k^F zOe|!+wRi-2up^bQ0B&Hhi!62|RbNM>?}E-36BZn4Ss%rO1v1>0?>+@Wh|%(oSv{%T zE7|21E2eKPZa}#=)N;cOtg4a4He|UsWV!1}xi_?|H{x>3aC_zaa$mSi(-+*${sOTy z`_|$Pe8G}Xl<#9tu8?YrlH!I=F3mHT;ixy2s9w-&dd z+}moo;Rf~zk;S%UxwmDxRkvDxGI#hicgUj4aQnGhbcr=m3omvbRM?l4{Wid{1SPLUE9N71-p&W4ht`>)Q zADqQXoQrw>KG$OFOD~pQ#4dDR*tD0Twf{wi%&zhxpEqBS*zrZ|Ch=Bv>E4ogPvpbk z*yzeL$~`)x+_N9jHcg&UAe_NeyQ#in)3Pe}lrzdb<&1JqKcldb3R;E=8ozZHL?+Af zbn}ExH}@>bIU`Ru6p|@;Oaw;kz&wIe?18yKKRfiZ&Ez?#3%AeW+h!u0#NR!!0;xht zT7Hs{P4T;B!2$wOkH@+vzwuVp-HllXr$6}b)gS6E)WuEI+eJ5x8@zzMW4(SQ zy~Dkrclgjd;!%)UasDMM?m!tx^l`abVb3GSJ+*{hrXF9injD+shTD6Q6~$F7yo^jj zR`h}6FpI9JHUVAH0?cD+x*{YhirYpTbUJwvq@IYp=(^H0JzyE?1P5-at`%Y;!I+jo zOT_vjC*qtwo`9#Qr1BJ{R}IBK8*mk+AA>J4T2K@RZQxK%gj&o{mKeq98hBJwo>(yr zxI&)<9@RwXI0mIz^pB=7C=sV7tWb(`HgJn3gVEbsyl5$o*&66-Eq(%AOtn~woJf!( zc3cGhh!Sv>ONRgdf&}tk4!<#28EEW>-x_RM=d(9X*&#b%*IAzlBL!H$i_G1Pq`i!N zjf*S5O8g08S@!J%(_-Ad-Ou`I(8!)_Erq(ym_0G0L)hxT+pZ^mu$C{!M718W`w0_O ziH+=c%1rKcrkT3WnPGB|lcKMhW%1r-j;Z^a`SI?o-i%?q5h}sHX+#H2)Z_O}1MGLC zo*jrwAI;}V3(iboE;mz{$rW?OTq#$~P2Fl0o!Q(>VO9i{O1W~YHcX!#*ckJ#UTft+g}L|4HnqIByz*R9LjJ}p2?MG zWIXVZ{Mwz8IhOTsgBi762pi$mpdEzrAu5C!Y%<(bK2Y;Dr)w|+Ex9tDz6#LQhIo9w zPpMtEY8{t=ZBd|hlrt7?M&35IKO;9DO&}zFVY8Drf>9R7dKb{kR5oA>4o- zRzjNy0tb}p{P=5uVzuBZZvz{v)V{Qs={(Mx`XroAWLK~Xx(7c=2(43<}BGkkC z8AT8oGyP0?e%)&ZsO1nLKuSceB1l8L00MFHS;%*1r>o@d65Jl>x{&VSR0-`bOH!lI zmKufFc4BgC3Bhu-_yl;|pb!ikF~Yey0ExG+`f{En|IT{Y49L905h~x}%);!vYHkt5 z<`&RQkzHJjl9q`SL0o8yrisAbBC0OIze3jxQE&w}(0l-HfN&62;6?l?LI4*fUmej` zM?wH6!(*e1)AHP{nT46+v=nB=m60}GCBp|49k2*+5vuRCQDibqY16aSf)LD)bhMxg zDTNJYUHbetHfTRI^}}O+oOEWUf^TCM+)li|LWYEFKra z0(o6hy3sP7WB2wlV|qzyqV35M=VaJi#;)0P5;@oJ?d<{ocD$^HZo^>l27SC)>bOEa z`+!3JpHRfJpMs;Ei3=K2oL;`DFD3-Scl4?Jeu6-P{ZPfYnMK9+=@=@uXiOfpz;AfX zteid@lT$E0C*Q>{%*u@i*|~XRa%+1L&&tOglaDhdpJ)(4>t*ERkIAV%CMWQznUzm8 zCZFz@d}Pnb$SNF@Rcl-&5ohseM!}ejviAYZCyd1iC0{7R13kPg!#zE`Cc_;)yeGr! zdU!*IclGe53~y!ZR}SO-$|1?LeYim4zc?rqK|vDK7C~MTR1-l?64Vnx^(3evg1Sji zQv|grsH39Gzk})E=LcU@dGXrp8dF@~ye)az;kA@fih_Q7qHyA?|Q`{?;s%DkHDn_`E#It0(hn zKwhQd{PeBj{LE}tT{XsM=1^u0nOPGvo1Q6`=5JvJ>Aafb^Qu!`%|xhve7ZO{Jzp%9 zXR^MrGd`;>Wz~^c?L$`6)3dWPGnrMtKR&A#WwkHWBAqdt@+>yWC^c?Hn3oaeWQ5f- z!nzq@t#nxDf&)S(GiF9v!;G?q8D$MK${J>rHOww+>afBTj@c-_5Ai;T@7s9q#rHM5 zcjEgV-q+*%2Htm7MPm);4{c{~Z~Q?ngHxIe;J+PyclP&S!XWG!Vrz!qilh4t16&7w zGyGPkoSyI~sLg5-jxT|2HKPKS#D1TW#PeKaebnRTr{inX_2U{vNf^Kk3Uw!Hv9>b^ zdK@KSXb#A_=pCN#&R1DKdfJOx6}~$=U%is*EYHp*6$%Bh?F7z`;rTWJB>kg~p4Z@N4Z zjZi9A8M^C{_oXTW*8{5<8CqkZ%0Q{-KMb1CQnR1>bQV@lIdv7RWEsP___rqxI@6e+5?z7u-E)*+`*P^Uvzdl`2% z@6=*Pg>Eluk-Q+_C?JS)2O*i26-CJ#SW2w(d!8TnytKMsu^fP&7fQ>4q~}p#EH+cT zr94;K!^ZZ2&N;J?M2MS*OzSK*Q@S-XU7Sf`$lA8Cwk>we&*v9Px5_dGbVL@6R5g1^ z^#J`4zWZ8~&(rcL(nXYRr1oXPNF;PqHWA^N0TEubew{lYcrbRxaiWYFCpk9h9d@S5 zqR6YSqOl3zotvc|zv*%gw{vv+=ndV@S6Sq8?)lAlh|E?QDly}LdCF1V&VAJREBP#o zO_%5Alu1f0sEq}+SZTUcoLA<#q~tc1++uUHaw|=lh%d46Oa551ojbm9uV*zboMIW_ z1RsKB7gAH#ttx{Y*TE@Q#S55IudlfW>%PcwzF1|x+h4=Cz#AaG>({q} z<#wAwaqSXQrc70?vaTBfn7aZ@X;4ad^yI(|L$3}Q%}-aEqAlLQGC}yvN9{RKXNfo~ zj*!%%Eg-xTbgS9vxrO=St&-BS;;OQ-s?fVwvVKyHAdTH0t55lXInFK(7s`cFyif+} zLP?U1j4^(0@0y?0d)NG2mG!!y1i$NroxT%d%TqQhVbG7Gkz>h>XgE&FxJ|ay%B%3Z)S>WIG+U_Pw=-qk+x#TieUuo9X3WCV< zo6jh7dLkFsjdj!|ZBJFSoHgLboIwJ%L^@2%>Wb zK{S41eVH|}f-sJ`QFr|*%y{$Fg4g|+a}vA`+7u)U^Xi5hi(tzl{IRBtaC~hohZ(gc zM2@4Xeq@18ZG$xpKHps^S2Yv>(woFc0JL@1(Ew;e8$$??Z1!U|O$>A?&y`CvGf9;6 z$J+R@$-Xp>nBJEzOfM|V6_rL-KHtXAhecz4e!i?N9rPv}Ys6xjxJRr{NhR4>Nfw(e z&y*LGH;G!avDW@ry(t*qn}Sqtx>n3+>nmy9$?EHmQz30_MLv(GXdp~tAE`#MY>nM# z>uj05VMlC*ZLqs+hdpO6*)#Tn-D97!&lu+{;EUTP-<>U232W(aGzZG(cK}Y%gS**k zK9BnHWKU4%DRg+bTwQt=R$hjuHEgk!q{Rq-a7`$w=c*U6WuBf=NgCXS*I2B}?FLWC zgqqymy%(|-e`nxrsjpQ_M7b5ceQfH}<8vv7b^m{ttw{eU-4x0{Cr!`Rv81S7qweROi;?X zYWTb1cV|Bb6K`xLYV;$#S&1{)!27#!-*FJ|xf3_g^Q3D$!^HP6@~7nQJwO_4_NhkD zQTGlcMF;wn)}2M?Y64)Z8pa+TM!JQpaeK`@aN9xGt>^X!xwVeR!$EE(2))SlUk9Ju zta}GY@S!ldblX!ixo!ym5Hq6l!C+BR?Q5DOt*N36MrY!rD(6A7*>>dv;ZPjG?)$-E+P69-+2_9QI(;Ok z{#b>4KT*iz{p#45t4U0u@=n?Nrs8jD@ugxLp4=Im=1!7EsGT8nZEXBC1@{2zZU|c* z8+$p4jjCt}TS;{X_y=asxo#UAr}L@l#Fadm{iV&IMH`65>FN1l*mI2%wgz1Uaz@AW z1a90(XD0^TL-TI@d6V92$zgbdkU7QPJ3#4&Oj*D zr)meD(K@a`X5syGu_(K)a0>5^tESjHyv%F1m}TrORwA91(od0M%T*}$yq>UKBCoZ_ z%^LHR3=+=Ej@bjh@bvE|i@JOvA6xVuk3>+rMAmg(*dPP=d=Kc&Tv=x2q# zXoG(4!p~i{13x?Lxy5k3FLcc3N+sN*pHD6J85~ME2mBfb0NX~$jL?m|BSNc{5y4j1 z5Nxv-%gR{(R>C5JD~$rCWBJUJ^_71QDN4&gVY(IY-!vbim*0<9k#!NJqm z1kT|pb4T=n+T%+-9(xVwaU1t=Ol(j@4{2Lg1v-q`<7BDXqrBv13uO#*^QGd#!kl)x zZwDZso^(%Vv6?);vsjj(_cMz%IH1Mkwhy3UT~R2x17uxJp*1sZ{Uga&=h-h8<)-eX zZQI@wHMFb&S#>SG>!}8Wc&}R!iajBFw)8AcKC(}I78?;hgO+-h^eC`5{p{pK3T9rw zXMOO*gD_@gB9mv2&*<#okQTf)BJbelGwRgJLBt_7^ho4TMot^FikYWw#?uR2)&Pvb zx^zR84Oh_X5#5N#8EhJ$fL~n!-ys*2QKzaae4&Dnd?EMR5W;IFPYfMnU9pluF}^(kOnRlcO5i;&=@#Y#|Cl zZkocFha+0@6BmD$rb-nGxGe%ol_Ct?LeHo4s8P{yvM~g&}gO!m*GZ-~oUFE`X_13&FTm`!(kV_O=PSi35U$AhiaeT^Z z_FR$m>>8^>uV}#R+J&p8T@PwK=y`?M45}4G9PQRx5DfqvY#-ttf-UNSeGJ;@%C!=s zt&_MCn(EX+1t{T@)?|4(Rkg2K@#4+RV-TU0mnlR8Y%BSZ!OPC`V&H`tx!M7oZWEy)Cq=Kd9lILNKUcTv8GipyxoB)};2-!r# zDz4Oj#(sz)Um?KvJW1MI1mOuDyRd4#21h1VzqnQ2sX%dMiDR!9M?MNC#U9S*5& zE*(JNtTlPtYwNo-9N}#UcM7*!NsP0H9Q*iXuw>~7AXFKjiU?5rMvS^qH7TCwiCfMY zJIV-Vh28R&at-6XQ+Uagb^19)w!?0f!-Lx$4DK9>Kmr{UfrucoMg%s8$(iB0f}o}s>P8Mc z_9eGh2jYlGg+W&E)or#8V|iMueTW${&gw;lmaC5Zp<`2cJ1DG=Cn6kL!o`?p#hTJn z3mUFYLhMmBPzX8mEPXrw;q*1>S*=MJ>^&#fG3U&QZrQ6cmJ#+5)M}dw2?_OQ`9Unf z>K+cQ_r_rlSV{WeJZnum5;&ra!Ef+u`c{bocMt8twB2>yZ0c0x)G*Wy0RhM#?ZfaQ zy*g$|iyESA0kL^-C^nmX>d|q?_$P*k*iwV7=boF8{>dg@YZ1U}{MZ0&`lb=+TnzzN zTE7K=U*;nNxZ#dQu+0hrO>7{7#@Ny;{F%ZV$~PdF+Qb_!(*0GwZ*-q?3!nkytJDx; ze=znJ0e_9ZZ-UouR0?$ZNMMO2T?FiPzG;9pyd4OzSwWy_3ttEt8TWe%G%O;Mj|K)! zAv(YK+3dxwu5>`fLX2EfALaZLH_v&a^B}as10N`8;xJsE`JQOhlL%vX7C^`izGWb! zWQ-=Xl&h(mP<9U|gGIV|m)|$K(e`74o<8Xv5Q%Yq2jo_1Ya3->wc`;H>WoVd+28P# zQR4FXD5%v;3ZD-iZfC*6b>P4bEN&qd0aKtKkWEzlTcY4x<7OZqo%z>aN`= z)m%yZ99AX!kz>oi@;2-`USpspIqqcaX*SD>)#$(IMlwFJ0ecKjiiCC()OXGG$%Ddv z3Osw)t_Q~08$3`0U1_qq-LX-xCQOxDU@-s0TO@jFc%d{INh{1S8{)DFVcA3pAEG06ipbu@8(pT`PM=F$vh#Sn{y2;^hj#{h_O~K0 z4i|!aJAX6({`9lcFTt|zT4-_q=Q=RxZa*A|gj@5kPCuJ}clu}i-5YupiEbPQ=dtjd z_}S)pV^$KL!Tw@%R#cqAI-F&vGAUa?OP4BJh)vNA3~mb^4E_inGnNLPO#Y%)b4DZx zK?l^1x?nlWXx5KrAcKq6tZ?LGt#tSdy?-9lmwB*E$wJ(0cx!vlvX7A!aov&g2uu) zss1;x`5#D@h;b~eDj%fn}aTN|_y$)#Rvz4Iy@v@~*fGR?_7plNe4-87mqUBGb2?As??;hia zA>_|hn#o4Wk1e6dR>8{cDh&{nRT1sG5V``%t_r;!8oiZe7rNnR3+SzT(4F9?OHg7d z19$B00`B$)1VD4P8YRO-RiL20X^wQPe$lhf#Ro=r1*@+T3wwXv>iaz=y1(*+i!a@Ma30 z>$cq+)k%3dpie`UgwPMiW736MT|iKr9&AeuV7#@wveC$-w+cxHrOmiP+7wC? zK~je|39%iCoGnBAq2-VH$f($gZaER+K7wT!cFM9##M_uVvrrux(rj!>vq=S&-Ms@? z$byVBLfaCxT18X*E+pndNHb>vnW1kr4C1i)H1U9Ia@`=DI(eIx!vB_#7KR%^#Q17c zT*kS4iiv^x-LX8;)hH9~k;_c+Xn7%ti(A^0S}@T8(*`X0y~FDNLl_<024${vyORl8 z--!I|Ns^0lYMPYm z^}%*~W&U>lwYmZBhb*T4_37vH|IEKR{R_MzTU_3o_^q8$Dx^G4E}14^_5z|+@vD4C z-_O6p3Ca?*CZ;Pmo2faIhv9K|d}7xNN5mA!sbQQc-ibaktyL=F?g;HrFTyEsd;LgI^>DQRk^w7kA6Iu{b}m@!nqPi!=X2+s@HEJiODFVcDopg!Oi;XGx$!T0fP zYRS@giT46uN)eZlw+~_hWhivJV-d;1O29Sn?fgf~?eNCRA;X#fef}0-zMcPz7U)kP zQGb2<<@^T=*Dc+%`DXr;r8X7b!wG3%nO!wOpsi30wn9cXj{UvB+3oOc);b5V5|wv~ zk7%~^nvDI56`3<<9vMp*10GLIn!J3`idk&&!%|sfF3y<>jV}e};H8wgkxnzzl`<=i zN=q;(;CGhr5&93rVA(@`0Y=6b03GK5`9lXxzQ=%iTz50l1eHKT3)J(5NcX(}|M8F* z7%!mzJX9of--WMx7>S|(s&22^^?lbLU?Fh*0k;Ex3|=E~ttKh{6A~k%VhO}QoxPw| zvwPhL8ip=d`PhuwT%|@Z;94yN;ocYVt`n$Ilk3tN>nO0-7XC?Ey39I?mrxE(7;ysh z&{keXs>=KfU_`WNy!IqF|PH(9gU9OM()>ay&n^kk5kh810vu{D`$iInTwB z=86i`WzvoMVqgu&-M!dCB_hZK7k2jv!yCOoN1Jx>OlqC5)@6r*j6yh+grSrcRSI=& zjbOBHjDhc`2VhJ3{gH^ayYa|$FxrMfxG?ffxL> zmYT?#Yv-0MqpS8wL3bBOo{1hWP+;rM78Q|{paa6DssK+mRMn=K+LUQlRl#N-l-0r? zpj!9=c}08#)0eTwD^OkB4%_B-*oN((U2K%-4A-`Rdkp{s`luaPkkx;X?}0=2CC@NJ z?aZ4ufYnaFXG?t#xp64RHq)yO-QJW-o9RV+ALXs>y!HV7e?;nWv<3S8DP-JAQcc@7 z<#hg7OI=>G(SYlCl%Fp+DmK8g(RJOAIbJp(;f8^ai${<2(c2gP(ZK_yo2mkj9m9$0 zgVc!%PJ(OvvG-67()gkWq<_zp)D;d)ZUD5z&1nyER#sO`F>l3?$4w5LE4Th5C-`{Gk`87A@m0WSQN0oVt2FQRK|1@F)4l z0VEG_*52h$GR}%WK}12_H1_n+p!OaSlqcZ3u59b*$&%e1tkg1m;zc*X@zS`G)?mWo zet`$O3oi$t9a1eQqXq0n0Tpn#sAHy)&LW*S&FsW6E($^%Bfz{OTEiy^?gW|qGXSqu z0dAjh$kTYO_(+VUK%K=epeNZtN_)6`zXiiH*~q_Np#pi;QND#h3Zb6{-&82Lv>Js` zBu-}brMj$Nvez5QB?H>0(#&0+LPT1<4oU%hsg!9mf3Pn3NF1*Vj=6`|gCr+s#hLg9 z0LpwZToXmBclQwEvBB;AfcMlr5o3(Z9`R>Nq!{xvgFSszc2X%$v=|(q2#wEzbpAY$=i~@l>Ad^%Cm5rN8~+< zD2#LmQvS2VZ1B{(gZbid5#8WVGgm{r-2sl5oP6v-V;#0bzRId8Ixj2idmAaq$9D(# z4(_JVg}b@d>9pk#F!H2gm{{Jt|BPN-;m=gxcQx4Cy3o^w|f0;K!#qfM`O7!1Z> SmH>71JO2ehS+u?X!U6y`a1bT{ literal 49721 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 diff --git a/data_svelte/widgets.json b/data_svelte/widgets.json index 21a983fc..ecd0a7e8 100644 --- a/data_svelte/widgets.json +++ b/data_svelte/widgets.json @@ -177,6 +177,39 @@ "maxCount": 86400, "type": "bar" }, + { + "name": "chart4", + "label": "График Часовой", + "widget": "chart", + "dateFormat": "HH:mm", + "maxCount": 3600, + "type": "bar" + }, + { + "name": "chart5", + "label": "График двойной", + "widget": "chart", + "series": [ + "Температура, С", + "Влажность, %" + ], + "dateFormat": "HH:mm", + "maxCount": 86400, + "pointRadius": 0 + }, + { + "name": "chart6", + "label": "График тройной", + "widget": "chart", + "series": [ + "Температура, С", + "Влажность, %", + "Давление, кПа" + ], + "dateFormat": "HH:mm", + "maxCount": 86400, + "pointRadius": 0 + }, { "name": "fillgauge", "label": "Бочка", @@ -321,10 +354,6 @@ "widget": "anydata", "after": "°", "icon": "speedometer" - }, - { - "name": "nil", - "label": "Без виджета" }, { "name": "anydataBar", @@ -332,5 +361,9 @@ "widget": "anydata", "after": "Kg/cm²", "icon": "speedometer" + }, + { + "name": "nil", + "label": "Без виджета" } ] \ No newline at end of file diff --git a/include/Global.h b/include/Global.h index 0df14fe3..278630f0 100644 --- a/include/Global.h +++ b/include/Global.h @@ -10,6 +10,7 @@ #include #ifdef LIBRETINY +#include #include #include #ifdef STANDARD_WEB_SERVER diff --git a/src/Main.cpp b/src/Main.cpp index 0e4272cb..5dadadf7 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -224,9 +224,9 @@ void setup() { stopErrorMarker(SETUPINET_ERRORMARKER); - bool postMsgTelegram; - if (!jsonRead(settingsFlashJson, "debugTraceMsgTlgrm", postMsgTelegram, false)) postMsgTelegram = 1; - sendDebugTraceAndFreeMemory(postMsgTelegram); + // bool postMsgTelegram; + // if (!jsonRead(settingsFlashJson, "debugTraceMsgTlgrm", postMsgTelegram, false)) postMsgTelegram = 1; + // sendDebugTraceAndFreeMemory(postMsgTelegram); initErrorMarker(SETUPLAST_ERRORMARKER); diff --git a/src/StandWebServer.cpp b/src/StandWebServer.cpp index 79be8f59..6ac28403 100644 --- a/src/StandWebServer.cpp +++ b/src/StandWebServer.cpp @@ -9,6 +9,12 @@ static const char FS_INIT_ERROR[] PROGMEM = "FS INIT ERROR"; static const char FILE_NOT_FOUND[] PROGMEM = "FileNotFound"; // static bool fsOK; // const char* fsName = "LittleFS"; +// Типы обновлений +enum UpdateType { + FIRMWARE, + FILESYSTEM + }; + void standWebServerInit() { // Кэшировать файлы для быстрой работы @@ -88,10 +94,12 @@ void standWebServerInit() { // - first callback is called after the request has ended with all parsed arguments // - second callback handles file upload at that location HTTP.on("/edit", HTTP_POST, replyOK, handleFileUpload); - + // отображение страницы с полем ввода для сервера обновления HTTP.on("/localota", HTTP_GET, handleLocalOTA); - + // непосредственно ОТА обновление со стороннего сервера HTTP.on("/localota_handler", HTTP_GET, handleLocalOTA_Handler); + + // Обработка обновления от WS drag&drop HTTP.on("/update", HTTP_POST, []() { HTTP.send(200); // Для CORS }, handleUpdateOTA); @@ -176,13 +184,28 @@ void handleCors() { } void handleUpdateOTA() { + UpdateType typeOTAfile = FIRMWARE; HTTPUpload& upload = HTTP.upload(); - + if (upload.filename != "firmware.bin" && upload.filename != "littlefs.bin") + { + SerialPrint("E", F("OTA"), "Неверное имя файла: " + upload.filename); + return; + } + if (upload.filename == "firmware.bin") + { + typeOTAfile = FIRMWARE; + } else if (upload.filename == "littlefs.bin") + { + typeOTAfile = FILESYSTEM; + } + int updatePartition = (typeOTAfile == FIRMWARE)? U_FLASH : U_SPIFFS; if (upload.status == UPLOAD_FILE_START) { - Serial.print("Начало загрузки: "); - Serial.println(upload.filename); - if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { + //Serial.print("Начало загрузки: "); + //Serial.println(upload.filename); + SerialPrint("i", F("OTA"), "Начало загрузки файла: " + upload.filename); + if (!Update.begin(UPDATE_SIZE_UNKNOWN, updatePartition)) { Update.end(); + SerialPrint("E", F("OTA"), "Ошибка: Недостаточно памяти"); HTTP.send(500, "text/plain", "Ошибка: Недостаточно памяти"); return; } @@ -190,17 +213,19 @@ void handleCors() { else if (upload.status == UPLOAD_FILE_WRITE) { if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { Update.end(); + SerialPrint("E", F("OTA"), "Ошибка записи данных"); HTTP.send(500, "text/plain", "Ошибка записи данных"); return; } } else if (upload.status == UPLOAD_FILE_END) { if (Update.end(true)) { // true - перезагрузка после обновления + SerialPrint("i", F("OTA"), "Обновление завершено"); HTTP.send(200, "text/plain", "Обновление успешно"); - Serial.println("Обновление завершено"); ESP.restart(); } else { Update.end(); + SerialPrint("E", F("OTA"), "Ошибка завершения обновления"); HTTP.send(500, "text/plain", "Ошибка завершения обновления"); } } diff --git a/src/WsServer.cpp b/src/WsServer.cpp index 7a27698b..2adb1f5d 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -235,7 +235,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) if (headerStr == "/localt|") { String timeStr = String((char*)payload + 8); - Serial.println("Время с фронта: /localt|" + timeStr); + //Serial.println("Время с фронта: /localt|" + timeStr); // Обрезаем дробную часть, если есть int dotIndex = timeStr.indexOf('.'); @@ -253,9 +253,11 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) // Устанавливаем время if (settimeofday(&tv, NULL) == 0) { - Serial.printf("Время установлено: %ld\n", unixTime); + //Serial.printf("Время установлено: %ld\n", unixTime); + SerialPrint("i", F("Time"), "Время установлено из браузера: " + String(unixTime)); } else { - Serial.printf("Ошибка установки времени: %ld\n", unixTime); + //Serial.printf("Ошибка установки времени: %ld\n", unixTime); + SerialPrint("i", F("=>WS"), "Ошибка установки времени: " + String(unixTime)); } // timeval tv2{0, 0}; // timezone tz = timezone{0, 0}; diff --git a/src/modules/virtual/Loging2/Loging2.cpp b/src/modules/virtual/Loging2/Loging2.cpp new file mode 100644 index 00000000..71573552 --- /dev/null +++ b/src/modules/virtual/Loging2/Loging2.cpp @@ -0,0 +1,415 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include "ESPConfiguration.h" +#include "NTP.h" + +void *getAPI_Date2(String params); + +class Loging2 : public IoTItem { + private: + String logid1; + String logid2; + String id; + String tmpValue; + String filesList = ""; + + int _publishType = -2; + int _wsNum = -1; + + int points; + //int keepdays; + + IoTItem *dateIoTItem; + + String prevDate = ""; + bool firstTimeInit = true; + + // long interval; + + public: + Loging2(String parameters) : IoTItem(parameters) { + jsonRead(parameters, F("logid1"), logid1); + jsonRead(parameters, F("logid2"), logid2); + jsonRead(parameters, F("id"), id); + jsonRead(parameters, F("points"), points); + if (points > 300) { + points = 300; + SerialPrint("E", F("Loging2"), "'" + id + "' user set more points than allowed, value reset to 300"); + } + long interval; + jsonRead(parameters, F("int"), interval); + interval = interval * 60; // приводим к милисекундам + //jsonRead(parameters, F("keepdays"), keepdays, false); + + // создадим экземпляр класса даты + dateIoTItem = (IoTItem *)getAPI_Date2("{\"id\": \"" + id + "-date\",\"int\":\"20\",\"subtype\":\"date\"}"); + IoTItems.push_back(dateIoTItem); + SerialPrint("I", F("Loging2"), "created date instance " + id); + } + + void doByInterval() { + // если объект логгирования не был создан + if (!isItemExist(logid1)) { + SerialPrint("E", F("Loging2"), "'" + id + "' loging object not exist, return"); + return; + } + + String value = getItemValue(logid1); + // если значение логгирования пустое + if (value == "") { + SerialPrint("E", F("Loging2"), "'" + id + "' loging value is empty, return"); + return; + } + String value2 = getItemValue(logid2); + // если значение логгирования пустое + if (value == "") { + SerialPrint("E", F("Loging2"), "'" + id + "' loging value is empty, return"); + return; + } + + // если время не было получено из интернета + if (!isTimeSynch) { + SerialPrint("E", F("Loging2"), "'" + id + "' Сant loging - time not synchronized, return"); + return; + } + + regEvent(value, F("Loging2")); + + String logData2; + + jsonWriteInt(logData2, "x", unixTime, false); + jsonWriteFloat(logData2, "y1", value.toFloat(), false); + jsonWriteFloat(logData2, "y2", value2.toFloat(), false); + + // прочитаем путь к файлу последнего сохранения + String filePath = readDataDB(id); + + // если данные о файле отсутствуют, создадим новый + if (filePath == "failed" || filePath == "") { + SerialPrint("E", F("Loging2"), "'" + id + "' file path not found, start create new file"); + createNewFileWithData(logData2); + return; + } else { + // если файл все же есть но был создан не сегодня, то создаем сегодняшний + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + SerialPrint("E", F("Loging2"), "'" + id + "' file too old, start create new file"); + createNewFileWithData(logData2); + return; + } + } + + // считаем количество строк и определяем размер файла + size_t size = 0; + int lines = countJsonObj(filePath, size); + SerialPrint("i", F("Loging2"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); + + // если количество строк до заданной величины и дата не менялась + if (lines <= points && !hasDayChanged()) { + // просто добавим в существующий файл новые данные + addNewDataToExistingFile(filePath, logData2); + // если больше или поменялась дата то создадим следующий файл + } else { + createNewFileWithData(logData2); + } + // запускаем процедуру удаления старых файлов если память переполняется + deleteLastFile(); + } + + void SetDoByInterval(String valse) { + String value = valse; + // если значение логгирования пустое + if (value == "") { + SerialPrint("E", F("Loging2Event"), "'" + id + "' loging value is empty, return"); + return; + } + // если время не было получено из интернета + if (!isTimeSynch) { + SerialPrint("E", F("Loging2Event"), "'" + id + "' Сant loging - time not synchronized, return"); + return; + } + regEvent(value, F("Loging2Event")); + String logData2; + jsonWriteInt(logData2, "x", unixTime, false); + jsonWriteFloat(logData2, "y1", value.toFloat(), false); + jsonWriteFloat(logData2, "y2", value.toFloat(), false); + // прочитаем путь к файлу последнего сохранения + String filePath = readDataDB(id); + + // если данные о файле отсутствуют, создадим новый + if (filePath == "failed" || filePath == "") { + SerialPrint("E", F("Loging2Event"), "'" + id + "' file path not found, start create new file"); + createNewFileWithData(logData2); + return; + } else { + // если файл все же есть но был создан не сегодня, то создаем сегодняшний + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + SerialPrint("E", F("Loging2Event"), "'" + id + "' file too old, start create new file"); + createNewFileWithData(logData2); + return; + } + } + + // считаем количество строк и определяем размер файла + size_t size = 0; + int lines = countJsonObj(filePath, size); + SerialPrint("i", F("Loging2Event"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); + + // если количество строк до заданной величины и дата не менялась + if (lines <= points && !hasDayChanged()) { + // просто добавим в существующий файл новые данные + addNewDataToExistingFile(filePath, logData2); + // если больше или поменялась дата то создадим следующий файл + } else { + createNewFileWithData(logData2); + } + // запускаем процедуру удаления старых файлов если память переполняется + deleteLastFile(); + } + void createNewFileWithData(String &logData) { + logData = logData + ","; + String path = "/lg2/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt + // создадим пустой файл + if (writeEmptyFile(path) != "success") { + SerialPrint("E", F("Loging2"), "'" + id + "' file writing error, return"); + return; + } + + // запишем в него данные + if (addFile(path, logData) != "success") { + SerialPrint("E", F("Loging2"), "'" + id + "' data writing error, return"); + return; + } + // запишем путь к нему в базу данных + if (saveDataDB(id, path) != "success") { + SerialPrint("E", F("Loging2"), "'" + id + "' db file writing error, return"); + return; + } + SerialPrint("i", F("Loging2"), "'" + id + "' file created http://" + WiFi.localIP().toString() + path); + } + + void addNewDataToExistingFile(String &path, String &logData) { + logData = logData + ","; + if (addFile(path, logData) != "success") { + SerialPrint("i", F("Loging2"), "'" + id + "' file writing error, return"); + return; + }; + SerialPrint("i", F("Loging2"), "'" + id + "' loging in file http://" + WiFi.localIP().toString() + path); + } + + // данная функция уже перенесена в ядро и будет удалена в последствии + bool hasDayChanged() { + bool changed = false; + String currentDate = getTodayDateDotFormated(); + if (!firstTimeInit) { + if (prevDate != currentDate) { + changed = true; + SerialPrint("i", F("NTP"), F("Change day event")); +#if defined(ESP8266) + FileFS.gc(); +#endif +#if defined(ESP32) +#endif + } + } + firstTimeInit = false; + prevDate = currentDate; + return changed; + } + + void publishValue() { + String dir = "/lg2/" + id; + filesList = getFilesList(dir); + + SerialPrint("i", F("Loging2"), "file list: " + filesList); + + int f = 0; + + bool noData = true; + + while (filesList.length()) { + String path = selectToMarker(filesList, ";"); + + path = "/lg2/" + id + path; + + f++; + + unsigned long fileUnixTimeLocal = getFileUnixLocalTime(path); + + unsigned long reqUnixTime = strDateToUnix(getItemValue(id + "-date")); + if (fileUnixTimeLocal > reqUnixTime && fileUnixTimeLocal < reqUnixTime + 86400) { + noData = false; + String json = getAdditionalJson(); + if (_publishType == TO_MQTT) { + publishChartFileToMqtt(path, id, calculateMaxCount()); + } else if (_publishType == TO_WS) { + sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); + } else if (_publishType == TO_MQTT_WS) { + sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); + publishChartFileToMqtt(path, id, calculateMaxCount()); + } + SerialPrint("i", F("Loging2"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", sent"); + } else { + SerialPrint("i", F("Loging2"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", skipped"); + } + + filesList = deleteBeforeDelimiter(filesList, ";"); + } + // если данных нет отправляем пустой грфик + if (noData) { + clearValue(); + } + } + + String getAdditionalJson() { + String topic = mqttRootDevice + "/" + id; + String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\"}"; + return json; + } + + void publishChartToWsSinglePoint(String value) { + String topic = mqttRootDevice + "/" + id; + String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + ",\"y2\":" + value + "}]}"; + sendStringToWs("chartb", json, -1); + } + + void clearValue() { + String topic = mqttRootDevice + "/" + id; + String json = "{\"maxCount\":0,\"topic\":\"" + topic + "\",\"status\":[]}"; + sendStringToWs("chartb", json, -1); + } + + void clearHistory() { + String dir = "/lg2/" + id; + cleanDirectory(dir); + } + + void deleteLastFile() { + IoTFSInfo tmp = getFSInfo(); + SerialPrint("i", "Loging2", String(tmp.freePer) + " % free flash remaining"); + if (tmp.freePer <= 20.00) { + String dir = "/lg/" + id; + filesList = getFilesList(dir); + int i = 0; + while (filesList.length()) { + String path = selectToMarker(filesList, ";"); + path = dir + path; + i++; + if (i == 1) { + removeFile(path); + SerialPrint("!", "Loging2", String(i) + ") " + path + " => oldest files been deleted"); + return; + } + + filesList = deleteBeforeDelimiter(filesList, ";"); + } + } + } + + void setPublishDestination(int publishType, int wsNum) { + _publishType = publishType; + _wsNum = wsNum; + } + + String getValue() { + return ""; + } +/* + void loop() { + if (enableDoByInt) { + currentMillis = millis(); + difference = currentMillis - prevMillis; + if (difference >= interval) { + prevMillis = millis(); + if (interval != 0) { + this->doByInterval(); + } + } + } + } +*/ + void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) { + String userDate = getItemValue(id + "-date"); + String currentDate = getTodayDateDotFormated(); + // отправляем в график данные только когда выбран сегодняшний день + if (userDate == currentDate) { + // generateEvent(_id, value); + // publishStatusMqtt(_id, value); + + publishChartToWsSinglePoint(value); + // SerialPrint("i", "Sensor " + consoleInfo, "'" + _id + "' data: " + value + "'"); + } + } + + // просто максимальное количество точек + int calculateMaxCount() { + return 86400; + } + + // путь вида: /lg/log/1231231.txt + unsigned long getFileUnixLocalTime(String path) { + return gmtTimeToLocal(selectToMarkerLast(deleteToMarkerLast(path, "."), "/").toInt() + START_DATETIME); + } + void setValue(const IoTValue &Value, bool genEvent = true) { + value = Value; + this->SetDoByInterval(String(value.valD)); + SerialPrint("i", "Loging2", "setValue:" + String(value.valD)); + regEvent(value.valS, "Loging2", false, genEvent); + } +}; + +void *getAPI_Loging2(String subtype, String param) { + if (subtype == F("Loging2")) { + return new Loging2(param); + } else { + return nullptr; + } +} + +class Date : public IoTItem { + private: + bool firstTime = true; + + public: + String id; + Date(String parameters) : IoTItem(parameters) { + jsonRead(parameters, F("id"), id); + value.isDecimal = false; + } + + void setValue(const String &valStr, bool genEvent = true) { + value.valS = valStr; + setValue(value, genEvent); + } + + void setValue(const IoTValue &Value, bool genEvent = true) { + value = Value; + regEvent(value.valS, "", false, genEvent); + // отправка данных при изменении даты + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { + if ((*it)->getSubtype() == "Loging2") { + if ((*it)->getID() == selectToMarker(id, "-")) { + (*it)->setPublishDestination(TO_MQTT_WS, -1); + (*it)->publishValue(); + } + } + } + } + + void setTodayDate() { + setValue(getTodayDateDotFormated()); + SerialPrint("E", F("Loging2"), "today date set " + getTodayDateDotFormated()); + } + + void doByInterval() { + if (isTimeSynch) { + if (firstTime) { + setTodayDate(); + firstTime = false; + } + } + } +}; + +void *getAPI_Date2(String param) { + return new Date(param); +} diff --git a/src/modules/virtual/Loging2/modinfo.json b/src/modules/virtual/Loging2/modinfo.json new file mode 100644 index 00000000..0841e795 --- /dev/null +++ b/src/modules/virtual/Loging2/modinfo.json @@ -0,0 +1,48 @@ +{ + "menuSection": "virtual_elments", + "configItem": [ + { + "global": 0, + "name": "Двойной график", + "type": "Writing", + "subtype": "Loging2", + "id": "log2", + "widget": "chart5", + "page": "Графики", + "descr": "Датчик", + "num": 1, + "int": 5, + "logid1": "t", + "logid2": "h", + "points": 300, + "series1": "Температура, С", + "series2": "Влажность, %" + } + ], + "about": { + "authorName": "Serghei Crasnicov", + "authorContact": "https://t.me/Serghei63", + "authorGit": "https://github.com/Serghei63", + "specialThanks": "@itsid1 @Valiuhaaa Serg", + "moduleName": "Loging2", + "moduleVersion": "0.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "Логирование в график", + "moduleDesc": "Расширение позволяющее логировать любую величину в график. Графики доступны в мобильном приложении и в веб интерфейсе. Данные графиков хранятся в встроенной памяти esp. В окне ввода даты можно выбирать день, историю которого вы хотите посмотреть. Старые файлы будут удаляться автоматически после того как объем оставшейся flesh памяти устройства будет менее 20 процентов", + "propInfo": { + "int": "Интервал логирования в мнутах, рекомендуется для esp8266 использоать интервал не менее 5-ти минут", + "logid1": "ID 1 величины которую будем логировать (температура)", + "logid2": "ID 2 величины которую будем логировать (влажность)", + "points": "Максимальное количество точек в одном файле, может быть не более 300. Не рекомендуется менять этот параметр" + } + }, + "defActive": false, + "usedLibs": { + "esp32*": [], + "esp82*": [] + + } +} \ No newline at end of file diff --git a/src/modules/virtual/Loging3/Loging3.cpp b/src/modules/virtual/Loging3/Loging3.cpp new file mode 100644 index 00000000..0a2dcfa9 --- /dev/null +++ b/src/modules/virtual/Loging3/Loging3.cpp @@ -0,0 +1,427 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include "ESPConfiguration.h" +#include "NTP.h" + +void *getAPI_Date3(String params); + +class Loging3 : public IoTItem { + private: + String logid1; + String logid2; + String logid3; + String id; + String tmpValue; + String filesList = ""; + + int _publishType = -2; + int _wsNum = -1; + + int points; + //int keepdays; + + IoTItem *dateIoTItem; + + String prevDate = ""; + bool firstTimeInit = true; + + //long interval; + + public: + Loging3(String parameters) : IoTItem(parameters) { + jsonRead(parameters, F("logid1"), logid1); + jsonRead(parameters, F("logid2"), logid2); + jsonRead(parameters, F("logid3"), logid3); + jsonRead(parameters, F("id"), id); + jsonRead(parameters, F("points"), points); + if (points > 300) { + points = 300; + SerialPrint("E", F("Loging3"), "'" + id + "' user set more points than allowed, value reset to 300"); + } + + long interval; + jsonRead(parameters, F("int"), interval); + interval = interval * 60; // приводим к милисекундам + //jsonRead(parameters, F("keepdays"), keepdays, false); + + // создадим экземпляр класса даты + dateIoTItem = (IoTItem *)getAPI_Date3("{\"id\": \"" + id + "-date\",\"int\":\"20\",\"subtype\":\"date\"}"); + IoTItems.push_back(dateIoTItem); + SerialPrint("I", F("Loging3"), "created date instance " + id); + } + + void doByInterval() { + // если объект логгирования не был создан + if (!isItemExist(logid1)) { + SerialPrint("E", F("Loging3"), "'" + id + "' loging object not exist, return"); + return; + } + + String value = getItemValue(logid1); + // если значение логгирования пустое + if (value == "") { + SerialPrint("E", F("Loging3"), "'" + id + "' loging value is empty, return"); + return; + } + String value2 = getItemValue(logid2); + // если значение логгирования пустое + if (value == "") { + SerialPrint("E", F("Loging3"), "'" + id + "' loging value is empty, return"); + return; + } + String value3 = getItemValue(logid3); + // если значение логгирования пустое + if (value == "") { + SerialPrint("E", F("Loging3"), "'" + id + "' loging value is empty, return"); + return; + } + + // если время не было получено из интернета + if (!isTimeSynch) { + SerialPrint("E", F("Loging"), "'" + id + "' Сant loging - time not synchronized, return"); + return; + } + + regEvent(value, F("Loging3")); + + //String logData2; + String logData3; + + jsonWriteInt(logData3, "x", unixTime, false); + jsonWriteFloat(logData3, "y1", value.toFloat(), false); + jsonWriteFloat(logData3, "y2", value2.toFloat(), false); + jsonWriteFloat(logData3, "y3", value3.toFloat(), false); + + // прочитаем путь к файлу последнего сохранения + String filePath = readDataDB(id); + + // если данные о файле отсутствуют, создадим новый + if (filePath == "failed" || filePath == "") { + SerialPrint("E", F("Loging3"), "'" + id + "' file path not found, start create new file"); + createNewFileWithData(logData3); + return; + } else { + // если файл все же есть но был создан не сегодня, то создаем сегодняшний + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + SerialPrint("E", F("Loging3"), "'" + id + "' file too old, start create new file"); + createNewFileWithData(logData3); + return; + } + } + + // считаем количество строк и определяем размер файла + size_t size = 0; + int lines = countJsonObj(filePath, size); + SerialPrint("i", F("Loging3"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); + + // если количество строк до заданной величины и дата не менялась + if (lines <= points && !hasDayChanged()) { + // просто добавим в существующий файл новые данные + addNewDataToExistingFile(filePath, logData3); + // если больше или поменялась дата то создадим следующий файл + } else { + createNewFileWithData(logData3); + } + // запускаем процедуру удаления старых файлов если память переполняется + deleteLastFile(); + } + + void SetDoByInterval(String valse) { + String value = valse; + // если значение логгирования пустое + if (value == "") { + SerialPrint("E", F("Loging3Event"), "'" + id + "' loging value is empty, return"); + return; + } + // если время не было получено из интернета + if (!isTimeSynch) { + SerialPrint("E", F("Loging3Event"), "'" + id + "' Сant loging - time not synchronized, return"); + return; + } + regEvent(value, F("Loging3Event")); + String logData3; + jsonWriteInt(logData3, "x", unixTime, false); + jsonWriteFloat(logData3, "y1", value.toFloat(), false); + jsonWriteFloat(logData3, "y2", value.toFloat(), false); + jsonWriteFloat(logData3, "y3", value.toFloat(), false); + // прочитаем путь к файлу последнего сохранения + String filePath = readDataDB(id); + + // если данные о файле отсутствуют, создадим новый + if (filePath == "failed" || filePath == "") { + SerialPrint("E", F("Loging3Event"), "'" + id + "' file path not found, start create new file"); + createNewFileWithData(logData3); + return; + } else { + // если файл все же есть но был создан не сегодня, то создаем сегодняшний + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + SerialPrint("E", F("Loging3Event"), "'" + id + "' file too old, start create new file"); + createNewFileWithData(logData3); + return; + } + } + + // считаем количество строк и определяем размер файла + size_t size = 0; + int lines = countJsonObj(filePath, size); + SerialPrint("i", F("Loging3Event"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); + + // если количество строк до заданной величины и дата не менялась + if (lines <= points && !hasDayChanged()) { + // просто добавим в существующий файл новые данные + addNewDataToExistingFile(filePath, logData3); + // если больше или поменялась дата то создадим следующий файл + } else { + createNewFileWithData(logData3); + } + // запускаем процедуру удаления старых файлов если память переполняется + deleteLastFile(); + } + void createNewFileWithData(String &logData) { + logData = logData + ","; + String path = "/lg3/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt + // создадим пустой файл + if (writeEmptyFile(path) != "success") { + SerialPrint("E", F("Loging"), "'" + id + "' file writing error, return"); + return; + } + + // запишем в него данные + if (addFile(path, logData) != "success") { + SerialPrint("E", F("Loging3"), "'" + id + "' data writing error, return"); + return; + } + // запишем путь к нему в базу данных + if (saveDataDB(id, path) != "success") { + SerialPrint("E", F("Loging3"), "'" + id + "' db file writing error, return"); + return; + } + SerialPrint("i", F("Loging3"), "'" + id + "' file created http://" + WiFi.localIP().toString() + path); + } + + void addNewDataToExistingFile(String &path, String &logData) { + logData = logData + ","; + if (addFile(path, logData) != "success") { + SerialPrint("i", F("Loging3"), "'" + id + "' file writing error, return"); + return; + }; + SerialPrint("i", F("Loging3"), "'" + id + "' loging in file http://" + WiFi.localIP().toString() + path); + } + + // данная функция уже перенесена в ядро и будет удалена в последствии + bool hasDayChanged() { + bool changed = false; + String currentDate = getTodayDateDotFormated(); + if (!firstTimeInit) { + if (prevDate != currentDate) { + changed = true; + SerialPrint("i", F("NTP"), F("Change day event")); +#if defined(ESP8266) + FileFS.gc(); +#endif +#if defined(ESP32) +#endif + } + } + firstTimeInit = false; + prevDate = currentDate; + return changed; + } + + void publishValue() { + String dir = "/lg3/" + id; + filesList = getFilesList(dir); + + SerialPrint("i", F("Loging3"), "file list: " + filesList); + + int f = 0; + + bool noData = true; + + while (filesList.length()) { + String path = selectToMarker(filesList, ";"); + + path = "/lg3/" + id + path; + + f++; + + unsigned long fileUnixTimeLocal = getFileUnixLocalTime(path); + + unsigned long reqUnixTime = strDateToUnix(getItemValue(id + "-date")); + if (fileUnixTimeLocal > reqUnixTime && fileUnixTimeLocal < reqUnixTime + 86400) { + noData = false; + String json = getAdditionalJson(); + if (_publishType == TO_MQTT) { + publishChartFileToMqtt(path, id, calculateMaxCount()); + } else if (_publishType == TO_WS) { + sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); + } else if (_publishType == TO_MQTT_WS) { + sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); + publishChartFileToMqtt(path, id, calculateMaxCount()); + } + SerialPrint("i", F("Loging3"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", sent"); + } else { + SerialPrint("i", F("Loging3"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", skipped"); + } + + filesList = deleteBeforeDelimiter(filesList, ";"); + } + // если данных нет отправляем пустой грфик + if (noData) { + clearValue(); + } + } + + String getAdditionalJson() { + String topic = mqttRootDevice + "/" + id; + String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\"}"; + return json; + } + + void publishChartToWsSinglePoint(String value) { + String topic = mqttRootDevice + "/" + id; + String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + ",\"y2\":" + value + ",\"y3\":" + value + "}]}"; + sendStringToWs("chartb", json, -1); + } + + void clearValue() { + String topic = mqttRootDevice + "/" + id; + String json = "{\"maxCount\":0,\"topic\":\"" + topic + "\",\"status\":[]}"; + sendStringToWs("chartb", json, -1); + } + + void clearHistory() { + String dir = "/lg3/" + id; + cleanDirectory(dir); + } + + void deleteLastFile() { + IoTFSInfo tmp = getFSInfo(); + SerialPrint("i", "Loging3", String(tmp.freePer) + " % free flash remaining"); + if (tmp.freePer <= 20.00) { + String dir = "/lg3/" + id; + filesList = getFilesList(dir); + int i = 0; + while (filesList.length()) { + String path = selectToMarker(filesList, ";"); + path = dir + path; + i++; + if (i == 1) { + removeFile(path); + SerialPrint("!", "Loging3", String(i) + ") " + path + " => oldest files been deleted"); + return; + } + + filesList = deleteBeforeDelimiter(filesList, ";"); + } + } + } + + void setPublishDestination(int publishType, int wsNum) { + _publishType = publishType; + _wsNum = wsNum; + } + + String getValue() { + return ""; + } +/* + void loop() { + if (enableDoByInt) { + currentMillis = millis(); + difference = currentMillis - prevMillis; + if (difference >= interval) { + prevMillis = millis(); + if (interval != 0) { + this->doByInterval(); + } + } + } + } +*/ + void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) { + String userDate = getItemValue(id + "-date"); + String currentDate = getTodayDateDotFormated(); + // отправляем в график данные только когда выбран сегодняшний день + if (userDate == currentDate) { + // generateEvent(_id, value); + // publishStatusMqtt(_id, value); + + publishChartToWsSinglePoint(value); + // SerialPrint("i", "Sensor " + consoleInfo, "'" + _id + "' data: " + value + "'"); + } + } + + // просто максимальное количество точек + int calculateMaxCount() { + return 86400; + } + + // путь вида: /lg/log/1231231.txt + unsigned long getFileUnixLocalTime(String path) { + return gmtTimeToLocal(selectToMarkerLast(deleteToMarkerLast(path, "."), "/").toInt() + START_DATETIME); + } + void setValue(const IoTValue &Value, bool genEvent = true) { + value = Value; + this->SetDoByInterval(String(value.valD)); + SerialPrint("i", "Loging3", "setValue:" + String(value.valD)); + regEvent(value.valS, "Loging3", false, genEvent); + } +}; + +void *getAPI_Loging3(String subtype, String param) { + if (subtype == F("Loging3")) { + return new Loging3(param); + } else { + return nullptr; + } +} + +class Date : public IoTItem { + private: + bool firstTime = true; + + public: + String id; + Date(String parameters) : IoTItem(parameters) { + jsonRead(parameters, F("id"), id); + value.isDecimal = false; + } + + void setValue(const String &valStr, bool genEvent = true) { + value.valS = valStr; + setValue(value, genEvent); + } + + void setValue(const IoTValue &Value, bool genEvent = true) { + value = Value; + regEvent(value.valS, "", false, genEvent); + // отправка данных при изменении даты + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { + if ((*it)->getSubtype() == "Loging3") { + if ((*it)->getID() == selectToMarker(id, "-")) { + (*it)->setPublishDestination(TO_MQTT_WS, -1); + (*it)->publishValue(); + } + } + } + } + + void setTodayDate() { + setValue(getTodayDateDotFormated()); + SerialPrint("E", F("Loging3"), "today date set " + getTodayDateDotFormated()); + } + + void doByInterval() { + if (isTimeSynch) { + if (firstTime) { + setTodayDate(); + firstTime = false; + } + } + } +}; + +void *getAPI_Date3(String param) { + return new Date(param); +} diff --git a/src/modules/virtual/Loging3/modinfo.json b/src/modules/virtual/Loging3/modinfo.json new file mode 100644 index 00000000..11a9420d --- /dev/null +++ b/src/modules/virtual/Loging3/modinfo.json @@ -0,0 +1,51 @@ +{ + "menuSection": "virtual_elments", + "configItem": [ + { + "global": 0, + "name": "Тройной график", + "type": "Writing", + "subtype": "Loging3", + "id": "log3", + "widget": "chart6", + "page": "Графики", + "descr": "Датчик", + "num": 1, + "int": 5, + "logid1": "t", + "logid2": "h", + "logid3": "p", + "points": 300, + "series1": "Температура, С", + "series2": "Влажность, %", + "series3": "Давление, кПа" + } + ], + "about": { + "authorName": "Serghei Crasnicov", + "authorContact": "https://t.me/Serghei63", + "authorGit": "https://github.com/Serghei63", + "specialThanks": "@itsid1 @Valiuhaaa Serg", + "moduleName": "Loging3", + "moduleVersion": "0.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "Логирование в график", + "moduleDesc": "Расширение позволяющее логировать любую величину в график. Графики доступны в мобильном приложении и в веб интерфейсе. Данные графиков хранятся в встроенной памяти esp. В окне ввода даты можно выбирать день, историю которого вы хотите посмотреть. Старые файлы будут удаляться автоматически после того как объем оставшейся flesh памяти устройства будет менее 20 процентов", + "propInfo": { + "int": "Интервал логирования в мнутах, рекомендуется для esp8266 использоать интервал не менее 5-ти минут", + "logid1": "ID 1 величины которую будем логировать (температура)", + "logid2": "ID 2 величины которую будем логировать (влажность)", + "logid3": "ID 3 величины которую будем логировать (давление)", + "points": "Максимальное количество точек в одном файле, может быть не более 300. Не рекомендуется менять этот параметр" + } + }, + "defActive": false, + "usedLibs": { + "esp32*": [], + "esp82*": [] + + } +} \ No newline at end of file diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index 5b7bf79d..7170db7e 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -3,6 +3,7 @@ #if defined(ESP32) #include #endif +#include "DebugTrace.h" #define TRIESONE 20 // количество секунд ожидания подключения к одной сети из несколких #define TRIES 30 // количество секунд ожидания подключения сети если она одна @@ -50,6 +51,10 @@ void WiFiEvent(arduino_event_t *event) mqttInit(); SerialPrint("i", F("WIFI"), F("Network Init")); + bool postMsgTelegram; + if (!jsonRead(settingsFlashJson, "debugTraceMsgTlgrm", postMsgTelegram, false)) postMsgTelegram = 1; + sendDebugTraceAndFreeMemory(postMsgTelegram); + // Отключаем AP при успешном подключении WiFi.softAPdisconnect(true); break; @@ -70,6 +75,7 @@ void WiFiEvent(arduino_event_t *event) } else { // если попытки подключения исчерпаны, то переходим в AP + sendDebugTraceAndFreeMemory(false); startAPMode(); } break; From 692a36bf376bed34664cdf36c04ff905a9c6d9b1 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Fri, 28 Mar 2025 22:47:10 +0300 Subject: [PATCH 086/118] fix chart 2x 3x --- src/modules/virtual/Loging2/Loging2.cpp | 264 ++++++++++++------- src/modules/virtual/Loging3/Loging3.cpp | 333 ++++++++++++++---------- 2 files changed, 374 insertions(+), 223 deletions(-) diff --git a/src/modules/virtual/Loging2/Loging2.cpp b/src/modules/virtual/Loging2/Loging2.cpp index 71573552..3749bbb8 100644 --- a/src/modules/virtual/Loging2/Loging2.cpp +++ b/src/modules/virtual/Loging2/Loging2.cpp @@ -5,8 +5,9 @@ void *getAPI_Date2(String params); -class Loging2 : public IoTItem { - private: +class Loging2 : public IoTItem +{ +private: String logid1; String logid2; String id; @@ -17,29 +18,31 @@ class Loging2 : public IoTItem { int _wsNum = -1; int points; - //int keepdays; + // int keepdays; IoTItem *dateIoTItem; String prevDate = ""; bool firstTimeInit = true; - // long interval; + // long interval; - public: - Loging2(String parameters) : IoTItem(parameters) { +public: + Loging2(String parameters) : IoTItem(parameters) + { jsonRead(parameters, F("logid1"), logid1); jsonRead(parameters, F("logid2"), logid2); jsonRead(parameters, F("id"), id); jsonRead(parameters, F("points"), points); - if (points > 300) { + if (points > 300) + { points = 300; SerialPrint("E", F("Loging2"), "'" + id + "' user set more points than allowed, value reset to 300"); } long interval; - jsonRead(parameters, F("int"), interval); - interval = interval * 60; // приводим к милисекундам - //jsonRead(parameters, F("keepdays"), keepdays, false); + jsonRead(parameters, F("int"), interval); // в минутах + setInterval(interval * 60); + // jsonRead(parameters, F("keepdays"), keepdays, false); // создадим экземпляр класса даты dateIoTItem = (IoTItem *)getAPI_Date2("{\"id\": \"" + id + "-date\",\"int\":\"20\",\"subtype\":\"date\"}"); @@ -47,28 +50,33 @@ class Loging2 : public IoTItem { SerialPrint("I", F("Loging2"), "created date instance " + id); } - void doByInterval() { + void doByInterval() + { // если объект логгирования не был создан - if (!isItemExist(logid1)) { + if (!isItemExist(logid1)) + { SerialPrint("E", F("Loging2"), "'" + id + "' loging object not exist, return"); return; } String value = getItemValue(logid1); // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging2"), "'" + id + "' loging value is empty, return"); return; } - String value2 = getItemValue(logid2); + String value2 = getItemValue(logid2); // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging2"), "'" + id + "' loging value is empty, return"); return; } // если время не было получено из интернета - if (!isTimeSynch) { + if (!isTimeSynch) + { SerialPrint("E", F("Loging2"), "'" + id + "' Сant loging - time not synchronized, return"); return; } @@ -85,13 +93,17 @@ class Loging2 : public IoTItem { String filePath = readDataDB(id); // если данные о файле отсутствуют, создадим новый - if (filePath == "failed" || filePath == "") { + if (filePath == "failed" || filePath == "") + { SerialPrint("E", F("Loging2"), "'" + id + "' file path not found, start create new file"); createNewFileWithData(logData2); return; - } else { + } + else + { // если файл все же есть но был создан не сегодня, то создаем сегодняшний - if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) + { SerialPrint("E", F("Loging2"), "'" + id + "' file too old, start create new file"); createNewFileWithData(logData2); return; @@ -104,26 +116,32 @@ class Loging2 : public IoTItem { SerialPrint("i", F("Loging2"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); // если количество строк до заданной величины и дата не менялась - if (lines <= points && !hasDayChanged()) { + if (lines <= points && !hasDayChanged()) + { // просто добавим в существующий файл новые данные addNewDataToExistingFile(filePath, logData2); // если больше или поменялась дата то создадим следующий файл - } else { + } + else + { createNewFileWithData(logData2); } // запускаем процедуру удаления старых файлов если память переполняется deleteLastFile(); } - - void SetDoByInterval(String valse) { +/* + void SetDoByInterval(String valse) + { String value = valse; // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging2Event"), "'" + id + "' loging value is empty, return"); return; } // если время не было получено из интернета - if (!isTimeSynch) { + if (!isTimeSynch) + { SerialPrint("E", F("Loging2Event"), "'" + id + "' Сant loging - time not synchronized, return"); return; } @@ -136,13 +154,17 @@ class Loging2 : public IoTItem { String filePath = readDataDB(id); // если данные о файле отсутствуют, создадим новый - if (filePath == "failed" || filePath == "") { + if (filePath == "failed" || filePath == "") + { SerialPrint("E", F("Loging2Event"), "'" + id + "' file path not found, start create new file"); createNewFileWithData(logData2); return; - } else { + } + else + { // если файл все же есть но был создан не сегодня, то создаем сегодняшний - if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) + { SerialPrint("E", F("Loging2Event"), "'" + id + "' file too old, start create new file"); createNewFileWithData(logData2); return; @@ -155,41 +177,51 @@ class Loging2 : public IoTItem { SerialPrint("i", F("Loging2Event"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); // если количество строк до заданной величины и дата не менялась - if (lines <= points && !hasDayChanged()) { + if (lines <= points && !hasDayChanged()) + { // просто добавим в существующий файл новые данные addNewDataToExistingFile(filePath, logData2); // если больше или поменялась дата то создадим следующий файл - } else { + } + else + { createNewFileWithData(logData2); } // запускаем процедуру удаления старых файлов если память переполняется deleteLastFile(); } - void createNewFileWithData(String &logData) { +*/ + void createNewFileWithData(String &logData) + { logData = logData + ","; - String path = "/lg2/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt + String path = "/lg2/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt // создадим пустой файл - if (writeEmptyFile(path) != "success") { + if (writeEmptyFile(path) != "success") + { SerialPrint("E", F("Loging2"), "'" + id + "' file writing error, return"); return; } // запишем в него данные - if (addFile(path, logData) != "success") { + if (addFile(path, logData) != "success") + { SerialPrint("E", F("Loging2"), "'" + id + "' data writing error, return"); return; } // запишем путь к нему в базу данных - if (saveDataDB(id, path) != "success") { + if (saveDataDB(id, path) != "success") + { SerialPrint("E", F("Loging2"), "'" + id + "' db file writing error, return"); return; } SerialPrint("i", F("Loging2"), "'" + id + "' file created http://" + WiFi.localIP().toString() + path); } - void addNewDataToExistingFile(String &path, String &logData) { + void addNewDataToExistingFile(String &path, String &logData) + { logData = logData + ","; - if (addFile(path, logData) != "success") { + if (addFile(path, logData) != "success") + { SerialPrint("i", F("Loging2"), "'" + id + "' file writing error, return"); return; }; @@ -197,11 +229,14 @@ class Loging2 : public IoTItem { } // данная функция уже перенесена в ядро и будет удалена в последствии - bool hasDayChanged() { + bool hasDayChanged() + { bool changed = false; String currentDate = getTodayDateDotFormated(); - if (!firstTimeInit) { - if (prevDate != currentDate) { + if (!firstTimeInit) + { + if (prevDate != currentDate) + { changed = true; SerialPrint("i", F("NTP"), F("Change day event")); #if defined(ESP8266) @@ -216,7 +251,8 @@ class Loging2 : public IoTItem { return changed; } - void publishValue() { + void publishValue() + { String dir = "/lg2/" + id; filesList = getFilesList(dir); @@ -226,7 +262,8 @@ class Loging2 : public IoTItem { bool noData = true; - while (filesList.length()) { + while (filesList.length()) + { String path = selectToMarker(filesList, ";"); path = "/lg2/" + id + path; @@ -236,65 +273,83 @@ class Loging2 : public IoTItem { unsigned long fileUnixTimeLocal = getFileUnixLocalTime(path); unsigned long reqUnixTime = strDateToUnix(getItemValue(id + "-date")); - if (fileUnixTimeLocal > reqUnixTime && fileUnixTimeLocal < reqUnixTime + 86400) { + if (fileUnixTimeLocal > reqUnixTime && fileUnixTimeLocal < reqUnixTime + 86400) + { noData = false; String json = getAdditionalJson(); - if (_publishType == TO_MQTT) { + if (_publishType == TO_MQTT) + { publishChartFileToMqtt(path, id, calculateMaxCount()); - } else if (_publishType == TO_WS) { + } + else if (_publishType == TO_WS) + { sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); - } else if (_publishType == TO_MQTT_WS) { + } + else if (_publishType == TO_MQTT_WS) + { sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); publishChartFileToMqtt(path, id, calculateMaxCount()); } SerialPrint("i", F("Loging2"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", sent"); - } else { + } + else + { SerialPrint("i", F("Loging2"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", skipped"); } filesList = deleteBeforeDelimiter(filesList, ";"); } // если данных нет отправляем пустой грфик - if (noData) { + if (noData) + { clearValue(); } } - String getAdditionalJson() { + String getAdditionalJson() + { String topic = mqttRootDevice + "/" + id; String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\"}"; return json; } - void publishChartToWsSinglePoint(String value) { + void publishChartToWsSinglePoint(String value) + { String topic = mqttRootDevice + "/" + id; - String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + ",\"y2\":" + value + "}]}"; + String value2 = getItemValue(logid2); + String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + ",\"y2\":" + value2 + "}]}"; sendStringToWs("chartb", json, -1); } - void clearValue() { + void clearValue() + { String topic = mqttRootDevice + "/" + id; String json = "{\"maxCount\":0,\"topic\":\"" + topic + "\",\"status\":[]}"; sendStringToWs("chartb", json, -1); } - void clearHistory() { + void clearHistory() + { String dir = "/lg2/" + id; cleanDirectory(dir); } - void deleteLastFile() { + void deleteLastFile() + { IoTFSInfo tmp = getFSInfo(); SerialPrint("i", "Loging2", String(tmp.freePer) + " % free flash remaining"); - if (tmp.freePer <= 20.00) { + if (tmp.freePer <= 20.00) + { String dir = "/lg/" + id; filesList = getFilesList(dir); int i = 0; - while (filesList.length()) { + while (filesList.length()) + { String path = selectToMarker(filesList, ";"); path = dir + path; i++; - if (i == 1) { + if (i == 1) + { removeFile(path); SerialPrint("!", "Loging2", String(i) + ") " + path + " => oldest files been deleted"); return; @@ -305,33 +360,37 @@ class Loging2 : public IoTItem { } } - void setPublishDestination(int publishType, int wsNum) { + void setPublishDestination(int publishType, int wsNum) + { _publishType = publishType; _wsNum = wsNum; } - String getValue() { + String getValue() + { return ""; } -/* - void loop() { - if (enableDoByInt) { - currentMillis = millis(); - difference = currentMillis - prevMillis; - if (difference >= interval) { - prevMillis = millis(); - if (interval != 0) { - this->doByInterval(); + /* + void loop() { + if (enableDoByInt) { + currentMillis = millis(); + difference = currentMillis - prevMillis; + if (difference >= interval) { + prevMillis = millis(); + if (interval != 0) { + this->doByInterval(); + } } } } - } -*/ - void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) { + */ + void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) + { String userDate = getItemValue(id + "-date"); String currentDate = getTodayDateDotFormated(); // отправляем в график данные только когда выбран сегодняшний день - if (userDate == currentDate) { + if (userDate == currentDate) + { // generateEvent(_id, value); // publishStatusMqtt(_id, value); @@ -341,53 +400,69 @@ class Loging2 : public IoTItem { } // просто максимальное количество точек - int calculateMaxCount() { + int calculateMaxCount() + { return 86400; } // путь вида: /lg/log/1231231.txt - unsigned long getFileUnixLocalTime(String path) { + unsigned long getFileUnixLocalTime(String path) + { return gmtTimeToLocal(selectToMarkerLast(deleteToMarkerLast(path, "."), "/").toInt() + START_DATETIME); } - void setValue(const IoTValue &Value, bool genEvent = true) { + /* + void setValue(const IoTValue &Value, bool genEvent = true) + { value = Value; this->SetDoByInterval(String(value.valD)); SerialPrint("i", "Loging2", "setValue:" + String(value.valD)); regEvent(value.valS, "Loging2", false, genEvent); } +*/ }; -void *getAPI_Loging2(String subtype, String param) { - if (subtype == F("Loging2")) { +void *getAPI_Loging2(String subtype, String param) +{ + if (subtype == F("Loging2")) + { return new Loging2(param); - } else { + } + else + { return nullptr; } } -class Date : public IoTItem { - private: +class Date : public IoTItem +{ +private: bool firstTime = true; - public: +public: String id; - Date(String parameters) : IoTItem(parameters) { + Date(String parameters) : IoTItem(parameters) + { jsonRead(parameters, F("id"), id); value.isDecimal = false; } - void setValue(const String &valStr, bool genEvent = true) { + void setValue(const String &valStr, bool genEvent = true) + { value.valS = valStr; setValue(value, genEvent); } - void setValue(const IoTValue &Value, bool genEvent = true) { + void setValue(const IoTValue &Value, bool genEvent = true) + { value = Value; regEvent(value.valS, "", false, genEvent); // отправка данных при изменении даты - for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { - if ((*it)->getSubtype() == "Loging2") { - if ((*it)->getID() == selectToMarker(id, "-")) { + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) + { + if ((*it)->getSubtype() == "Loging2") + { + if ((*it)->getID() == selectToMarker(id, "-")) + { (*it)->setPublishDestination(TO_MQTT_WS, -1); (*it)->publishValue(); } @@ -395,14 +470,18 @@ class Date : public IoTItem { } } - void setTodayDate() { + void setTodayDate() + { setValue(getTodayDateDotFormated()); SerialPrint("E", F("Loging2"), "today date set " + getTodayDateDotFormated()); } - void doByInterval() { - if (isTimeSynch) { - if (firstTime) { + void doByInterval() + { + if (isTimeSynch) + { + if (firstTime) + { setTodayDate(); firstTime = false; } @@ -410,6 +489,7 @@ class Date : public IoTItem { } }; -void *getAPI_Date2(String param) { +void *getAPI_Date2(String param) +{ return new Date(param); } diff --git a/src/modules/virtual/Loging3/Loging3.cpp b/src/modules/virtual/Loging3/Loging3.cpp index 0a2dcfa9..fa9254f3 100644 --- a/src/modules/virtual/Loging3/Loging3.cpp +++ b/src/modules/virtual/Loging3/Loging3.cpp @@ -5,8 +5,9 @@ void *getAPI_Date3(String params); -class Loging3 : public IoTItem { - private: +class Loging3 : public IoTItem +{ +private: String logid1; String logid2; String logid3; @@ -18,31 +19,33 @@ class Loging3 : public IoTItem { int _wsNum = -1; int points; - //int keepdays; + // int keepdays; IoTItem *dateIoTItem; String prevDate = ""; bool firstTimeInit = true; - //long interval; + // long interval; - public: - Loging3(String parameters) : IoTItem(parameters) { +public: + Loging3(String parameters) : IoTItem(parameters) + { jsonRead(parameters, F("logid1"), logid1); jsonRead(parameters, F("logid2"), logid2); jsonRead(parameters, F("logid3"), logid3); jsonRead(parameters, F("id"), id); jsonRead(parameters, F("points"), points); - if (points > 300) { + if (points > 300) + { points = 300; SerialPrint("E", F("Loging3"), "'" + id + "' user set more points than allowed, value reset to 300"); } long interval; - jsonRead(parameters, F("int"), interval); - interval = interval * 60; // приводим к милисекундам - //jsonRead(parameters, F("keepdays"), keepdays, false); + jsonRead(parameters, F("int"), interval); // в минутах + setInterval(interval * 60); + // jsonRead(parameters, F("keepdays"), keepdays, false); // создадим экземпляр класса даты dateIoTItem = (IoTItem *)getAPI_Date3("{\"id\": \"" + id + "-date\",\"int\":\"20\",\"subtype\":\"date\"}"); @@ -50,41 +53,47 @@ class Loging3 : public IoTItem { SerialPrint("I", F("Loging3"), "created date instance " + id); } - void doByInterval() { + void doByInterval() + { // если объект логгирования не был создан - if (!isItemExist(logid1)) { + if (!isItemExist(logid1)) + { SerialPrint("E", F("Loging3"), "'" + id + "' loging object not exist, return"); return; } String value = getItemValue(logid1); // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging3"), "'" + id + "' loging value is empty, return"); return; } - String value2 = getItemValue(logid2); + String value2 = getItemValue(logid2); // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging3"), "'" + id + "' loging value is empty, return"); return; } - String value3 = getItemValue(logid3); + String value3 = getItemValue(logid3); // если значение логгирования пустое - if (value == "") { + if (value == "") + { SerialPrint("E", F("Loging3"), "'" + id + "' loging value is empty, return"); return; } // если время не было получено из интернета - if (!isTimeSynch) { + if (!isTimeSynch) + { SerialPrint("E", F("Loging"), "'" + id + "' Сant loging - time not synchronized, return"); return; } regEvent(value, F("Loging3")); - //String logData2; + // String logData2; String logData3; jsonWriteInt(logData3, "x", unixTime, false); @@ -96,13 +105,17 @@ class Loging3 : public IoTItem { String filePath = readDataDB(id); // если данные о файле отсутствуют, создадим новый - if (filePath == "failed" || filePath == "") { + if (filePath == "failed" || filePath == "") + { SerialPrint("E", F("Loging3"), "'" + id + "' file path not found, start create new file"); createNewFileWithData(logData3); return; - } else { + } + else + { // если файл все же есть но был создан не сегодня, то создаем сегодняшний - if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) + { SerialPrint("E", F("Loging3"), "'" + id + "' file too old, start create new file"); createNewFileWithData(logData3); return; @@ -115,93 +128,103 @@ class Loging3 : public IoTItem { SerialPrint("i", F("Loging3"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); // если количество строк до заданной величины и дата не менялась - if (lines <= points && !hasDayChanged()) { + if (lines <= points && !hasDayChanged()) + { // просто добавим в существующий файл новые данные addNewDataToExistingFile(filePath, logData3); // если больше или поменялась дата то создадим следующий файл - } else { + } + else + { createNewFileWithData(logData3); } // запускаем процедуру удаления старых файлов если память переполняется deleteLastFile(); } - - void SetDoByInterval(String valse) { - String value = valse; - // если значение логгирования пустое - if (value == "") { - SerialPrint("E", F("Loging3Event"), "'" + id + "' loging value is empty, return"); - return; - } - // если время не было получено из интернета - if (!isTimeSynch) { - SerialPrint("E", F("Loging3Event"), "'" + id + "' Сant loging - time not synchronized, return"); - return; - } - regEvent(value, F("Loging3Event")); - String logData3; - jsonWriteInt(logData3, "x", unixTime, false); - jsonWriteFloat(logData3, "y1", value.toFloat(), false); - jsonWriteFloat(logData3, "y2", value.toFloat(), false); - jsonWriteFloat(logData3, "y3", value.toFloat(), false); - // прочитаем путь к файлу последнего сохранения - String filePath = readDataDB(id); - - // если данные о файле отсутствуют, создадим новый - if (filePath == "failed" || filePath == "") { - SerialPrint("E", F("Loging3Event"), "'" + id + "' file path not found, start create new file"); - createNewFileWithData(logData3); - return; - } else { - // если файл все же есть но был создан не сегодня, то создаем сегодняшний - if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { - SerialPrint("E", F("Loging3Event"), "'" + id + "' file too old, start create new file"); + /* + void SetDoByInterval(String valse) { + String value = valse; + // если значение логгирования пустое + if (value == "") { + SerialPrint("E", F("Loging3Event"), "'" + id + "' loging value is empty, return"); + return; + } + // если время не было получено из интернета + if (!isTimeSynch) { + SerialPrint("E", F("Loging3Event"), "'" + id + "' Сant loging - time not synchronized, return"); + return; + } + regEvent(value, F("Loging3Event")); + String logData3; + jsonWriteInt(logData3, "x", unixTime, false); + jsonWriteFloat(logData3, "y1", value.toFloat(), false); + jsonWriteFloat(logData3, "y2", value.toFloat(), false); + jsonWriteFloat(logData3, "y3", value.toFloat(), false); + // прочитаем путь к файлу последнего сохранения + String filePath = readDataDB(id); + + // если данные о файле отсутствуют, создадим новый + if (filePath == "failed" || filePath == "") { + SerialPrint("E", F("Loging3Event"), "'" + id + "' file path not found, start create new file"); createNewFileWithData(logData3); return; + } else { + // если файл все же есть но был создан не сегодня, то создаем сегодняшний + if (getTodayDateDotFormated() != getDateDotFormatedFromUnix(getFileUnixLocalTime(filePath))) { + SerialPrint("E", F("Loging3Event"), "'" + id + "' file too old, start create new file"); + createNewFileWithData(logData3); + return; + } } - } - // считаем количество строк и определяем размер файла - size_t size = 0; - int lines = countJsonObj(filePath, size); - SerialPrint("i", F("Loging3Event"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); + // считаем количество строк и определяем размер файла + size_t size = 0; + int lines = countJsonObj(filePath, size); + SerialPrint("i", F("Loging3Event"), "'" + id + "' " + "lines = " + String(lines) + ", size = " + String(size)); - // если количество строк до заданной величины и дата не менялась - if (lines <= points && !hasDayChanged()) { - // просто добавим в существующий файл новые данные - addNewDataToExistingFile(filePath, logData3); - // если больше или поменялась дата то создадим следующий файл - } else { - createNewFileWithData(logData3); + // если количество строк до заданной величины и дата не менялась + if (lines <= points && !hasDayChanged()) { + // просто добавим в существующий файл новые данные + addNewDataToExistingFile(filePath, logData3); + // если больше или поменялась дата то создадим следующий файл + } else { + createNewFileWithData(logData3); + } + // запускаем процедуру удаления старых файлов если память переполняется + deleteLastFile(); } - // запускаем процедуру удаления старых файлов если память переполняется - deleteLastFile(); - } - void createNewFileWithData(String &logData) { + */ + void createNewFileWithData(String &logData) + { logData = logData + ","; - String path = "/lg3/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt + String path = "/lg3/" + id + "/" + String(unixTimeShort) + ".txt"; // создадим путь вида /lg/id/133256622333.txt // создадим пустой файл - if (writeEmptyFile(path) != "success") { + if (writeEmptyFile(path) != "success") + { SerialPrint("E", F("Loging"), "'" + id + "' file writing error, return"); return; } // запишем в него данные - if (addFile(path, logData) != "success") { + if (addFile(path, logData) != "success") + { SerialPrint("E", F("Loging3"), "'" + id + "' data writing error, return"); return; } // запишем путь к нему в базу данных - if (saveDataDB(id, path) != "success") { + if (saveDataDB(id, path) != "success") + { SerialPrint("E", F("Loging3"), "'" + id + "' db file writing error, return"); return; } SerialPrint("i", F("Loging3"), "'" + id + "' file created http://" + WiFi.localIP().toString() + path); } - void addNewDataToExistingFile(String &path, String &logData) { + void addNewDataToExistingFile(String &path, String &logData) + { logData = logData + ","; - if (addFile(path, logData) != "success") { + if (addFile(path, logData) != "success") + { SerialPrint("i", F("Loging3"), "'" + id + "' file writing error, return"); return; }; @@ -209,11 +232,14 @@ class Loging3 : public IoTItem { } // данная функция уже перенесена в ядро и будет удалена в последствии - bool hasDayChanged() { + bool hasDayChanged() + { bool changed = false; String currentDate = getTodayDateDotFormated(); - if (!firstTimeInit) { - if (prevDate != currentDate) { + if (!firstTimeInit) + { + if (prevDate != currentDate) + { changed = true; SerialPrint("i", F("NTP"), F("Change day event")); #if defined(ESP8266) @@ -228,7 +254,8 @@ class Loging3 : public IoTItem { return changed; } - void publishValue() { + void publishValue() + { String dir = "/lg3/" + id; filesList = getFilesList(dir); @@ -238,7 +265,8 @@ class Loging3 : public IoTItem { bool noData = true; - while (filesList.length()) { + while (filesList.length()) + { String path = selectToMarker(filesList, ";"); path = "/lg3/" + id + path; @@ -248,65 +276,84 @@ class Loging3 : public IoTItem { unsigned long fileUnixTimeLocal = getFileUnixLocalTime(path); unsigned long reqUnixTime = strDateToUnix(getItemValue(id + "-date")); - if (fileUnixTimeLocal > reqUnixTime && fileUnixTimeLocal < reqUnixTime + 86400) { + if (fileUnixTimeLocal > reqUnixTime && fileUnixTimeLocal < reqUnixTime + 86400) + { noData = false; String json = getAdditionalJson(); - if (_publishType == TO_MQTT) { + if (_publishType == TO_MQTT) + { publishChartFileToMqtt(path, id, calculateMaxCount()); - } else if (_publishType == TO_WS) { + } + else if (_publishType == TO_WS) + { sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); - } else if (_publishType == TO_MQTT_WS) { + } + else if (_publishType == TO_MQTT_WS) + { sendFileToWsByFrames(path, "charta", json, _wsNum, WEB_SOCKETS_FRAME_SIZE); publishChartFileToMqtt(path, id, calculateMaxCount()); } SerialPrint("i", F("Loging3"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", sent"); - } else { + } + else + { SerialPrint("i", F("Loging3"), String(f) + ") " + path + ", " + getDateTimeDotFormatedFromUnix(fileUnixTimeLocal) + ", skipped"); } filesList = deleteBeforeDelimiter(filesList, ";"); } // если данных нет отправляем пустой грфик - if (noData) { + if (noData) + { clearValue(); } } - String getAdditionalJson() { + String getAdditionalJson() + { String topic = mqttRootDevice + "/" + id; String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\"}"; return json; } - void publishChartToWsSinglePoint(String value) { + void publishChartToWsSinglePoint(String value) + { String topic = mqttRootDevice + "/" + id; - String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + ",\"y2\":" + value + ",\"y3\":" + value + "}]}"; + String value2 = getItemValue(logid2); + String value3 = getItemValue(logid3); + String json = "{\"maxCount\":" + String(calculateMaxCount()) + ",\"topic\":\"" + topic + "\",\"status\":[{\"x\":" + String(unixTime) + ",\"y1\":" + value + ",\"y2\":" + value2 + ",\"y3\":" + value3 + "}]}"; sendStringToWs("chartb", json, -1); } - void clearValue() { + void clearValue() + { String topic = mqttRootDevice + "/" + id; String json = "{\"maxCount\":0,\"topic\":\"" + topic + "\",\"status\":[]}"; sendStringToWs("chartb", json, -1); } - void clearHistory() { + void clearHistory() + { String dir = "/lg3/" + id; cleanDirectory(dir); } - void deleteLastFile() { + void deleteLastFile() + { IoTFSInfo tmp = getFSInfo(); SerialPrint("i", "Loging3", String(tmp.freePer) + " % free flash remaining"); - if (tmp.freePer <= 20.00) { + if (tmp.freePer <= 20.00) + { String dir = "/lg3/" + id; filesList = getFilesList(dir); int i = 0; - while (filesList.length()) { + while (filesList.length()) + { String path = selectToMarker(filesList, ";"); path = dir + path; i++; - if (i == 1) { + if (i == 1) + { removeFile(path); SerialPrint("!", "Loging3", String(i) + ") " + path + " => oldest files been deleted"); return; @@ -317,33 +364,37 @@ class Loging3 : public IoTItem { } } - void setPublishDestination(int publishType, int wsNum) { + void setPublishDestination(int publishType, int wsNum) + { _publishType = publishType; _wsNum = wsNum; } - String getValue() { + String getValue() + { return ""; } -/* - void loop() { - if (enableDoByInt) { - currentMillis = millis(); - difference = currentMillis - prevMillis; - if (difference >= interval) { - prevMillis = millis(); - if (interval != 0) { - this->doByInterval(); + /* + void loop() { + if (enableDoByInt) { + currentMillis = millis(); + difference = currentMillis - prevMillis; + if (difference >= interval) { + prevMillis = millis(); + if (interval != 0) { + this->doByInterval(); + } } } } - } -*/ - void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) { + */ + void regEvent(const String &value, const String &consoleInfo, bool error = false, bool genEvent = true) + { String userDate = getItemValue(id + "-date"); String currentDate = getTodayDateDotFormated(); // отправляем в график данные только когда выбран сегодняшний день - if (userDate == currentDate) { + if (userDate == currentDate) + { // generateEvent(_id, value); // publishStatusMqtt(_id, value); @@ -353,53 +404,68 @@ class Loging3 : public IoTItem { } // просто максимальное количество точек - int calculateMaxCount() { + int calculateMaxCount() + { return 86400; } // путь вида: /lg/log/1231231.txt - unsigned long getFileUnixLocalTime(String path) { + unsigned long getFileUnixLocalTime(String path) + { return gmtTimeToLocal(selectToMarkerLast(deleteToMarkerLast(path, "."), "/").toInt() + START_DATETIME); } + /* void setValue(const IoTValue &Value, bool genEvent = true) { value = Value; this->SetDoByInterval(String(value.valD)); SerialPrint("i", "Loging3", "setValue:" + String(value.valD)); regEvent(value.valS, "Loging3", false, genEvent); } + */ }; -void *getAPI_Loging3(String subtype, String param) { - if (subtype == F("Loging3")) { +void *getAPI_Loging3(String subtype, String param) +{ + if (subtype == F("Loging3")) + { return new Loging3(param); - } else { + } + else + { return nullptr; } } -class Date : public IoTItem { - private: +class Date : public IoTItem +{ +private: bool firstTime = true; - public: +public: String id; - Date(String parameters) : IoTItem(parameters) { + Date(String parameters) : IoTItem(parameters) + { jsonRead(parameters, F("id"), id); value.isDecimal = false; } - void setValue(const String &valStr, bool genEvent = true) { + void setValue(const String &valStr, bool genEvent = true) + { value.valS = valStr; setValue(value, genEvent); } - void setValue(const IoTValue &Value, bool genEvent = true) { + void setValue(const IoTValue &Value, bool genEvent = true) + { value = Value; regEvent(value.valS, "", false, genEvent); // отправка данных при изменении даты - for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { - if ((*it)->getSubtype() == "Loging3") { - if ((*it)->getID() == selectToMarker(id, "-")) { + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) + { + if ((*it)->getSubtype() == "Loging3") + { + if ((*it)->getID() == selectToMarker(id, "-")) + { (*it)->setPublishDestination(TO_MQTT_WS, -1); (*it)->publishValue(); } @@ -407,14 +473,18 @@ class Date : public IoTItem { } } - void setTodayDate() { + void setTodayDate() + { setValue(getTodayDateDotFormated()); SerialPrint("E", F("Loging3"), "today date set " + getTodayDateDotFormated()); } - void doByInterval() { - if (isTimeSynch) { - if (firstTime) { + void doByInterval() + { + if (isTimeSynch) + { + if (firstTime) + { setTodayDate(); firstTime = false; } @@ -422,6 +492,7 @@ class Date : public IoTItem { } }; -void *getAPI_Date3(String param) { +void *getAPI_Date3(String param) +{ return new Date(param); } From 3a2ac1666b127ceb28062bf189d7d36cdf15a2fc Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 29 Mar 2025 00:21:42 +0300 Subject: [PATCH 087/118] *web* fix render chart --- data_full/build/bundle.js.gz | Bin 51213 -> 51202 bytes data_svelte/build/bundle.js.gz | Bin 51213 -> 51202 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data_full/build/bundle.js.gz b/data_full/build/bundle.js.gz index d2e526ebbf26645765b9269f2b1b667896539e19..08f2a2cdcc444c22565212173489e104977ef14e 100644 GIT binary patch literal 51202 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 HKf?k5WY!3E literal 51213 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 SmH>71JO2ehS+u?X!U6y`a1bT{ diff --git a/data_svelte/build/bundle.js.gz b/data_svelte/build/bundle.js.gz index d2e526ebbf26645765b9269f2b1b667896539e19..08f2a2cdcc444c22565212173489e104977ef14e 100644 GIT binary patch literal 51202 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 HKf?k5WY!3E literal 51213 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 SmH>71JO2ehS+u?X!U6y`a1bT{ From 17dadf5745113fea0af7480cd95b2f5a70a813b2 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 29 Mar 2025 20:17:18 +0300 Subject: [PATCH 088/118] upd version, upd ectoControl --- data_full/index.html | 2 +- data_svelte/index.html | 2 +- include/Const.h | 2 +- .../EctoControlAdapter/EctoControlAdapter.cpp | 55 +++++---- .../exec/EctoControlAdapter/ModbusEC.cpp | 110 ++++++++++++------ 5 files changed, 104 insertions(+), 67 deletions(-) diff --git a/data_full/index.html b/data_full/index.html index bbcd166f..407b5bd5 100644 --- a/data_full/index.html +++ b/data_full/index.html @@ -4,7 +4,7 @@ - IoT Manager 4.5.5 + IoT Manager 4.6.0 diff --git a/data_svelte/index.html b/data_svelte/index.html index bbcd166f..407b5bd5 100644 --- a/data_svelte/index.html +++ b/data_svelte/index.html @@ -4,7 +4,7 @@ - IoT Manager 4.5.5 + IoT Manager 4.6.0 diff --git a/include/Const.h b/include/Const.h index 691983f0..6ac1c62e 100644 --- a/include/Const.h +++ b/include/Const.h @@ -2,7 +2,7 @@ #include "BuildTime.h" // Версия прошивки -#define FIRMWARE_VERSION 457 +#define FIRMWARE_VERSION 461 #ifdef esp8266_1mb_ota #define FIRMWARE_NAME "esp8266_1mb_ota" diff --git a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp index ea4700cc..18511cc6 100644 --- a/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp +++ b/src/modules/exec/EctoControlAdapter/EctoControlAdapter.cpp @@ -8,7 +8,6 @@ // #include "Stream.h" #include - // class ModbusUart; Stream *_modbusUART = nullptr; @@ -21,7 +20,6 @@ uint8_t _DIR_PIN = 0; #define MODBUS_TX_PIN 19 // Tx pin #define MODBUS_SERIAL_BAUD 9600 // Baud rate for esp32 and max485 communication - void modbusPreTransmission() { // delay(500); @@ -52,7 +50,7 @@ class EctoControlAdapter : public IoTItem int protocol = SERIAL_8N1; uint8_t _addr = 0xF0; // Адрес слейва от 1 до 247 uint8_t _type = 0x14; // Тип устройства: 0x14 – адаптер OpenTherm (вторая версия); 0x11 – адаптер OpenTherm (первая версия, снята с производства) - bool _debugLevel; // Дебаг + uint8_t _debugLevel; // Дебаг ModbusMaster node; uint8_t _debug; @@ -136,36 +134,39 @@ class EctoControlAdapter : public IoTItem { SerialPrint("E", "EctoControlAdapter", "Не подходящее устройство, type: " + String(type, HEX)); } + getModelVersion(); + getBoilerInfo(); + getBoilerStatus(); } else if (_addr == 0) { // если адреса нет, то шлем широковещательный запрос адреса uint8_t addr = node.readAddresEctoControl(); SerialPrint("I", "EctoControlAdapter", "readAddresEctoControl, addr: " + String(addr, HEX) + " - Enter to configuration"); } - getModelVersion(); - getBoilerInfo(); - getBoilerStatus(); } void doByInterval() { - // readBoilerInfo(); - getBoilerStatus(); + if (_addr > 0) + { + // readBoilerInfo(); + getBoilerStatus(); - getCodeError(); - getCodeErrorExt(); - if (info.adapterType == 0) - getFlagErrorOT(); - // getFlowRate(); - // getMaxSetCH(); - // getMaxSetDHW(); - // getMinSetCH(); - // getMinSetDHW(); - getModLevel(); - getPressure(); - getTempCH(); - getTempDHW(); - getTempOutside(); + getCodeError(); + getCodeErrorExt(); + if (info.adapterType == 0) + getFlagErrorOT(); + // getFlowRate(); + // getMaxSetCH(); + // getMaxSetDHW(); + // getMinSetCH(); + // getMinSetDHW(); + getModLevel(); + getPressure(); + getTempCH(); + getTempDHW(); + getTempOutside(); + } } void loop() @@ -176,10 +177,6 @@ class EctoControlAdapter : public IoTItem IoTValue execute(String command, std::vector ¶m) { - if (command == "getModelVersion") - { - getModelVersion(); - } if (command == "getModelVersion") { getModelVersion(); @@ -324,13 +321,12 @@ class EctoControlAdapter : public IoTItem tlgrmItem->sendTelegramMsg(false, msg); } - ~EctoControlAdapter() { - }; + ~EctoControlAdapter(){}; bool writeFunctionModBus(const uint16_t ®, uint16_t &data) { // set word 0 of TX buffer to least-significant word of counter (bits 15..0) - //node.setTransmitBuffer(1, lowWord(data)); + // node.setTransmitBuffer(1, lowWord(data)); // set word 1 of TX buffer to most-significant word of counter (bits 31..16) node.setTransmitBuffer(0, data); // slave: write TX buffer to (2) 16-bit registers starting at register 0 @@ -348,6 +344,7 @@ class EctoControlAdapter : public IoTItem bool readFunctionModBus(const uint16_t ®, uint16_t &reading) { + if (_addr == 0) return false; // float retValue = 0; if (_modbusUART) { diff --git a/src/modules/exec/EctoControlAdapter/ModbusEC.cpp b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp index 029e448b..d9d0818e 100644 --- a/src/modules/exec/EctoControlAdapter/ModbusEC.cpp +++ b/src/modules/exec/EctoControlAdapter/ModbusEC.cpp @@ -1,6 +1,9 @@ #include "ModbusEC.h" +#define COUNT_BIT_AVAIL 5 +#define COUNT_BIT_AVAIL_46F 4 + ModbusMaster::ModbusMaster(void) { _idle = 0; @@ -256,8 +259,8 @@ uint8_t ModbusMaster::readHoldingRegisters(uint16_t u16ReadAddress, /** Modbus function 0x06 Write Single Register. -This function code is used to write a single holding register in a -remote device. The request specifies the address of the register to be +This function code is used to write a single holding register in a +remote device. The request specifies the address of the register to be written. Registers are addressed starting at zero. @param u16WriteAddress address of the holding register (0x0000..0xFFFF) @@ -266,7 +269,7 @@ written. Registers are addressed starting at zero. @ingroup register */ uint8_t ModbusMaster::writeSingleRegister(uint16_t u16WriteAddress, - uint16_t u16WriteValue) + uint16_t u16WriteValue) { _u16WriteAddress = u16WriteAddress; _u16WriteQty = 0; @@ -274,7 +277,6 @@ uint8_t ModbusMaster::writeSingleRegister(uint16_t u16WriteAddress, return ModbusMasterTransaction(ku8MBWriteSingleRegister); } - /** Modbus function 0x10 Write Multiple Registers. @@ -308,7 +310,8 @@ uint8_t ModbusMaster::readAddresEctoControl() { _u16ReadAddress = 0x00; _u16ReadQty = 1; - return ModbusMasterTransaction(ku8MBProgRead46); + ModbusMasterTransaction(ku8MBProgRead46); + return getResponseBuffer(0x00); } uint8_t ModbusMaster::writeAddresEctoControl(uint8_t addr) { @@ -393,8 +396,17 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) { u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); } + // if (u8MBFunction == ku8MBProgRead46 || u8MBFunction == ku8MBProgWrite47) + // { + // u8ModbusADU[u8ModbusADUSize++] = highByte(u16CRC); + // u8ModbusADU[u8ModbusADUSize++] = lowByte(u16CRC); + // } + // else + // { u8ModbusADU[u8ModbusADUSize++] = lowByte(u16CRC); u8ModbusADU[u8ModbusADUSize++] = highByte(u16CRC); + // } + u8ModbusADU[u8ModbusADUSize] = 0; // flush receive buffer before transmitting request @@ -427,7 +439,9 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) #if __MODBUSMASTER_DEBUG__ digitalWrite(__MODBUSMASTER_DEBUG_PIN_A__, true); #endif - u8ModbusADU[u8ModbusADUSize++] = _serial->read(); + uint8_t req = _serial->read(); + u8ModbusADU[u8ModbusADUSize++] = req; + Serial.print(req, HEX); u8BytesLeft--; #if __MODBUSMASTER_DEBUG__ digitalWrite(__MODBUSMASTER_DEBUG_PIN_A__, false); @@ -448,26 +462,34 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) } // evaluate slave ID, function code once enough bytes have been read - if (u8ModbusADUSize == 5) + uint8_t count; + if (u8MBFunction == ku8MBProgRead46 || u8MBFunction == ku8MBProgWrite47) + count = COUNT_BIT_AVAIL_46F; + else + count = COUNT_BIT_AVAIL; + + if (u8ModbusADUSize == count) { - // verify response is for correct Modbus slave - if (u8ModbusADU[0] != _u8MBSlave) + if (u8MBFunction != ku8MBProgRead46 && u8MBFunction != ku8MBProgWrite47) { - // Serial.print(u8ModbusADU[0], HEX); - // Serial.print(" != "); - // Serial.println(_u8MBSlave, HEX); - - u8MBStatus = ku8MBInvalidSlaveID; - break; - } + // verify response is for correct Modbus slave + if (u8ModbusADU[0] != _u8MBSlave) + { + // Serial.print(u8ModbusADU[0], HEX); + // Serial.print(" != "); + // Serial.println(_u8MBSlave, HEX); - // verify response is for correct Modbus function code (mask exception bit 7) - if ((u8ModbusADU[1] & 0x7F) != u8MBFunction) - { - u8MBStatus = ku8MBInvalidFunction; - break; - } + u8MBStatus = ku8MBInvalidSlaveID; + break; + } + // verify response is for correct Modbus function code (mask exception bit 7) + if ((u8ModbusADU[1] & 0x7F) != u8MBFunction) + { + u8MBStatus = ku8MBInvalidFunction; + break; + } + } // check whether Modbus exception occurred; return Modbus Exception Code if (bitRead(u8ModbusADU[1], 7)) { @@ -485,6 +507,16 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) case ku8MBWriteMultipleRegisters: u8BytesLeft = 3; break; + + case ku8MBProgRead46: + u8BytesLeft = 1; + break; + + case ku8MBProgWrite47: + u8BytesLeft = 1; + break; + + default: } } if ((millis() - u32StartTime) > ku16MBResponseTimeout) @@ -493,24 +525,26 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) } } - // verify response is large enough to inspect further - if (!u8MBStatus && u8ModbusADUSize >= 5) + if (u8MBFunction != ku8MBProgRead46 && u8MBFunction != ku8MBProgWrite47) { - // calculate CRC - u16CRC = 0xFFFF; - for (i = 0; i < (u8ModbusADUSize - 2); i++) + // verify response is large enough to inspect further + if (!u8MBStatus && u8ModbusADUSize >= COUNT_BIT_AVAIL) { - u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); - } + // calculate CRC + u16CRC = 0xFFFF; + for (i = 0; i < (u8ModbusADUSize - 2); i++) + { + u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); + } - // verify CRC - if (!u8MBStatus && (lowByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 2] || - highByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 1])) - { - u8MBStatus = ku8MBInvalidCRC; + // verify CRC + if (!u8MBStatus && (lowByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 2] || + highByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 1])) + { + u8MBStatus = ku8MBInvalidCRC; + } } } - // disassemble ADU into words if (!u8MBStatus) { @@ -530,6 +564,12 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) } break; case ku8MBProgRead46: + Serial.print("ku8MBProgRead46"); + for (i = 0; i < (u8ModbusADUSize); i++) + { + Serial.println(u8ModbusADU[i], HEX); + } + _u16ResponseBuffer[0] = (uint16_t)u8ModbusADU[2]; _u8ResponseBufferLength = 1; break; From ff7a3550d28559c42e8072f5b166c2a3b542b593 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 29 Mar 2025 20:32:13 +0300 Subject: [PATCH 089/118] fix sync time bk7231n --- src/NTP.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/NTP.cpp b/src/NTP.cpp index c6b3a227..bac99e72 100644 --- a/src/NTP.cpp +++ b/src/NTP.cpp @@ -64,6 +64,10 @@ void synchTime() { if (sntp_enabled()) { sntp_stop(); } + sntp_setoperatingmode(SNTP_OPMODE_POLL); + sntp_setservername(0, jsonReadStr(settingsFlashJson, F("ntp")).c_str()); + sntp_setservername(1, "pool.ntp.org"); + sntp_setservername(2, "ru.pool.ntp.org"); sntp_init(); #else From 444bd6c201d9cfece97d232adb1704840f9da89c Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sun, 30 Mar 2025 20:55:44 +0300 Subject: [PATCH 090/118] *web* chart color --- data_full/build/bundle.js.gz | Bin 51202 -> 51201 bytes data_svelte/build/bundle.js.gz | Bin 51202 -> 51201 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data_full/build/bundle.js.gz b/data_full/build/bundle.js.gz index 08f2a2cdcc444c22565212173489e104977ef14e..729d6ae03ec698974df34ccb7c2d8eb6ffd37bd5 100644 GIT binary patch literal 51201 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 G!vX-&ow2(B literal 51202 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 HKf?k5WY!3E diff --git a/data_svelte/build/bundle.js.gz b/data_svelte/build/bundle.js.gz index 08f2a2cdcc444c22565212173489e104977ef14e..729d6ae03ec698974df34ccb7c2d8eb6ffd37bd5 100644 GIT binary patch literal 51201 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 G!vX-&ow2(B literal 51202 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 HKf?k5WY!3E From 1ead6a7e025bff52013d3c337edf632b921e5e68 Mon Sep 17 00:00:00 2001 From: Ilya Date: Tue, 13 May 2025 22:10:24 +0300 Subject: [PATCH 091/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E?= =?UTF-8?q?=20hexstr=20=D0=B2=20uint32=5Ft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/StringUtils.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/utils/StringUtils.cpp b/src/utils/StringUtils.cpp index bfb0ec1d..d6c8c3f7 100644 --- a/src/utils/StringUtils.cpp +++ b/src/utils/StringUtils.cpp @@ -103,6 +103,7 @@ uint8_t hexStringToUint8(const String& hex) { if (tmp >= 0x00 && tmp <= 0xFF) { return tmp; } + return 0; } uint16_t hexStringToUint16(const String& hex) { @@ -110,6 +111,15 @@ uint16_t hexStringToUint16(const String& hex) { if (tmp >= 0x0000 && tmp <= 0xFFFF) { return tmp; } + return 0; +} + +uint32_t hexStringToUint32(const String& hex) { + uint32_t tmp = strtol(hex.c_str(), NULL, 0); + if (tmp >= 0x0000 && tmp <= 0xFFFFFF) { + return tmp; + } + return 0; } size_t itemsCount2(String str, const String& separator) { From 9b54a179e5d8afa90443548173c07c846ca4e722 Mon Sep 17 00:00:00 2001 From: Ilya Date: Tue, 13 May 2025 22:11:54 +0300 Subject: [PATCH 092/118] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D1=8F=D0=B5=D0=BC=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D0=BA=20=D0=B2=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=20AhtXX?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/AhtXX/AhtXX.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/sensors/AhtXX/AhtXX.cpp b/src/modules/sensors/AhtXX/AhtXX.cpp index a49e8fe1..7bac81c1 100644 --- a/src/modules/sensors/AhtXX/AhtXX.cpp +++ b/src/modules/sensors/AhtXX/AhtXX.cpp @@ -88,7 +88,7 @@ void* getAPI_AhtXX(String subtype, String param) { if (ahts.find(addr) == ahts.end()) { int shtType; - jsonRead(param, "type", shtType); + jsonRead(param, "shtType", shtType); ahts[addr] = new AHTxx(hexStringToUint8(addr), (AHTXX_I2C_SENSOR)shtType); From e9cc823ebfe4f97692791d0d8bf6a4c898ea29fd Mon Sep 17 00:00:00 2001 From: Ilya Date: Tue, 13 May 2025 22:13:18 +0300 Subject: [PATCH 093/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20?= =?UTF-8?q?=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?led=20=D0=BB=D0=B5=D0=BD=D1=82=D0=BE=D0=B9=20LedFX?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/display/LedFX/LedFX.cpp | 332 ++++++++++++++++++ src/modules/display/LedFX/modinfo.json | 163 +++++++++ ...\270\320\276\320\264\320\276\320\262.json" | 125 +++++++ 3 files changed, 620 insertions(+) create mode 100644 src/modules/display/LedFX/LedFX.cpp create mode 100644 src/modules/display/LedFX/modinfo.json create mode 100644 "src/modules/display/LedFX/\320\237\321\200\320\270\320\274\320\265\321\200 \320\275\320\260 7 \320\264\320\270\320\276\320\264\320\276\320\262.json" diff --git a/src/modules/display/LedFX/LedFX.cpp b/src/modules/display/LedFX/LedFX.cpp new file mode 100644 index 00000000..8515d389 --- /dev/null +++ b/src/modules/display/LedFX/LedFX.cpp @@ -0,0 +1,332 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include "ESPConfiguration.h" +#include + + + +WS2812FX *_glob_strip = nullptr; // глобальный указатель на WS2812FX для использования в функциях для кастомных эффектов +std::vector vuMeterBands; // массив указателей на элементы IoTValue, которые будут использоваться для передачи данных в эффект VU Meter + +uint16_t vuMeter2(void) { +// функция взята из WS2812FX.cpp для демонстрации возможности создания своего алгоритма эффекта +// в данном случае - VU Meter имеет тот же смысл отображения уровня сигнала, что и в WS2812FX с сохранением алгоритма вывода данных из нескольких источников +// но вместо использования внешнего источника данных для встроенного эффекта, мы используем данные из других элементов конфигурации IoTM +// Если данные не поступают (IoTValue.valS == "1"), то используется генерация случайных чисел для демонстрации работы эффекта + + if (_glob_strip == nullptr) return 0; // Проверяем, инициализирована ли библиотека WS2812FX + + uint16_t numBands = vuMeterBands.size(); // Получаем количество полос VU Meter из массива указателей + if (numBands == 0) return 0; // Если нет полос, выходим из функции + + WS2812FX::Segment* seg = _glob_strip->getSegment(); + uint16_t seglen = seg->stop - seg->start + 1; + uint16_t bandSize = seglen / numBands; + + if (vuMeterBands[0]->valS == "R") + for (uint8_t i=0; i < numBands; i++) { + int randomData = vuMeterBands[i]->valD + _glob_strip->random8(32) - _glob_strip->random8(32); + vuMeterBands[i]->valD = (randomData < 0 || randomData > 255) ? 128 : randomData; + } + + for(uint8_t i=0; ivalD)); + uint8_t scaledBand = (vuMeterBands[i]->valD * bandSize) / 256; + for(uint16_t j=0; jstart + (i * bandSize) + j; + if(j <= scaledBand) { + if(j < bandSize - 4) _glob_strip->setPixelColor(index, GREEN); + else if(j < bandSize - 2) _glob_strip->setPixelColor(index, YELLOW); + else _glob_strip->setPixelColor(index, RED); + } else { + _glob_strip->setPixelColor(index, BLACK); + } + } + } + _glob_strip->setCycle(); + + return seg->speed; +} + + +class LedFX : public IoTItem +{ +private: + WS2812FX *_strip; + + int _data_pin = 2; + int _numLeds = 1; + int _brightness = 100; + int _speed = 15000; + int _effectsMode = 0; + int _valueMode = 0; + int _color = 0xFF0000; // default color red + + uint8_t _BrightnessFadeOutStep = 0; + uint8_t _BrightnessFadeOutMin = 1; + uint8_t _BrightnessFadeInStep = 0; + uint8_t _BrightnessFadeInMax = 50; + +public: + LedFX(String parameters) : IoTItem(parameters) { + jsonRead(parameters, F("data_pin"), _data_pin); + jsonRead(parameters, F("speed"), _speed); + jsonRead(parameters, F("numLeds"), _numLeds); + jsonRead(parameters, F("brightness"), _brightness); + + String tmpStr; + jsonRead(parameters, F("color"), tmpStr); + _color = hexStringToUint32(tmpStr); + + jsonRead(parameters, F("effectsMode"), _effectsMode); + jsonRead(parameters, F("valueMode"), _valueMode); + + + //_strip = new WS2812FX(_numLeds, _data_pin, NEO_BRG + NEO_KHZ400); // SM16703 + _strip = new WS2812FX(_numLeds, _data_pin, NEO_GRB + NEO_KHZ800); // WS2812B + + if (_strip != nullptr) { + _glob_strip = _strip; // Сохраняем указатель в глобальной переменной + + _strip->init(); + _strip->setBrightness(_brightness); + _strip->setSpeed(_speed); + _strip->setMode(_effectsMode); + _strip->setColor(_color); + if (_effectsMode >= 0) _strip->start(); + } + } + + void fadeOutNonBlocking() { + + } + + void loop() { + if (!_strip) return; + + static unsigned long lastUpdate = 0; // Время последнего обновления + unsigned long now = millis(); + if (now - lastUpdate >= 70) { // Проверяем, прошло ли достаточно времени + lastUpdate = now; + + if (_BrightnessFadeOutStep > 0) { + int currentBrightness = _strip->getBrightness(); // Получаем текущую яркость + currentBrightness -= _BrightnessFadeOutStep; + if (currentBrightness < _BrightnessFadeOutMin) { + currentBrightness = _BrightnessFadeOutMin; // Убедимся, что яркость не уйдет в отрицательные значения + _BrightnessFadeOutStep = 0; // Останавливаем затухание + } + _strip->setBrightness(currentBrightness); + _strip->show(); + } + + if (_BrightnessFadeInStep > 0) { + int currentBrightness = _strip->getBrightness(); // Получаем текущую яркость + currentBrightness += _BrightnessFadeInStep; + if (currentBrightness > _BrightnessFadeInMax) { + currentBrightness = _BrightnessFadeInMax; // Убедимся, что яркость не уйдет за пределы + _BrightnessFadeInStep = 0; // Останавливаем затухание + } + _strip->setBrightness(currentBrightness); + _strip->show(); + } + } + + _strip->service(); + IoTItem::loop(); + } + + void doByInterval() { + + } + + IoTValue execute(String command, std::vector ¶m) { + if (!_strip) return {}; + if (command == "fadeOut") { + if (param.size() == 2) { + _BrightnessFadeOutMin = param[0].valD; + _BrightnessFadeOutStep = param[1].valD; + SerialPrint("E", "Strip LedFX", "BrightnessFadeOut"); + } + + } else if (command == "fadeIn") { + if (param.size() == 2) { + _BrightnessFadeInMax = param[0].valD; + _BrightnessFadeInStep = param[1].valD; + SerialPrint("E", "Strip LedFX", "BrightnessFadeIn"); + } + + } else if (command == "setColor") { + if (param.size() == 1) { + _color = hexStringToUint32(param[0].valS); + _strip->setColor(_color); + _strip->show(); + SerialPrint("E", "Strip LedFX", "setColor:" + param[0].valS); + } + + } else if (command == "setEffect") { + if (param.size() == 1) { + if (param[0].valD < 0 | param[0].valD > 79) + _effectsMode = random(0, 79); + else + _effectsMode = param[0].valD; + _strip->setMode(_effectsMode); + _strip->show(); + _strip->start(); + SerialPrint("E", "Strip LedFX", "setEffect:" + param[0].valS); + } + + } else if (command == "setSpeed") { + if (param.size() == 1) { + _speed = param[0].valD; + _strip->setSpeed(_speed); + _strip->show(); + SerialPrint("E", "Strip LedFX", "setSpeed:" + param[0].valS); + } + + } else if (command == "setBrightness") { + if (param.size() == 1) { + _brightness = param[0].valD; + _strip->setBrightness(_brightness); + _strip->show(); + SerialPrint("E", "Strip LedFX", "setBrightness:" + param[0].valS); + } + + } else if (command == "stop") { + _strip->stop(); + SerialPrint("E", "Strip LedFX", "stop"); + + } else if (command == "start") { + _strip->start(); + SerialPrint("E", "Strip LedFX", "start"); + + } else if (command == "pause") { + _strip->pause(); + SerialPrint("E", "Strip LedFX", "pause"); + + } else if (command == "resume") { + _strip->resume(); + SerialPrint("E", "Strip LedFX", "resume"); + + } else if (command == "setSegment") { + if (param.size() == 6) { + _strip->setSegment(param[0].valD, param[1].valD, param[2].valD, param[3].valD, hexStringToUint32(param[4].valS), param[5].valD); + _strip->show(); + _strip->start(); + SerialPrint("E", "Strip LedFX", "setSegment:" + param[0].valS + " start:" + param[1].valS + " stop:" + param[2].valS + " mode:" + param[3].valS, " color:" + param[4].valS + " speed:" + param[5].valS); + } + + } else if(command == "noShowOne"){ + if (param.size() == 1) { + _strip->setPixelColor(param[0].valD, _strip->Color(0, 0, 0)); + _strip->show(); + SerialPrint("E", "Strip LedFX", "noShowOne"); + } + + } else if (command == "showLed"){ + if (param.size() == 2) { + uint32_t color = hexStringToUint32(param[1].valS); + _strip->setPixelColor(param[0].valD, color); + _strip->show(); + _strip->start(); + SerialPrint("E", "Strip LedFX", "showLed:" + param[0].valS + " color:" + param[1].valS); + } + + } else if (command == "vuMeter") { + if (param.size() == 2) { + int bandCnt = param[0].valD; + if (param[1].valS == "") { + for (int i=0; i < vuMeterBands.size(); i++) { + delete vuMeterBands[i]; + } + vuMeterBands.clear(); + + for (uint8_t i=0; i < bandCnt; i++) { + IoTValue *band = new IoTValue(); // создаем новый элемент IoTValue для полос VU Meter + band->valD = 0; + band->valS = "R"; + vuMeterBands.push_back(band); // добавляем указатель в массив + } + } else { + // Очищаем массив vuMeterBands перед заполнением + vuMeterBands.clear(); + + String id; + String idsStr = param[1].valS; + // Разделяем строку idsStr на идентификаторы, используя запятую как разделитель + while (idsStr.length() > 0) { + // Извлекаем идентификатор до первой запятой + id = selectToMarker(idsStr, ","); + + // Ищем элемент IoTItem по идентификатору + IoTItem* item = findIoTItem(id); + if (item != nullptr) { + // Добавляем указатель на поле value найденного элемента в vuMeterBands + vuMeterBands.push_back(&(item->value)); + SerialPrint("E", "LedFX", "Добавлен элемент в vuMeterBands: " + id); + } else { + SerialPrint("E", "LedFX", "Элемент не найден: " + id); + } + + int8_t oldSize = idsStr.length(); + // Удаляем обработанный идентификатор из строки + idsStr = deleteBeforeDelimiter(idsStr, ","); + if (idsStr.length() == oldSize) { + // Если длина строки не изменилась, значит, больше нет запятых и это был последний идентификатор + break; + } + } + + } + _strip->setCustomMode(vuMeter2); + _strip->setMode(FX_MODE_CUSTOM); + _strip->start(); + SerialPrint("E", "Strip LedFX", "vuMeter bands:" + param[0].valS + " IDs to show:" + param[1].valS); + } + } + + return {}; + } + + void setValue(const IoTValue& Value, bool genEvent = true) { + if (!_strip) return; + + if (_valueMode == 0) { + _strip->setMode(Value.valD); + _effectsMode = Value.valD; + } else if (_valueMode == 1) { + _strip->setBrightness(Value.valD); + _brightness = Value.valD; + } else if (_valueMode == 2) { + _color = hexStringToUint32(Value.valS); + _strip->setColor(_color); + } else if (_valueMode == 3) { + _strip->setSpeed(Value.valD); + _speed = Value.valD; + } + + value = Value; + regEvent(value.valD, "LedFX", false, genEvent); + } + + ~LedFX() { + if (_strip != nullptr) { + delete _strip; + _strip = nullptr; + _glob_strip = nullptr; // Обнуляем глобальный указатель + } + }; +}; + +void *getAPI_LedFX(String subtype, String param) +{ + if (subtype == F("LedFX")) { + return new LedFX(param); + } else { + return nullptr; + } +} + + + + diff --git a/src/modules/display/LedFX/modinfo.json b/src/modules/display/LedFX/modinfo.json new file mode 100644 index 00000000..7b09f028 --- /dev/null +++ b/src/modules/display/LedFX/modinfo.json @@ -0,0 +1,163 @@ +{ + "menuSection": "screens", + "configItem": [ + { + "global": 0, + "name": "LedFX", + "type": "Reading", + "subtype": "LedFX", + "id": "fl", + "widget": "inputTxt", + "page": "Кнопки", + "descr": "Лента", + "int": 15, + "needSave": 0, + + "data_pin": "2", + "numLeds": "3", + "brightness": "50", + "speed": "3000", + "color": "0xFF0000", + "effectsMode": 0, + "valueMode": 0 + } + ], + "about": { + "authorName": "Ilya Belyakov", + "authorContact": "https://t.me/Biveraxe", + "authorGit": "https://github.com/biveraxe", + "exampleURL": "https://iotmanager.org/wiki", + "specialThanks": "Yuriy Kuneev (https://t.me/Kuneev07)", + "moduleName": "LedFX", + "moduleVersion": "1.0.1", + "moduleDesc": "Позволяет управлять адресными светодиодными лентами WS2812B и аналогичными.", + "propInfo": { + "int": "Период времени в секундах обновления.", + "data_pin": "Пин к которому подключена лента.", + "speed": "Скорость обновления ленты.", + "numLeds": "Количество пикселей в ленте.", + "needSave": "Запись значения элемента в энергонезависимую память", + "brightness": "Яркость ленты можно менять из сценария.", + "color": "Цвет ленты в формате 0xRRGGBB, например, 0xFF0000 - красный, 0x00FF00 - зеленый, 0x0000FF - синий.", + "effectsMode": "Режим эффектов ленты. 0-79. 0 - Статичный цвет.", + "valueMode": "Режим применения значения элемета. 0 - установка режима эффектов, 1 - регулирование яркости, 2 - изменение цвета, 3 - изменение скорости." + }, + "title": "Адресная светодиодная лента", + "funcInfo": [ + { + "name": "noShowOne", + "descr": "Выключить один светодиод на ленте", + "params": [ + "номер пикселя" + ] + }, + { + "name": "showLed", + "descr": "Зажечь один диод", + "params": [ + "номер пикселя", + "цвет в формате 0xRRGGBB" + ] + }, + { + "name": "setBrightness", + "descr": "Устанавливает общую яркость ленты от 0 до 255", + "params": [ + "яркость от 0 до 255" + ] + }, + { + "name": "vuMeter", + "descr": "Включает режим VU Meter. Важно что бы элемент ленты был ниже в списке чем элемент с датчиком, ИД которого нужно будет мониторить.", + "params": [ + "Количество каналов для отображения на ленте", + "Список ID датчиков через запятую (если указать пустую строку, то каналы будут заполняться случайными числами от 0 до 255)" + ] + }, + { + "name": "setColor", + "descr": "Устанавливает цвет ленты в формате 0xRRGGBB, например, 0xFF0000 - красный, 0x00FF00 - зеленый, 0x0000FF - синий.", + "params": [ + "цвет в формате 0xRRGGBB" + ] + }, + { + "name": "setEffect", + "descr": "Устанавливает эффект ленты. 0-79. 0 - Статичный цвет.", + "params": [ + "номер эффекта от 0 до 79" + ] + }, + { + "name": "setSpeed", + "descr": "Устанавливает скорость эффекта от 0 до 255", + "params": [ + "скорость от 0 до 255" + ] + }, + { + "name": "fadeOut", + "descr": "Плавное затухание яркости", + "params": [ + "Целевое значение яркости, до которого будет затухать", + "Шаг затухания" + ] + }, + { + "name": "fadeIn", + "descr": "Плавное нарастание яркости", + "params": [ + "Целевое значение яркости, до которого будет нарастать", + "Шаг нарастания" + ] + }, + { + "name": "stop", + "descr": "Останавливает эффект", + "params": [] + + }, + { + "name": "start", + "descr": "Запускает эффект", + "params": [] + + }, + { + "name": "pause", + "descr": "Пауза эффекта", + "params": [] + + }, + { + "name": "resume", + "descr": "Возобновляет эффект", + "params": [] + + }, + { + "name": "setSegment", + "descr": "Устанавливает сегмент ленты", + "params": [ + "номер сегмента от 0 до 7", + "глобальный номер первого пикселя в сегменте", + "глобальный номер последнего пикселя в сегменте", + "номер эффекта от 0 до 79", + "цвет в формате 0xRRGGBB, например, 0xFF0000 - красный, 0x00FF00 - зеленый, 0x0000FF - синий.", + "скорость" + ] + } + ] + }, + "defActive": false, + "usedLibs": { + "esp32*": [ + "aadafruit/Adafruit NeoPixel @ ^1.12.5", + "kitesurfer1404/WS2812FX @ ^1.4.5" + ], + "esp82*": [ + "adafruit/Adafruit NeoPixel @ ^1.12.5", + "kitesurfer1404/WS2812FX @ ^1.4.5" + ] + } +} \ No newline at end of file diff --git "a/src/modules/display/LedFX/\320\237\321\200\320\270\320\274\320\265\321\200 \320\275\320\260 7 \320\264\320\270\320\276\320\264\320\276\320\262.json" "b/src/modules/display/LedFX/\320\237\321\200\320\270\320\274\320\265\321\200 \320\275\320\260 7 \320\264\320\270\320\276\320\264\320\276\320\262.json" new file mode 100644 index 00000000..c034bb0c --- /dev/null +++ "b/src/modules/display/LedFX/\320\237\321\200\320\270\320\274\320\265\321\200 \320\275\320\260 7 \320\264\320\270\320\276\320\264\320\276\320\262.json" @@ -0,0 +1,125 @@ +{ + "mark": "iotm", + "config": [ + { + "global": 0, + "type": "Reading", + "subtype": "AnalogAdc", + "id": "t1", + "widget": "anydataRed", + "page": "Сенсоры", + "descr": "Аналог", + "map": "1,1024,1,255", + "plus": 0, + "multiply": 1, + "round": 1, + "pin": 0, + "int": "1", + "avgSteps": 1 + }, + { + "global": 0, + "type": "Reading", + "subtype": "Variable", + "id": "b1", + "needSave": 0, + "widget": "rangeServo", + "page": "Сенсоры", + "descr": "Бар 1", + "int": "0", + "val": "0.0", + "map": "1024,1024,1,255", + "plus": 0, + "multiply": 1, + "round": 0 + }, + { + "global": 0, + "type": "Reading", + "subtype": "Variable", + "id": "b2", + "needSave": 0, + "widget": "rangeServo", + "page": "Сенсоры", + "descr": "Бар 2", + "int": "0", + "val": "0.0", + "map": "1024,1024,1,255", + "plus": 0, + "multiply": 1, + "round": 0 + }, + { + "global": 0, + "type": "Reading", + "subtype": "LedFX", + "id": "fl20", + "widget": "inputTxt", + "page": "Кнопки", + "descr": "Лента", + "int": 15, + "needSave": 0, + "data_pin": "2", + "numLeds": "7", + "brightness": "50", + "speed": "100", + "color": "0xFF0000", + "effectsMode": "11", + "valueMode": 0, + "show": false + }, + { + "global": 0, + "type": "Reading", + "subtype": "VButton", + "id": "pause", + "needSave": 0, + "widget": "toggle", + "page": "Кнопки", + "descr": "Пауза", + "int": "0", + "val": "0" + }, + { + "global": 0, + "type": "Reading", + "subtype": "VButton", + "id": "bars", + "needSave": 0, + "widget": "toggle", + "page": "Кнопки", + "descr": "Бары", + "int": "0", + "val": "0" + }, + { + "global": 0, + "type": "Reading", + "subtype": "VButton", + "id": "any", + "needSave": 0, + "widget": "toggle", + "page": "Кнопки", + "descr": "Анимация", + "int": "0", + "val": "0" + }, + { + "global": 0, + "type": "Reading", + "subtype": "VButton", + "id": "fade", + "needSave": 0, + "widget": "toggle", + "page": "Кнопки", + "descr": "Скрыть", + "int": "0", + "val": "0" + } + ] +} + +scenario=>if bars then fl20.vuMeter(7, "t1") else fl20.stop() +if any then fl20.setEffect(100) else fl20.stop() +if pause then fl20.pause() else fl20.resume() +if fade then fl20.fadeOut(1, 3) else fl20.fadeIn(60, 3) \ No newline at end of file From d30408c3953ae190acca4cf68582c38e2e47e8b5 Mon Sep 17 00:00:00 2001 From: Ilya Date: Tue, 13 May 2025 22:14:41 +0300 Subject: [PATCH 094/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=20=D0=B4=D0=BB=D1=8F=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20hexStringToUint32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/utils/StringUtils.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/utils/StringUtils.h b/include/utils/StringUtils.h index 9fac0aa5..6d3afa15 100644 --- a/include/utils/StringUtils.h +++ b/include/utils/StringUtils.h @@ -12,6 +12,8 @@ uint8_t hexStringToUint8(const String& hex); uint16_t hexStringToUint16(const String& hex); +uint32_t hexStringToUint32(const String& hex); + String selectToMarkerLast(String str, const String& found); String selectToMarker(String str, const String& found); From d417f96248f442dddb752e743aa10da6cd8d9d58 Mon Sep 17 00:00:00 2001 From: Ilya Date: Tue, 13 May 2025 22:16:21 +0300 Subject: [PATCH 095/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=88=D0=B8=D0=B2=D0=BA=D0=B8=20=D0=94=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=83=D0=BF=D1=80=D0=BE=D1=89=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D1=85=20=D1=88=D0=B0=D0=B3?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B8=20=D0=BE=D1=82=D0=BA=D0=B0=D0=B7=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=82=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=D0=B0=20PlatformIO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 run.py diff --git a/run.py b/run.py new file mode 100644 index 00000000..95808a19 --- /dev/null +++ b/run.py @@ -0,0 +1,109 @@ +# Скрипт для простой прошивки ESP с учетом профиля из myProfile.json и поиска нужной кнопочки в интерфейсе PlatformIO +# Если ничего не указано в параметрах, то выполняется последовательно набор команд: +# 1. run PrepareProject.py +# 2. platformio run -t clean +# 3. platformio run -t uploadfs -е default_envs +# 4. platformio run -t upload -е default_envs +# 5. platformio run -t monitor +# где default_envs - это параметр default_envs из myProfile.json +# +# Если указан параметр -p или --profile <ИмяФайла>, то выполняется первая команда PrepareProject.py -p <ИмяФайла> +# Если указан парамтер -l или --lite, то пропускаются команды 1, 2 и 5 с предварительной компиляцией +# Если указан параметр -d или --debug, то выполняется только команда 4 с предварительной компиляцией + +import os +import subprocess +import sys +import json + +def get_platformio_path(): + """ + Возвращает путь к PlatformIO в зависимости от операционной системы. + """ + if os.name == 'nt': # Windows + return os.path.join(os.environ['USERPROFILE'], '.platformio', 'penv', 'Scripts', 'pio.exe') + else: # Linux/MacOS + return os.path.join(os.environ['HOME'], '.platformio', 'penv', 'bin', 'pio') + +def load_default_envs(profile_path="myProfile.json"): + """ + Загружает значение default_envs из файла myProfile.json. + """ + if not os.path.isfile(profile_path): + print(f"Файл профиля {profile_path} не найден.") + sys.exit(1) + + try: + with open(profile_path, 'r', encoding='utf-8') as file: + profile_data = json.load(file) + return profile_data["projectProp"]["platformio"]["default_envs"] + except KeyError: + print("Не удалось найти ключ 'default_envs' в myProfile.json.") + sys.exit(1) + except json.JSONDecodeError: + print(f"Ошибка при чтении файла {profile_path}: некорректный JSON.") + sys.exit(1) + +def run_command(command): + """ + Выполняет указанную команду в subprocess. + """ + try: + print(f"Выполнение команды: {' '.join(command)}") + subprocess.run(command, check=True) + except subprocess.CalledProcessError as e: + print(f"Ошибка при выполнении команды: {e}") + sys.exit(e.returncode) + +def run_platformio(): + """ + Основная логика выполнения команд в зависимости от параметров. + """ + pio_path = get_platformio_path() + + # Проверяем, существует ли PlatformIO + if not os.path.isfile(pio_path): + print(f"PlatformIO не найден по пути: {pio_path}") + sys.exit(1) + # print(f"PlatformIO найден по пути: {pio_path}") + + # Читаем аргументы командной строки + args = sys.argv[1:] + lite_mode = '-l' in args or '--lite' in args + debug_mode = '-d' in args or '--debug' in args + profile_index = next((i for i, arg in enumerate(args) if arg in ('-p', '--profile')), None) + profile_file = args[profile_index + 1] if profile_index is not None and len(args) > profile_index + 1 else "myProfile.json" + + # Загружаем default_envs из myProfile.json + default_envs = load_default_envs(profile_path=profile_file) + + print(f"Используем default_envs: {default_envs}") + print(f"Режим Lite: {lite_mode}, Режим отладки: {debug_mode}") + print(f"Профиль: {profile_file}") + + # Выполнение команд в зависимости от параметров + if not lite_mode and not debug_mode: + # Полный набор команд + run_command(['python', 'PrepareProject.py', '-p', profile_file]) + + # Добавляем сообщение о необходимости дождаться завершения обновления конфигурации + input(f"\x1b[1;31;42m Подождите завершения обновления конфигурации PlatformIO, затем нажмите Ввод для продолжения...\x1b[0m") + + run_command([pio_path, 'run', '-t', 'clean']) + run_command([pio_path, 'run', '-t', 'uploadfs', '--environment', default_envs]) + run_command([pio_path, 'run', '-t', 'upload', '--environment', default_envs]) + run_command([pio_path, 'run', '-t', 'monitor']) + elif lite_mode: + # Упрощенный режим (пропускаем команды 1, 2 и 5) + run_command([pio_path, 'run', '-t', 'buildfs', '--environment', default_envs]) + run_command([pio_path, 'run', '-t', 'uploadfs', '--environment', default_envs]) + run_command([pio_path, 'run', '--environment', default_envs]) + run_command([pio_path, 'run', '-t', 'upload', '--environment', default_envs]) + elif debug_mode: + # Режим отладки (только команда 4) + run_command([pio_path, 'run', '--environment', default_envs]) + run_command([pio_path, 'run', '-t', 'upload', '--environment', default_envs]) + +if __name__ == "__main__": + run_platformio() + From 060373ec31b07bc507cef2a6672354c527f78fb2 Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 15 May 2025 07:59:54 +0300 Subject: [PATCH 096/118] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D1=8F=D0=B5=D0=BC=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D0=BA=D1=83=20=D0=B2=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B8=D0=B8=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/display/LedFX/modinfo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/display/LedFX/modinfo.json b/src/modules/display/LedFX/modinfo.json index 7b09f028..5c0ad13b 100644 --- a/src/modules/display/LedFX/modinfo.json +++ b/src/modules/display/LedFX/modinfo.json @@ -152,7 +152,7 @@ "defActive": false, "usedLibs": { "esp32*": [ - "aadafruit/Adafruit NeoPixel @ ^1.12.5", + "adafruit/Adafruit NeoPixel @ ^1.12.5", "kitesurfer1404/WS2812FX @ ^1.4.5" ], "esp82*": [ From fbdcb6ee42646716f997cafcda56f79491cfd714 Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 15 May 2025 08:00:44 +0300 Subject: [PATCH 097/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=20board=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrepareProject.py | 2 ++ run.py | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/PrepareProject.py b/PrepareProject.py index 7e8a495d..24bcdc5a 100644 --- a/PrepareProject.py +++ b/PrepareProject.py @@ -13,6 +13,8 @@ # python PrepareProject.py --profile <ИмяФайла> # python PrepareProject.py -p <ИмяФайла> # +# Используя параметры -b или --board можно уточнить для какой платы нужно подготовить проект +# # поддерживаемые контроллеры (профили): # esp8266_4mb # esp8266_16mb diff --git a/run.py b/run.py index 95808a19..44edf8f5 100644 --- a/run.py +++ b/run.py @@ -8,6 +8,7 @@ # где default_envs - это параметр default_envs из myProfile.json # # Если указан параметр -p или --profile <ИмяФайла>, то выполняется первая команда PrepareProject.py -p <ИмяФайла> +# Если указан параметр -b или --board , то выполняется первая команда PrepareProject.py -b # Если указан парамтер -l или --lite, то пропускаются команды 1, 2 и 5 с предварительной компиляцией # Если указан параметр -d или --debug, то выполняется только команда 4 с предварительной компиляцией @@ -74,8 +75,9 @@ def run_platformio(): profile_index = next((i for i, arg in enumerate(args) if arg in ('-p', '--profile')), None) profile_file = args[profile_index + 1] if profile_index is not None and len(args) > profile_index + 1 else "myProfile.json" - # Загружаем default_envs из myProfile.json - default_envs = load_default_envs(profile_path=profile_file) + # Загружаем default_envs из myProfile.json, если не указан параметр -b, который имеет больший приоритет + board_index = next((i for i, arg in enumerate(args) if arg in ('-b', '--board')), None) + default_envs = args[board_index + 1] if board_index is not None and len(args) > board_index + 1 else load_default_envs(profile_path=profile_file) print(f"Используем default_envs: {default_envs}") print(f"Режим Lite: {lite_mode}, Режим отладки: {debug_mode}") From b0d1ec946555cc00e03a99d77a477288cb35edcd Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 15 May 2025 12:31:22 +0300 Subject: [PATCH 098/118] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D1=8F=D0=B5=D0=BC=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D0=BA=D1=83=20=D0=B2=20=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=B8=20LrdFX?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/display/LedFX/LedFX.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/display/LedFX/LedFX.cpp b/src/modules/display/LedFX/LedFX.cpp index 8515d389..b692c811 100644 --- a/src/modules/display/LedFX/LedFX.cpp +++ b/src/modules/display/LedFX/LedFX.cpp @@ -166,7 +166,7 @@ class LedFX : public IoTItem } else if (command == "setEffect") { if (param.size() == 1) { - if (param[0].valD < 0 | param[0].valD > 79) + if (param[0].valD < 0 || param[0].valD > 79) _effectsMode = random(0, 79); else _effectsMode = param[0].valD; From bdb8c29d8f2b1da0529869ec77ae99e4738b665e Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 15 May 2025 12:35:32 +0300 Subject: [PATCH 099/118] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=B8=D1=81=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D0=B5=D0=BC=20onModuleOrder=20=D0=B2=20DwinI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/display/DwinI/DwinI.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/display/DwinI/DwinI.cpp b/src/modules/display/DwinI/DwinI.cpp index 3df8fe8e..ccaa7c9f 100644 --- a/src/modules/display/DwinI/DwinI.cpp +++ b/src/modules/display/DwinI/DwinI.cpp @@ -140,6 +140,8 @@ class DwinI : public IoTUart { void onModuleOrder(String &key, String &value) { if (key == "uploadUI") { //SerialPrint("i", F("DwinI"), "Устанавливаем UI: " + value); + if (value != "") uartPrintHex(value.c_str()); + } } From 892e6d32abaecbeeb5c6d80c8698e5ce2544b3b5 Mon Sep 17 00:00:00 2001 From: Ilya Date: Wed, 21 May 2025 09:35:51 +0300 Subject: [PATCH 100/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=BD=D0=BE=D0=B2=D1=83=D1=8E=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20=D0=B2=20=D1=81=D1=86?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B8=20doByInterval=20=D0=92?= =?UTF-8?q?=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D1=8F=D0=B5=D0=BC=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D0=B2=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=B4=D0=B5=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D0=B5=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=D0=BB=D1=8F=20=D0=B2=D0=BD=D0=B5=20=D0=BF=D0=BB?= =?UTF-8?q?=D0=B0=D0=BD=D0=B0.=20=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D1=81=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=20=D1=81=20=D0=98=D0=94=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0:=20ID.doByInterval()=20=D0=92=D0=BE=D0=B7?= =?UTF-8?q?=D0=B2=D1=80=D0=B0=D1=82=20-=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D0=B2=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20doByInterval?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTScenario.cpp | 7 +++++++ src/modules/sceninfo.json | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 754d12c5..7245b2f8 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -293,6 +293,13 @@ class CallExprAST : public ExprAST { return &ret; } + // вызываем системную функцию периодического выполнения вне таймера + if (Cmd == F("doByInterval")) { + Item->doByInterval(); + ret = Item->value; + return &ret; + } + // если все же все ок, то готовим параметры для передачи в модуль std::vector ArgsAsIoTValue; for (unsigned int i = 0; i < Args.size(); i++) { diff --git a/src/modules/sceninfo.json b/src/modules/sceninfo.json index 53265548..b7d0be54 100644 --- a/src/modules/sceninfo.json +++ b/src/modules/sceninfo.json @@ -14,6 +14,12 @@ "descr": "Получаем количество секунд доверия к значениям элемента. При -2 доверие полное, при -1 время доверия истекло. При >0 время обратного отсчета. Используется только совместно с ИД элемента: ID.getIntFromNet()", "params": [] }, + { + "name": "doByInterval", + "descr": "Выполняем интервальное действие модуля вне плана. Используется только совместно с ИД элемента: ID.doByInterval()", + "params": [], + "return": "значение элемента после выполнения doByInterval" + }, { "name": "exit", "descr": "Прерываем работу сценария и выводим в консоль причину. Причина не обязательна.", From d11f69b08d996a9dec849e39d2f1b38ee6ed54c6 Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 22 May 2025 14:08:28 +0300 Subject: [PATCH 101/118] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D1=83=D0=B5=D0=BC=20=D1=81=D0=BA=D1=80=D0=B8?= =?UTF-8?q?=D0=BF=D1=82=D1=8B=20=D1=81=20=D1=83=D1=87=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=BC=20MACOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrepareServer.py | 4 ++-- tools/patch32_ws.py | 2 +- tools/patch32c6.py | 2 +- tools/patch8266_16m.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/PrepareServer.py b/PrepareServer.py index 7289a2f5..d0750773 100644 --- a/PrepareServer.py +++ b/PrepareServer.py @@ -26,8 +26,8 @@ def copyFileIfExist(fileName, deviceName): deviceName = config["platformio"]["default_envs"] homeDir = os.path.expanduser('~') -os.system(homeDir + "\.platformio\penv\Scripts\pio run") -os.system(homeDir + "\.platformio\penv\Scripts\pio run -t buildfs --disable-auto-clean") +os.system(homeDir + "/.platformio/penv/Scripts/pio run") +os.system(homeDir + "/.platformio/penv/Scripts/pio run -t buildfs --disable-auto-clean") if copyFileIfExist("firmware.bin", deviceName) and copyFileIfExist("littlefs.bin", deviceName): copyFileIfExist("partitions.bin", deviceName) diff --git a/tools/patch32_ws.py b/tools/patch32_ws.py index 33214618..c0914f99 100644 --- a/tools/patch32_ws.py +++ b/tools/patch32_ws.py @@ -11,7 +11,7 @@ pio_home = env.subst("$PROJECT_CORE_DIR") print("PLATFORMIO_DIR" + pio_home) -if platform == "linux" or platform == "linux2": +if platform == "linux" or platform == "linux2" or platform == "darwin": # linux #mainPyPath = '/home/rise/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src/WiFiClient.cpp' mainPyPath = pio_home + '/packages/framework-arduinoespressif32/libraries/WiFi/src/WiFiClient.cpp' diff --git a/tools/patch32c6.py b/tools/patch32c6.py index 5933dc68..e1d569e7 100644 --- a/tools/patch32c6.py +++ b/tools/patch32c6.py @@ -7,7 +7,7 @@ pio_home = env.subst("$PROJECT_CORE_DIR") print("PLATFORMIO_DIR" + pio_home) -if platform == "linux" or platform == "linux2": +if platform == "linux" or platform == "linux2" or platform == "darwin": # linux #devkitm = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitm-1.json' #devkitc = '/home/rise/.platformio/platforms/espressif32/boards/esp32-c6-devkitc-1.json' diff --git a/tools/patch8266_16m.py b/tools/patch8266_16m.py index b65c22de..c6426761 100644 --- a/tools/patch8266_16m.py +++ b/tools/patch8266_16m.py @@ -9,7 +9,7 @@ pio_home = env.subst("$PROJECT_CORE_DIR") print("PLATFORMIO_DIR" + pio_home) -if platform == "linux" or platform == "linux2": +if platform == "linux" or platform == "linux2" or platform == "darwin": #mainPyPath = '/home/rise/.platformio/platforms/espressif8266@4.0.1/builder/main.py' mainPyPath = pio_home + '/platforms/espressif8266@4.0.1/builder/main.py' else: From 33d449d892912db72535634da49666460ab15320 Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 29 May 2025 18:52:23 +0300 Subject: [PATCH 102/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D0=B0=20get?= =?UTF-8?q?Utf8CharByIndex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/utils/StringUtils.h | 2 ++ src/utils/StringUtils.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/utils/StringUtils.h b/include/utils/StringUtils.h index 6d3afa15..62dca319 100644 --- a/include/utils/StringUtils.h +++ b/include/utils/StringUtils.h @@ -51,3 +51,5 @@ unsigned char ChartoHex(char ch); std::vector splitStr(const String& str, const String& delimiter); bool strInVector(const String& str, const std::vector& vec); + +String getUtf8CharByIndex(const String& utf8str, int index); diff --git a/src/utils/StringUtils.cpp b/src/utils/StringUtils.cpp index d6c8c3f7..80cfa61a 100644 --- a/src/utils/StringUtils.cpp +++ b/src/utils/StringUtils.cpp @@ -233,4 +233,29 @@ bool strInVector(const String& str, const std::vector& vec) { if (vec[i] == str) return true; } return false; +} + +String getUtf8CharByIndex(const String& utf8str, int index) { + if (index < 0) index = 0; + + int len = utf8str.length(); + int charCount = 0; + int i = 0; + while (i < len) { + int charLen = 1; + unsigned char c = utf8str[i]; + if ((c & 0x80) == 0x00) charLen = 1; // 0xxxxxxx + else if ((c & 0xE0) == 0xC0) charLen = 2; // 110xxxxx + else if ((c & 0xF0) == 0xE0) charLen = 3; // 1110xxxx + else if ((c & 0xF8) == 0xF0) charLen = 4; // 11110xxx + + if (charCount == index) { + return utf8str.substring(i, i + charLen); + } + + if (i + charLen >= len) return utf8str.substring(i, i + charLen); + i += charLen; + charCount++; + } + return ""; } \ No newline at end of file From 4b98abfa53cdac02fec593177b21db7a61b4e705 Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 29 May 2025 18:53:55 +0300 Subject: [PATCH 103/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20U8g?= =?UTF-8?q?2lib=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=8B=20=D1=81=20=D0=B4=D0=B8=D1=81=D0=BF=D0=BB=D0=B5=D1=8F?= =?UTF-8?q?=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/display/U8g2lib.zip | Bin 0 -> 10908 bytes src/modules/display/U8g2lib/DisplayTypes.h | 631 ++++++++++++++++++ src/modules/display/U8g2lib/U8g2lib.cpp | 419 ++++++++++++ .../display/U8g2lib/example_config.json | 217 ++++++ 4 files changed, 1267 insertions(+) create mode 100644 src/modules/display/U8g2lib.zip create mode 100644 src/modules/display/U8g2lib/DisplayTypes.h create mode 100644 src/modules/display/U8g2lib/U8g2lib.cpp create mode 100644 src/modules/display/U8g2lib/example_config.json diff --git a/src/modules/display/U8g2lib.zip b/src/modules/display/U8g2lib.zip new file mode 100644 index 0000000000000000000000000000000000000000..aacb2535ce60605b654728ff9b23668052740378 GIT binary patch literal 10908 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 literal 0 HcmV?d00001 diff --git a/src/modules/display/U8g2lib/DisplayTypes.h b/src/modules/display/U8g2lib/DisplayTypes.h new file mode 100644 index 00000000..4288dc75 --- /dev/null +++ b/src/modules/display/U8g2lib/DisplayTypes.h @@ -0,0 +1,631 @@ +#pragma once +#include "Global.h" +#include +#include +#include + +// #define DEBUG_DISPLAY + +#define DEFAULT_PAGE_UPDATE_ms 500 +// #define DEFAULT_PAGE_TIME_ms 5000 +// #define DEFAULT_ROTATION 0 +// #define DEFAULT_CONTRAST 10 +#define MIN_CONTRAST 10 +#define MAX_CONTRAST 150 + +#ifndef DEBUG_DISPLAY +#define D_LOG(fmt, ...) \ + do { \ + (void)0; \ + } while (0) +#else +#define D_LOG(fmt, ...) Serial.printf((PGM_P)PSTR(fmt), ##__VA_ARGS__) +#endif + +enum rotation_t : uint8_t { + ROTATION_NONE, + ROTATION_90, + ROTATION_180, + ROTATION_270 +}; + +uint8_t parse_contrast(int val) { + if (val < MIN_CONTRAST) val = MIN_CONTRAST; + if (val > MAX_CONTRAST) val = MAX_CONTRAST; + return val; +}; + +rotation_t parse_rotation(int val) { + if ((val > 0) && (val <= 90)) return ROTATION_90; + if ((val > 90) && (val <= 180)) return ROTATION_180; + if ((val > 180) && (val <= 270)) return ROTATION_270; + return ROTATION_NONE; +}; + +struct DisplayPage { + String key; + uint16_t time; + rotation_t rotate; + String font; + String format; + String valign; + + DisplayPage( + const String& key, + uint16_t time, + rotation_t rotate, + const String& font, + const String& format, + const String& valign) : key{key}, time{time}, rotate{rotate}, font{font}, format{format}, valign{valign} {} + + // void load(const JsonObject& obj) { + // // time = obj["time"].as(); + // // rotate = parse_rotation(obj["rotate"].as()); + // // font = obj["font"].as(); + // // valign = obj["valign"].as(); + // // format = obj["format"].as(); + // } + + // auto item = DisplayPage( pageObj["key"].as(), _update, _rotate, _font); + // // Загрузка настроек страницы + // item.load(pageObj); + // page.push_back(item); + + +}; + +enum position_t { + POS_AUTO, + POS_ABSOLUTE, + POS_RELATIVE, + POS_TEXT +}; + +struct RelativePosition { + float x; + float y; +}; + +struct TextPosition { + uint8_t row; + uint8_t col; +}; + +struct Point { + uint16_t x; + uint16_t y; + + Point() : Point(0, 0) {} + + Point(uint16_t x, uint16_t y) : x{x}, y{y} {} + + Point(const Point& rhv) : Point(rhv.x, rhv.y) {} +}; + +struct Position { + position_t type; + union { + Point abs; + RelativePosition rel; + TextPosition text; + }; + + Position() : type{POS_AUTO} {} + + Position(const Point& pos) : type{POS_ABSOLUTE} { + abs.x = pos.x; + abs.y = pos.y; + } + + Position(const RelativePosition& pos) : type{POS_RELATIVE} { + rel.x = pos.x; + rel.y = pos.y; + } + + Position(const TextPosition& pos) : type{POS_TEXT} { + text.col = pos.col; + text.row = pos.row; + } + + Position(const Position& rhv) : type{rhv.type} { + switch (type) { + case POS_ABSOLUTE: + abs = rhv.abs; + case POS_RELATIVE: + rel = rhv.rel; + case POS_TEXT: + text = rhv.text; + default: + break; + } + } +}; + +class Cursor : public Printable { + private: + Point _size; + + public: + TextPosition pos{0, 0}; + Point abs{0, 0}; + Point chr; + Cursor(){}; + + Cursor(const Point& size, const Point& chr) : _size{size}, chr{chr} { + D_LOG("w: %d, h: %d, ch: %d(%d)\r\n", _size.x, _size.y, chr.x, chr.y); + } + + void reset() { + pos.col = 0; + pos.row = 0; + abs.x = 0; + abs.y = 0; + } + + void lineFeed() { + pos.col = 0; + pos.row++; + abs.x = 0; + abs.y += chr.y; + } + + void moveX(uint8_t x) { + abs.x += x; + pos.col = abs.x / chr.x; + } + + void moveY(uint8_t y) { + abs.y += y; + } + + void moveXY(uint8_t x, uint8_t y) { + moveX(x); + moveY(y); + } + + void moveCarret(uint8_t col) { + pos.col += col; + moveX(col * chr.x); + } + + bool isEndOfPage(uint8_t rows = 1) { + return (abs.y + (rows * chr.y)) > _size.y; + } + + bool isEndOfLine(uint8_t cols = 1) { + return (abs.x + (cols * chr.x)) > _size.x; + } + + size_t printTo(Print& p) const { + return p.printf("(c:%d, r:%d x:%d, y:%d)", pos.col, pos.row, abs.x, abs.y); + } +}; + + +struct DisplayHardwareSettings { + int update = DEFAULT_PAGE_UPDATE_ms; + rotation_t rotate; + String font; + int pageTime; + String pageFormat; + int contrast; + bool autoPage; + String valign; +}; + +class Display { + private: + unsigned long _lastResfresh{0}; + Cursor _cursor; + U8G2 *_obj{nullptr}; + DisplayHardwareSettings *_settings; + + public: + Display(U8G2 *obj, DisplayHardwareSettings *settings) : _obj{obj}, _settings(settings) { + _obj->begin(); + _obj->enableUTF8Print(); + _obj->setContrast(_settings->contrast); + setFont(settings->font); + setRotation(settings->rotate); + clear(); + } + + ~Display () { + if (_obj) { + delete _obj; + _obj = nullptr; + } + } + + void setRotation(rotation_t rotate) { + switch (rotate) { + case ROTATION_NONE: + _obj->setDisplayRotation(U8G2_R0); + break; + case ROTATION_90: + _obj->setDisplayRotation(U8G2_R1); + break; + case ROTATION_180: + _obj->setDisplayRotation(U8G2_R2); + break; + case ROTATION_270: + _obj->setDisplayRotation(U8G2_R3); + break; + } + } + + void setFont(const String &fontName = "") { + if (fontName.isEmpty()) { + Display::setFont(_settings->font); + return; + } + + if (fontName.startsWith("c6x12")) + _obj->setFont(u8g2_font_6x12_t_cyrillic); + else if (fontName.startsWith("s6x12")) + _obj->setFont(u8g2_font_6x12_t_symbols); + + else if (fontName.startsWith("c6x13")) + _obj->setFont(u8g2_font_6x13_t_cyrillic); + + else if (fontName.startsWith("c7x13")) + _obj->setFont(u8g2_font_7x13_t_cyrillic); + else if (fontName.startsWith("s7x13")) + _obj->setFont(u8g2_font_7x13_t_symbols); + + else if (fontName.startsWith("c8x13")) + _obj->setFont(u8g2_font_8x13_t_cyrillic); + else if (fontName.startsWith("s8x13")) + _obj->setFont(u8g2_font_8x13_t_symbols); + + else if (fontName.startsWith("c9x15")) + _obj->setFont(u8g2_font_9x15_t_cyrillic); + else if (fontName.startsWith("s9x15")) + _obj->setFont(u8g2_font_9x15_t_symbols); + + else if (fontName.startsWith("c10x20")) + _obj->setFont(u8g2_font_10x20_t_cyrillic); + else if (fontName.startsWith("unifont")) + _obj->setFont(u8g2_font_unifont_t_symbols); + else if (fontName.startsWith("siji")) + _obj->setFont(u8g2_font_siji_t_6x10); + else + _obj->setFont(u8g2_font_6x12_t_cyrillic); + + _cursor.chr.x = getMaxCharHeight(); + // _cursor.chr.y = getLineHeight(); + } + + void initCursor() { + _cursor = Cursor( + {getWidth(), getHeight()}, + {getMaxCharHeight(), getLineHeight()}); + } + + void getPosition(const TextPosition &a, Point &b) { + b.x = a.col * _cursor.chr.x; + b.y = (a.row + 1) * _cursor.chr.y; + } + + void getPosition(const RelativePosition &a, Point &b) { + b.x = getHeight() * a.x; + b.y = getWidth() * a.y; + } + + void getPosition(const Point &a, TextPosition &b) { + b.row = a.y / getLineHeight(); + b.col = a.x / getMaxCharWidth(); + } + + void getPosition(const RelativePosition &a, TextPosition &b) { + Point tmp; + getPosition(a, tmp); + getPosition(tmp, b); + } + + void draw(const RelativePosition &pos, const String &str) { + Point tmp; + getPosition(pos, tmp); + draw(tmp, str); + } + + void draw(TextPosition &pos, const String &str) { + Point tmp; + getPosition(pos, tmp); + draw(tmp, str); + } + + Cursor *getCursor() { + return &_cursor; + } + + // print меняю cursor + void println(const String &str, bool frame = false) { + print(str, frame); + _cursor.lineFeed(); + } + + void print(const String &str, bool frame = false) { + //Serial.print(_cursor); + // x, y нижний левой + int width = _obj->drawUTF8(_cursor.abs.x, _cursor.abs.y + _cursor.chr.y, str.c_str()); + if (frame) { + int x = _cursor.abs.x - getXSpacer(); + int y = _cursor.abs.y - _cursor.chr.y; + width += (getXSpacer() * 2); + int height = _cursor.chr.y + getYSpacer() * 2; + // x, y верхней левой. длина, высота + _obj->drawFrame(x, y, width, height); + D_LOG("[x:%d y:%d w:%d h:%d]", x, y, width, height); + } + _cursor.moveX(width); + } + + // draw не меняет cursor + void draw(const Point &pos, const String &str) { + Serial.printf("(x:%d,y:%d) %s", pos.x, pos.y, str.c_str()); + _obj->drawStr(pos.x, pos.y, str.c_str()); + } + + uint8_t getLineHeight() { + return getMaxCharHeight() + getYSpacer(); + } + + int getXSpacer() { + int res = getWidth() / 100; + if (!res) res = 1; + return res; + } + + int getYSpacer() { + int res = (getHeight() - (getLines() * getMaxCharHeight())) / getLines(); + if (!res) res = 1; + return res; + } + + uint8_t getWidth() { + return _obj->getDisplayWidth(); + } + + uint8_t getHeight() { + return _obj->getDisplayHeight(); + } + + uint8_t getLines() { + uint8_t res = getHeight() / _obj->getMaxCharHeight(); + if (!res) res = 1; + return res; + } + + uint8_t getMaxCharHeight() { + return _obj->getMaxCharHeight(); + } + + uint8_t getMaxCharWidth() { + return _obj->getMaxCharWidth(); + } + + void clear() { + _obj->clearDisplay(); + _cursor.reset(); + } + + void startRefresh() { + _obj->clearBuffer(); + _cursor.reset(); + } + + void endRefresh() { + _obj->sendBuffer(); + _lastResfresh = millis(); + } + + bool isNeedsRefresh() { + // SerialPrint("[Display]", "_settings->update: " + String(_settings->update) + "ms", ""); + return !_lastResfresh || (millis() > (_lastResfresh + _settings->update)); + } +}; + +struct ParamPropeties { + // рамка + bool frame[false]; +}; + +struct Param { + // Ключ + const String key; + // Префикс к значению + String pref; + // Суффикс к значению + String suff; + // Значение + String value; + + String pref_fnt; + String suff_fnt; + String value_fnt; + + String gliphs; + + // значение изменилось + bool updated; + // группа + uint8_t group; + ParamPropeties props; + Position position; + + Param(const String &key, + const String &pref = emptyString, const String &value = emptyString, const String &suff = emptyString, + const String &pref_fnt = emptyString, const String &value_fnt = emptyString, const String &suff_fnt = emptyString, + const String &gliphs = emptyString + ) : key{key}, group{0} { + setValue(value.c_str()); + setPref(pref); + setSuff(suff); + this->pref_fnt = pref_fnt; + this->value_fnt = value_fnt; + this->suff_fnt = suff_fnt; + this->gliphs = gliphs; + updated = false; + } + + bool isValid() { + return !pref.isEmpty(); + } + + bool setPref(const String &str) { + if (!pref.equals(str)) { + pref = str; + updated = true; + return true; + } + return false; + } + + bool setSuff(const String &str) { + if (!suff.equals(str)) { + suff = str; + updated = true; + return true; + } + return false; + } + + bool setValue(const String &str) { + if (!value.equals(str)) { + value = str; + updated = true; + return true; + } + return false; + } + + + + void draw(Display *obj, uint8_t line) { + } + + void draw(Display *obj) { + auto type = position.type; + switch (type) { + case POS_AUTO: { + D_LOG("AUTO %s '%s%s'\r\n", key.c_str(), descr.c_str(), value.c_str()); + obj->setFont(pref_fnt); + obj->print(pref.c_str()); + + obj->setFont(value_fnt); + obj->println(value.c_str(), false); + + obj->setFont(suff_fnt); + obj->print(suff.c_str()); + } + case POS_ABSOLUTE: { + auto pos = position.abs; + D_LOG("ABS(%d, %d) %s %s'\r\n", pos.x, pos.y, key.c_str(), value.c_str()); + obj->draw(pos, value); + } + case POS_RELATIVE: { + auto pos = position.rel; + D_LOG("REL(%2.2f, %2.2f) %s %s'\r\n", pos.x, pos.y, key.c_str(), value.c_str()); + obj->draw(pos, value); + } + case POS_TEXT: { + auto pos = position.text; + D_LOG("TXT(%d, %d) %s %s'\r\n", pos.col, pos.row, key.c_str(), value.c_str()); + obj->draw(pos, value); + } + default: + D_LOG("unhadled: %d", type); + } + } +}; + +class ParamCollection { + std::vector _item; + + public: + void load() { + for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { + if ((*it)->getSubtype() == "" || (*it)->getSubtype() == "U8g2lib") continue; + + auto entry = find((*it)->getID()); + if (!entry) { + _item.push_back({(*it)->getID(), (*it)->getID() + ": ", (*it)->getValue(), "", "", "", ""}); + } else { + entry->setValue((*it)->getValue()); + if (entry->pref == "") + entry->setPref((*it)->getID() + ": "); + } + } + } + + void loadExtParamData(String parameters) { + String id = ""; + jsonRead(parameters, "id", id, false); + if (id != "") { + String pref = ""; + String suff = ""; + String pref_fnt = ""; + String suff_fnt = ""; + String value_fnt = ""; + String gliphs = ""; + + bool hasExtParam = false; + + hasExtParam = hasExtParam + jsonRead(parameters, "pref", pref, false); + hasExtParam = hasExtParam + jsonRead(parameters, "suff", suff, false); + hasExtParam = hasExtParam + jsonRead(parameters, "pref_fnt", pref_fnt, false); + hasExtParam = hasExtParam + jsonRead(parameters, "suff_fnt", suff_fnt, false); + hasExtParam = hasExtParam + jsonRead(parameters, "value_fnt", value_fnt, false); + hasExtParam = hasExtParam + jsonRead(parameters, "gliphs", gliphs, false); + + if (hasExtParam) { + _item.push_back({id, pref, "", suff, pref_fnt, value_fnt, suff_fnt, gliphs}); + } + } + } + + Param *find(const String &key) { + return find(key.c_str()); + } + + Param *find(const char *key) { + Param *res = nullptr; + for (size_t i = 0; i < _item.size(); i++) { + if (_item.at(i).key.equalsIgnoreCase(key)) { + res = &_item.at(i); + break; + } + } + return res; + } + + Param *get(int n) { + return &_item.at(n); + } + + size_t count() { + return _item.size(); + } + + // n - номер по порядку параметра + Param *getValid(int n) { + for (size_t i = 0; i < _item.size(); i++) + if (_item.at(i).isValid()) + if (!(n--)) return &_item.at(i); + return nullptr; + } + + size_t getVaildCount() { + size_t res = 0; + for (auto entry : _item) res += entry.isValid(); + return res; + } + + size_t max_group() { + size_t res = 0; + for (auto entry : _item) + if (res < entry.group) res = entry.group; + return res; + } +}; \ No newline at end of file diff --git a/src/modules/display/U8g2lib/U8g2lib.cpp b/src/modules/display/U8g2lib/U8g2lib.cpp new file mode 100644 index 00000000..97dc291f --- /dev/null +++ b/src/modules/display/U8g2lib/U8g2lib.cpp @@ -0,0 +1,419 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include +#include "DisplayTypes.h" + +#define STRHELPER(x) #x +#define TO_STRING_AUX(...) "" #__VA_ARGS__ +#define TO_STRING(x) TO_STRING_AUX(x) + + +// дополненный список параметров для вывода, который синхронизирован со списком значений IoTM +ParamCollection *extParams{nullptr}; + +// класс одного главного экземпляра экрана для выделения памяти только когда потребуется экран +class DisplayImplementation { + private: + unsigned long _lastPageChange{0}; + bool _pageChanged{false}; + // uint8_t _max_descr_width{0}; + // typedef std::vector Line; + // текущая + size_t _page_n{0}; + // struct Page { + // std::vector line; + // }; + + uint8_t _n{0}; // последний отображенный + + DisplayHardwareSettings *_context{nullptr}; + Display *_display{nullptr}; + + public: + DisplayImplementation(DisplayHardwareSettings *context = nullptr, + Display *display = nullptr) + : _context(context), _display(display) { + + } + + ~DisplayImplementation() { + if (_display) { + delete _display; + _display = nullptr; + } + if (_context) { + delete _context; + _context = nullptr; + } + if (extParams) { + delete extParams; + extParams = nullptr; + } + } + + std::vector page; + + void nextPage() { + _n = _n + 1; + if (_n == page.size()) _n = _n - 1; + _pageChanged = true; + } + + void prevPage() { + if (_n > 0) _n = _n - 1; + _pageChanged = true; + } + + void rotPage() { + _n = _n + 1; + if (_n == page.size()) _n = 0; + _pageChanged = true; + } + + void gotoPage(uint8_t num) { + _n = num; + if (num < 0) _n = 0; + if (num >= page.size()) _n = page.size() - 1; + _pageChanged = true; + } + + void setAutoPage(bool isAuto) { + if (_context) _context->autoPage = isAuto; + _pageChanged = true; + } + + uint8_t calcPageCount(ParamCollection *param, uint8_t linesPerPage) { + size_t res = 0; + size_t totalLines = param->count(); + if (totalLines && linesPerPage) { + res = totalLines / linesPerPage; + if (totalLines % linesPerPage) res++; + } + return res; + } + + // uint8_t getPageCount() { + // return isAutoPage() ? calcPageCount(_param, _display->getLines()) : getPageCount(); + // } + + // выводит на страницу параметры начиная c [n] + // возвращает [n] последнего уместившегося + uint8_t draw(Display *display, ParamCollection *param, uint8_t n) { + // Очищает буфер (не экран, а внутреннее представление) для последущего заполнения + display->startRefresh(); + size_t i = 0; + // вот тут лог ошибка + for (i = n; i < param->count(); i++) { + auto cursor = display->getCursor(); + auto entry = param->get(i); + auto len = entry->value.length() + entry->pref.length() + entry->suff.length() ; + if (cursor->isEndOfLine(len)) cursor->lineFeed(); + + printParam(display, entry, _context->font); + + if (cursor->isEndOfPage(0)) break; + } + // Отправит готовый буфер страницы на дисплей + display->endRefresh(); + return i; + } + + String slice(const String &str, size_t index, char delim) { + size_t cnt = 0; + int subIndex[] = {0, -1}; + size_t maxIndex = str.length() - 1; + + for (size_t i = 0; (i <= maxIndex) && (cnt <= index); i++) { + if ((str.charAt(i) == delim) || (i == maxIndex)) { + cnt++; + subIndex[0] = subIndex[1] + 1; + subIndex[1] = (i == maxIndex) ? i + 1 : i; + } + } + return cnt > index ? str.substring(subIndex[0], subIndex[1]) : emptyString; + } + + void printParam(Display *display, Param *param, const String &parentFont) { + if (!param->pref.isEmpty()) { + display->setFont(param->pref_fnt.isEmpty() ? parentFont : param->pref_fnt); + display->print(param->pref); + } + + if (!param->value.isEmpty()) { + display->setFont(param->value_fnt.isEmpty() ? parentFont : param->value_fnt); + if (!param->gliphs.isEmpty() && isDigitStr(param->value)) { + int glyphIndex = param->value.toInt(); + display->print(getUtf8CharByIndex(param->gliphs, glyphIndex)); + } else display->print(param->value); + } + + if (!param->suff.isEmpty()) { + display->setFont(param->suff_fnt.isEmpty() ? parentFont : param->suff_fnt); + display->print(param->suff); + } + } + + void showXXX(Display *display, ParamCollection *param, uint8_t page) { + size_t linesPerPage = display->getLines(); + size_t line_first = _page_n * linesPerPage; + size_t line_last = line_first + linesPerPage - 1; + + display->startRefresh(); + + size_t lineOfPage = 0; + for (size_t n = line_first; n <= line_last; n++) { + auto entry = param->get(n); + if (entry) { + entry->draw(_display, lineOfPage); + lineOfPage++; + } else { + break; + } + } + display->endRefresh(); + } + + void drawPage(Display *display, ParamCollection *params, DisplayPage *page) { + display->setFont(page->font); + display->initCursor(); + + auto keys = page->key; + D_LOG("page keys: %s\r\n", keys.c_str()); + size_t l = 0; + auto line_keys = slice(keys, l, '#'); + while (!line_keys.isEmpty()) { + if (page->valign.equalsIgnoreCase("center")) { + display->getCursor()->moveY((display->getHeight() / 2) - display->getMaxCharHeight() / 2); + } + D_LOG("line keys: %s\r\n", keys.c_str()); + size_t n = 0; + auto key = slice(line_keys, n, ','); + while (!key.isEmpty()) { + D_LOG("key: %s\r\n", key.c_str()); + auto entry = params->find(key.c_str()); + if (entry && entry->updated) { + if (n) display->print(" "); + printParam(display, entry, page->font); + } + key = slice(line_keys, ++n, ','); + } + display->getCursor()->lineFeed(); + line_keys = slice(keys, ++l, '#'); + } + } + + // Режим пользовательской разбивки параметров по страницам + void showManual(Display *display, ParamCollection *param) { + auto page = getPage(_n); + + if (display->isNeedsRefresh() || _pageChanged) { + D_LOG("[Display] page: %d\r\n", _n); + display->setRotation(page->rotate); + display->startRefresh(); + drawPage(display, param, page); + display->endRefresh(); + _pageChanged = false; + } + + if (_context->autoPage && millis() >= (_lastPageChange + page->time)) { + // Если это была последняя начинаем с начала + if (++_n > (getPageCount() - 1)) _n = 0; + _pageChanged = true; + _lastPageChange = millis(); + } + } + + // Режим авто разбивки параметров по страницам + void showAuto(Display *display, ParamCollection *param) { + size_t param_count = param->count(); + + if (!param_count) return; + + display->setFont(_context->font); + display->initCursor(); + + size_t last_n = _n; + if (display->isNeedsRefresh() || _pageChanged) { + //D_LOG("n: %d/%d\r\n", _n, param_count); + last_n = draw(display, param, _n); + } + + if (_context->autoPage && millis() >= (_lastPageChange + _context->pageTime)) { + _n = last_n; + if (_n >= param_count) _n = 0; + _pageChanged = true; + _lastPageChange = millis(); + } + } + + void show() { + if (extParams && _display) { + extParams->load(); + + if (isAutoPage()) { + showAuto(_display, extParams); + } else { + showManual(_display, extParams); + } + } + } + + bool isAutoPage() { + return !getPageCount(); + } + + uint8_t getPageCount() { + return page.size(); + } + + DisplayPage* getPage(uint8_t index) { + return &page.at(index); + } +}; + + +DisplayImplementation* displayImpl = nullptr; + + +class U8g2lib : public IoTItem { + private: + uint8_t _pageNum = 0; + + public: + U8g2lib(String parameters) : IoTItem(parameters) { + DisplayHardwareSettings *context = new DisplayHardwareSettings(); + if (!context) { + D_LOG("[Display] disabled"); + return; + } + + jsonRead(parameters, "update", context->update); + jsonRead(parameters, "font", context->font); + + int rotate; + jsonRead(parameters, "rotation", rotate); + context->rotate = parse_rotation(rotate); + + jsonRead(parameters, "contrast", context->contrast); + jsonRead(parameters, "autoPage", context->autoPage); + jsonRead(parameters, "pageTime", context->pageTime); + + bool itsFirstDisplayInit = false; + if (!displayImpl) { + // Значит это первый элемент U8g2lib в конфигурации - Инициализируем дисплей + itsFirstDisplayInit = true; + int dc = U8X8_PIN_NONE, cs = U8X8_PIN_NONE, data = U8X8_PIN_NONE, clock = U8X8_PIN_NONE, rst = U8X8_PIN_NONE; + jsonRead(parameters, "dc", dc); + jsonRead(parameters, "cs", cs); + jsonRead(parameters, "data", data); + jsonRead(parameters, "clock", clock); + jsonRead(parameters, "rst", rst); + if (dc == -1) dc = U8X8_PIN_NONE; + if (cs == -1) cs = U8X8_PIN_NONE; + if (data == -1) data = U8X8_PIN_NONE; + if (clock == -1) clock = U8X8_PIN_NONE; + if (rst == -1) rst = U8X8_PIN_NONE; + + String type; + jsonRead(parameters, "oledType", type); + U8G2* libObj = nullptr; + if (type.startsWith("ST")) { + libObj = new U8G2_ST7565_ERC12864_F_4W_SW_SPI(U8G2_R0, clock, data, cs, dc, rst); + } + else if (type.startsWith("SS_I2C")) { + // libObj = new U8G2_SSD1306_128X64_VCOMH0_F_SW_I2C(U8G2_R0, clock, data, rst); + libObj = new U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C(U8G2_R0, clock, data, rst); + + } + else if (type.startsWith("SS_SPI")) { + libObj = new U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI(U8G2_R0, clock, data, cs, dc, rst); + } + else if (type.startsWith("SH")) { + libObj = new U8G2_SH1106_128X64_NONAME_F_HW_I2C(U8G2_R0, rst, clock, data); + } + + if (!libObj) { + D_LOG("[Display] disabled"); + return; + } + + Display *_display = new Display(libObj, context); + if (!_display) { + D_LOG("[Display] disabled"); + return; + } + + if (!extParams) extParams = new ParamCollection(); + + displayImpl = new DisplayImplementation(context, _display); + if (!displayImpl) { + D_LOG("[Display] disabled"); + return; + } + } + + // добавляем страницу, если указан ID для отображения + String id2show; + jsonRead(parameters, "id2show", id2show); + if (!id2show.isEmpty()) { + auto item = DisplayPage( + id2show, + context->pageTime, + context->rotate, + context->font, + context->pageFormat, + context->valign + ); + _pageNum = displayImpl->page.size(); + displayImpl->page.push_back(item); + if (!itsFirstDisplayInit) delete context; // если это не первый вызов, то контекст имеет временный характер только для создания страницы + } + } + + void doByInterval() { + if (displayImpl) displayImpl->show(); + } + + IoTValue execute(String command, std::vector& param) { + if (displayImpl) + if (command == "nextPage") { + displayImpl->nextPage(); + } else if (command == "prevPage") { + displayImpl->prevPage(); + } else if (command == "rotPage") { + displayImpl->rotPage(); + } else if (command == "gotoPage") { + if (param.size() == 1) { + displayImpl->gotoPage(param[0].valD); + } else { + displayImpl->gotoPage(_pageNum); + } + } else if (command == "setAutoPage") { + if (param.size() == 1) { + displayImpl->setAutoPage(param[0].valD); + } + } + + return {}; + } + + ~U8g2lib() { + if (displayImpl) { + delete displayImpl; + displayImpl = nullptr; + } + }; +}; + +void* getAPI_U8g2lib(String subtype, String param) { + if (subtype == F("U8g2lib")) { + // SerialPrint("[Display]", "param1: ", param); + return new U8g2lib(param); + } else { + // элемент не наш, но проверяем на налличие модификаторов, которые нужны для модуля + // вынимаем ID элемента и значения pref и suff связанные с ним + if (!extParams) extParams = new ParamCollection(); + extParams->loadExtParamData(param); + return nullptr; + } +} diff --git a/src/modules/display/U8g2lib/example_config.json b/src/modules/display/U8g2lib/example_config.json new file mode 100644 index 00000000..48809c20 --- /dev/null +++ b/src/modules/display/U8g2lib/example_config.json @@ -0,0 +1,217 @@ +{ + "mark": "iotm", + "config": [ + { + "global": 0, + "type": "Reading", + "subtype": "VButton", + "id": "btn", + "needSave": 0, + "widget": "toggle", + "page": "Ввод", + "descr": "ТестКнопка", + "int": "0", + "val": "0", + "value_fnt": "siji", + "gliphs": "" + }, + { + "global": 0, + "type": "Writing", + "subtype": "Timer", + "id": "timer", + "widget": "anydataDef", + "page": "Ввод", + "descr": "Таймер", + "int": 1, + "countDown": "99", + "ticker": 1, + "repeat": 1, + "needSave": 0, + "pref": "ТАЙМЕР: ", + "suff": " сек", + "round": "0" + }, + { + "global": 0, + "type": "Reading", + "subtype": "Variable", + "id": "time", + "needSave": 0, + "widget": "anydataRed", + "page": "Ввод", + "descr": "Время", + "int": "0", + "val": "", + "pref": " ⏰️", + "pref_fnt": "unifont" + }, + { + "global": 0, + "type": "Reading", + "subtype": "Variable", + "id": "var", + "needSave": 0, + "widget": "inputTxt", + "page": "Ввод", + "descr": "Текст", + "int": "0", + "val": "☀️-☁️-☂️-☃️-☄️", + "map": "1024,1024,1,100", + "plus": 0, + "multiply": 1, + "round": 0, + "pref": "текст: ", + "value_fnt": "unifont" + }, + { + "global": 0, + "type": "Reading", + "subtype": "Variable", + "id": "ip", + "needSave": 0, + "widget": "anydataDef", + "page": "Ввод", + "descr": "IP", + "int": "0", + "val": "", + "pref": "IP: " + }, + { + "type": "Reading", + "subtype": "U8g2lib", + "id": "page1", + "widget": "nil", + "page": "", + "descr": "", + "oledType": "SS_I2C", + "int": "1", + "font": "c6x13", + "contrast": "200", + "rotation": "0", + "autoPage": "0", + "pageTime": "10000", + "dc": 19, + "cs": "-1", + "data": "21", + "clock": "22", + "rst": -1, + "id2show": "timer,lvl#ip" + }, + { + "type": "Reading", + "subtype": "U8g2lib", + "id": "page2", + "widget": "nil", + "page": "", + "descr": "", + "oledType": "SS_I2C", + "int": 1, + "update": 500, + "font": "c6x13", + "contrast": "150", + "rotation": "0", + "autoPage": "0", + "pageTime": 3000, + "id2show": "var#btn,time", + "dc": "-1", + "cs": "-1", + "data": "-1", + "clock": "-1", + "rst": -1 + }, + { + "global": 0, + "type": "Reading", + "subtype": "VButton", + "id": "autoPage", + "needSave": 0, + "widget": "toggle", + "page": "Ввод", + "descr": "autoPage", + "int": "0", + "val": "0" + }, + { + "global": 0, + "type": "Reading", + "subtype": "VButton", + "id": "nextPage", + "needSave": 0, + "widget": "toggle", + "page": "Ввод", + "descr": "nextPage", + "int": "0", + "val": "0" + }, + { + "global": 0, + "type": "Reading", + "subtype": "VButton", + "id": "prevPage", + "needSave": 0, + "widget": "toggle", + "page": "Ввод", + "descr": "prevPage", + "int": "0", + "val": "0" + }, + { + "global": 0, + "type": "Reading", + "subtype": "Variable", + "id": "pageN", + "needSave": 0, + "widget": "inputDgt", + "page": "Ввод", + "descr": "pageN", + "int": "0", + "val": "0.0", + "map": "1024,1024,1,100", + "plus": 0, + "multiply": 1, + "round": 0 + }, + { + "global": 0, + "type": "Reading", + "subtype": "VButton", + "id": "rotPage", + "needSave": 0, + "widget": "toggle", + "page": "Ввод", + "descr": "rotPage", + "int": "0", + "val": "0" + }, + { + "global": 0, + "type": "Reading", + "subtype": "AnalogAdc", + "id": "lvl", + "widget": "anydataRed", + "page": "Ввод", + "descr": "Уровень", + "map": "1,1024,1,5", + "plus": 0, + "multiply": 1, + "round": "0", + "pin": "34", + "int": "1", + "avgSteps": 1, + "pref": " ", + "value_fnt": "siji", + "gliphs": "" + } + ] +} + +scenario=>if timer then { +ip = getIP() +time = gethhmmss() +} +if autoPage then page1.setAutoPage(1) else page1.setAutoPage(0) +if nextPage < 2 then page1.nextPage() +if prevPage < 2 then page1.prevPage() +if rotPage < 2 then page1.rotPage() +if pageN != "" then page1.gotoPage(pageN) \ No newline at end of file From 6194169990c14400eef9a75a04ae084185cad34c Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 29 May 2025 18:56:15 +0300 Subject: [PATCH 104/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20U8g?= =?UTF-8?q?2lib=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=8B=20=D1=81=20=D0=B4=D0=B8=D1=81=D0=BF=D0=BB=D0=B5=D1=8F?= =?UTF-8?q?=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/display/U8g2lib/modinfo.json | 96 ++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/modules/display/U8g2lib/modinfo.json diff --git a/src/modules/display/U8g2lib/modinfo.json b/src/modules/display/U8g2lib/modinfo.json new file mode 100644 index 00000000..d4e18bb3 --- /dev/null +++ b/src/modules/display/U8g2lib/modinfo.json @@ -0,0 +1,96 @@ +{ + "menuSection": "screens", + "configItem": [ + { + "name": "Экраны U8g2", + "type": "Reading", + "subtype": "U8g2lib", + "id": "u8page", + "widget": "", + "page": "", + "descr": "", + + "oledType": "SS_I2C", + "int": 1, + "update": 500, + "font": "c6x13", + "contrast": 90, + "rotation": 90, + "autoPage": 1, + "pageTime": 3000, + "id2show": "", + + "dc": 19, + "cs": 5, + "data": 23, + "clock": 18, + "rst": -1 + } + ], + "about": { + "authorName": "Ilya Belyakov", + "authorContact": "https://t.me/Biveraxe", + "authorGit": "https://github.com/biveraxe", + "specialThanks": "Yuriy Trikoz @ytrikoz", + "moduleName": "U8g2lib", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "moduleDesc": "Позволяет выводить на графические экраны типа SSD, ST, SH указанные параметры из конфигурации IoTM.", + "propInfo": { + "oledType": "Строковый код типа дисплея. В текущей верссии поддерживаются ST7565 (ST), SSD1306 (SS_I2C), SSD1306 (SS_SPI) и SH1106 (SH). Для получения списка доступных типов дисплеев, обратитесь к документации библиотеки U8g2. Добавить возможность выбора типов дисплеев можно, добавив соответствующие условия в файл модуля в конструктор класса U8g2lib.", + "int": "Интервал обновления экрана в секундах. Если указано 0, то обновление экрана не производится.", + "update": "Интервал обновления экрана в миллисекундах. Если указано 0, то обновление экрана не производится. (парамтер на развитие)", + "font": "Шрифт, используемый для отображения текста на экране. Доступные шрифты можно найти в документации библиотеки U8g2 и добавить в проект в функцию setFont().", + "contrast": "Контрастность экрана. Значение от 10 до 150, где 0 - минимальная контрастность, а 255 - максимальная.", + "rotation": "Поворот экрана в градусах. Доступные значения: 0, 90, 180, 270.", + "autoPage": "Автоматическая смена страниц экрана. Если установлено в 1, то экран будет автоматически переключаться на следующую страницу после указанного времени.", + "pageTime": "Время в миллисекундах, через которое будет происходить автоматическая смена страниц экрана. Используется только если autoPage установлено в 1.", + "id2show": "Идентификатор элемента конфигурации, значение которого будет отображаться на экране. Если указано, то на экране будет отображаться только это значение. Возможно указать несколько идентификаторов, разделенных запятыми для перечисления горизонтально и # для перевода строки.", + "dc": "Пин, используемый для управления дисплеем по протоколу I2C. Если не используется, укажите -1.", + "cs": "Пин, используемый для управления дисплеем по протоколу SPI. Если не используется, укажите -1.", + "data": "Пин, используемый для передачи данных на дисплей по протоколу SPI. Если не используется, укажите -1.", + "clock": "Пин, используемый для синхронизации данных на дисплее по протоколу SPI. Если не используется, укажите -1.", + "rst": "Пин, используемый для сброса дисплея. Если не используется, укажите -1." + }, + "title": "Дисплей U8g2lib", + "funcInfo": [ + { + "name": "nextPage", + "descr": "Переключиться на следующую страницу", + "params": [] + }, + { + "name": "prevPage", + "descr": "Переключиться на предыдущую страницу", + "params": [] + }, + { + "name": "rotPage", + "descr": "Переключиться на следующую страницу с ротацией", + "params": [] + }, + { + "name": "gotoPage", + "descr": "Переключиться на указанную страницу. Если номер не указать, то переключится на страницу закрепленную за элементом конфигурации.", + "params": ["Номер страницы"] + }, + { + "name": "setAutoPage", + "descr": "Установить автоматическую смену страниц.", + "params": ["1 - включить, 0 - выключить"] + } + ] + }, + "defActive": false, + "usedLibs": { + "esp32*": [ + "olikraus/U8g2 @ ^2.36.5" + ], + "esp82*": [ + "olikraus/U8g2 @ ^2.36.5" + ] + } +} \ No newline at end of file From 1a79776bfbd8e7e9489b986c703745aa73023c3c Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 29 May 2025 18:57:46 +0300 Subject: [PATCH 105/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D1=8B=20setInterv?= =?UTF-8?q?al=20=D0=B8=20doByInterval=20=D0=94=D0=BB=D1=8F=20=D0=B2=D0=BE?= =?UTF-8?q?=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=B8?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D0=B2=D0=B0=D0=BB=D0=B0=20=D0=B2=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20doByInterval=20?= =?UTF-8?q?=D0=B8=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D0=B0=20=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=B2=D0=BD=D0=B5=20=D0=BF=D0=BB=D0=B0=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTScenario.cpp | 27 +++++++++++++++++++++------ src/modules/sceninfo.json | 6 ++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 7245b2f8..7efa73ca 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -291,10 +291,8 @@ class CallExprAST : public ExprAST { ret.valD = Item->getIntFromNet(); ret.isDecimal = true; return &ret; - } - - // вызываем системную функцию периодического выполнения вне таймера - if (Cmd == F("doByInterval")) { + + } else if (Cmd == F("doByInterval")) { // вызываем системную функцию периодического выполнения вне таймера Item->doByInterval(); ret = Item->value; return &ret; @@ -311,6 +309,15 @@ class CallExprAST : public ExprAST { return nullptr; // ArgsAsIoTValue.push_back(zeroIotVal); } + if (Cmd == F("setInterval")) { // меняем интервал выполнения задач модуля налету + if (ArgsAsIoTValue.size() == 1) { + Item->setInterval(ArgsAsIoTValue[0].valD); + ret.valD = Item->getInterval(); + ret.isDecimal = true; + return &ret; + } + } + ret = Item->execute(Cmd, ArgsAsIoTValue); // вызываем команду из модуля напрямую с передачей всех аргументов // if (ret.isDecimal) Serial.printf("Call from CallExprAST ID = %s, Command = %s, exec result = %f\n", Callee.c_str(), Cmd.c_str(), ret.valD); @@ -350,7 +357,8 @@ enum SysOp { sysop_mqttPub, sysop_getUptime, sysop_mqttIsConnect, - sysop_wifiIsConnect + sysop_wifiIsConnect, + sysop_setInterval }; IoTValue sysExecute(SysOp command, std::vector ¶m) { @@ -456,7 +464,12 @@ IoTValue sysExecute(SysOp command, std::vector ¶m) { break; case sysop_wifiIsConnect: value.valD = isNetworkActive(); - break; + break; + case sysop_setInterval: + if (param.size() == 1) { + + } + break; } return value; @@ -515,6 +528,8 @@ class SysCallExprAST : public ExprAST { operation = sysop_mqttIsConnect; else if (Callee == F("wifiIsConnect")) operation = sysop_wifiIsConnect; + else if (Callee == F("setInterval")) + operation = sysop_setInterval; else operation = sysop_notfound; } diff --git a/src/modules/sceninfo.json b/src/modules/sceninfo.json index b7d0be54..bdc834e0 100644 --- a/src/modules/sceninfo.json +++ b/src/modules/sceninfo.json @@ -14,6 +14,12 @@ "descr": "Получаем количество секунд доверия к значениям элемента. При -2 доверие полное, при -1 время доверия истекло. При >0 время обратного отсчета. Используется только совместно с ИД элемента: ID.getIntFromNet()", "params": [] }, + { + "name": "setInterval", + "descr": "Меняем интервал выполнения периодиеских операций элемента в секундах. Используется только совместно с ИД элемента: ID.setInterval(5)", + "params": ["Секунды"], + "return": "установленный интервал" + }, { "name": "doByInterval", "descr": "Выполняем интервальное действие модуля вне плана. Используется только совместно с ИД элемента: ID.doByInterval()", From fe9d9827db72699378e4925e2078a11df4fafcab Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 29 May 2025 19:00:19 +0300 Subject: [PATCH 106/118] =?UTF-8?q?=D0=9C=D0=B5=D0=BD=D1=8F=D0=B5=D0=BC=20?= =?UTF-8?q?=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=20getAPI=5F=20=D0=94=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D1=81=D0=BE=D1=82?= =?UTF-8?q?=D0=B8=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=BE=D0=B2=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B9=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=D1=85=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B2=20=D0=BB=D1=8E=D0=B1=D0=BE=D0=BC=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=20=D0=B4=D0=BB=D1=8F=20=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BC=D0=BE=D0=B4=D0=B8=D1=84=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrepareProject.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PrepareProject.py b/PrepareProject.py index 24bcdc5a..a848dbf7 100644 --- a/PrepareProject.py +++ b/PrepareProject.py @@ -223,12 +223,12 @@ def updateModulesInProfile(profJson): allAPI_exec = "" for activModuleName in activeModulesName: allAPI_head = allAPI_head + "\nvoid* getAPI_" + activModuleName + "(String subtype, String params);" - allAPI_exec = allAPI_exec + "\nif ((tmpAPI = getAPI_" + activModuleName + "(subtype, params)) != nullptr) return tmpAPI;" + allAPI_exec = allAPI_exec + "\nif ((tmpAPI = getAPI_" + activModuleName + "(subtype, params)) != nullptr) foundAPI = tmpAPI;" apicpp = '#include "ESPConfiguration.h"\n' apicpp = apicpp + allAPI_head -apicpp = apicpp + '\n\nvoid* getAPI(String subtype, String params) {\nvoid* tmpAPI;' +apicpp = apicpp + '\n\nvoid* getAPI(String subtype, String params) {\nvoid* tmpAPI; void* foundAPI = nullptr;' apicpp = apicpp + allAPI_exec -apicpp = apicpp + '\nreturn nullptr;\n}' +apicpp = apicpp + '\nreturn foundAPI;\n}' with open('src/modules/API.cpp', 'w') as f: f.write(apicpp) From 4195c383ee5a37442cdf4d8be21b628ebc072652 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Thu, 24 Jul 2025 22:28:57 +0300 Subject: [PATCH 107/118] =?UTF-8?q?*web=20=D0=9A=D0=B0=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=9C=D0=BE=D0=B4=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=20=D0=B2=20=D0=B2=D0=B5=D0=B1=20*=D0=90?= =?UTF-8?q?=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=208266=20=D0=B8=20Bk7231n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_full/build/bundle.css.gz | Bin 6511 -> 6607 bytes data_full/build/bundle.js.gz | Bin 51201 -> 51602 bytes data_svelte/build/bundle.css.gz | Bin 6511 -> 6607 bytes data_svelte/build/bundle.js.gz | Bin 51201 -> 51602 bytes myProfile.json | 14 +++++++++++++- src/StandWebServer.cpp | 11 +++++++++-- src/WsServer.cpp | 10 +++++++++- .../virtual/LogingHourly/LogingHourly.cpp | 8 ++++++++ 8 files changed, 39 insertions(+), 4 deletions(-) diff --git a/data_full/build/bundle.css.gz b/data_full/build/bundle.css.gz index de44f689bfa9f04e1abd637189ea8b417695831a..19d2f663fe9d31dbff0c439fae92d1cdd9f1cd83 100644 GIT binary patch literal 6607 zcmbuDMN}LBkYI5Q5FCQLOK^7!ZowN3E{(fea0^aj!6mr6HSQjuaR?B!fzYHO%)Hrs zZ)XpC*{MSvepUUt)uCt-F%bSMu&w|>smEO&Z|u{YxSdxjE#;wg2ec{p42YipM!zBm z1%E|mYVJK*njr|P42qez$4ek$Q~lnv)++8-Kne7{)FC!zOa%MgP3+|k(CmkpTdzDV z745g+LR&wBiw`gN(F4d2ma(As4bS(2DU(ZnFndLA%s+J!@eG<+_l!KRc>eJlB3-!U zrX&IFBN7ZE4F5X!%u^XPE*R&Ve8%n$RDw6muj>sdB__t`Vd}Izn{rEgTEusNiDx_e zif5L@l5o!#@ci@%&-p?~5x#TkvPd_qYO_|`z?hi(sNYdPCt-h83|whd`dy_7%vyN| z`~;E=`#N%S{zP-1lsmri1WU6y8hpE-68Hx~7oE~LI+u2bMt-8CKhlCl7posV*(MRJ z`2W?@^gIg6{H#?;SM~f5q%sLZW}SpR3A_cpFvc5b4-A&e7D;%ddyZAQkfrOz|G*+7 zu>U%}0OeD}v>7PjQ(~NNm4bgbUaHX435et0`#Ck8+RDIf<0+Z#Bk$o`FGqpfXq!Qr z%+&>cPKYddut@D1qj^)Z&e*51_o>2Vpgd)oOA4E&HfVnxZgi^B(#3f52Mhd>apVU3NqPLED!V+JVJesP)5m*AME z2BIYx+=pOu5Bm~gGu_eMBkNnmAuV6fvM_3e%ry5iF$S_bWsu(D6r-SGHq`JPaYou* zdT)m==#NNz($=vme)GW5j6TjIw+F}P2FT*thO*CMv4}7-V<<5xQ7QV><~bq0votBjvC4nzA3h z0mF!r5r|Qhn5N|}TdR8!VivToIi1>+Ryefd`RVzOh^TmHBDKT^La2*s`Q~wbLg}@Q zXbM$!d9|8}?Ri+^8P=0&bTS89HWl+|RLwp=8qL9_7FUXIZ&?wKRkDA{B-@-WdZaCC~XE^3{nRDOO^w&mz?2i+Hiwv*VsCW|H?Idp? zkfoj>*Xreehw3VOd}cg5Wbsg}&)t9cz!(5~N!8PAB4@HA%8R<5l*m4nk^-r^v~WjK zY-VM*j+7hZnnmJ?Bwl2vv7EAf)B_bd<%?06mPWHD63>;7wMpKZ^e-En@O!Zm5FIjH zO)2z#Xu0TedTmwbv{nfakVAYMjyhv)c4^!%&8g|8{!xEOQwv<=5pEsdnyU- z0X0e)*2evo)DDoB^xr+3`zuq_urYyETalX|J5l zd}NI;gS#0-azDqz;IJfyX06a#OOj8*jhnHE+wU&);3)Zozsc5K<@gjm=ruFCst=u> z0+TQ+y;wGL{JC`KR&9oJXfnwpO&bHq?+URvhJy}AmFP1oosB_%6IX>YCE~aZJYid^ zd#68CfAge`tfgQholxdeb}n|9?z8Y~D0*v#NJ!1OR=WbcJHkp;`@lQ5B#Cx`9JS>X z9_zCKQBj<=gFMq?t~kJRvfbsYIB}Klu?DM>pP|`)vku(?25L4(DckQi%C(*>f5-Q1 zx>*JD^~Jyy^_$H;y!fdT2it6N%%e#b@E^~e>~?Tm_N3sgB%fn&HPk4w(bpRmOwh-D z3<`WFMXi-OJh7EdmT6vbSf98A6hbx1D`MYk2CN@@W0QBJvA<@ur>#eCQvNna&LbFD zkz!U%E0`$9@cd1tRC3IhC<6ICr_9`*vEahEyMBAxa4?r6ZOCw*TsLi%MX*Tmu=bJJP#tUk$FQfLv)&lPZL;XCXQxdAcY3(9hvGweV@5E`1!=}waz#kVkKC{8amCB)C+ZUqghC(bc+&f}_ z&EqUULeuGnV(@LP{Aa)pz-Q{Zg^oz7pi#TL{(+>mt}v8-%_}(MhZ?b0nSgM`c#1He?;_r(om7pR2<` z4VW}fu|iRHzb?Sk1IRKcV#+ZAoqR8u{zf?5yPgza>Qp5+FiKU-S@P#=EpI&b;22#* z^4;m4x}dHPAg56XBJO%GC*3Htu+00-upmfd9a(z14v;PqoSiT}&?qD+&;iP)q8|00 zk3FwBS%+pr*3h&}I$6vtNT1{EOi z4miasLEJEAIFqHf)$<4IpK0qNNCG$#=&D+mMd`U)*=EOfr_~wXbGS!;&|Xq6>Nx7P z5v+H`N1%6IhiY%J?6I*{NuA}gJ_g|U#VNH}bu#_SDY@OGo`;&+72tXh2Iwr>9KpP> z5tnoTRM=IP(puQ@M~V8jrEfmD*o7CYT9}C4mpYw=T`kGJ_n}T_;GJNfe|9dGufkb? z$t|F9l!-7AH{{FPwg9}=}pZ(d@@68v@b&%!T?6lp_xVH-bDo-l73o;S~n z73V*6p|Srs>?yZj4EScI3n+_xo{qn@VrEi}>Tn#XIxs+c;HY+q*`5{Na02dy*jE2;Q~2dU53|`6o2dmZzpFq*geuR`rRg&bwA( zZN9|7_JXW%umMuL)0%tx`KSKR`1%1v z!5FxN<>rfKSIF!#rqxs$5iQlGzX+R8OJ5Ume>OKL@)ktY3g3N0GV8hfp~euAS;eV< zGWhE7jX4 z#Q`s4@|_LAH;B(G^Bg_UUwD(n9kHa)BhCc8?)KmkBxWjbJc=r%Bt4`6n7oGePXnL3 zP-m4&hv3Kw9i2l(8z$jXf%mU*{_I0>ytvg=?ZB9U3WuL4;4)YZ=W%>klfzd~viH8d z8G@_c#?!vh#tiyVQ;@CO@D#q2&Rmfx9wu|GqNh6@QnGwa^KsgmWrpe}rQS@)5ZSt# zO)E-J7Z(xb4)sSgJc0eCgkBz4go#&a-dtyF?;mE2(DE(X(b-7g6qR?iA5*G#b;$5y zx|DUlS}JblZIIR_vWbx#{PFBYvIcLH%xE+i`OOWp!mEkL|4bvs+#PA91O2lM*HZ^p zK2O${33K1b`kVw>XA2}*zax|7WcT&dbDcUBG)*x-Se%mD zca*J&bNHycxPi7rF6z&e0xYWq+b6 zdN}%o{8lJJ%WR+QK!c=v`IUkb%fXl|kMD;ILW6OKfA#M>`}jA2hoDgTTLgH(6Swq&!?kRIJl>Rd7t1gQXtH!n~)J%`)&3_-ox9%Z6OUR7RvDILz>)O6GjzIu;qJ>wFKHRCtGp@&4%al? z3L)bd1^6|F#vL9XU{h$+;gjt~@|=lvAxGZYfwyszJSM_`&XXn{1qn!@a2eN&EtgpH zNOp&~DGyIq@>Vrco?M|WXid4a^yh(@oO9F7J=kZxL0U;m7=0#X;NFnolQ~Z+mLAWy z2`26v)k`zwKCWhQpVz)4GvnjGq0B6>#dc`NQ)`z{U(Cln%{26tDfnZHIa$#!4Nks- z(p^GP3$klpR~J%0rjh!~P?CP|xI0AjwUGWU6gMj|utLHyL6}=ZvQ=-Iu(cO%Y({n+ z=)5ya-y1&77+=ul<{@+n{^|a%8(+LboF8W#wOCc8m>PwwJ7incWdW<4SHAngQXF%y zLUMy_hgt~7W6w~EI-MIoHQG|Wlw?MnMRLu5=Fo+cDqjPr9SRh!3=i#VEDN40wYX1{ zCxtrA5w~MolY)O5$%ccG*Y=3T-H@pcEWV~JS64BlD`&k%X;)ide8Iu_qAyQXdi3`^ z?w{C$UPZ$0sNMthyu*=$O)!<>hmOD|i>>G%Cn^=dp%F*8xklq-(av4qjp|!WJLC1^ z%~3QGk|27PWMDx&ZvF7A_9ALiM8Zrdj=lt0{%A%9GJ5extB&;^Dd+f5uS_ucUu>r1WEFMg(kRdIaR`X967hZP!lpnzNN%T< z*ZKfWMxM|te>|?@dLaAdm1b&#Q87a#hTAr5I{zrFUHmKhHKk|Y*(&Yl9yOL9U-(-P z&~z&ZG8u0`o@K1I7dSVPo-&`|m>}8wx(8lWC8FmESQEr8Xm=TVDw!yj1bi|v{O{)L zD?z9)V1tBBFH}0=VDo-@sCuL}ul4joPBXZ}nmR!X~}J<3Wt>fdsA!WA>l$EdVNO=zx57v>;4^%rS){8C5+U-8cR~ zb{Sz`0Qxc2)6=7`_Yr=ERnYpa;ZfE>Tj=t`%>bc+q0gyG*1L0c@P8gp9Sc{?Eu;od z+&Q0EB*Z_%^A}{ zkxVanq!c$`Wq&ZGf7iv1s{E2A)*XV_m<{-w0}j~OwxE*XSZUFkhB;J`UYBVQnP2JY z>_e-Hk;*a3SyOtAX8kpOoU^6$g^p&Zb7a|C--9iq{k+E^375*+kI4 zZRTY20BruYfv}V?AUYjC%?9J4DTUhkO?<+%$(19IbQHXX08p&wQMJl%jrpYCka72w zsbK!9QJVX_;l;b}z!YlO-|@71k-<>C3iS$ZmJK^?H$EiW%2l|S$9)w805HX%c&tDq-!T|}%+J5pe(-*%?jta626*J0& zn+xs@kBSf5Ce79uza?Ii

e} zk^lC+gyk1J244DA+0yNjAB;YH3%))U*gw9y%W&Cmb9eQh$C0iS${N>md3E5cYi~9q zFY+3Ft=2%nJ)_nfhH&BlZFW2v%Mlo*VaPm(PvMV_dd|T^10pZ+DiO$q;f}&J5-CZ` zliv%*ia>^_-atRKyj_$+auq zp@Gdp&{t!i|L45!{H38!LBfWA$cc6o{T3>1Yupf!j)_cRcF`lk^_qS!x znA3&b2v`I|__oY;taO{R3=d$>_FC_2dl^(Tty3wMwLDbjmNV3U5QcHdMjbAfv^=Wi zo>deqJjAhlhAvHvld>0^n%S{1DZg$1P;`ad++MThT42KFf`wA;l($@EfP+H4w#B8N za*Pmo5MrXoOw0Z-GAZBB8>q!2^HM*)Ma&yU7Sh9F>18@(rx0Fi$NH*c=oly9wlTCu zE#*f=?uIx9BCJ^AgDyId_uIG0WHwmsHJcdPb^!2!P4I?r;mr`kAqpkY_qRi@s2^UM z6A?5rOE-d~nA!|Cs8CHW(mBO)Q4&tNVC?_WUk>&U!dDQMz#EvHU3|Ckfg>UakWwL zKd}#KX)gvuF*qIFRwn~@sL0k&6t!!Ad-!hBxS$ z4~@=p&>v=y|DGVeLc>D?WCkTlET|WG@c!o*#!fr=IDa&*rwr&4cK!A+A zr4xoaPDBkIuOLcg?9l4_+z&{4@|NTOmH(^s{N`9^{QqeCzh_~-ANDklwv$EM95B@X z_b+VFpVaEBEo0%cxVmC26Lw|wPgPqd>+BW3Z=f)xSan9d|@xS5jZ?) e+%Q)9KjL1_|8GB(RHpC6!r7~jScwu5;XeR&uK=$A literal 6511 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 diff --git a/data_full/build/bundle.js.gz b/data_full/build/bundle.js.gz index 729d6ae03ec698974df34ccb7c2d8eb6ffd37bd5..d4dc70e4c01d1036f2613a64cbe795747f840094 100644 GIT binary patch literal 51602 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 G!vX-&ow2(B diff --git a/data_svelte/build/bundle.css.gz b/data_svelte/build/bundle.css.gz index de44f689bfa9f04e1abd637189ea8b417695831a..19d2f663fe9d31dbff0c439fae92d1cdd9f1cd83 100644 GIT binary patch literal 6607 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

e} zk^lC+gyk1J244DA+0yNjAB;YH3%))U*gw9y%W&Cmb9eQh$C0iS${N>md3E5cYi~9q zFY+3Ft=2%nJ)_nfhH&BlZFW2v%Mlo*VaPm(PvMV_dd|T^10pZ+DiO$q;f}&J5-CZ` zliv%*ia>^_-atRKyj_$+auq zp@Gdp&{t!i|L45!{H38!LBfWA$cc6o{T3>1Yupf!j)_cRcF`lk^_qS!x znA3&b2v`I|__oY;taO{R3=d$>_FC_2dl^(Tty3wMwLDbjmNV3U5QcHdMjbAfv^=Wi zo>deqJjAhlhAvHvld>0^n%S{1DZg$1P;`ad++MThT42KFf`wA;l($@EfP+H4w#B8N za*Pmo5MrXoOw0Z-GAZBB8>q!2^HM*)Ma&yU7Sh9F>18@(rx0Fi$NH*c=oly9wlTCu zE#*f=?uIx9BCJ^AgDyId_uIG0WHwmsHJcdPb^!2!P4I?r;mr`kAqpkY_qRi@s2^UM z6A?5rOE-d~nA!|Cs8CHW(mBO)Q4&tNVC?_WUk>&U!dDQMz#EvHU3|Ckfg>UakWwL zKd}#KX)gvuF*qIFRwn~@sL0k&6t!!Ad-!hBxS$ z4~@=p&>v=y|DGVeLc>D?WCkTlET|WG@c!o*#!fr=IDa&*rwr&4cK!A+A zr4xoaPDBkIuOLcg?9l4_+z&{4@|NTOmH(^s{N`9^{QqeCzh_~-ANDklwv$EM95B@X z_b+VFpVaEBEo0%cxVmC26Lw|wPgPqd>+BW3Z=f)xSan9d|@xS5jZ?) e+%Q)9KjL1_|8GB(RHpC6!r7~jScwu5;XeR&uK=$A literal 6511 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 diff --git a/data_svelte/build/bundle.js.gz b/data_svelte/build/bundle.js.gz index 729d6ae03ec698974df34ccb7c2d8eb6ffd37bd5..d4dc70e4c01d1036f2613a64cbe795747f840094 100644 GIT binary patch literal 51602 zcmV(oj1PmjmbGvn#; zcx+kjW>JvDZWgE^psuP>abs`y;_f2eySRvpi@1pU>)to;?Ry)yx9`~-@jgM#H@e6K zK!TK1-95H%C!X6=A^{Lc0Ex^*B9VD8UyD>_g$T&TKK4{VHdXz`14T9^SL+gUnhf~H zqOP(kmh;^PjqlbJnW4xVZ@mHY?Kg1sAqMALbn10x$6h zp+&eX`J8d87-RaSfin#_4Z~27O*Y4IV2l$B^(ZZbR6WUfDA(sQEwghTVCj)5BEz+) zv&I2ok6S4LiDlDP0+3SyV|#cQ7UJ2AOH~%v;c6|H0YD;%GuCTeoJxdEk&T9?WV1TM zf}tjZX;6}?`M4=l&%q>``o0|32!z8pFUmmID|(seaiS(-%J@V~>$aY%r3K#7G{oh^UF2+6E_bdQ(oM(^K+ZR^$0x(O zGl~sH>X8_!qa(s6YRdYN1)m#e`%$HhvZyolCw%m zF4SkmjQhU(7MA>?c*S)a%K7fF!D1L4!3HDoNSSdP2|eRt>ih6FY{U1;p_6+Eh}+cV zYm0yOH1L*6t>WY3%gf8~@+2(E#qn@37#z!23y-?BUGJ~$D}IHYZngfhq21Sk*YljL zXRRzZ=fyS=2$R|D!&h9WPcx~w;HAb@LV$-T}&@lkS|*pzp-qq&IWRx z%>x-ed#1s6xEzq-K!%d%JXL(g4hEzWzTZ&io0~w@**_OEe#QEc1KWoUZ{kda->!Li z{S=EAW#Gl>lBX~E%&VCd_kC^wLFWEhLsY(ix;|shEPW6lwLJKYsAXAP_5{D|eOQ)I z^+z=mPx744dc|7FY{q+Oaj_}{7pj+uOl3))eV3q6QG@VVQ~$@%;s*gSEcv2X3#A#d zyZqjDaNZP73!(TG;%2Mp&o!bLrpl1l1AymA`ch7K2t;-|6231iN3A8TK*1Vx*9swq zmVXCq;afJDj$p*zg9n}Q5oCPHz9@@}OaivaB7emLg5`e84x(moe-)6;Z*Ojb-?D=N z{W4TbE`p!A634Hhm+x)&{x^{RQJteGNI{N15hypgyUj#6Oq^i|!&}zc8`^bmD+970%0K0jvQC&w4cj zVVzJJsPG(l=`)>1M$Pg=L1koq*`yy$X;TdlP5T_KvR9tH zTa&F+GuIq8A4;)J84qY0Po{JgE9KC5p$mlN&5aC{3R6OrVoHT8XUCxobp-%3-w%En z&Unrh@Ib1<41`T*6QbH;CVW)j<1cZh6tPJ6OPnsKLxriv-vAih#;sraet_&`7DO<( zgj57tEkIh}x#T_R`_kP=FB+N!b6j(&+$$E>YY~vB}ik1ge0;9)lJ%qbW`3 z8rQV#J>%c5lRVBSVp}W%LhZD` zCk?FjEt6>>1Wz%$MT8)sg<6v-H9Rr~;_)O|1*PShH#fm-JagD+JedLxSU!o6API}t zRKCns&oqDs5iN^C#bv0Ha>3Qj4ORka)hO}(B$(riW`8SSf7v{kYVRlunN z6s`z?d6+lMV+G7#2J;RFq4Ne84-N|7FLXZ%wL`6Ux#9A9R>B80w{{nv8LD^7GPw@t zWpM#41~zT5pOK^r>dHoQXOT3|VXi5@U3piA0`DoE24qx*nNVfn`%(pf{SD8gDJ~w< zBrU^4q|2hDWtgs|DlW{njnJP3r1~P5kt)p-DSI=uIW%Y=kPT2E5XK@x;WxBdOjU=l z@u6CGbWnm`V@q?SKWRyTQxK?kB*VgQ^h!AULhsA!v6eN}5@ghmKt%9;8Ojw3l8Q#8 zstzRzq?=bs+2bSAkmNukIa3sPjM4tR{h4arD5lI_1Gb(?spPLSwG6!DpLk?Ej0aSOT+D3ZJ&%n0!&plsgtWi#KnhmO zJNAwgq24j>tpRhG=Ml<%|DaWuhgfw4=fR6#wfytoo5+IJS$K`}i2?<{mnZVkPps;Ab zyl^B-r#uJ(PLYM^G97(IqozeEv#a2cgld%mE5|%8D?$$< z`^ACueH@+g<_6^Fo125kQLy1Uhc-d*H)G;^ri<=CF^>?^K&v~y(Ru_v8K83Dz?lI( z)CU2#`pJmg-0+Eg?MD`uJ*mn}EE+W}h{|Cm(tJJRGVmxOfMn7_LO~;6>lQ#OH%5)~ zL{4MW(HZ%Rs*2D}RS%sZSzM?x<4CnSy$RF=dIGxZXj+3khPN30Oa@bAiJQt*JF50E z#h4$d*wyPCs%FFKXdWhCWuh#mJy--45ZYIYUMhO6=u5>mAOHO6SD%0Rn>eB$zx(v# zcu1do_ypch=;t4O6ra*^Ew&YNFd9Hv&BtTVk_04f(%*gh@ffrQaHgR5BXq$VC7Z2C z>vetKlVv(9Qdkl?Da?x$)ga+2QA?3r@Uh!qj4v9}s-n+eLDLrwd)Jr-l;tHNc%$AE zOt8nW2?^duf=F?dZVbmE)U;oSWg?g9G7$^T>a!pb5YEAEMdrE#U3M|bWsGrWHx~-j{#9S5WXK=Dt2uI zN$k)vld34MCxIAyC12%9%DvbFd}Z!KR`fsCq{Rc7-6y;F&stq0ukTe{#6t z)pPUyN-X!Kq9YYOPb7y%o++lP3bbFfHs4_)9YR3`Yawy)Ou<&!P>;~`D0rr*2NPW9 zkR#A-CuO=k;y5%K&7UHx2y~K>M}V&Y=Kq{QBmGhZkHW<}t~Yd6LU) z4$mlJ=_*mnsRD|W#9t}8mi*&H zEcHZy@Von(!>RTu!T)gLJjZP%B;WV7dx^wH@D0G zg$m)9+7X3>nuxZE!l#Zv@ou0o4dhC$l2G>-SIJYwOdkD2vCmboStUyGQpBD|aryFD zd@!h-n!j>teyV8aECsZ;wzcuQ!BeH%j1N`d!9zfLjcmS_s&~$NBqn7c`wH%c*EOkRt$Czr+L zM>fx#lA#P>Kk)q^xlA$@fClMHvvb!i;x_W}!1o76ymVW}%$pmV<$U4$tp;p0#K?wN zULSo7@bscpZbV>D&g{89Jy2Fnug@jw!mip?TT0lmwbQl4%^$T@g=VU#Q*!hKR;MZg zPT@oowMZ(2F$+*LZzU`vH|hBg*TO1i>IC*gIo3Z2lUu;9CZ?!8wSim%kr^<}%Aj2k zT=a{sr89{QVQY(SpcJ9p@EAh5(YAc3Kyra)hcsyD8zOY-!}jU3b}nd1bT-)GxQp_O zW+jYjMf>EPX*km)n@YA01XWZ`9!}|JwFJ3I1G2##ADli=um}+*K|g~UVo*`AmMKlf z3RI>1=4N;{^g(aB3M8$o=HofE1CJ&BP?2~MzzcMRR5Sx9;W!#t3l0b#R#Vg+l}%by z(HTld&>q^0INFg9n!dsYj44#N;t1^O73J)i?OW;ett3?2x0JB|v7MZVDcL}cV>u2a zoUp+lM7}`nBCE(=|IZ!VHau z$Q>9=*%}tAeE$j#xt!toxK_-7&~tbw^Fqm3vQ0$~4`o`cKt;hg-Jn#JGf)@ddrb-p zXbDnkf|%J9hb*Qx%^{A7?iJ&74Tq#NXmrjtmBGo?4w(vh#LdkoY83DgDL05Y78c_B zhbn;WNu4zIG=J#XgvVZNSVj-J#Jt0e-eOeVG0Lv?P*{uy3A(0`TpZ<#)H>_XxKvR_SDD;aEJwq5my|i&gLdJyP2Y5WtSh(jI~dh z6hp=E!2oF5LTSEeaBniDxWr3P_vfsoV0DysN+WE_~&QdMu}2=#)=?|=8Z3302hp#VFpR&OTPHH{oy9B4xiV8Hrn)-KmqP3{~R{z1%OaX3q}zr zVXItBI4JZ9-Dq*Hv|_r12Nf5S!PG!KpkU2JP&BK8dO?^ogx0iYh&%@Afsd7z=9mXK zM8}6(B3kMrsE(XcI&zBXv=vuyhN=?fUY7a(#>}*yb~E1wSu&_s)q-jRd$Y`B+#ont ziG#W*%sU0GHPX!uoE7WQ%8az{oN&lS7^+&U8>+TVY}Ji;vH|5l?0%#7=DHiO@KEQX zKPU7cgK@Q^e{*wi*LXvc=~zR3+}`T7G%mv>uE#ilwfO}06t=x?Sy&6Dkr)ZZx!;o3 z>gmf_+1<=QU+nfMC-h@&QUO!1sh!p}jbI~{R}Mihs3kfZ5e$GAA}=?D#HK}+r2=y%L)+O%4 zSyzM6)N5v-E^|iH7GogPYtW!B^?)WVCPAoYq>j4CLt5flIi`|IpMqvP{`W7ZfwS@<%v8u%8pOlZkuYEhH>(+Um?0sA?7 z6?n7kl?OYX`ccB;GD7v~bpZP_SP(D4*r_R$sUT~ck0A0}oK5nJ{&H4!QTehTMaPjw zrJ_lm=lrVoVl7oRzwUD}>s|KiV!Tr1NX+$5 zfrc&_EvUAAP3!F_C!63Py}5~ePJI7qP*UuBy~p2Fqf;Mj4}_ju24hKR7NV_(u=~nX z?<-rQ16%F1z02H{Z}*&Lr%4kPWG(Fc$fag&I%elgvTIx`osq96M2{G^>yX=_s>dLL zK0XEY0MxR3>9{a`xs8b%1Y#e3-UFNIU5WX%kJ#ODgeD zCJTt=AisJ$4)R+?zeEnA$6`SBAVgI6e%RtDziw#D7G*I!BFu!~<;Pz=`IP<5qgnQ< zhfpz>Fa!0rlw1?(-bE(*%f3uY&cVd3f7)AJ!JqT~aG-@6Q&3*S=XsI7gojms;5}}& zkzMf_sFk?t4|?Z|{-R8-`_TZOi&c_l>bn2neovK&kQwyIrh2`k%#!{xo6Wdjo+{Ve zd;I8lmc4r1`<>|ZdcCc_)Zliy(qcX>@GknvS`{V@FDxd6z|=&3Y(K@mYVq&huU(vWrCVzFcL(_G$a?-?UkQ z9?9>ZNjsdyD_+j?;-$INX~$m)oi3->mWzk zH@usTl(5rH(XIzYB;PN#*+^Q}5^!$WNN&Duvk+mbXi{a(LNcQ*FUMu5-{YWU*a@m( zFtrg9m%bmA`i@3vC_L7S6kgukocbA3_=48Gl;b&c86Go-!VfzXUTO+o00ozA+HTXj zR2};{v!m0c=-;@rvo*>n)QDOT?GCFe)VLg4k3(0e5mu;i!E<5x+17anTm%35FM8e) zwa+_--SdvGf4t`%zxaX77j?w2G5aBG7C!E9SxDN!NQb)^siTMZ<=c^yUnu&s7W>3* zL@m;y&kZcXfb82v;7qL6suzfc3?>-8u=qW`tfdpTNN>!le?m20`uSCdk?3 z1wxLNf*u87n@~*BJ)^h{nxZz`EI0`ZPWrw$U@Z8n_SN@W!wRQ|()T|NxW0G{cb}ae z`F^*HT|xyK0U6{iq~|}@DK--dAN(29dA2p34}N6RX(sb8F_+>;K9`_+-9MMWig!=q z!>vht=f^XNr+z(K!!GmPJx%gQK20jSxMP}LyX2z5)^tVDk7vFj{|Bxva97eO+gtZA z;c$SVVk(?*nU>?`5qvisc^+Lc%bOTpv%tImzK=dE=z?iF*UI9UwPbqPw6X+d9Wp&t ztt<&yd$zdJ5$xe{g@*yx!JNZLu!7SP5YiINS@`|}U)T7$^!+8i&hYin_Ycj! zpsdHbVBQKge5zcFG*Mhn7hJ%p2M1O1P-h77LYTkgf@7rEZU7% z<5j3PBXO`|`YydjA3aJ5Au(*uR(jL6GMhGw^-V>K@uIG1!B9A%8u9eNt_g`3z8@@f zMGISzStCtF%ki?VXvvT>QjM~DE@p(pOWzNcx}s$bkzP?vMTg_Vx}rmdw3}*VcczcT zhrS;i>bee@-BIp3mqE;#*(Eizi)m(;(X4%Blk?hj(h=h$>%?kSfHkCa?#dNhUv^Y1 z(@#_$9T{H~g9D~&cNFHfmMDN~!s(UcnLvNJu~ta-hADSWj^W5(Tkj8AUUss*-yYe! zV!JAFt4O)K0lUm*a2-P89_vzmv6joYWPvGS^_nzip6A{j)u-apP!doc zEz|C$D`s;>uqDhHB8V624)(D_`aSBr4+yDn!#uIv3r(!dXyIk=!CgZ@Tu|!q{ZyOC z>J16S%1HGWsky25HPseDyN0~|>5%4sHHhrqJK=A&_f9!2Iqba+jt{88@Ame4?MNJ3 z@&;Ye1zpm^*T@~0S~x&&3`d@~M>1%M1BY-H3T!>Y(>B-)_Jz{CQhYZCJ$m zufg{n=ItoeF>79Dt(Z42%8PypqG%8Q_9agXF-ywp-lf(mFZ;vZsz0bz&H18dVbc=m z`2t1F6BISADjwd*k!R%0Vy(aipbzE-J@9##l!-|7yM@UJ(+Gu4y8xR3jyoOwo?OBE z$+WHGt1Smy>7xYR3qP6uN%c>nm2orp1RmyEQlC@qO6rT7n_vl&`n-|UIUew0k`dIM zl%~)bi0%u=?4XuW4ng2Jd?OjWW#i^`60fW5orSF52415THm6#44m*Gp`b|9$hi|6amLQYy~F2FD>d-rY4)z zd~UI7ha+J=Mr(Zq>#CUd;B;ZkV{H|uy;b0O0R;#OG0zr(82?a@p7CDKp;RAR;lYI+ z58WDe4Lgy|gZ8Cq)wqypU4v>s)#F0+2^Lx?2ddj!xKwKfrFQDdyWSnRHB=p$nJ``` zr1q34Z*FutTs**sk@jxE^`$Hhx4E{)nRMO3j_~4Dx9DoCpq~Av_?BY{_@X|nhh0%! za%=kSC02_{aNTw>9;4Vp(fh1H1Pf0EdFNWMqtocZPg#}dzzwg6$La`h~H!uTzsmme zlZD*P);uHbAXHAqd7N8&{+>sSK|g1Y(Z?=+1vg`jV?#pRI?=g7oLg5^Zq}=$^zgh+ zPP{|!D4()+K3@5iUTi(^!2I`eveN-=KH<~wJQFbT?e?{0L7e-3-kPCyTZvNTuBJNv zVWF9J^T8}7aA7Fw^2^Y zPG8Xy!;5z<5$rO0mQAGuFTzKFLnBWwmF>}iqMg1PV*zxVb~SmWc5>s%MkR~b%pi4^ zdMwbJFy;EL?RdPYz$=}3Ex8zvC(~&~sCDsBXLM3rs8AbZdGey>$uOYIT$OQoEnEg_ zu_>pJ!+M-z^@Ou#8Z81i#pElf3T6(bkFduJ9zMfnJHZnHS zc-fcaI1nI>OL}hFj-Zl>)ui_MlwRp=2i{5h09+x0uZ*v<3%KQX$XRqoUvU=Qr4M$5?u!X<%+%Yr1U7-rb%?y$;+&m#lyj%8cCi%1M&k` z0aqoL5}X?El&rPa46=ENOrYZzRo|K27c4{5B{Je#!T<)s6s=1yc{1zz`VVw7gz8_T zPq$pi+TbxyTPk|g5*#gx)wB}#0Os`}xV);I0a0 zudU$W+3B4%T)sgMP9L_an0S^jc+^%mHPc^bI0$eWp7u_{)3hJn?}t%8e9#Yv{qW&w zKa5V3@P2r|H-LZr@FYA*`(YGDXW<|`4WrZW;c0#v0-BtLCuta+gs0&!JUb0f!UxWm zJt&-p(OEwnoP;NRDANz`e+oE#mP7NW_~8&*2v5V4*0(27Z;%390{|;J4Ns$fc#;pp zclyKdofHy>P$|}Y8oA#B%u$M+(*Ga!b)iqAvtBgJPr|5w0-)jNrw{t!=>r&qvy)c8 zqdtxfRB?h84Ey1OQ>Z)dL(luC;qbS2tcQk9w_c5Y!@l0JTz0JwX97=p!w44Z2|j)N zj!rn~MfaaT>c{5y>vue&(E!wzGA(zZmR-TGRy*J^-*GPN5Sucw8>`6yi`B`7!7YTkcHy(2EtV#a^< z<KiDnx5sxZFL&_{DPD=tM|Bs1o%@)*dIPQ>z#cHGqRh^YX?B!ux>B6ap_Ah8h$(+JQ)sp(eTsgw0G7# zVgrbiXpg_IEy%P@O{;0s+^kTR1IK0`1>=M@>O8~X^**3?y1E*ftw1k&xN7nGFbwrZ z<%DP_$YfgYM+05C-2)gYGrfw3un8C*J-DZ684oF3K8-;O67>6U#6Y}CyZ70<(u^3f zV*!~XBwb8PEPG2;l{+f(706JvoTOiN4-#O7*9cdOdcg32WS(4P`E}g;nwPUgB(x_J zA^U)_^O3od+c!N!(P&f;jUI1E6!|0~Y)}^-vjNU}r{Ac>rbm}?=0Umocp!x=ItS7)s{CN&{N-;254JxvhDjH?jP-_Ylw9!161a>$ol4GSkc3y{QR(|m!ZmpWUU(c3 zRW(BGxAnAYTuRsBsX)mHzW?DMb@mm^Dwjk@y=$ex&B$!Vh05j`FP*Sd5|Lx%=<+Hm z>vpWcQKvF){ZenTSuC82=@o?bz=6LuPvGTPpJuEDR?fyF1^4>YC*Ud|KT z&N#EZ)3v0tMDVK2n-qt1bP@7KrMZ})N!}Y3PC@6H_uvBp>M7$<&vp>Cs1ak$yB^pK zyk$!UdKMT(?FmQL?)tVpdd>n*_hMsLt_-jGBD|v4u?(;KBD~hC7=n;pQ5iyb918B1 zKsRk#oeU^8tA9&~C}q$o2XqodPVyKcmnVs2_VFjamk_>vmkk-qcUzoYs9|* z+{=eoM*?jGZj#y5U@cM`qFeX5$ zoH5BM_-Zoa09UCh4NKN6J`Gdfz(mtd&UN2FM%PV_hOTd*qpMENb>BcZng!l>MRDQL z4g6>#x4d2z;5{HEedm1*wg)bpRn=PBnLT5JImq-P#)Gr~?`TWh3l!Vvrbiyu_CO<* zUGK&bRTj=Op@Yn!G{(bhhQWGfgpA-Sb+7~ZG8+Ixz{N7#7=)M!JXP|X!?_9FnC^sE zlxy_62#D{`YIm?(1u#HELkni0civYSoEYvn+iKAR?K^TGI_?{k^fiN$f)gY&0I42; zwLnL|U@zY4L9l?s{F@t~Y6F*m+zodLeru%6Uh()Ks>mCBXeioSf476S?J4OHHdtud zGHllr0uG?0urqhq8lG9;?JEkj3VvEWYKWJyM0p)ez9`m`>%n;g=76QwD-UfMqJw^ESa zy#|+YdT1~rm%d#S=m(~e9EJd1jkyQ*EH(m6t;M)VuAcH#vLz4PcN)=?=>EwWKgE~> zPR__QKW>%pGZjJu#{oZf(~pN3Btk0;)NgrN9I^I?k{l1g$DNaQkM&J$_m862ets{A z`YK!%GQ2v5xD~Z>#&|S-R&vSJZ*48laNF@jZ_0x$t-oWxfP)C;3oQ+)6+COn#kAem z&Xn=Ui&zu7i%bMgIyGg{FTgRs*BaMFb9$|VcbT1jeST=RhI{KY$I9SgYFAx&!r#;- zkHoRj4e23R=or6&-Q9!zBIx_E(Rp4JWl$dLqk$tY_KxhKVi56@dnN2JfBy7yqb(%X z&t^o2LsD6%*7Yp*4OI@Wx(H(@1ST*zh`RIBwuu4CqAisSJy-|B%D5*Pj}lr#Zoc;O3GmuLZqj76$(Mb#EQ0({XFi1bkA9A}OC`=69!fjOO z5s*F?5Evv?K>?l6rE~g<(-S%X2hh6~hW@xB^aT&HptL??dmd?Aw4M;~Z`MEAZdxxZ z8V%`YkLHYko=cy|XmbamCsIq-O|%?qT%a|BWQ%qfy;^&uFn*+(R&}5twa&B4)!i~sp-&$$ zhL4})V-BcyxZ(Y%Z$RvyR=wyUd0v5ZVDO2H0{hv-Hsoa2tHe${UfvHBfTx>&Ue7b~Z1vC_@rI`ckQmpTea z&tW=l;eM-?Es|1S=8GZ<&D%a<|ECbFpfi(TU)oF~uE46QYAar_eqkNi%*YyMg6pup zZum;K0G{D|h8I;yD2r0nKB2+Brxv-k1V<;JWZBaO#8&AokL^9id*MS`Fxf}O?9lg; z+>^&mVolrEOjE!aD~|Hx;mAeLwS$|pCd8%Fmr02M>p0Wh0josNqsY&a&%j96Fd`FU z6lkVVx%a`=2yqX*-gnS%00EA^hHC>}6{912ReS`lvw|V1p3?y>wy|>HBIFB>8l}1< z&b3aB9CzA7(k?OGra9*LrcFvM>sZr6U>ZgQphG(Bat?qjBH9CN?G!BzPc*5Yo4}6eenKA(twG#!f=eoX5oK)Exu z3UqOsHyM%cS0)6Tv24S^m}N3K&-pA6MBD8{y?AyRbiTf#oSuRiRGUA*PzrK4PicG3 z1uuKVsxG-jIpBi3!L14D4wRJB@mL}FLP0U*hxU=aQGNAW&Wt6aeG-U?j>f%HkrEJSh3MYcAEh=r=Db#78AWVC!zc zNT->w(3Q6=28^_9L(|k{o1otTsT$C2$U!t^w9}u?7bp-_*5<{Umwc97a0aG)cxBF_ z0a!qeJ^1UvN$+B*>T_^y3xU!)py2{f#AI%~D4!T@BZ~%g<9ox1H zDidnUI1ttwQWm3`xF|d4pf-66y&VgchLC_kY{RJ86%WX9#7}Mp-LGp~$_DRU)y6zi z+Zv6=PG$E;dZ#_u`c87)RujRdb2XyYN4Z04luaNbwQs8^t2i-o0w*J*MA5nh@#vlA ze`AnRL~O|!5?ctp3m0Cdu8yW$3jsGv;y0TIby04eP8)V>SS{XFG|U#7B^dPpoFiJp z>PJHe70AxH_96_wbcg|^1)R?ESG>G##5s%&4WXOssFzKT&UvuK;IU0It%)yA0kAA= zZ`$A-47fJDCic1w(3iM%D$}$DI5lOeB{(?aSg(*6FU*?#(jZsEO*C85EAxVaIJWF6}sXVHM` z&LXL*I-H(Emfd5_JCIw|gV*8q8)M#&SF~Lk?|qsH-t&$y4sg{_EgOxlOHYs{wY0Lq z8>nTss8Rj2u?pEkG`HHmr)HQksA~3SV%U>CxmqsNra%Wx2VFE!`xN^-H2zw#4{M1( zx<6qp8#S9Qp3{NJO11H0%uu-;QGt*W-CaHU=d(>rAjb%pmD zbHVIJJrZ^+q4ZXwwZ#RS8l->|HGRz5TTQ*|GfLm1sIJKO#Y7!Nro5|rZ0$%bikOLj z+e+wjz5~Kr?Zw}I#^{ded9&@i(XU0vV3*d9jt8U8T}jbs2--Ul2yo9I;aye63FVK` zl`!L^l8ixxm@|NhXIL|4M~xq4K!>f3KWKAzZT!*d0g(!Buvw&XfR!y^OQw#6qhrVz z>|*-m@sOshXl>%;6r(qEcaFGXjWikCJv2Ct(XIE>eLLvEer@6IjUSxK5l3gU?@a9u z0%_*@4bcFMfujxcZO6$pD@b`lcU^`QxzP;fi3Ttz5 zS~=PlV_??CBR(DFzK_A-&mm|V>dBY_APB|y$qo#FljEFbEPQyc7`dz387=Hzr&lfIDRjw-k7Zzji^7oW zmtqBw7x&arQ1ml`_-L_9(45M?pxG|9KA;wa>$Lk1g=$2vA|sc>xHrkbOwnxhq{cyB zs%yYQqc5b-U_C{xz5c6!9EA~Su@^J+S5YkBlBI;}mO0$C%#Sh(>eX0Lga&SNLeQlY z@Y%IN+l!TE0&=E~BcPe$aXp<*xlxwl+UjXT#xB*(b0^~NzJLl;&nzxH{(or-i4C)R1DFbsa29Jco z-$!VFY7+3{vbuos~ zK#~c$ad0Na9Tk=k*el#8Z~p*1r9%cH~?-LWZ(oRhj6dPQ2qI=ELMGesXl<4S<&jM z=jbZhOsXQ!8w}@cFyfE$qiDpNMJ0o*U)Be?-mdIrS8!a#P9`qi1=%4=P#ubL$%3tt6143%$W&|q7vVZ@sQ_Y!1ePOB1pv?~x za39?4f*Q5;U?gxLM0X&B9*DcZ1QhS04U*0Rg#ICPe z!nq)=%>-I2Kk7fYZw_~gqa#Dk-BORRf8&;w2+j;BU%Kc0Jr6Vq@pj?ewgDg}cZmWZ zeWR#EyMTd~X_fiew@kwOguc%MBZHn@7!*o-wey|FM<3%n?IBLd8xD zN+Z-nR-Ns+xhJOWG4}4V%|X%Ld~15Jm0!7hqjt{XXljAuw%>R1Rjs?N8ZoR@SFP0# z@86HZ(+5?G#dwtw2z)+J)Yf$W&1-#&0 zkDz{KiYm?j58-v+$#uN5NY_k(RQA%gZLvN)>gr(XbApjQz8E>Wl95KL!N`6e4Mqs< zK~%dmfuKtv9JJs8%0@HB_$TxEe5BV*{F5k(MtY^iKS>k#SK${hQ}qW?8qJ2o`kV9w z{?(tICh!kG+a!4&qxIFuy*y~|4mwu{ox=uwRT5*!+KZWROK_x(U+~fO%`k#LeH|MW z%oNfhUtfrk4m;&syBw`0M3Uk;i1TUP08x`?%(ixHY~;@+hY2$QJ=JXW}42R)R_ zG7~T3LA&#HlrG~SNUoBU_s_YyEnsLQvXEvkGu-akR(FYd{Dak1<(W;ZkjTi&%mK>(aYJ5~aT%H(SNmT;1v*RFG(J2#IH zH)Ul}WLUiNrMF(entnrb(-+A}GupVjS$Ga}zIz9HV-fmcpu6ymQ$&#;DeIxtvt?0+# z_CmSYcf`c*#?>h5@EYK59Kr&3TurCompNt19S!4JI^E~k7^~73o*hrdPdlEBOUHw4 z0Rh~afCfQxw6UqI=|@pVXtGa@iUlqZ+jz>Z_LW5=JmJ|`E4}B}hZ|Krhkf3wBAfLF z3}U#*soC!dV?qKcl|2x6j3z`A9$rnE&{jN#K&899hcU(q9l%1H3K*Xc=FqWy=3JmV z5-!QuKE)Fc&c(gP^%y^?@Sr}i1M#sr+?U2PvNl(G$pcAK^qp+a*0TU#Ys(6RJ<(U# zFm_^XYgEw>0s`)v3-N5mVc}fskw^%=+hugoxQyQA6#As)6}oKZ&i4cRh`OL)3+(L! z+cy}y+yDLc54V53{p0ul?)IO&>1$`DYL5^4mCjjFJ7})xq%c&$^?vj1M2$UjzZ0qg z2dz^(D@;-FmW@&4>o5hMyq$;Vr<{J;^6=b>PViMLjFn5Y?(_&>FC@g5Pk0@|-82Fp z&};_eS8?f49iGs0{E6Hjc+|=)-T(-=mizR}-uUk;6F)q)0pBwf6x}HA4M8iJXM`~w zwl`Br4t@=-2YM}NsAAQM^83U5(yJ@gm)~_G!nY`K9fq?Gz1fZh56L+srx>Xep0Xx3 zClJ!$AhY4$4LNpV#2!I<@0?JY~IZCy>!Xgq>k+Q;oB|S&pG{S|FZq; zO@fNhOZtqyPd}xf(68v{cZV3cE2M~i%hxBO0B%5$ zzmbKGJl5o1V!|_5xXEi2$^IHqNXlK&#~^;j41$m7C~V+dza0W3UGnthd2!W=R^rLB zUx@q~lb3b!A@lUQLRh0IMv}m2*=Ma#5@#lqgbA^I){dR6PfYr`j#>SzuKj%m9F#mi^OqqfK=3PW!W_(q}wrp5M@)wBxc30Sy+zO{geof#ffq)?w!5ZSYT?8`-!8Q+Zn)!^u zq+#kpXD;>6rT%$F=qEQf!B<@jdsoGu z6-UKcb?rDRs+m<2qy$$AgoOr@-HaK;jW($!s!X#8)L&u|K=aNTGhn_CZ8b~cbR(=Mx>U<*ODW`eJ`5HEnnOR3(bXrHx^|H-yX1&}vNp ztyZkHa_mK3>gQ<;mQwIYA@HgoehJ&aT zIn9m5V(gtXCZo_@$6zS}2)nW;#F*voAG{rR|AN!c+F@7R35{$JmSKzOe|&fB(uVE7 zCYsnYlWzvidA229m=YMxY1};CEiCL)VO;KrOq$pNYjzzx10ewltZeFnT?gKO{l7dA z6|RF9|5h5HFy<7X}Eu!c=#KAqY$QqQg#q7zhpy?qNSJ(|PyKC}C*Z6z4iD*g@1* zv;o;f_4AwYjaG;-thmDtbVRJT2oP2_8lke*2%(*DbDJfjCj-2Tjj#^z8gc1rX-Znq z+|u=*za3qFm(!2ibX^Zvn~;B353$uHT9bk%R>>r~4~BALO64SaFlBfOBP?$%{{H@_?2?&cG$yM@0W?b2v52v_L)UvgBW z!*Zc%%MuyQ%&h0I5kF!PN#Ul;FL{8ol|dXEqpwH+pGy^_6E&p~ji}bv!7Co|SA=W@ zgLhO|`mq50B?KUr$oZO$cIS3M+T1Qcn81c3Afpz=UzD?clool^OYqhx@2}RmilqHQZ98q#0sI9R`wD8tT*e;Ju>Ac_Qwfxzeest2sk- zz)06Y+F5&Fx@*sp6YZD%m)qpzf4lv|_y6wRiik-~Yq+|NZxWfBOg8yZy)8Ki>Y~`~T_o4^W_Y`=4(A zbo+lp`S1Vz_kRxwf4u$E?LUIjzW4qAf_3~CsOS5?|Nh_gZvU}&`!BbDy8Yw#|HJJ+ z-~Pw%{{dS1{_k)9^!?x6{?kE=nDHINOd>G@Q#riw0C~EmLN;VA}H$U?Waq2@lwmlbFLpQ4^|yY<3U&I2#99sEg3ZFOYy`nlxlg zPe^8oLZ*FrUIcJN4WV%$ZW*wZICDr@=8&?iL(2Bd>^L0hGIgLxUB1?ZVh{R^lW~xA!ALY13Dc;RSTG=+!t6*F3`t0wIAA0W7)ck5oj5vP zkArm=h_wb{%{2b5EfA1S0UJseh?06z98t$V7Q!jhIS;c|l~ zYUw|&wI)TFh1R4(@-)!#AD02Y=q=eefflyazw#$@|S~ChwiQC-2Xiu%G`pChSK$H($SIZldT- zS5`Fm^JZ%P*jCxS6o~l{y3)WM>{z`Yfp}W2;zunVeYt|Y<_lSBAA#lcbH8GZBkb?20?vxhImQ`+TQe|sfik)($KX(X!u{DGk1{zq<)oO71Na-Rf*eylXtW%=NFZi^AIOH}Xo!9xWQZ_0E1A&Y;GGB2*@?+F zZLSXQN&15(o58|kf8P789 z%B!#;=HXSJ0UISwO%4Uw6m}&Et9-%x6tyv9Xa(;C$t63^~jNa?=6eZp~R;N>BKSvDwhp4kfJz zB{NTr9S29T1gaN>dd9z9CwX%=2qv@j8{^vO1?v8bSNPu+JoY41h_^Zk<$@~kD&yk* zfNGSFD5Cq&Zct8Ir=wE1W-hgnOWWw=GQg0RKy@xn2zyWzUj{bNCvZadEo;4@y@$Tk z<53%~6BFUK&yzuKupFMg8lHYU_^vidz4EAczka*+s22_GYYA`oQkaq^uV@!7+@hH+ z`cD1o6wTbC&S4)I$X)i&dd_M8>0q$Ss!~vWS<0i{@YJSg1N>H!xo+iAZ_w)x&4nwI z*SaD_ykWe(ou$gf4${kj*b+d|^`%~Mwc)hC5*6d_$%~#fr`HI-Sca(y6 z8umhu7RC_@TpKU64+_90LO+0)jQm<7Y*H>TvJzgkps8c7DW-6QtM=IKr9jCsxNU>L zWsCM}537=C&ZP4Axy_xMr@R z25lwvuJQF@ojYvj!t2AtFM-R&8{;x){b|<5<@B$J%gNi}aw=%i#^wL+_})S9h3uzA@iODRS0~{hyx+U& zJ^A@py?e(_FV-jt!xjbI)Us&AAJwDOYy*$T2J!`~^T0!#{Y>hZl?vR8f=kp|(yAbL zCRihQqus=&;b_`-pbnh@cE$5d@EN#SzFzTS-m_ud$i@@s2?PA^VOCJGwFov91$%Z9 z@~c%=a&6vZo>}b;2L6PixD3eA!?RO<|6W}N@4)T)wtfm#@vE=iw?1SbdhCvX=ZaV# zB*F1dgW=@l^z6Oq&HWE=&IUIR-Y3TkI^*4soKGeJnI11Fmua%%+F@`G?ycUl>6Jpj#@lghj!+yxs)HzQBG*R_b)1bj!VVCo3I;NfMNDY)0D$WdO| zxidaVbZq!wBf-9!f&$LHqW79v^ZnqUi%d5+iZlr4MxjTb#+~=NFFlXM69}2Qsn8Wt z*?1Q%EqdlmOv<|Z3?-f1Mv}6jOqfSTs=USzGPXT0L5{8`!GF>un=)_%n9PC#xF|Sd z&Wvx;6g{XbvZ+T*jlqvhEFst~`bddw2w%W*&!ZY&Io%l4iu)0U2E5GF@?E9M?0l`b zYzElbaT*`lg#ecoyfjs5hc5M(sP4ep-nRvJSLS@(RB1iwH}!!wWYfIH#>CNJ#=PYG zJ8x`s$c^H8AG6_zw!PC^?ZXVI-0i@dJ*^sfUB_e!U%pk`Q7Z@{zucz zup&pti)`0AA`}rAYJS6|`O);|Wb*F&{g0+Mr-PgOllMOOaEeQH^4|L&O!q9;3bv&X z{{7f19`c*1mBulKTwX{?FYeX5J1R<;P;Tjxyg@_kZ~Qe?+smKYagpxBqOa*DX zNP=f)q>+A$l5o+BCCSok^nQI1X{Y`AD(Sy^IhbYtEJUn^$@N57t!zl*T?WmJ^ ztxlF&oh? z4DpBRiG+b!yK2}qA@Llq6{26tIn&NR^g5rJQ>(3Y+(9XmmUh!-owKfPez~Kba(6vl ztJnmO&JsAc)cWAU{AQS%nzzKDL!&odw`k6_*gpJd)>yGp;CyXmQQX9g5ljJ14wpQc z@v_mupBq}P@l2AMRU*0Io%>-H?yL|<9oF9(76soc%KIM)wY!Jf>5^$+D`|dZ7}W_ zkY}QM5Za8Z@8gt$Zo8fQvP(tV=gJhls%Tr;`dlSioDImvsvzd#O9G&3boOo$fnl)?IR~ z4BY{L;SM-MONx$Xc|742trK3@%(M4JfHIQ6gXg`+$(=*c<~Z3s;=1dUTjFuDY!1Oj z?Zv2-0jGm^&it}=fS)7$wnN|vKX3YwJLky-Go8rENKW$U82*H-pumGKc!7=v}QDc||qpFW@<(}i)_q)^qmV>FMWTB3pq8C zFWgryavjypXw19*-%1mHPoF~7>hqJHyof=Ielf$Je1Sh#IsOdIFR0k9yM|~m=s7+u zdo6b!+6AQf(JmHF27?~@hm36vLvXs#a_s_9B>LyGYwKOak>s_%AaonFN@`X4yi0Ib zTlnJpD@$7ZsO5Z~(sU&d#FR(&NLRa?g*-BqH z+fC+0Gh{*!nJ{GDrZWphb>|`)FUP?$)YOL#4Ox*YSZWidCBrpFm)3X*(kTpT>cW*0 z5-%O2wWVX=vD|62mT2*RsprEHTN-E3XI(#Z3E551t-q@+!j`FI%SD`_gz}=d zpKfO>1qCjRM;a(6FKi*>qY6^@ky%^0>xwR+GnnCoa_s}D?TRj;B_zW`uJe&lexir! z;dFunHYF6ivZb0X>Tbh1eP-z*Diamsbm$9Q9tp@F&5RfqbqS$ora+yD;w8t;Ps8BZ5;V(AC54yJnJy%r=*20i7RuQJTx+gMj9=7teGdW9L|SYP=CHt zTh?Gw&H9a7!?JxBGT+v8y*Ud9$MSy#F8+Gly@P(#jt)ymuCHUJ_U2`}>+Cym&at-; zs`e|pV*(ooh&v`{ydJM>`m<&@Q|5Nyde?m*w>Ii} z09MS#V4(|U2Z%1&%8ciQ4L>(p_WL7pF;SD{6k@te+0qm_hxxgx=jX6~dS&yI(BKQQ7jLPvV=K@n{&Jyst1Y2uORH@Cougq+nPnJ^#nj|nP zx$yl%la7w{lXDp?`xoGun;7@omk8xkuIROWYN+u`R8fL2eTb9=`xuaiGOQ8<+UPR@ z70$C#D!STK;^|U3+ zmd2JXTN)k>M1Ul05TF21lq~61Cdoe8x3Vj_m2>LeUFV*?bN8d_{&lJ*lT6~wOq{Pk zeTDN$ZmqStfo>3#D33gO)aVa^Xml?$`rWI4>$jS7`fH88E;%LEj&yc#4%{cqVI>Bg z%4N!c;6`lAV>WAf>NYRaEXBXtEakc;C|C7D9FOKQ#-lBd_I+3L@1Af5-luFkX-=Ck zWA9B?_~dRf8!!g&f1;*KQx`>>;L(~xqCHL)ruN?CWKFYiVVaJ%r9_)bMH7yku_nV;@2f}JOMDydkFpaqM_I_3g9|y6g_-ugy{N+8oSlb0Dv&>dC8&is{Vtk|#*^3efnn zyosTpN~tt#y8{fc?O>cB1Y_@`t0Z(8_6EbdgqS!3y{?ikuG6?s<|=x8%Hi)8UARIs z;bdH=F```K#CiC*MVB$Sj1hnF7&}3z!af_5&<#sE+W;-+Q$cKO#;f&BAT@5rw<~bl zi}z-a^%{GcfQ&ta7{{A=GhWOmUjs{d_3K3JW-2z`L3H)Y=2T-mTK|LuF*dezwx6=E z+aSf^e)=4LLscVYJy*{8Jv__b*Wr5y>3WydW$KV=p@$Q~Hd|qj*%n)757+`*V{h0Y zTV$*3317tV)x4sD*riROm^U1CI|%Q6W`NZmdpUTx@=TfCUcy@Tk*6Wf?3sGF@|@lx zrk$?(mc+Q7qD}H>ogvZgQ?w}_tv4jvLs`2rH6dwNG9rJhsA6W~`%}nQIJ{)VoYlZ%|TesHBadPaY3_@?hwbp+^SXVF-8IiaXtq9mC8QGMgPM z`oD~W0|cJ0(~vd`TXlL?7bggui}=cBUnsmJw#hDMo7|)UEUra%t3)#S8*mbBz$Cg( zW7w=P<%XwCy5Jnzg2{88MzC2NeYu&OTP?@)#d&vB%P*Wx71TM+@vh zj2aBt8Wb4s7F3QH{04p;!W_MLcBZYu9PPxD@-9ru-Nf<0bGYxsk6-XPo8R8oYivV?7+(5wzlNvKo}*pp=5c2t#J(Xn9CmaB7;WYYAA^~fiytobPh zAIB5a986jBFUdAMM1`%G#6q26I1C^!No~@V2{-5Lq@l#KADw%Oa6`QQTzpWv-6Wsd zNqs7@grr-Kh}}!Y#%2T2)pm60g65&lw#9-*W?YFQx;)~?I$IFrDJ+?k=A&p{iy}cW zB9ehZBcc=AC^B%~VtgDHj~F(kT+KD1MK*??wbq=dQN_)PxZ2af#FohZ2X1CBAkHEVR>TPFhz zV_#_)`C>Ay>kjv8lNXKN_RLn|*jQ{BS4>4lS}AT4Xtci>$$lDirqBMHay7S>x%f}COBNwm zKd|yp!|r03D~C;#GQ!H>I;oMU7KkvM%pTR8gfgIU7sm)vL2|r93k|U7jjQr9;586PfV* zBnxL28hkeJ^tpW`Jl|Id&-Y`(bNB_*N2s%XiSV39ps>{XixZwFZ%&#NW@0Ie@Z3tP z^H0+H|9w>FTax~N-`Kx`mTEtJCJ+l5TnMyaA%NWpxX#li9b?))Ja5p{-%&kisOS2F z$^iQ~G6Ort0R?^!Tx9N*Cu*rdsB=7C$%z4HN~kR%Oj2BeK9jqv5~LvJ$@omElyhwp zy&fUeF9ze%|;bt8P453vc zg_ZFNa?ke|(ca{AE#|P|s=?XvU9tWg{Pr?`5=%{0ibtib6!w}zVi63uCW=+_UJ9rC zFF-2a|8@UsRDi#O+4SN^7yp<=5dUBLZ!dlh#PY~h|L)?4z(fz!@_AKPaS(a1Rc}X$ zI|WxLe_aIz!BwaB-c+TQKq1nE3|WANHzO$-!3h+(yjZ)+SZ`{crjwHSKl@)@ zd?qSoNZo;zq@+y~E-JgS!b_;iPBc6rxmqG<(;!K_YHbecuBbhv5qVOmlNs7&d9z-( zJHXNdv>r~~gsQ)@{&e%Ph`<#<4abe0FoIV;@G{q46@lhJ(^L=ea)<5M- zl{v#vpjql04mre2gH|CO5XToSv7)01KU!yJ+L%~RP;;rgPbtS`_Ti8?p0rRL_Qyd7?4&e2)0uueRih^=E2)UP zi~d|^d^!h*Zw=S)jh`SKF|V_2h}|}i$73$4+0s$#l5XOqgy-TJOSoxto5_1xj%C^2 zfE6(23L?4YNv`1>+g8r;LOU8S5kk_ezlI-v$E-UM&bEUnN#T1<#=ya8-RXf=XS|`y zFvl*oYQ=&$MeifGLV;rK1m5srN$MYZe{{(STvm~7s+ZHY@+R=C= z!%N-ZWT?1!y2|J%K5E-%uM!W)*+*`iztcSMyHT<2TV2r_Kx^gR|}{p0j3mT4~s7l$sgQ*BRis@$O_UZB} zhM~Y^gEFyBmucAPBoN5f<~izpfPO+bT=>3_G3>jw+(`s9nF@e zYFW14t`i@HhzTIJ=sD5yRS5x!W@FBv6<+&bynMCo%#b5=gyV`PDz_QgJVvpIks~EW zSyQ#d?Yw!3<@fF-OGYY-)I9L-;HwXpjs181-}K)p(=#p{FMgD}_=z-I{2{e+l*?!2 z#p1IxSH!^TW<=_U9Zzfg(Jb|shb$S19i2mQWYC85V(Yn|)9Ru7Yb8Kipw@(!#A0Qg)0MUV% zqZBar@7+<8HzE0GMbF)DH!m4`UJmzc(DT@lca>*@sSoJcAoyGKYe2>O+=JzO|MUJI z`d{OKoxAu2_-VcP1@1dOyZA-!;wSXD|E~YdaOG)IGcROQ3L_dXPTfWmoxt=gzpd$i zr`hAt?Q(2ZLJvXf1H*g*GnHwI!D)Hj_Zm(US?9@dIl*{B3?Y{bsM*1L^1Be$ZO;rG zfBQJ9IvCOo?EpMoR_lq61`~dEjS{nr5@#o4r=fXdFX0=j9hn@Nod))S??)?Pr`l8= zw9t+!W|AD3MI>{V+q|WVrJEUsP7}FJeLTH#8d}#d3>#UjPA%KDBRhw8EV&_q83$~O z9P9QAAZ0Ft8}xwes%&zI4jzlNyX*)ql^Fnyds?{!pR3OiA*|F14=%N#xve9j%rKze zAz5wR)@*E{SuYae6DCVdKW!D;X7Jj`JATy81DymGu@MmN*3f`!8c1#<161Qhvio%! zCmP;%%pgSPNmxgdIw!N0#sNM6AUSJ18WmtLDwyrgTwWqo{Rl(dNC~`$flUaMLbbg1 z$tT@CbNtQ1_-<+ZZtZmP{OprY_WpCXcDDDQKlvnI)Bi57eG>j%Ri8imLH4{@rM|wU z>vIwC9)IF};)zym+{@o~5?2tsw;-=I0-P6J|3Cxi&nX-&RF#7V(Ch&ntkckXj%WG3 zqGujCO*8U?Vmo|l9@(40X2Gq2CZ&p@LL zH0QQwEwvmMjk5%CB7f<#CmUP@^_6E&HUKjh6ZjTPrN$$vhA5pl!Hly zgSp0NAUVQIGA{IB3W9#ZHG1)zn|8ztY4K#u(xhV_&fS#HgQD(~Hiw&Vpj$l|bSOi` z_u5EuMm_7aZbo*~4^FE2JVTbO>S@r08{4bq^XCj!_NgH1oYjDd7FTsx({x=sH~~s) zYE{saJAMch5uqKxs8p>N#n1COVQ*-8Xtbc+z%^vtFm6#bxi$Lu(FC~MsSTXT5Fw5&XXqOq&_x*vpj*0!UTZ&mYKn@_j% zjJWN>>S>;DUdFfKv@N4gum#+*J8v+o`st!=26m7eJGIY0J!jB7s;RySEhGke(r0+s zL^OTQEBdd&6TZIB|l77ebuKHy9+;HBpjQs6b92|B8k!`J6 zxAO%oSR;Qsv!Gdi|G+i9*Lj`ULEs0Wv3J@Io7KGkdOz&e>vkCC&ue;>KMad)I}FXH zEwhEQeW_7F#l>AcvubGy`F7O`=I!kC1}ZOt%FAjV_gA)I7_^K2YxIy*VGW*Vo7bT( zmqF5xUtvEkgBA9kRpaxRjxKf_3KE@$?0A;oh~`mhFxZIKyr}9%Pxr9a`Yozc-w}~M z9}shXBj>{m>tNEC z1Y1tnam^EWVtXM}9y|fGvJr>SKq7MWsc2_`*()}ksMS4y@rWx&i*>(!=aCal+U}h- zfBO-&z&l5FFlpIGcfz24hdwF1Gj^K6%WmuE*$DXuZ~MOn{Ae{db{cXAPUoM-OJ`WU7Gxh)ZxN@6Bic@=Z<`y5fy(vf6f<{#$K^l3}kb$ZIxqrKs@;P@VH%~CoB%NXph2b1`lJK zq<@t7TV%l@zIZ@*Z7x(6zp~f1dA>X!NK_pxm@xHqnO;}oJ&)wXEr1V>ALuMEZGCQ;frPgaC-eP#kL(fb&J^Nv6-biOEWNwlZ0geAl5? zURsdrV#Gy&GN0j1*A61>xhEz? zdC4B{lZ%dL*~gm=Rb1kWCt*P3`Z^ev6i{}s~We?u1Im*V;6Kk-n7 zfpD~6U;McL+lzm^_>q`af0v*EL0$c){#O@2&i&xxv(YheKLACR#(Ql|O!oP_7^mFS zG9UybQK}434V0|^0U?=cfu2^L0Hzw@4(1atuk%{GT?TJU4%eE3&J<7)C+vu0Bto{t z9c!f3|e1!|!Izkt0L*1%5Zy>k6t0wUwyI`T9Qem=~a->UpL=kur% zczMw@FYah=mfN7CN-Tl8T$M`_XN4u|%?T!}HcKp4Yfh3M&M7A8FQ-|e zvYcVE{$Tc;G-(p-NA}u0isP8dgzOBbGMVYdKzWfS_TE6Ok zeev^z2_@J6D!1dTI$7>tg7BIyWrn`t(Z}1{S#L0hykP_fGuX!P896-@C3tC-<`tL*LD9wsb{CAG4&`;UsSf{_jcA| z-jK5v^F5rk$eq_4?7U#PKADLE8HMq`GWou~42bMsV*0NnkPgA|FA@A#CTrh@+dou4 z{K}#Dm$2+5brj)%|AZ^$FZyr$UtjzqqJ{qe1~i}JLiy{9f6Qm~{DDDx&@MsghH{bN zur9c#X=J~tQC(^}D!wF8N@+M0S)zg)#{I)~*)#T%Js$*VRS;r3fKqv`07qWHv9K3v zI2AvS4aM&pWiow*rEM63@0l>vM!@QN+3ab(W;AYv^m2cMcK5 zkde2U8IhpF^eTmbhe+f0lc)RNt}=Q~!^vHI2Iutsx0C@1Z%nUvdWjwX3kB8mLZF(q zQN~IlW97Zei!${X1#Tq*m*r9!Kpih!?{)u*7HD6<|6KoF|JS&;{{k%ea6kVG$^+37 zy-D73DCc1jpWZJN?jts26>py?)-q47vZPDl+9Ylte*m8=Y){Y@v^73^EqhRzc<;T< zLNT>#H=ZY;E1BiA{8w5|nDcZ;*&3}R7BWlX z@amFiAB<1_r54BGU~#+|tvHnRv18@n-#EC38n5J!!)p7rN<|9*-taBwY3fQ^yC`?$NmMa*v zET^2nphG!m5`&(|38%n}`dON$1+@*bE0w)#13{`L zHJr(UEgQcK*;kRV%kykw7rvMB^tl&c?D9f3c7Yq%Z-qL0A&gyKkg?0tl(EYTMf!`_ z*hPdJ;`QhFff=onfBLfe=}8lW&(CO=nCMVVB-$S&8EBHJz2f}+`3i^#Bkevb>s9T( z0h>p5UogKwD1)}UDua$!b-j9DB8j^%ft>GWQpD}j7X3c8c4<>iA%pxZFJhyCMc#iB z%hh$}ZbC~r>=LXpW>AOSwtNHq%c~aI3N@N8X;wi}9*`7)A5-u$s5a z6KbFnR%He_9_oixH$=4E6Jr%dj$Px)NG9wfsm0>uB2 zL<}g(cGCojTxa?%HFcjQdJ&(Hx+NT-)hkULoT6REZOzZcw6{V%~%hH^l9vrS2F zCg)&43AXhuwQ3R-H`klVuaop$u?p+W`>U{qX?^%sj1MZr7kyxcHtd>&YY6abCw{gq z`U!Es!(DQ7>`FHkNSG$AmW_tV>Wy{#eEQ!`%ZAr8;{fUfH z61~ilSo*6iiKW4k*dMJVo@SQB%3p0stPGaK=4d6cm01!Cf8F|}g~8%@aFhC_H}9=q z+Lb74N1%~gM{@QOE##i!)^(87UsW(QLBX^Rq@E((mLEhEVT>-lK~2*>XqwiwB`H;4 zH=JWh{baMJiq;4@N;W}xw63ir>7IomkFq|=R#-?Lfa+*nTaey{d-&KTK;i`8>`Yq( zT~Jq6%}k?erX>dvUEY!$L@J{dIf!&d3sO*pbVhGvb~0qkJ5oWx|6=*hHQBIBTi zG~2}xSg%Uet8+pOszDu zCb8qULl%Ws+3`<&Ks)}up!T@>)%+cRrBCfBs@4a?A00+f)f{Fn-<2QCWtqFkS(dC%5O^v*(pf(Fl9XXg z@&F7?_~)gpVnlG-NQJCngprCU0Lj9|;fXPv8?r!INMn}%aUTvED^9vf7~qsC4&+Y(Y=i4N88sNm~R(ru6W zBB9#8BtE>Uo_!O?MaP{8QtGTgiwUIT6pSo5ix;mIiT*54k= zyq$$IzXD$le8@& zX*!#pDVJvN-YvZs7#$POPEU@EMdwQ%{~Bm=|2>f7{-r2!h4*H-F~`8cMh5?|fke;6 zUU<6K{aa4>;50*rrKvpIMm#>ma%F2_KM`fxBgI zgCn84x%0Znus&raH{ z$KWW^)(eF#&;q5#HBKV9r86nwGDJ)bc${f;S&8@nA}S*xCk1?vL@N|5h?Uvwbnq^d zv`j_z0;E#LRg~QX<(m|34WeB(;9{yCz`UeXZy?o`BQYjj0%%zBF&mKbhFU6qzSRDe zEFQv(u9^xkhns*}i)VyI&biA6+Q&4|E>g3QhE@tm52o0ZQhd9|qu~RtcBY&jb+e60 zlCf7j?BYW!e%O#7N~hBJ@G`H&5^7(qwD$NY;P{j@^D1fPptQ_UHhs{SEv+#q%^E7L zIrPaDW8QU9rW3YqX2E?9aWF#e^7@6$!K31qV zQVR97%b3|T&~ZWqI>uju5luBBq41=S!AOl%Bt$|c-;?TFnNDQJ-dA7z-_S4y&GtTw zmKaYUuA?PBy0(Sg`Y>l7Q)Zin<571v(fYLPh>_4#%cuJK>*FWiyvOcwd$7_KfL&iz*M6q8h~ewp7dA!xBWl% zfAiiRQ{`za(_`wcf@(klH6n^&(euN+Vd zg^5ZPpvKS#Q8D z9n$QJ#7iW6DKT}z%Q{^WtVvs2Az;a4*m7?bv8~!x(h=~{GR1g6mo>T&;Go17&(5?} zSQR&A+n(5*D8YdcG-ONh=v>YStH4ruF>Mx9o+znSIZtHw#80xVaQG_B)8}^4J@KyU zo_IHQPYl0c*%s<-S8`9xBTyLCsp6YBd2P}tFbB_K-^8$Fo8Ot=i9OHk7__vbX?I6< z+PqUJXgh?3+2Pcf+O5O0vkBUPXOE+CRh^yTyIvLw+Dj7hl7v)W&cBRb|I!$vl_kEO z8dpc>FQW5;6WHmGG8m%1KpH=F#t$4a8j|t`u1on4BOT^R8cub|IrL$gE&qw?bA?vt z`rM)99D3K-y}~)PIvfO&kU`_4UCK7$KUerY~; z@l(uJ|JUG-?k#!gRT1$Z^Gk9C1pan^L{1~V$Vq2U-$@^|n}@z*gy7Enf#8|a}MrQ#2+>8$8vI3TJW zveuP=sM7aF5l`zm6u+Cxg=yhb9ZH3wuYI{PfBL>U6Kp(FW{uFuuW& zW##EsF&A$+fhPSe(Yq?+i!zAxe@m{&G6pNM%E}l^xG%GKGyxM){7}8>&YPM}-$r0E zC^1D}XZ&Z6m;0(k4@ow&Vc^tYJe7&Dc?#pkLv@yyn|+e=65`zCXB-WuMk^!MO@wDb>dF;nr7(4=z9C`j8kl|cv97pW zr|yzSpFra2fe2~PT>}-8ZLXl~09k5NAxqUy{R|);(dR0W(y+CxC{|V!4M|6_mAQIM z$r~B>w1$?yL#V2={6MGs*dC%Ck7 zg$)d}(`;~XEl(&&wO6Ac)g}|9+GHB3w)D4$RC{z8gyu>{)PIG67VRm&K|jJUVh=ix z&O(=MU6&eFc@=s9oj_v0JI6Q1y#p4^Sua`}@*-#0i~b*&N3tXx4v}OIlk_iXS~IjU zhU_AV!571_{Ny`eW{osQ4X=xE^9s1##8q&+3`E71Y^>aOVm;CvC9IBNW*pWX0?Xsx z4bOz5!*cC?*jX#nGZ|v8OVgT_l}pH49YNO0Wz_L|CQGFZG4+tUNIA5KN zFf$$2eLo)90og&e?8~@e&4@F?n#%CCaZT=qKW3ZxXA(FJa*4!e6bTJOa$a#AK8B~) z&o+4E{R})Opd#SwQRz=^EX(WH%A7NxU-*Frg`FwR4$jdy_D zn7v^4*+cd*iy~%6%!^nUu^?h@#Qcak5vxbcj952fR>T?+>qM*>u~x*|5j%+3am2*Y&~Mz5!;N|O2i&VY%5~R5ql7^g@~<1>`lZD zBeoc^)rdWb*lxt0MQkTxFC+FmVlN_gKVlCf_Ho1_o7pzvIEn`z0Hi$|adWleK{U^= zF?c!@F^}v3?gM_`++%c;-?wZN!Qowg-w14b z@g%ZC2((0?3wI5E7linRj%^SL4hDrzp|AmDUQL@*M90BTA-H856*YJrg4?z+p$2b5 z@PTbis==EOd~6$2YVZmKkJ-kw8vOX%a8h6QkUx!aNiUG;2%pH?gXHb5=&gY4w(ZN& z7Us=l^_RHQMoO8lP+$Ki_VYqOo;K}5p-CYJJU%c$P{=Wb0LHdWA!8JBU>6Dp6mmo%$9AD` zOd&lA8M6z8F$y`Mkk?X9_Lbi^Q!@X8Wr7IC{#Ust3y-KAUeVi^q&Gf_Yi|Q;&$M;+ zlwz$*v9^`pA0m$p*9=>f%T0R!iuBIMaW1zYmt9+D%M|N@6l+2GeN%1hUH|KGY+k5* zrZbl>0h$Lxqm=D6%Fr7r6NhoO7a`l0t+Q2%^+bxbtNgy1Y@=7gi=QGw^z$tB`R|iS z@)>1mN6N;_IOESD;|&-iDb~YC0bD+eZj$_?H(t3jF<`53)mLY3JlG>GxQZ68%wJ}Y z3^4hq8yjr8?wLWrQ$FlOebOU)E#_ctb*EAXb@Vstj<#p=@^7?qxyl#)2*R`y? zF5W<14@b@G!pM1jmX+7%H;~ttqvmyYer)ZemgVskH1ysSH4x|*GJF%LT2Uq$N_L$k=T~_e}m;l-X$z&4ZIuI9r)F}}Mq}RzbvM!lMa`ZXGZHh!KO4K5A@fMkj zwmt!MCE_OI+XO`4mVoHoV+O>1AQCN5q6NaAFOY+b1u!*kYlmzRE{klH z;yw|Hb}7*=dq$TXy1azTOZFTt&)Ex#dtW4aNQoY@kLeOcbhU~15p>UZ-U}LNN)bdN zts7Bd)JpRoj`&f>AE>8B%s*(WDVY@uXmA0j!R9}j;zuirx4dl_^~KRMYPsXRZ~DHUC7^!Sf%l#E&KXfm(U^ zfx3B0_B0l-&IO>pp8wbsKUVMuYVff=fgYcdEyn^LZ~>^>=RelOk2m-Owf)$(K<7`% zR$~EAxBxr{;6I*;A3OL1PX@4^!TA7hVzGdS`0L~7>`aSn;}!4HvZ=(!kzxWdi3jY3 zf(_QansU6rsSrS~EMj>W>yl#!Ow(bWlqSS9spANYx4}XwUV!mZ#}pWEnFUfj7vl{c zUtrW#=1Nh0jH(`MV6+#^m!dfsEp^;Mj1duYq=W{?2KO?HY?ZKJ`Ff5|zN=GDr&7;7 zUE0VsJC6Tej(BhUa1(R1yddQ$`y?}ilST3r!hhaajxK&m5KqKl@H2}6FC-^&zJ{nx zQ?xLF2Y!ZTlx{hiM^&%eKHz(XE4^#nyc+d=^4`eG`v*{~wzBem^6m0|l9l(~sCiF& zofwk$_w>BjalEHX8<(0OXYBZhJccJ*{2MwwPS$@IEU#-K~eRPx|` zX?(77*hBh;oas4jGqT4!T{pBxW$>A}drbzPg&X^d9C%aDIzPMVZ=5V$^BdQ$G3hT2 z_jL9hf#r-_v4>)(QZE#6$pXjE5n{d{;Oz$9LbG4Uq$>JQ=&b(_=3g{nc*jXsE`A|= zcm27SEdBq6jgcFJ{07=4XDE8t|KhSWOx(sB1I{IX%B@Uz8~*UC92rvdw*Pyu?Sk)s zek8eo%U<)u-*J-qj(;Zv0XIJ3-?Ef;rY2##wr}QJ{wt0Ee*)vrj8kn6Vjv8I1YwX{ z%@#ggPM%8qI}dIObtaJid>H#041Oqc3;22oH}*zm3QEJdM5b2>xgbNi5H}#f1~A}x z67WL$d4s?PXi3B|@av18K{H0{`W&!+UHrKJoBrF2zaLsL*;p^}?U4k6AUKxzdXMlA zp%lTTAQ^-;6dxsi-%u&=`3O)>f5O>HHokHybv`aoZY(JWgvk=0E2FZS%ICH?;7N+W zF;HVt(2)QX6$(p{40(DK6$+0c8S=Cd6$%>^@;U+*fWPrQ3||Vg#%KOqJCSSxs~g!% zsDKISO!M2--O8xhd^&PAA7o{7k#lajepB3MQEo|~4w-T*@oK-T5Yd!sMb~fM1mo7u zhh^N7fF=s#)*HdNCCWu&{bG! zYHTOr2LsjURO&ZThhrbO4m-o@5RfrciK2L9tjtxFXpIaY8h{$ztnLVo?%w!tRCqn@ z(e;!?F>M|EcuKLK61V(Q0t!5p80*%x$CSBVlTvJnq|20ands`4fu0>Mh#FWU)W91F zHLxgAmC?|TPgW_y6S_R3%MQKarFhkIdKDrF;BucX4<+=##~eL?`*2u{s;{Ggik^ES zVkmyN;)fscvXA1zk9g?|FhQNb1o*?kAGotupadO)5;Rkpa4L0r*b=eY;>WT0F~)On zgzx1mMQTkL-otRdUX;R5Fr2R%rSR7nz7OZ$ucEXPfQKgxFFC5%ILa)}B1vh4aS`vKE4qLut7sK%Cx96Md>!b6wNP1F`?s9WRMb$Z{4t8_9B_@43FBO&uU8%oslm^{EQsb zcJq&-`A3PsN0IS>YxT(Y3kW<>1fGCE=Mf;+&RWU-Ij7Ay1sm*2RybC?4e!-nU*94{=H0 zNfeK7Ng$jR??>(2*B zR>Kr))Z(>>QS<%(=zre-L;vd>@vnSw@iS6$_y3qWCQ>zhF{b_i+?rpLzjJkfzcY*L z0Y(AfT8lFzC`o@pIj-i=r`VB}52L{Mn&{-_M2q&yuz1QMg198_u4qN>Ae1;{frLyf z-JRys;!`bP^tRz0>B(j1T?waTBgIf!uGHpN!|Gyq4oN#k1IF5>(HVZelxD`@+E%ny z{69FUqbRvt!wK4EFR+UTjt6HOU-#eUTqlZLyAfj8#b*~k2i{ikkTcwVBiJEjj@$mf zT>Pm2)x{4%s|_Y|{3Utj(FqN%Ms8h#z(F!-O9|K4rlk#D;G+ zn=q{A*^)+XdvL8UKhQdGx;a}*2n(a6ofgB$?`#Er$84HJX2?3ly6L){fKWeA1o|ER zmb*1IFxo5A*2a}L4rSWgIMQ|}aXu6WP2%>VtL!d1hGA&bW%NR!Ip2&|W=)Pp#eT$^ zua^7<^$b?nm({j|Xc+6F(=1{n>08}O?us(==S80Pb@IIHHl7(g_@-d z6uZMYjUR<<=}J!HyC0C#IQW}pG=8Qq8cV*IiPyO92lgX749%t;3T9)OA=6b!hkccF zxDFiZ8-6oP`+QGaHm9Aw+tFg+_d+|^cG`BD^tjt`ebZWXf_Bdg>@@YU@2xtn{nU2t zdSqKwEAc?zAaZ3hFx%mxZF@`D(X46*3dyip6WU}8D~h#^cxA2WE{{A_cGdP-l6ydJ@9iX{6&-pK@N}IMQ7r;w4_=fqInaje&c2;5l&b zx~zi?Rg%kl&cG`V?KJAxz>#c5<~C@78+HIr0qk(ERGUL@#=s!lHf-*(&C+aL<=Z78 zk%Gd$V5v7X7;&=RI#9UZ~DF;y@W z@2wJ11v}gyyqT8NYo)puHQ`4|7N{aNkdAZOOs{3%c<0_pNKGlmlw^@ zgv$%>k&wd!M@tE}ny(SZIt*#L6jrBjj9ZqOmm~f3a4(wAcfGLXG@^Vp-|2>}d`+V< zwPi#M>9kw0jG=dS6DsDN>rpX33)wDGF-sFng(;Iuih8+}kSb5IWFDDf$<#5;QnSSj zOHB~7EHx*Tr;+%%dY27O2IX_yma@I^G8-?~WPawCe|z-G&#!=6(!L5em`)=w+pqy} zw6GWkbru+(a(}vGr@;Sue#f?)=u`dd?2#72nO{B6P=gh+JQhlx#XIc;viA+5U%u@B z7Kp(wewbVHw;!3F+2luJVeJ1VUoMsYlL%|sPO}wJ;89D2Vh#zRkZ1Xl2#ycRx~?16 z(E=v^7-f48`5*6?O*>;Z&%G|kD{OSddn>CfBB?A;-5i(2IdiHJ^Dof~ycoU$ejc)y z-+T4=fNS9U8D2g3%J9?HUzska_JX zi)CPxhwbynp>Y~?tEYeoalE44HXS!#&9C5<@z4&m`zk0(K1aaa*8s%i&+tDy{3Y)Lp~z@7OB5JAM}&+d7jxpu#cU0 z-#!LP{e1tI{m(D{0b>7NP73-tbh^?1P=q;*btK^06NJ&zFOcr<9|)xfZ1Ip!)3PY9z@v^|{A(EHb7%=9kbPf))+ovP zTmFfSeJtB_$}gy#@h7sO2|jr!NJ!WX?O@;Yqqunft^YZqiMhK;#bZ+cOStD6&0k;q z478iS$7%*YN?&q}Fj&G-Mg|7H9YZ&5Jm9RWI#0vJ`Am} zpoO-?3-g_zvc`gZ%Ln?maw_|-aQ-u1KoAE52!&zbFw)?c^GFa$Q1fxfzd*Y7*(_Z{{7j`{&R>N#JPMS+oQvhf5g zJ`=mO5CrB)(FyUYApx*Izh~E~HaO(qCs`j=#9E?j*v36NcQbC4x%@7y^&reLN}&4S z!5srvR8B*)bV@$g(1d%2(C{>WzPnedRlE9}Id5yBUTqkG7V7h1H9BWa!zs4Sj;7(# z5tINCLmyyWSb9awDj5H}R{rQCTW4;e0Dic1zJ#;R3tDQ(Y@*OKzVqLu$2cOTuTBUogbs{Yvbn`l91q#zRJ=cwU z$v%}8iz+^<42NDB@25|%>WO{fo8J@EK)HqQZ=RN@f&{77G{~e z_GBBUx^bdCh68Rm=I+X;<`%J3OQg_px~6dg@UK>4lPJ>dLs05l76!frp*LiWxS<@b zZyP6oCsR+g5e%4MD`q5YMPdmSA9_2nZ}iX(JfVW>N=SJ`1?J37$2J4gtJ~uq9LJMV zO8^LSJ%SLn09e>L9-l~Mz_m@w@tWfiD9O0tj^B-3$K&ECh$9gB6Oj{gYM;s;hXBB9 zL=etLE#D<&Tj;lK-?RTW``B!ET)SBJ+i9b)_Q5!LZ|}T!@pVM;b;J%RWh8YY#n(O< z|2AdV<7Jr6BQL{ruv(6P7yqU0(%J{((-^ifh^dJ9BMF3Y&>ZizoX8e9)5@_M<4=!W z`0UwSCmNs5bq>a7b8+2B+{?U_+UD_iZ1~`%%nn-Pq)^SZ$1A`s+8&<-R?+tOEH^|5 zBQuCnb_^*%p+^WKZ;-68t@+G>ivy0<;LfB=7t8^=%to#+-c%`-MVExTu&s4ilkQq{ z=|SQiB^H%IsrIiP914X6LeFs*?sM>KiIQ)?WdjTtHqXwq6~LEtV_3SqM+o$u6hip( z4T(ztSt~XbD2LO~$c6f2z)e0z|LTLoJHjmMU?(vNak~;cTq+{~iFa9~78^<50_j_d z^mvXy;Z2}vMBzPExF|yq-eZwktd+?^jKqVoeL#3Z&nV4#$vomoc*4-YHS7bxGA`_S zwR!kg>;M)>uWE1ulTD~I42K05{-Ao`U_vjcIge`2<6uG&ZisiE)8{Y4=PxUtpG<}L z{o8DLhytIDX$vr+ZxW_uMVY~Ub@54WK*%(pTJ=jn;-0Ap1WV%JikJ@y6SM-DC9kb)yF}qRg4s|AW+V(BG3h@~vuqYxC)Lp0#Y#vV*XCx`5cis_b3)&MQF2usjDgj&H+Mni1oi9r)Hsb^Yn) z<6?+tai?*j0R%7Bj!@?9BE;A9IlJh;p4a$Sp0>kgHJ?@&<uO=KO^4Lzl^fzG zA?J0V=z}UdKWAO3_$&|bGFm?JU)$b36iy}2$k3wcN4}Q7!_`c%Cidx5ih&Ks*P4Dl z%0W|*95l%_E1fqHlqh)w$4+7|fxt-FN3@t0RP;t=(3!Lt;3BnQ!WQozi>Gd&l4Fl)jx#X)I$!S}4G}9sYw+ z$5D{7u?P!=5Zj@hw8MZ0({DzL%mCVpXosGDnwC8u&O_Uvrduf&JhBJ__uFM1%!Lem zH>0=la0V~2?xrb!vXf{G5ru|dl(al`wR<$s=dbWT zpXEILO>hIw(+8ZMm#=bqo?+XgI6V)BI4-Z0$`j=1yIg|(!swpM)h<8ii~A~H-9!9s z%N5c~R|u_Y3}lHccFd@SCrxBFC};=T}fX31h(lg|UD zYa|UU9!fRNXL)`J=N-BO1aE+9)ddF6m01S{iFvXd27Fo>?HAE{SmlYxg$QCK6;xu^ z7;pY?JJ_}@r`yi8gYgO|dP>EqT;~KYLIbAw6^Z+E+=pZ9FC3^~F!B}B!+Jatb&x>f zG%{>f=JuTqQnue%B@o*?=z+?rmFZtZ*#W>$s?fCUGK|N}SLq*5A zTN}}2xMl=ObH^|8@nqljj>1}@&`XclUZLQnN9>RX({Co!0@Uq8 z8mzxqjr zI{y9#==iVyLOcHJ57Y5q{h2!ctkm&mzwh|pcl>L0{G|`j@n8LgcKlZ#rsF@#?)YH3 zc;j8)RJ#6Msq4>Nr|V;vd9D3b4gj1N&ObZT9Az9Z0k1J^9H^rYrkfrI>VK8vfDhw< zqmBa`A7C7K^cOk~Jo+%>z|#TcRk?&6bn?%Co?5QVmV{?Dai}_wyAe)R*M}@}h!Sj~ zRy^oBu2m?+_lpIy9Bd7oMdVUAug!G z=2$uSH(vMM5D+d0iAK#A4Z$B|%aI&!#;s#kxU{3i(zmEgY(g%qkAzGgo#}n>(t#mQ zs*OvU@OD-cHh`gn4w_XCEnnf#a^P%XEzt06&qod|aV{Mh_ku`s_9FSn0&a!Qcc7g| z<^dkAVoQ(UjCsKML=*@%_XvPzZ*p+ym{$JYM^P(&bl{G+to*(HKleZH|DFsnfV2Ih zJ5lRi?h`MU@t2kSmuRB`wg$hrc2ePqK_nbK>95dUa@(%4?KELkU|F!??{=17G zq6G}Lu5Tlt5neO(wW8;G<1;+TM|Yy&-VfwqDFTGR00En$0KJ@qfX!17b%I1V4V4pM zyYv7O9k_@l9CggNGFOFyL-4bJ!_QnKJbez1YtH$p0T^7k z`l(tRzRG1s0|74rev;rA4$y5xcAzc#KJW!xUZ#O0Bz@d4ra7rY-_2p05EYSaAP?*) ziza|skMZc_Rh9MdENR({Y>mRff^WgHY)daj{)S&SU7Hgjg24^sjL+w;u)Ij)7McK40F#{pXjYV4JAD!rtfO7q#GTq}l=8Fj;AC$NDa0iwopN%B;k zW0LSjC?9QG#u6;$8pf+Vt7h!)S;^5h4bVY6I$M0>)KaL@FxWRvv@ykL4+fjYiPqD( z8=VGuaUIxl;izz6od8l6oEx}J4ggL=W-pCbA2FWX`_<`$j{yxa1~jrZT?3rlaOcpa zE|G8BfPsY~O^6gRw4);(NPGaR-D;klO_eKn(yA8hf)t<5qFBbdkHp>jy@4zKnCdGP?ZD&B!wDr?L);`>0t(QX{j5;Wq}+eD^Kb7^Q>hoNnh9>|B%bzKz^ zE4Eg2p;k(&OCNaMHblO>FLQH%?SU7W=os60OfOO@cko4<5c!f(fxDF79C%9;5<->Z zTaludO z&tnA&d1B0ev**iWKHREfKJ{7lYW`K6Hr0(^#bf>}81r8h+uD+xqosKG-=N|D6}1~_ z_@|Kc@E-~COiq}I*RF7Mow(9okW^x0yrCu`sw>dPX^5PdJO&K&_?k;-tq0g+f7gEt zLA#>9!IcLOp=ICQp2D%UK z17?fS$`+#)|KW%qb@9WDDWfxOOd?LUn%Q2`?D(eA9JYetY}mX~Mk?cLGF&gKi740!uQ%RsTsMC&%aLxryX>4mK32%JfC;!72USX?EMy&` z42@UxW-)ww$$5!~^G9j~@W^aPb>{nFtL!QovW3yAZYouE9MgT603opys(}h{q-9PT z$vx_tWN>wW&~LE`3ggK-#KMko*{A1oFhPan>%%3MO#|wO5R0xDz;6IBE+H1xf?XRp zz8G;IW(Z@utD_bQn>UExz4`np7~rY$bOs1`^Dh?!{6?w4t8DVu6X(q%mk$}`M|;zW zktUhr(`izg+zD;<7mU&^!;m>fK<%${T^CzRr$tg5O!{UFO}raA^FolL-V7Taq<@ic$CM+e;-x0g~E2aFJ~R!1w?ruZ6!On zlSIA(X$h9)d*o12h#m^ncQ=D8VO5E`Dxz8$QFoQ7yCP~MBkGP4bw@<)WJGRkiA!cldZ?f*yEw)ft9ZY9k-Fyp$-NAH?tJ`v+u%o6E zJ`%5N+J(Y%N(rSo7kgBMA1x}@7H}EB{XX1dBbOZRp=(8K>Qdl___0nR){(9NNW50g z&a}tCSyeYYbvbAnI0{zM90l5~&9k#fI(d@V1V*0nbn+#$1-gXIv$N?~RBV~A z&W9M^Vaqxz&kUS*T`{TAIoO-*b1*)UdHUQToP!<8>;rHElU=B@Lvi$VNatP9_+s{f zLq+sq%swE(4e{=CV0ReI|B%^}^1YayZ$4vs`rInydsWUi+`z0F>TFfydsXDyO7gv` zh+d8JEy9h(%kzEZG)-UdB>M~a)a>bVyYL0O@)y7jOy8l-cEuO$iZ5s+U$Co)-i^ON zgd0yT|AHaw0m}EY?0oYzfTz#xK)!e6e8UZ_6GENshoVB2VmJ<5IBque*PX_+SWC=kwIsNIlXv7zhL`_dle zzO+ZVukKOUKmn~m0S#Zeb5@cyvAfx%-OYVn5Xgw#4TWSX9utKT8`BP97dxh{(q)$} zJ520@I&k|uzHKJDNxbg!8Aw)2()5#rZ1C&44igAyJsztr_l8?l9|WxZJyYKYv#MUa zj7_9m8l)3JE|G?7hOI4Xn35wPKQi&o$2-$?f%U`j8h+Iw7d(`rS|21N>5_+^&C?(g?V-wGoD<@Yr+<~QOggUHyBp^bkQ~g zn`lNqJ!e^*D)(2m^XEiwf=*}dvSy0`ZGJp&iA6ZC17?!CjaJGlR^9ax8J7B;{%kDOc@%iqx`QJF@TK(N}mUe>*B-0k2s% zQo#1*1*~KFCJjmc_A#kVQ6_Ws;=V)9X6gykiWUE4bKt;fafid&U@rgy&l} z$t)V4`Uo^Uv(Tl}G(1Sa6PGct??AL6>^nztsRNfz+dr~X#VFD5aFVYK@*URWl87ex zbObh@vdqSl9vdZhVZg|fehjX$XxNneg@J!B9;&mvG>}R@z`((m^hA%Dt0j^kaPY-L zhw%hWp}Q`HCx~buVH}oxg@KnY5sc2i;-Ojc6V^b_U-1)Q9ID5<(nL=hveOcJNQP*{Z+w<7)v5CMON zSh{gKAX$m#sxV&7T$wkNf8fR_P(~q zg~W;)o@e=bH-P2dlJEL~c!2mm?-2a){;l$Bjvk!nxue6aEY`luS`$tP!`-P<#9DIh|}(* z>f*1=AsUmUT=QU<&hp2pvHMtO`IFR0eZu|pFjw@iXV>dry8(NG{fjbRV#n1oJE>NH z$qW;p_8iahd)1xb+-N1co0lVTxlc?90xrp|m%NXfi?>5?IQufvP9-)iJA+LtL^ds( zp{*Dl2g=81cKYBmb(og*Tw>C)Q=sY>g9mB`Djr9)6uBR0FB40VOAbotZ2$eB|HL0m zmvP6loTiVud>#VSJLKJf&Ov8E?Mp87qP?k!8hKv?rhZl9-#H#Hqm^M<=*@khH;*j@ zMz;yzTt0J~z*YvCVBi-Jc84zLbv@a&@D#ZlR>LMivl|Ss&z2@W2 zY+7($nZ7$YJ6W0#Dx0`4(gvCY@5c=?3*q!%b_F(wzl9-fVyaf;>gR!m=64_^w=_f? z0vs*b#r=KcMl=E;pcgWm_!5oy=_QCq#ZFUH1%Vinu~y0$w=Z;crbgzYc$^6xv{Fg# z2J>`@b=Sj;;Uy^v*AYF=%&;tsy@{z*X|~th-v`R*cv=nYMxMnB^x?*r!!r5tx5(uG zfGl487<|KwoY9!b^ZHqh+|l6PZFMMLNN_f=9;)W=WD$;eZZ_dqI7CL>_Zm(!OHw#Q zk~>_IXX6)UNehNZbB0KBoiNIh;|`Hy4v`a{giw1KlKdf(tRa%X#bcHnXNa865ILgd zWQeK{5!D)2NJO(cD99WlD0>~iJc4l!5YGi7+*QMU5$>qrbrEi=;aw4Kso@O~-ciGw zBD|HcUOA4}E61d{_2386+r>cv4|0 zbMyI$K`rE|a(8;7k|C%*T#!qGVs%v)(RC9ucc&m%8M3;=WjQ3PD`Yi5R=G4Yakn%x zIh9pbjp4#f64nsHnkZ~yvQnP8ivrTJn!{yTB&(UIj!)0$rYB}f<;rB%H@1h1>X4|m z5On~eCMKq)CMPqC{$RMM7Ku6#%K!F|MR^wIVwmc;Jj}@mGc&@hjId5dSSuaYzG8!r z$^V#<*B~RWK}KGKjJyUJc@47jn%b-|iAgn#?*qJd<9i?Po%p_v_hx+G#d|BhZ{U4L zK29@n{7_Z~wmWnqm%*G&X5L@*zrOf60QEU)KgR6;o^Rc6=fT_Em;J9)V&xIHg372C zV*la@PAx2APK@`-Nj%Pl`Ul-^dc#Z9^WqXkO&A=e7cDbvG1oltyAf)@(CCeI&{=u3 zH&bK1aH|`(s?pxmOzlRBvobZE6ewiGh%=%ym_f=@l_WxvH3PGzvoarn@iAu9h|tx@ zcT>P&dNG?QG+fZ|MSIhg8Z3Yl7a2Tw0)ru?V@NeX3sTl|tfn1>yb{Wl8bc2=;=Wu% zSMf_28ERv;COM3c_NMOEB&YGw-gK$P2<5Sf-a(_i>2fVmTcYV=tn#P5JvuxoPe8#s zJXgHj%dnf4BTZ7Iux@*1;P~6e5rx8`F*LP@aZ_{7b#_?nbi)?u3;YNb1hI5blIdAd zB-y~lpjN6+?M^0v_tsrTVbI<(s%i))JajM0?Xy)Z(AoQ3SWsbo=O# zZf9yNw4=!JnsFDIs)2h|KZpZnNTRr%{-EPm@>x2YsLV`DgOr?612d|#@XjBkNAKz!S?w*3XyrBIx^_>d`5Rcfqb2LM^F0v{OU z5*}?H*+Jk~AZTWy#-xMbCzvM)pZuUL2g)o_XT=ecQZzVFb%bU$H8DLqQ@UH0T2@?C z1{M`M#7gE*DiI`W`>xuQug;*d^%YK(v*mcAbmfVXG#eRx{L>iR$lxocPRvp)ViW+*`sv=`r=Ikqsw_3g*I$rZR38yDwa@~nLo|`?ns)^z7>N>M$ z7`NU~-P}(JU8@#It(R&g9?;?#g992h-$X=K^DRpfFYZp?xqvhZCE8TH|%wHjoU7FRhA9`z&FacUW?oZv@$vz3~H0zeXv z7zuzDy($_2Ek$Dp0aB`d$f}8fE|uv@d2%v|lKxl&KQ>vH#u3x&(%FgG+3Av0$WMGNtOi}mn`6($R0}DxKQjOU**oBV|+g<6#R%NWfMj}!Ym4>(iF2B6$)L7 zDKS#S?sV$v>4M~9+B1*xoNGsTjixgR#l>_-A|=Rw6n0GS-bZ)vl4p`JVi)3$#m9|3 zaopHT9XI|vLf<}5xKsiBc7k&DKd10LkOU5A)o* z@o6k!T}W6@NyyaJ0bLZN-;C3*i1aIIw%Gn#WMTNS|4sjo7e9lvk1_35oOW5HT~2>H zdgA(F|6TtNDC3L%=V0rMd`5BVHIaHPmHI#WpZEXJ|N7!*V91QsM3sJsH;b`=RlI)! z_iYmapSy7dJxiL#b4+|6BR?b;5(z$wW=P8hb97&(U&@b8+X&~pLojH<#gxRsJb-|UnRm7fRTUZVl z+MtIWx-{w1B5U9=xQu~OFx;KcWgjm4e#MXPjq0+%Oj7cRT(na*&&FSfO3QX$-@ z%R`-g44cv@0{mJ80Jfcg{Y&N4MDwvj>>q>z=+4ZJtuf54Oi4(8Klj;K5v}sZyAv=z&C+N$x z{n7sDU`$_Bq%9~+fH}JV}T%e2p)pKcdjsDW@KA*!ptZFTo!1!6VknIAv$>b zRj8No1HH^#P#^8|IWb!kQ|88>7)2OPT7Y6lNG3!F116jpjz^p@EeEzp$ME1`yY=YN zgPL@oWYACF7SjniaPqq>bqV!xCgjM#Tg<^exQdN!ryK&5W5czBuzdUPTvoPN9d;e4 zJ5)-=Tl}IO2OR58%~9-!$YwZqKY}$%;r-e^9nxuTaZ>&7E9fV^lLJrfFI9<`gAaojT*rf}) zxBc<*O9IZN7_2IlQrMlPAeNBmCyU{k`^JW6e*MsfXCkf%dWqf>NG11g`}OL85}rdA8p?w;_{A~!W!LKZA*qu zwq!vOjsRcq%diKfp}xcqkV*%m`Vw8b0=aAaJIBAbDp(2R8P0r*fBX2ihkq~dZx=G= zt~#2cXPsbeEs*ih{*F5*@~S`}3UL*;IHs7;mmvHM|9-^f;0XlsC#c!MzYie&j;0;? z4gWmlpWoq$e^%4V(7f8N*`Z4YxFgTxNQb`W9mmevhP`3Z!FFW_Vg}hG*TmE0<6?R+ zcZ9T}Ri_s8c-Vx>D%`;AS9s9Zc$`Dkk_UL=H#LF%w+ONc@3!T(DtI3rli5Vfn2PC4 zQw2AHkk^=(8FE6LSKA1ccqH$TP80*>4o>r_t?-3G4kE;tU6B5`6LOgm?hQu&wvay{ zNmu1x9ExeF^gnDg_Dpyvx5aGV(1t>TJnm~mwJ!z#8=Qs|VjPb`WAmLh8n2E_bcOwP+Da*V5aqfzynbPNMvJMd zgP|=9*2nQp;8t!-L{~)@YAHClYwVPSpjwzwvI#QK>tjBFs9IOceVPf`zTawz*-VI; zkQ@507tH+AT+}kM=BK^O_@rmDJj&8NMDh7Xlr-G9Pow$^ai-Rg@}!^TBy8tdlIUC( z3;okk4{b0;?(4fQ5BGl%o7x-46ymn7FM4tE3j{^WB0fobNk>OqKuoItG72Gc8;rWK zA>Y|&$;+T=$HEo`qPlXm((y_nD^Aa5)mMhmH~r3phx1V#yH!+2Q>5WWOYS13s0565YcHM z!Ko>|5CrF(+Wiw~jx#b?AL>h<7ri-@PHl@0`f}K4{6P5(K6Mux6m4%5kHUZ>u%URp z9_wthq9cmkwGfMsx@fpQ&ghP|fj4o4pL!Xh8?2kc3m(=4<)FyN$DLGWGJveF3>n>R&)@ly-MXF0)@eF~ZJU<;3|5&N5b%`#cL8 z4Sxx(2e$51fvrsukHQ@!>oM6l9$|(mg`_&YXS_!LkOI$F>kib3E!s37#0vWxIu=q0H zk$4o&^@UFw#n*N}sA&{MA7m6oW+vy^NtpJ?NPV1*R&0_motiw>MfgDo_XHfUx>JRe zHu)~O+Cg9`@fuypph-H7Q`?EPwrB>&0cmHnub4?ajLIwf%&}eOmiMbmr>CW= zq4ow62K>L2Lhj{rbvJjf-@3fbx=F>^goZ?dA(7AIh}?NgM)tq_Nt*HlaWjZC;&TXV zkYq)PuRei`BqO}`=jbr*^Z_9?7xOAHjE!kEr?IRJ{Yxop^CIsWcvuAo9=gC`1qg8D zug;A|c+NN-H{f=B3sJLqRrhfV@Bv~7o%bRoe+^xrYw1+98S$1>KiQ|muA+PutCp(k z{5vkEvas&PBT9`0RTTF0Uf{^q4dkEt#qPsDG(*k}~O-B|h&fo~xggY+}Y#jIxeM6{qGG@;aBD-x7~5 z?rcWvqhd@6)om!EnbSZp)Bc;>RP0hkxs5){NaHe^ZQPaL*gF|tI!E<4Wp1c?a;SK| zzyGg1Z)HgDFPh|S3jJr4LidfXZK+~Lb^mHL10Hm&4S)_HtxjehF# zt_mle?zx&HbKKQ+{hTQiFSRA@8C{;G8I`n{1fEcU2E_U;+Fel#RcXG++kH?y*lx5f8pbP&uwvx!RV$qY`Pew*;OdI zq)$h(fI%-YH$l^^x1m=?M^D)3JpVJcKp4~e0FF09A4V%>|XqPIj!d+q#S~Vb1eGvl<#CHruJFPB)jeT?uxRR7?xfQ>)yGC74QJ zJPQwnY{@e^Tk34xBNiuVY>X}z`EVwL=x`dVsFgtd%)E9Bq!*N=av0N_8a_~>jU z{P^dO|D==u{P-7a0f{N__r0>2c5SZ`{T!dtXOwJ+L8>p0!6Tl*APZ5 z7_rRg70~yGN5^tkbU(vbLsGPz;oI(0F-5#&aMhITcf8R^Q872Z#`zLwu>=^kbO>~B zH;&Eb{jJ-)i_g3Y$1h9f;+-+Io?ca~TS&ikzAyySIsQ&(@|?_B1=QvwdQkY}9HHwP zp?DO+5OEFG)3}?mptnF8ElA;#(6p~o`jH8*Un=Eanb;ZnEW*=0&-EyN-wf7+=2;XE zsgOqTPzGt7!2Vb?8is>}5+PY`1XOk*u8l^}@8xKiL{OoNDYv=LjnH8ZnAP~&)KO|n zZRtwzRN`wM-2R%fbobaHQET@m$7D?Bfi*_kD%iF@=uS{v^pGQvy}g4hx1LbfW8DcT zx%#ZDYy8u<;#V_RqpPK!W4C3V7Bd9G+6jeXjAsje7q`P8U;IGHxzEe@R}J5524JMk zKVoTWgFFnVc$fSPsCbXP4XAvdd=9Aikem+O(n^iVLBMJ+ZL3G*mGEUmdq)Tos$j8N zZOc2NdtUQa!O<60S3e8dfdqPz^1`>q>1CWgiOsY(K~sB*A-zmt<#cy~U#-`jvvQW| zns{)o^OwEi+&B83840LBDU2s;Yj9N@HX5(tLdFp20lA3?_BEkaYCy>Bo=j9YSqlx0 ze-pM_t+kd|4_j+SG+RPW9;+5oyVPX!SE9aHzw#IBE(^ST2RUcEUu_dSbGFMWH=nKA zB1wZ2)l9W>x+(MHX)%4ds0MmTYM^Iq7yJ>guL59e z&uGv2`XJx+2l*}rxwFn%$pdNTVVMOnEMm@{s*^&mJgeV9;`WQ)1eKaewjTlVmCv(h zpN9>Z*2%&5a3B{5>)zn|L%kp@y;~Q)$aJhrWAz?%Y*)ygGAmUFyPTc#je|g{-D+X` z0PC>@my;HJRH7()BPk=aK^o{c^Aid-2;bE7!_x^$k8K4_CZ7HMWoduM_x(V=R?lrG zy(fCc`nF0bb#oJvxrLU^-@?I!?7-EQ*k)0mzqa&~tT6d%gxswkDi-X5-| z+G?>h_8-`l!>fqL^}``+0=||96^fAu^t`CMDwOLQYM=1beL(3-*`P$`+iLGnE6>WY z${)j*#@pZ113blG4)1)AlS9bJwgrb6JT>yd$i9*9jl5&zrIBxqd|~7> zBY!mVxslsOesAOxBX^AaVB|aF3uH)io~ze6N7%eZHe@mL8yu?dD3va~-AD4UawVa} z*Z5v*0-i!+=h4iLV74iFhFOlP&2kN;a~E_DX}ewF`&#SrRn!=8u8hSMqHd3R%O~#1 zxAxxOJF?rZ(07H)g_^SQkB0Mw(=5qB*PhO(O&XH59%tO+mdwNq zE$EXwoBSb{nsl+HpvHizcR_ue*)GRs$rHr`vC4C&oP-KgI4{bNlXMYqC#!7g_H3fZn7Uf>V%}3t!6HzUH(=~B zHRg=*SnV;!udkKwdj-Pae0_brwa%QYUOuX8&RR9+*VjSLW<|O>>8S9lUP9?&o$XY{FvRR#B z!BCUIG$={ceB6|&=U@^|eP51i1j1pQ7iFO96}?RKI8hTZWqcy0b=_4U!c<*`GS5;T z5DFCqGT?-e7;~Cd=WUQDLuj!991;Q<2tr2LJUB11S#Q7?8W`z z`PXG9q3P(-c9fR1z|Pk2+ZR^2ZzJD zGl~sH>b@AM{e8kGYRdYN1)m#e`%$H&S7zKsLeIFE`ab*(+wk3T=;RIp;x={h z*5Y404ZMX?%lP2n;^HE_I1G#O^k6s`3=ZV^sYl(~u6EbTdlurX!lj%^*kr* zc`M7!`Eip7gvo67@i`aj^Gqr(c&TxfP@rAPjPtevO|6d{&}(ASP-Gr1OAZx$#OKK> zS3ohsG|BToEiy^DyB0pTD55E^7+VM)Dph7DE5!p&Vilfp<)-X0CICTXE13!h$fpjY z@)%=k3{AxQ4vTuCafdU{+vik;vqUApoqRvgFU-Z3XBOShlYGS)ACEn+$^EPu>82}E zUF8;azbcC*FV&UqkIs=?HOcVt*vrnAMX3^@ytp-!U)q7{VtTQJeA&YIwPjm%Hjwjd z9?0p1$NWuVz-<_qhcGnfn(FQTYn$`hq#L^ihD+a_RYbM*%S``K(w8r5Uoj z{2n?uZwjY{Q2Y{cvsLs{jVOkxGUW9D;7O9cloK8Tk)4i&?+eROYe_3mum;_=LWrT| zKLJ~K#U|4cjM#_ppfkRPj8E8CWpS2Cz&2Ur=R6=-?gzFPHG}(YK-NE8Uk5+1y#f6s zR0}SG-?$RT@1d6;Zub6rNdLM{*A0KeU@D$+g)M!@22Df1(Q`J~W9&PFW+ThIzZlJm zwJNU=lSkj(|H-0m!{2|Jd^a6^x4%yT8|ZHX7(!B2X`<2v@(Dx)`ym_9@7RE<3M%|c z%d)hcIeJw$@+w>w%YX!=!%;u9C6u#*IQwv-rlW7dMFR59^>y$K(9eJq$^$~G59?N{ zi$#|6;HQ@GG5Wf0_UpP?m=gL;nC3hw1A<*_2Ku)~Hh@m-F{Z+KnVbS^0K&6c&Olfv zR0b+ML0PM^oBV14Pq4hf6JjP!0q-nJZqJ>S}!aJ&Zcm{JYj< zE7i<3hs}plY+c3!n#PkUUB*f|G+yWeVR?Nm1Es>0P^Fks;nLZ0C_`NVz|8l9--R=t za|Jw*sxSj#)7gZmwwMVYX(8-)I8%yPr28FC7u2D`RO4>|jBf4LFMU5ib}|bh7+gXs z0<9JxE%03Op7ed`Zlnrj$#FwzZ`}%)WwDeKJ{@V=xyP79UUKVJcv7sy3`9>sg-%J; z1ZsiJ*8z4#D)-q^K(1PZsy|tafIHT^o#c73rj56QP!m~iog3$c>`uC>OEs|8z zy0c^%a1ze5T=6m}L1u03PR3hzE4T}aL6)bj>eyroqnElk)NHoYCT$!UTo(?K2F)I& zBNk7lqYoQ$DcOU51k63mfGvGF4aC^(*XuuqPR6;ld04HLP!esGS!0q=D7GWil;<;3;OeC<-LBP-`-! zhT+9P37#a&ptLOT`Z}16XAVz{CsV)y%k&Tuq(||J%9q*lxdw1AqGeI2xC~WNo^o}4 zjg>%JHA;Lx3Fi2sdD#+pSvC*mIIhLGfU(qT?)rLN(EwLT7>2UJ^^#f1Xe=j#X)LS& zfR*@urfZw1DYXx*B)%W)&BF#z-=CWWtfuaBP!hWI{q~01AmpuEW{)|T`hM_}<(>4~ zz$_TOX`N?z9t?<^HsJ?{(e+?@&7%AF`L7S7D&SNB3Ri@{Jj@$TumnyngL#J?(0PN4 zdwaR>=enPS+M(84)^Kq(E8&Bh^|}ks4AsN3Os>LtS)2jCfE^fYP9&*7poU8Kx_#iZinZBlI@` zslEzkq)PKd%HB$?ZyB@?$QmdRNLCS{@Eh7Jrm9=8i=kQ(v{!Lo&FRtl#awMDAg`)G-+sY30uA(^R(nt~b(9`>Ut z8Px^YpsI{+WG%Uhb4xW{Y|jIQQUohMU0eCSodWpvsbWz zluQIUxxQ9}f*7GEzO+I|O6b5T4N`&xxsGYANaaXROJtcaDP}zeiYc>kfPG|AD*0`u z7J+y0E02ta@qnt3i_lGgQ-mxBdwUj{SF|!!s@LM0xa6|U_lT}o3{p?d$%$}x}2iqO5tez7NgA4jLWz6N3V`g$*FpgY5L z4sC)IZ^p#;Oc&jOVjdx+fmU~Zt(5|NGQgewo-+e_sP_VHm5mX(zUCAA+K((Qds3B| zIBj&UAoqruNb}W<%fO?E0Fp@y2?h0fttbE$+Zffy6FH4h;b!D7swzU)RXucuWO1R& zj3d?R^d?Xf=m{vIqiGHH7~W#|GZ{>gC9W%1->BMW4r9KrVpmCXshZuRqehrK%S2gB zd$0&9AhhR--cs~J(JRH)k3W6-?8~pek0bi{;nT83bCN z6*C@77_wNg2M8!Vg(D|P)`2UJ0a4l$z8~CD?7|3=*r7!xRZ(6|0x|YVzRZ)9d$9-j z3WVb+K;%t>bwxeU+l~zE3PF^?OSKO}qhDV9>eiZ9FUw5%tR;UUj z)Ej#Q028n~Ur_H?9*mD7bWb7Bq@rhBEsB{8HWkY?QPc`*(6$j>F%^s>S>!5MV@k{` zgRcU(Id1Ywrw}v`Wh@%u`x>ywtsH>_IiaMerNPV+HS1J2vo;tL3#WvD5*8)Zmok2n2f&2-s%eVIQezt%rbI&K?9DcNsdl2QOL;SXC8DbflsuiR948OT|=G zfhwz3_&ZFbLnx?VEhG+JD%dI;>JgeA1uqr#V1nx$vJZ;tq)Zq49EV1u`BP*Sfle~= z2=EnPymlejH_1eJhRVBxKL(ROj(;`XC&4)W!#J4y5uV8y-hLH?@ObN>M(GR11YNJn zJQfu8AMq_k0jyX~qUrUu=b7m^Q-PceF@;c^Q#m=r*9z(Rqb}iFH!_~8*jxqA&D*q$W3Jk&EY!e%K!*b1*Buw){atWu-6F6g@df0Q{U#LJ(PZ#p&UPQg;lIL>|aI?t< z9@NiHMNx8((1P(WRb~ELesz7#!!xcD^O)qyJjq2ihi4SAbd{)a+ADp3ukd|gn!@>0*e|7!GNz#Ayu>Zq!KRyT*bW4J;xb1KU4iDN= zBq%(_XOH%c*EOkRn!Cl|%VCpOOD&g>yQ-BVWQ zt`8aN!mip?n?2aEwbONqn?Gu+3e8ker{w4ntWE{`1UQ~VEs_dh%mPr>S60F@a+99_ za3!pArcPjwlw-<+Fu4WnYGR7oBN)gv5SanftPI)(!9~C5S~`>15Vp4H21*gi4UZv| z8*R&%3M3a;c1VMUz9B+KK5U;pZs&rQL}!Chjk_qnXja0gR1@jJJ67(~uAqEu%)0fg@EJ0Puudj#4Lm%{}%Rth)YCfJr zJMdW2FBOST19*Y1kcwsiC7dk-Yrz4*lV@6>*xIB;6`i4U1nr^mhoc?&s_83iz?edH zD~`anUQy1T+rE`f-%3KYu}TU1AKS@^n36TrIF{o;!f_c4LgWk7PJ#}R#DQek8rAii zbPCmS$9@GwIN0a~C}d#oA{tSBETh#vaB2caWp-$U85#|dJ205CF)UR1{w17PIm7c& zt(XC!=hiKm7fQyGtt)!#mQ0H!s3;hxYm}-A2I?YwuSsDJEkR065Hp+Nkj2!dIm9v1 zy<(iM;KXwVjn3J+GB~;1B2yucxW0a(Mgb3za)X#-VIjVMsRG!Z)JbDc^M{^Ic;Ll` zW%Qs+%)7PLTa3zk@S^JV(nS0X@)^TpZms!yRi?#alxr*RLGL0{iyi`sC0~u$f?{oEKWwRFRha6l62KDGDqMpbY{=X-PE0GYZir z)9iyv-38nzI-JvDLy9Ad#@#1+S>v$-kEZYHl-+2uzxW9?HW#ZWQ4HvpQpRGKdu+?z}( zF7Xo7{RL|&SRG}eBeKUH83*RHRMnd~LcL(}$3OhxV7gB{5;wd1Kl}j{z&Yb)m_d^H znxB4rxeQ+X@z%PiZoQ}lZ8Xp=fdbr6{snB*a{!^17K|cL!d5w-a8T$Iy4K=cX~lF2 z4=TG2(4+)5P1yJ10O3b%`p#fh>j1nM0Bc;pgM9&>BuRj z(^g!;8LCQ@ds*iDYctb&+Rc0$WXYgjRST*O?9DQhaf9GoB@XJMFz*z!rbXA+a8|5G zD>Kr*bHX7TVW?`YZm8Neu~9eT$r_XcvHOkQo9k}C!b6>l{+!Ug493-t{`K|VP2&wo zreh8DaeJ%R(zpy4xE|vG*5(t~Q`q*pWnnFpMq(rs=YB(4tEaDEWp^_JeX-l4g3!m> zqyna1Q#-9|8o@@Ys2qZxQ%iK#A{YQKL|$$PiA{?z4Lbm=KN!+E=vqYpjB{@0&4p0u zBRo{idNA%@CVF6@5FFx?N3|NQSx=pNM01BX5$ajgtxMd2v#tiCsn^UvUFMjkEyh5o z*PuaN>Ml)MOoC9)NF8;Nd$h!}a!e(aJ_XnO4)uNO;o;D4j>dg|Y0tim$kJ@oGIyVr zy4$p*A{Cvi=#0)C(~FYIsW~Ekta|)X0W*cuVw6wH6fqF*Um z7^&&7**6|F(A;sMId-ABTe$|X4^b!yD(ZYOrY~QY0ZWRYiN>DhCDqeDr zdg-c!wfv~ai?W^BzsP24;ZbkcNr%x%lch(!5>BJ3BS{Gb`zfh^ zv>8>9u^)BEQQ;IgI>j=8=n>;~9dbKV^%z9Z$0wj3fLgXM9T%prH!*Q! zFX~J_RP>da(yV3XlD3bLQKhg4`j+t^)^GR{#r>%I+d!}s3{LT2JcGmUd?KchVp>U< znjAICml<0H32I0Vr+SLradI%e)>)K@+cV#v;cE-!lKjjLnY2hI3H@8)`v6Ob*oJrn zPo=4*Ni7;>$7-raX~D!u_lXL|*kW8)2E|sO@^JJR*<>+wR2lHv)@IPZ6=O3pRE}j+ zNo%mQ`lO>jp(Q9yv`vf#9Mw(5_4Pe}h03NGt%tH0&tY8Qaiu$l>ZZe~HpsBpU({L^ zse&2cb+MscDVv-w#@Aypvs2R5NPY6IDi@WhoX3ULoTOzTWutDvv!pnCD`m%89Lf%| zAEpuNVU=}WgpwboK_1j!=M7Qj!?Z0z+F?gXn`lyAQi+E$SwJiY`QiOI$R~<^jT}Ue z#enKTh^X%Uu*FfnZD`8|WidP=%!J_O<7ZDkXMb~lmYw$yD&`Vqpx%~}Ya-n{%S3c!y>eW?V2&l`HN&xPLIq&L8ytAbP!CZ=)|Y zxSg)Fm`@A5vwpHtg-OHPN6b4Z${8>Fs#x|@kgQ^aO>dh#`{6}D8uS+M#}q%Z4=4GG zqpWA%WszsI9*R?Z)}OEPyqAdVEK$5Kmzl7A+Wh-BZC0R1@)a~`hqE~6 z<@NQEpCN_MY28aXo@&VutVXcrtmpXaM`BqHmyt5v7a+LI$etXjXOIVql`k0 zs0GpPu)0Ex%c1o+bcGsWg&G$;7nbif&O6{v_xFF%^Ny%}-ZAW+cYOcLJ@5F<&t$%+ zBZiIH&tbFhafi!7(iTQK+{Q>9J;ZO{kDUBQ(eGO96T1<$NXze92m`Wj7lAXeT&d1h zMj!zSB^PS!WlPmB#mwyQv(tsL6dyMGcLoD5-d1K_q$?Sll9`xgrv(-^ElI^;b3O+Gns#hx#Yj_xdheg?zse3ynPbyZA{_^znn=t^6S|ecA4+? zX%fHiX;RtQ4b$}2B^M1grYnkmIrA0yKXY|S?kd|`_b}mbfT3b4oN<|!5UPJtRksN7LYTkgf@7rEZU8i<7KEfBXO`~C^k}!K6;cA zLSopQE%l~tX*O*Z>zj&B$ES5gr%d0l*NCSFc11{h>ifZ|uISWOWY$Pi(PF%)D_St* zj8vnno{JeF@xu3mg|28(L!?(!Q_=bOysqe+A?>Cb*`4Vl@wx8@=en+QW_Og^&SemD zW_C%<>|&bPWi)Fa*_6EYgS5~1$akL`}@YR#9)u9+P8$c zttASens9pMcqY(auB{c4yFZA~7_o(weAh71kK!z8R z%1{-{EUl{{)wX?|hOl!orV|PEG|0~04z_PPaobsS)H5AE$5o`$yh6v(? zx`Tb}kbaLk?*l?A+%Qip_d*jZGg^4rdvMbb5Eqnse4lC)S-l~lSQ)AQA~iSlzNOkc zXxC7*KONHIuLhCbd#C)p_TCw%lEdEH;P`+V{BCc*6G!6MkT>X(p3((9e~a94p@jqV z#<1^sJ0ydaIB*VUp}^KNJZ*y=afRo89@}fWNE&GF7)tsO9ENof=Jvl{D^AJT%tBQv=vhNu= zvsfvx0qBFdK@S|*C1oN~{cd40!Zbo*)6T$Vfa6X_zbBXQemHIG_-e}mSNbSvu75K9 zlj@&DE8}MH2|UcTq&}zImDEqKuY(0h>hnfY=Xk)2Nk&k2Qkp`?AiAGAW(T#5at;E= z`8&xd=Y&SbT1%N3B@0$@0aaXRZfj8#KS}6?DYAkhJ8|kSB-X4yZ>c%*mC_nJgNCVgg!eE}qB?{T)uBltTrzjF|&aPPBdNg*qjGxuaoxJs8f z7n{sEXJvSnfdML*uwHJ}j&5+#@C{AVl2^i#s zFMS`JWZ**pti*KapbTFEw>z{wvk6CV2e59Hvz!(zqp2B&L>F#17^prcw}Yggl7pb= zbF!ZjQuAs{_gh^kcXQv;<#lDv>q_t>Q39_k4X6myPVd343-Qv@9MusN9gzO<-UnVM`;^SQ;UEnb277_IdctgB+) zgVTjEkF`~t_Ev%C1r#7C#5_9<#Q5jB=Ztr{0j2ub3J)&qc<9!!YuJfw9<(n_tHy;) z>l#!8svZ}jPq5HJIZ)l+!lha>D7A-H-u3Rlt)c43%!KhmA+_5}d3~+Z;o<>4jI?(P zt}kVAxXraO&ZO(xb%YnMx<%(31@-JV#Wx&Fz!&vlJ?x6=k{i=+FR@xwg6p=Y<1vao z6kW+0RKN@}l5qXZg$C?q8!s~xL5pcI-*iC%BTx`|k)ee;S*MBQo=Q%=7@y4Wnl~VK z`YFj};l+@fi4`B|udtvB;r9`IClo6{bOSTcm%7YCo#jxbFBZIq z56pkBAX~l3785=VPci``-)>)97Q}_`7p)m;x0NVWZfmOJ>=l}6R}XfCo8N&iCMeq) zU1;`s3FB`rC?g;x7XfifcySpNWaGna*{?DQ2aF}!%&62UH`o7hxJ za0$E*I5hI~QrR3GDB9_(F&02qEUajJSp&}c`s4y0wZl=oZ>L-mZHQRQ`w)=mE|D9n z`dUd%?_n)cg`NxI$<(d&=^~jG7Y+GGO^d$ndJ~~T0%^Q=Z14lMn{YQixDut3bYYs; z9z?ui$%R+B%mXfQLW!@7LeaJLXIGO~Y9}|ItW|Ovn;E3eQjZ0?2Buu!wH=Sw6?mmH zuO%1b@nkx!2(>OA>Wof`3l(aEEKgq6JQ)U*nX57`uZ7D%EjHy8a#)X3te$YzOru2r zrQH^ZlPTEIigeUSas12Gn{q6>GzzyS+5u#vHm#>>7W2Y~=-T+%bsb_A77 ztR}V3!RsZ{!ZyF?eFUx$!B@t!>2FRlsG*r34SfTP17lHG{0L zkO_4BqUt-dyCPp`x82)RTRf6_T>4}qvuI!o*XJ_3Y>AV+Lo?|(0prND!N9PVsDnoWu9EcaA>sc z>ywpIg^)emkLx;2((ckGCw{~O?@4b+qharHZ#e9k=i_ilqvNpkemA@eulOF_4exFy zz!%_B59KI(*#Vsnp$mpgeUyMhjH;qtVDzA6;uMIO16g#pcl6D00Kdb*=h0y=IyTS4 z2%h2bo1-Updqy?7Q&)ElG#*8sqZj>4m;A0Fnz@Pqy^{2+zIAykSrA4TrB z0CSXLr}Y1aeO>7D=(raR^TROe9|CCj`O)2ecyt#A;rOuC@2HQX163Si1;c)L_Xz6F z`_S|LQ8@hJhV{_U>DH^!Z`juxmdm#F;Y{FRZy3R1J;bNSALxX`UUcUPq&_yk-+bT^ zjRv5$lxevQwd@K$Uv7cNe8;)4OZb*a`uV^QBY^qvNp!ClMTio2pWxrmk9$$1AHO-= zI=U_sv)l#cJ$);U3-v9$?R!g5hnfOf5Ufi)##bz2Tyy~g|L)1>PkD&}A9zW{O<|!% z+CdfCW+ZWTmYj0X0_|U(<)d_wl%U*Psd@h%_4c_)iy8m@*PlMJ?uP>KiDnvlRv2Gs z=%YED6&E5ek{R=sd7(m-ip`Czpy8&vzg{#L{CcC0I<+$Xd!d$XgvMnB_j<=L?Dw7= z_l`e@8QD(ewF4kK!+a*Z|@r+T-tP3o>m}(`wo@ zH!GCoz_Hm!!8l=!I?ph8y$|ReEiXrAE6|JXEnB=k3`4z9IV9Q%GMU!<(Lh&j_W(x9 zOfTahYyyV+cW*0N#zP91Ph-%61pPi7F%YlP?tONyG$TfASwQ9pNf*-+%g$0&<&KIx z2N|lCll05>K?1Ds8sX}+9xyy0nI~sieiiq=;pHq53GK;5$Ub1~d}OZV_D#=FG#b@I zqsQCer5SO9j~iQG3(IMl%|Iq=CF%>n8_BTaksGOJN%@kOo9U;x!|0~YR;9NAjNU}r z{O9`Bbm}UO?wB3rfa)8-v7P`k@h3Ulk+148M3olgz}XBCE<-HsgCUnlUvoCVTaq-@4oefZzKjR-DjrnU zzYks)U=P+jSmPE*QEVYDC^+qloAS#-I&ZTwIgJyF8zDZ6i*aWC{jy=4+r1!K=b>BX zV0{@oXD_^ut{XpumrR^KLhkT2Pr;FA&gY8IE4R43p*UQG+C2=ROv@tApA}2+Dzij2 zNdS%(PWg9K|9%f=Z%8BD;YocTX)bIkimtE zhDm3-jP-_Ylw9!10=SGmok~t*kc5}ye(C#8!WFp>UU(c3RW(BGxAnAYTuRrmra;LE zzW?DMb@mKql}n;S*tOE&W@I+wLS^%emrjf+iO4Z>ba@q(bvxGJs8boYeyP{lEEZ11 z^b$gQ;J{y*C-8EtPcv4a*3`~6_uzPF&*GEs2O3iYFXstvXPnvI>RQrSB6wBiU5Z0G zx(Iov(p=2YB=4OHr=au9d+-6=k7356p6wuNQ6t8hcRjEfc*~Xy^eixn+7phf-SusH z^qd8r?#0@!Tp3>WMR-ZCVi{ibMR=uGF+>!*q%ypMB?0c1KsRk#oeU^8tA9%f4`tA) z0CW;WPKqhZCdHHrcmnVs2_VFjamk_>vmkk-Lo9AWYs9|*+{=fT`vM$>Uy=j3YopVy zblMf96^!=-sY}YbWX?*HdZkmL>?jE@_gO)c@M@psFeX5$oG~dV_-Zoa09UCh4NKN6 zJ`Gdfz(mtd&Q;$)MpsRahOTd*qsvatRo_53ng!mgqB!&D8h$j9TU;#*@E(wozVp5U z+XENQs%kCm%$~8q9AtVC<3U=0ceEw$1@cXF(<2XSd!UiZu6N^zDhubC&=KQM8slL$ z!(cr#LPl_vI@p4InGJv;;9{9=3_{EVo+^3H;oO9-O?Sde$~F3(1;qDfwL9320vMp7 zp#?M0JMXFtP7Jr4ZMEou_8qwk9d`{%`j$aS!3mNXfK(5_N}!`(uorLjAUFkM?(1uy zY6F*m+zfXKeru%6&Uw5SRpcE$G!*T~_29e%bHLK8rH8hRa-)UKk=a@Oj-s~i5*KQ|eRUyG z1E0d@DAatX$y<}~{T4#!7Qb@dzSqQW3HN0+LlUN8vDq*PkQ-}m3C6?Qm#)bYH7f^R zjzRafu1p*OgEzP`J7}bVMA!QmY-vXgS}>?oI^#d=9eb)X^l7k`mxO38Ov%abA&VKaP&u<4&Uxmv;hL;Brx1v_g7>~x! zOD?(k!PfE|w;fOPraait`aAXuIEY}r(9)1v!LycJOxu0!Oc{^7h&7=*%S7O$Q&SfG z0vzz$t#Ms8r`I}om)Ysp=Z9u%xU)`ktPCEew$+6v{7qeQUmO_SkRF0l9k4gByL+%- z1bsg?I?s!u49Ww2G_dc*-o8Cl3?hDbyM!I)r%%5$+CpOeY({iAB$ah)UC(0QQ04Hl zi!gRVU;=}^s5?Jxn;4)h+EU3d&Up6}o5M&mTC_E%aP{Zyqi;X8$`+$R68&@DzvM9N z^`}PXX-@DUQn}>HYe8?Bg@M0*-B}0fble&=0pHqXw-^!$W9NlDC^o^LVBP{}PFm~e zc6(9^7Tp=p9LapIdB1=ao}u?{h)iN}LiLaN(e2HH=U0W`U(V;?w2Kf3lhQ>S zZT3;tn>!Fa zky^TLqUBiQ0<9S&8??jd)!HM4@gvo=ssjbNMNx6|VR0F_l?j(#gqQszgZome`1kLb zJ@Zj*%3{>~`}e@6Dl2zUpDkpp?v{ZHefoegeEb3*b3naYYu=Cg2E_hR z)r;FlOPguL6k9r|99+w!1EtZDm-X$m-F`F?RQ z9J%PZa&U9jgt&D2GAS`&9cQ{bV3i1Z6!}H+1sLh#Cj}e|CZ!0xPsMoxp0wa#vWNEq zVhlm12ib-q1=4CX^L;Q$LKFq(_#G@AKpdoRpcb!+(cir)J^>F~!H`rh=z!*%$UAWH z_BltzQ(Y2KLZ?QK*X7- z1-Y5^v>oh%Gd^N9oZO-uFw5=W*7SA@O3LYYED;$o2k;z1x5}xDnkI84GNr%pJVaN% ziLNf0B}VR0MB^;qXTzw$SvrO`!3^60Hb#B z&>@SBOBaN<$sZ>8cj`o-Lmf2(Ej{H-;B~#GQGJnuV{}uKZkmQ5-JPYbb2e9c7r>4& zx3#Twj3GS=?Z!@f+srAEve-l87tLVCW?|KW3aMV$BWJlxtOc8@rrT^E8pX?Am$?TH zKyU+O)8s*ALT%U(!g@o>ViXu>W#_omCU2m(W607F60nVb!~Fl z;JvE>nP+NK@zI#GZ2w4a$OjwWNv_*!0^M|OP}FKGcSwy+3Ph>)r50uND@L5)WMp(L zS_L8Qf6)AI48n|vEjdGC3lVzZUd+^0<&-NS-~vkgZu6kd%8f&8!)^_$MbX7DTWFSG za0Kw7Xzj1>4$h|AA;dDTdL7(yB%JlDZ7n;xC_%2Z2maK^D-Au-;oGoM3U?OE@P67VZh z2e7L~?X!1cUnRbRr$#=JQ;>HwDgbwA)!PXN4`Et!R2IqI^CO$X6T!?#Niub}X&U`H z(C{e{01Z4%HQdM=-J%=p2r=2$-x2gxP!|m7R769Jlc4@r#c_w(z+sAOhRYSFG(7G-? zL7LQ3-UjcWz1^Tj_0!twZEvAf*5-9K!<0dzvpW-`qwL7la-p^u+G{%KqJi3_|KD;j zp!NT-miYZUgElg4MS=YUP&E4ev*FMZPa4YCkgNT@__( z<7!dFOvGAyRmJURN89r5TlV*#F}h`X-ffp})Ns)On6LGtgTbhCrBXDCg!WEkGMJ9| zeZ11jIHCLjdK_k)RFW~M5OW4F@eFIm?5J_K4Ct_-9{{EAHvIq^M<7zcMK_C74zRKX zY{}Gta8wZ)D*{RS<-w4qEN^Y%-Wo0w4&*Fv|`Mx@BdWts0{`#qi^i z4o3_xAdzXU9{3$Ln~9QCXd$Kjsb~bDISX)3?~sFnW-PpSJ0H2L+8HhEU#C|s9V>Ln zijQSrVvxd+>z85)kmtA6evtPwg7|2$OVEPKzM$DQ?LVLvMD?`$4~5!BuOcIt!?+jD zz?#u)^`yo@UaBj=L!(xtcr!3+?e)(CvL8mI#a_(NUq-QjyOpNyy4pFbQ-E?Q%}5(F zp&!OjkXL45?nVpH+#3M53^MSQQ$SQ$W6%C#Ru;>? zzIz|Q1+Hj$*>iLiZ6;Nb7Y&AUHW=~y#eOv6&7zV)*3WNqoRtyZW7gC`OS3K^`Vka? zB~|cWw>5hbO4qilvqUZu*l2mNcei)XLpS!<*RC+^R{op^8W2(|HzQCvmi;?79e&O< z>I+M425o+rfS2KB7u2Y&2P1(4A-V%0^g!GMCZKp<{{@sMNQzvjRU2xpJ+jcMePhm% zTw)#0hn9@4wkDI?C8}Iqn-PsH>L9u^=-SpCh?Xre2!Ru{xS(*SlScOj1A085hXWc7 z=p7nOLAaF<7{n4_%IN1yj7b_swGoP?z9qR`x>%d?EO&(K14(Ynw)wQV9HHZ+k1U-k z`to)TmUw;D63zu_Z6?sD`F{WI9eakozi-I7Tk1acZ`?8_!I=T&OV=!*=Yb|6-YmS` zgaE|kE>QraZxoeiJ}}TStujBmmPvSr&>wkVWYA+Pj7B@Z7;3G&DYzdU?OqhojTQk_ zRn;G<+F6Od{}Ljyo-J33&z^$7QJbPI(dfd;9(YOyQcS&}Zi}>?z2(T!GX{3|Kelq0 zIb!HXsMv`?X@r`{s+FGh~8WTcU5 zFtXoAgAqcz7uB9mAU0D72Q7Gjvet|-{?&XwAL%s{|0;^2kzQ%>uhInmRrm$WRQ*Ae zMzi6t{w6(yfAwca3H-y))=8enXrwiA?-<%EhRzK`=deNFsKijS_WmYZCLC!S8GLkI zIE>&=Ux!cyYlgJQS7&0RqfaI68p~2V|!*InIZ)ya0#p1z870Y;lWqYAERb4x4looIpFHyzuQ~@hR3s{Jk5lG;<)arxsFYd{N3ec<(WfeR;bUhwCrO{vrLKUxHy}KdRlhm!~Izx9`Zk z!#j6wm%)ILeUEO*xVJ0g2r`IQkzjZ{xUKdF*aP~Ux14Z+f&juyYX3_hQJGwg-x5yp zi`v7^3+ICJt#w&h6uHnib8DTCJ#@z#8w1|zMFle8rr$5!9&RpembFVMsk_(gY$^)? zD6a^8#6iir|9pE464toV-tFUiSM-mxara#paD5|tSZ_D_M%N2>)?~@^ zW#7ntd?QFQc*js~_6?!4yWuzTItmAPC5Pz29goy0xNlCGa!12>piX!BKgO!`y=ceb z@zajO9Br&CYx79qhf)3#y0G-t9@nB2v2y{)=KZi)vdLv zUcf%@yvSy~0fSI4a%%Q_!kCaiN@WiO9-s-)gol??CbSigAyDZyCu5AUT*tZ4rUJ$_ zggJC8~wS-GDwomcIgL84O@leJOD?F%A>_9v=hx^hvP}b&3S3Hn3MHkEVY&{F` zwYIE4*b{xz4MQx}wni2GC?MeFxe(8192U-%9*Km|n>|bCjc4g?zM~IY&ZEm_?tDM6 zkEja@Ho)FIuziQId;Pz@{?qG!dHpYM{@v?;@}_T{m8v~H=zh9jdF{u!qLbWE1=mT= ztBD$W<{Bte1%6zoc2=08;8Yuf%h%Bip1hwU=%<{1-f{%p3S#iA746C;S~oh5uNM;H z%M)HldN+;02Q-@j`BhwcR7WxN9JeEP1|GFCi#GrQuH`=cvNKHl(u5gL>$vbL$h*Pd z8-i9c&j@2Wx^JeE9NZsTNA+6JP{pzp4EX1{uUD6kU%F&$QU?J2^8J?W zXPiFUy=*^zm)IlpfaVcB`hm8@s%xw`_g0Wy30xzd(q%o1(K6RyZ~CYXUzB#1%OURuJy(ESN#0 zwt0xt%x4TH4O35b=0g8m=%43=KD)jSKHG@da6a#I zNCuzmTor#-xD{vBwZpBbW>!rs6I>|}JsL=MGiDH8+N7G`GtDAUe~Co^%{yz%fcXg8 zYL>*?g1r32mIOfKtVsjSQ-J1achKrJvTL97OviQkti_1F*d1|A+g(3ZiQ;i-LtXET z^s+SqTN7ui9g=PAMPBR;Jo>ZZsyTplf~z?>n~`IN?-x0yj=$zb9;;)njdfFd0|M|j z=@y2)s1;z%4cTJsoirw+&|QaW$peVavLh0imx3;en`d75w;b6}q(HOEczOoT`2@Q+=uOrsO$cq9BQ;b*CN;*u^lIGPC<_AW8UF8&M0Ma9ORLu1bkd~appXILN2u>d1B6~-s=LAvga!Sv!%lx52o4VJU_UO?d3<9qF@0yX z(9y&8qPC(9$R?_v-;HmyB8g$e9d@7tXT3)pv9i$!m9<6)?Sz}#EEzo<;FWEJb%3{x zOIJ%%(wr8Su0MP~y8f8ckJ@xy4_KR!e_9W*)g@Y!f+nQNB)S8Ja$-v5B)U6gg36|X zpWdm0drbu&Oc|$gG8}X&dgZc|`eGa^b$(E_Qpad-UjJ{e|MdDly!pE~|M2?%dHo+> z|0xW^Mp2WiK(zEQHRZ{`yi|w0)w+yW>D|24yLr*wt;_aqep|lX&7K|EFky+(bRx76vRA3D@LN?b71Qb|rh1T~GX5cgU`KYKB zT3lN|PL8JIe5?adf^vsOBo1y2G8dhFfZsG(+sD!$9&%Lw!0Qd{`7YPsGhL zS2|U7HD`zp7!W&1J8SQ2ckNknqTRRuc9Wd^FR%af=6`(sr{3%TjEeSudi|f?{QKUU ze|Y_$-~8R{KfV6P*Z=ADKfV5!*Z=(Hf9}2h&u{+W&42sm?_d9k_Fn(v>wkIur#Jt@ z>pww(-s}JS^}oLUzo7h^fB)w1A>m(M|Lg021f_lN&HsdT{J&7oo4 zp%QIEwk_WwWV|z&pKMpnGowp``#eD74GZ=CAMmPW%FGsQv%t4lAYoo2uE6$cv&8SQ z#EO}?xEuN3WB!ckbHdI1Z+H`x3kNa-mzS_8xZVKxeu}R`D-V4?acJPm_gDB@;_J-! zXZTvM=Yg4lxv5e=Q%$MnreY^izyntABuaR|Mx4YF9wKkjxT=OuPI%3*d+vBIrPPGhi!m=8&??A!S*IlOhgYe60(`4)hr(;~?pRk!Uayrco=gU_d&B*^w?7l8`uY zz(^c0k}eoqadf;I2dgd+D-FboY5ZMTARwIrHk2+9B_Z+30b=Cyr<6zbW zVy1zZv2XMuvOqvO1?($aAPPd_nFGYk0bz?YSu%snSxZL20TKbP`tw|APp*1PetgBeb`@X(zgCmuDNsik zVS9(FIcSXTO|7~_P3}zVGk$$0zh`Hr-WU{mThU4e`UFfWtq(GbiqKd3+!_bH0Qzh; zDS#n2GYU~N3QJvjy< z2sfgIxjXvB_dn_GX{7Haw9+D^Q@L#uAsuN^I?|%tDlM8VtK8V6%GS0NJLO7$?hyWFV+b)A$c9=?w$y4R zsMWsX!B5(wLZenIj9RU1tJTUKYPGidqHL=#teOnBo%QCu4OY1UmhYG7HU>+N^d!p8 zBtjUL$T!;Y9D8bd4mSn!rn9-DQ7V|}ZB9nzB%h80_!};R0#}v7S3TqK1jADhie=2a zn*us*bM_m}QqCF(nl2(R1t^fZnkCU4N!isYm8b|3u1<-SZ_y@|U2RfbiN&n*prqT; z>bLKqL~2$My>(0G1-LY`PKhSJ;nNC|(_+cvb*e67Rs9SVkC}L@8(deTA^L@oA;RFS zWI~675AH_ChbG^&&DMBO5euqes7ah8e^mw2@45=4dZA4|l!e9G9O0l&)}Gx= zhSTvNj_T0zEYq&MavO;rUiBHUQR39(5SE8sNx~{$@IFOt%vc&%6)EE*Q#Fvqbc`P^ zk&ecVf_IX-Gyz^)WX*s@#aPteb|6I{aV=r+8L>t8U}mE<=MoxT_ap*S?1&?v?ylDz zdnH`cjXb$3R_ZfZ2yMOrwLlDoQ!e#c+FCA(3p8D?tvIq9tTLr3B1MRk> zx2FA$*+!E=sE6=4MjLPhhiTvpU{PE+r*mMc4N04Z9EWhe@;-(f<^s9t0C2bFtS+U8 z{Lt8JXlsX()`OCnr^b$hqgVpfi$Xo;Kdq9yIU59%+4_xfZS(?l|HUi(uL~Y~63WGU zorEeue}^Zb4(<=AM)`;$x)1FJ<*;=+Duiq1QX9FnjZQ8CjEo6X=fXs~2SxEkVB>)T zCv@Mk)*IS;=u15wwNX7W5pMfD8T1B=;nDf<=<(oHZIXKFQSVOucI8no8rs(q-tZ+i zB~4!5E}FYVGh6h7`qe3#xka7BJ}{8G=pXl-)BdBuV4GE?p!%|uN4?>ZP0@a<%vXd96in+xrx zMTU;Sx{D0g%w^P|t)$)+zTT^IhwWT=z1Lb*%{sybaJ0FqcHuu-lkP_Un=pGPlI}q2 zn^(fm#O$pX>kzX+ouB78c!;x~Ngdi! zfqPMKiCRlq738i2YlJ_vn^-plLHiEW5jMcCc%BJ912@Z8OJ2--Hu@V`djdUSfd4(r z3QCrUU|mtLXD1=QTxKQL=1u0A)!ty>Pbi9ufb8EpKH_(7*Jbby+_rD)r%)BYfA+}w zkbxkxTjHWCVttSV2fq%6lf$Fq52x36KE6I4T;F{}4o>NecRzAInFM5da7wvMlO@*< zg9~tPWyd#%@hu7La6yr@&%9C3+t2A9Xuh0O=I!Gy*f_cwdD^|MMZ_j9JYoe?`|t%1 zFUm~8y+%d$i^|TO@kydX$Omf)_SF;=aPAeox6GRF2YX#)y1rJVK{z*9JpwiEyw`o{ zc_f}dWYu+ru8_*cyJ%_AvtVLU*4<|)=@d5Ll#O`8JTg+{6@HMh&3Oq5bUg|FlP1}e zfg8YN7UaN1!5MRAe3Pc=L0yq`Jz{DMeq>?^F?rEPN^B$j0+xFo)%eQk+Mrh4k1&GZ zMWz-Hl`6B7mEy7)U}wi^d}J2_TvqVXRHYrd)L){y18aL^3vRE>`MRmndeU#|18vB< zd5w*Uqrr@M$@wdA=vdLZlI=x6i9xDh4FefNJgC3%{s#4YgDETiu=T|y_t>3Ud^{e#nN+d3i?5g2NI$EEqn^!jk}@KOJh>Gjdz`p)FTk3OE_Qk{JG z=%eY5{pro$z5eId|Gcfv zFLuxHHqIJ}SZWop zu%{m-)N(KS;Bd2+a(69-uBE<8og*y6!Dc1-?n+W!33zk`Oc~F|^HBFN4(1HehU)o) z@mRS^(-k4{94`T)7s)x(t~&Jco|!YIjpf_HB$JkQ(`KEMscwF`rJizoJzX2t6c4&m zIAzq@+uZzSn3|fm#9%?A)ab$9Dt5}qjLpxt^*O?e!*R^EoFQb)a`<<(gA1_j2i~zN_3Ac zn{oAhoKnz4x05fr#It=0Owk95wrs6WK?>(kxUh%9g(>SK3JmSN)L*#Gj^$V%3>SD5 ztU)tJ!Ml!trCy2p)E8E?Qysd=*ZHN+kIQjcw@|VR-Fa<42SbNZVz(}{wNay+Jj7wBkCD5m4=!o!YJ-civ2 zUufWqDNbq~9&ZY6ui$5ZW$@aNJ!r~s(c&nJ9GUBc(W)KI>oF6FZ=|2d@ZQEMfd{VNv= zJRSuKc2C_14ZBw6XCgTLb5`cdzv#*w-nqABVQ%l=jSKbkZ433Yf2)Q1`L10}vq?`{ z=l4UihJw_v0{F|AcIm&jr(lb#Lqy1LGqni36D8oraXNk?;->-)(pC)Wob*9wLHpp{ zVa8V5b`h$yn+P@YT6fy;-MDJ1-}QBHZ35r+mV~Z?&|}at>1xTj){;Am%3MOjpF;nb z3u>9Rspr%Pq{fJ2#TW~8uLK4g8_$g8RUFJTXVg6ed-XsA=+r|xYm34+ZO?SOH=hiL z90*TcdIdhBCx>^ZVVdMQI3j`~RDtq>A{n*k`OZ+!y1uXyyG1MN{M_}q)7o#r&}J&x za8q@X_fKY5eR-x2R!S4PQJ-L1H!e#B1ul$N3@9hhY$4+(2U0s;d^Rd~-C-qk2D6(` zuKlpI-C-rPgk*RqbUwOrd4@xEJeW>!z@~(PXQ-6@2!QBr!&zZwk3LW{q8O(`U*Muh zfT}h#V%%gUgdUp$xu&XUbJ?`x`x`B9b1PLg?xn!<6iwSW@?;l|FtaG@h|Nc&g)WKX zntO71XR1k>MjB!ktS7P@bkuFAw{HC#OwvAG8`o-O`#x5&xouzc4}0<~hQqkC8UEy_ z_;Z=#&(Qo{^uf7x&pLjI27{jC9ksP?%G^*|ZMzf%H5vQ%hXEy;6n*`*B8FmRsuCFZTtt-pV z5L}l)NDK>s^Jxe~Q7amk$V_lPkL{j&=lT~nu76NX(y~3qpS7ee-OoLZD!%W@)k!BM zn>jDWYeJI%CN$2gcK_;B2Zmbp>*w8tFQ983<7H`*^)t10ueHSbUl8K4HQTWiU3a*zC~HPxn7{x z=fJeGYPZrDy6a+*DYo2E>^HjD&=kAaQS7%a3p#RG(6++AYw@ciQtDwMJW? z=>Hb9-CtqePpXsW+CJ1Z9%79{jO$J4Lw$v>TkG$vB3vmuWsBm%_aANNiETl)WLLo_ z+vHb=!a0r*F%$hD>i7j4-WgrP zj3vHsOMKNX@e!7I?3Q@gF7YXrP!RWC;bQ!0QzEc5+IS1h+EhP3HB{ebcBy^7v!>PV znrgqxdSdHq?7=r3uY#Q_mp1{o+yrjEv!;uiYP#60X|c1Wr#o}L*qQTqXU@(&mGSIq z;_Dy>kn|EbsHB`;wuGcDJ1evhc&16(U>asdW;eoB?KJAGXz%;qYquaP;}+ygO~C3| zq!1ey>NG8&2dX(7!93G6Y+!BfA@@}OpqIu4_?CL6DVX&ZrL!ODpQm`@^BH~WI5hcK z|9pX2U(qj|tdI21W6XL;AJ^wZl70#UW|oB>M@;?+9$vwHrw^~MgRj9$WLAqEKY)kG zRpTM@8+c#V+26tIMg964GNm83q)u>|!Z;1~UR_^n>67^WCm?=qvLuu|OZrK(ugThS zO_C84?*$#E_rs?Xk(^Y+)tBXCh^hKvMq74*pYWC-VG?lkV#QPbP>sZaz&t@AZj57JyKc-QmSj0FRMm| z`-#9x056$ex1_m`-!9EDH94Hp#iq1%+QPR5AnKI}{(tt~yt#2C%M<)63|I^c=x{Me z>I^Co8Xa*cGOpAShm;&8M1mwDNPq!2MN!9EWmV5qkJVV$TJ6|c+w6AtcK4X=Uu%|? zRoNAlnHBXFsIRb}WcR)24!DD$L`5j-veX|U;Ba?1{Py>L@AnW*(PYv`ai2u|`8+Bz z*nkLx_C|9XXu0h{Zcls@fhz;W&}~&1y6x$PZhI5*M~&H9w6r<4CASueWJo4tedz8r zQ`6vca3p33jz$g&Be*GezVC+jw;nyTfAk3tbGWA1X))dHPk1YSwBMd;)s5T3e;vLZ z{^66GymdSGxu4ViGNP~7CyqM&t3>bE@Zrnj1W zzb*GPO}VFO%0116116tu(Wbg!Hm|;VUVK_`e zc##mh(N-WznkS;>iNsbwhTHP>;7qktoR<2IxXlpGQm!ubm-;cBrEk+5PSc;#epaQQ z&zpT(Mf*ZyQZCLc#JP&*wb;ybd3J7Ets5ei8>qx`@lv1@%ZatXw-)!1SZ+@zmfMSo z<=_eykH}(s3bCAsKw+uvlOUE$-kfwOEW~OSv0Oc^u^Z?bJ6ffv<4N=1J$vs0^IyFu zhe{@++kh5q18^__r(7D0b71bl^9C*aU7a3VmtBsY<=sQ>gl??s2!lSjBH1lXS5s3^ z_i(D5lhe&?QHr3;nk>3pEJ|8%X?*1jrsj*qT-$Zf>lg>YbFLB8dQm0laTIfdeTfK? zla{=tygk3}H3Q_Yl}E=@LCbr*55oo~n=K@YfIf|;!uBgDy*MK9-DzN2@RQN&TgMBf zTXNSq`t2q0B+fO}C_dG;R@qNAW1(<_0y_RmE5%1#_*qjyl?oc;djHg$i4S9 z;407lTNV-De;K|#`+FepLr%bVXFmqUKcMh4bWy`T_u-`7;R$VJAPs2(P1Gwy_wMe@ zOf?brrVU@RgtluF$q0dLo2W&fUWBe3TS5Oae0TPrk@6784zX&W28i+S?8n1*!`~tI z;nz?P%62Z!Fi2(i&%jU=0c8Q(n!1 zroZ`M^T}fwLC9|!UORSn0p1UQ&A)S3209~MQ#VJ;(aw7+wl&Mx{glp?#f;Z-XGvd# zS`~j9vjZVr zZv=%`(f_|3BVX=shVO7b|LO1#5GS=tk}lk>wY2N!TT&>RvOV@H z@idjKF%vu~&VJD2g-%fKwcW=A_eEV=^33V+RuIZ(I~nQL+^7c6o{vJjlBl2rTK5}) z#kMcfvTcK;=8bPQGPGLnMl|@P@k{fXezT7X#2MC{y|cAPw){?Jv`^eM`kq6>q)vh*V}HWF0FI9^pY?n8f*O4p`dm-?5%9;{;(8zW6r^@N2A`a_igtaol6rEPxJMaMA6Pxv@ z(kEA#!R=4Y;j<^_mPpZuMP0Wx)%GG%uC1N(x(DaHZvEWX9gTb4@;O;5E28jNEoa|D z2}n9juVVVj6?-iUXqy*k&dYqwd0CItV?8p1@=4z0E9x-#*`uFV^lX)WHmML>^z#6I z9)Pzo__;$rk1y`J`TRD?sf6Ba5z;-SnM zHS(>+ZIBghC!(T?2{*7}MHbtZ;-PJl2|d>2XnxXKKDCxFBG_ zr5Euw=ml+qX!&6;@_CbH52f8kwm}ExHpp&Xq%pE@&c{E(%8t;?`DzwQzwO0}5V-)v zsKtS4R1~-|LStz)()XzQQ>BaXfnzk_aO#S?sM=>#2%v`gQzIq7)A?%R-p@G)vww8X zmXYcrwGR9n_(Z^MQHAN!Snf~ANL^f7jsdNbIX5(5*r%#dOb`uyf)GwOFRozWN3E+TZ$k3P zs$RG`Yo0Ur+#Nv&#|)AOK0EX;VvwBuhzye9Un74cRqu`u+xg*F!`}_R!wEZg_6zWb zbM^~7cYJyFi`?1Y(&OQ~;rHW(r%B5^_o-=c9kKaTVfMx&hqnr$lgZIR58P#0h3B6$JkXJkm z=|ye`9z`m(gbUMw%bs0ib-O6+%Gq(`9Js6a#!6Qup<>6OyB`GnPSmY5wFfQ0-y}R6 zBdbU|Sw(J$o-Vg;P84}fY#YWMk^{CHBI4dEOJ+9)hrqgb_;Q*+^s8_*A?gkN< z!9{Kevr?s2ke8>TJg(jI;R{WJ2d`a!4-%CHZy2o;RDTT@#2$rDRJ2}*y*aw+)awR=s&OkuEeIonbzI&G>J{VZlg%xI5i3DdIX1-M zWoiqwZ5d;NE#r~hJHoKa7b~t4x?%46v3vT(DTD4&NsUeDAu(2yKEuZ@Vp@xSA$YxH z!o#5L7TQ76j0&L}_1eg;KvxB)_Sz5nZMWWZ>-oIss6p5DFRBQtglNgD+s2JJJ5Ygy z+^w(IZy0&3Zriw#S^dn|+iyGmYr|r07zSZv?;dxeX2l3z??t^@&5a`Cv}#qv!>G`4 zqsVEx30Ir?Wk8L@_LPnXjVq^v?B=Is=EIsE41n126*Mr12F~h2_wH=LROw<{`ev!j z8luduXlIM56=7g~8LR=G&N9MX!F;^s9&#(YE@f1x(`4>=B^=*|c4N0*6>BH?RQD)I z4pcJzSp~Jw!_)+{8Sk@EypCQBVSo1<6yd%jl0-2H=YmGA4XeH{$zWVtUh1Db{MX?( z!*9=idiGz3U%}D;Tcou52805!P*^MxIm|DSrvZe|66?2`=NBma7X?!#3;zupOL$n+ zUNd}41Jz-n2c8%eBdP&0 za}r$lqHfz6z!TSxpd-T*U~;hI5Sn;pslJe7E_C{ZrpH^oeVD(6Fu70*IyWDAe8z3x zTo1M$(P+GR;D$4G_uys})^5@#MK`Y>XYd8O)@k+wttw7$syfFn7WHNW-88uBe0TO` zZuo7*V19bWrP;&B4b8Qv5WKc{D-8NM*azK#v1EQR{HL?O8@?U>3OY?Ccl|gL!|?Qr zgcyr5i{$j3*@sj`>G19Fx0<#T^jj7SlTn?@0>`y!sAb7%=$UVaZ_^oy{Vr@ltO9Sj zzDe6;oQ!7KLz}1OAF5Xn6IBfM5NsDIp3othr5U!0$3@F3P(f*rG(K7;)qipzQ<(h0 z({}Q}Vuo@`OZnVZo>IGa&IT$l$b- zfmsj&OD6-#!7qM3$GY%5egGaJU|IBDrT(xCtYc44RRr0&o{Cz# zYg+i*6u*ahAGuE1017k8Oy3vjK*}J>ZQq7cLg8@{v9Hl$!a_^(&%eAJ|NOSk?h^le zBJ(UURo+=_ zjLS2b?8-0x`gnlvjn`_$l{1d6_n+Zh0~TXve}DEfT1a43_%`?4yX$3<_wwkHgur9p z@aVIxt*kc$W8N?UJ#c$W(mxgp@D&pN_N2P5cUi*Uo+SM3r3inWF_gZg>6vnAetuy( z@4g3>uSk7s7E@oA!k1Dn%+6uzNw|B3?#cN;&Ryqtgh!Jx_zc({;*uYY z=kZ}X>^XbMo{b{5%80iefvh~!P$VxvNBpU8;!^x9wi&-?m&ghh_KZ;k6vCe+!i#ez zUSBi0?n>+5ev?ntqgpr>@pg`fJs&g&qxQ*Jr;x8cx!Jw_BNgE*+FZ5EQ6Lobw0602 z{Oj=D+0RIDqN38pyA=>HazZ_?TYt=p2*&7aGLrg@iagz&!3GdE9yL`l3QT#tfe( z8Lp|dG6F$fzTE5n1D;&)-9! z$Ohit)l6sZUSw960=X$XJ?#;&t~5kJ!_d~$!ljHuReHPkwh_hDZMVV4S&L4nb-KcM6n9MCGLh% z1nfpJ1w~0x;5{M=ip|OD=}u-nt^I}86P7$ZP@Ya!6U&)3addG_boQra{#>i$XtX-s zOjaG*{@APM;NMg&Xh&1!T+`_a>yf*omX;IS`6^t;MM3_40RR>4LAJ~~rEt111Qh$sgz%%L~r#a+1A0jibf zCnx4hFph33bPEe;;apcj$XdFugp|ly`jKiHT`I+4(iF8s*3xTg%4rNbQiEnN=&qV@ z7Hq1Yrx{yN+Mse*i+&@CtK)8j5$k$H>Mjs9)qgN@KOGs`KoX=W9cL!*s+KTg&Q)aj z@+{l(MVzI4Yw-nGzPwN^U*HDLTam?HNXwTOWcl(aW%=?#%l$=c`69z@`TA4*z>MB0 zK7CF9^rQ>I=V$awOmw6tlKl^ojC9G=S#jy!QW>&{xOtD2tcrQhhQlMfCuv|HltJI! zP!Y%*mQ}e2q6YzbzNa9b?`d#nDJ|NeBl0Uv{Wsd6N^2u=+cABEi$U1dCD2nI6;kn+0PmN zJMxx^!(rAZA;Ed(H;E@7{iC8wepIFuJL}U1ZW}lQGCwYU_R&8t{NT@fm-TVvg48k6h;-pElulzQB+aM z;6$h&Ron<+aChwum^pUryA#>7Pb3zLw~Npengjv`LBn@vzmR&CKa6%nlU0Tl zz@%FTlrOz`Z~4-W z!d^Q8r`#42truw{w~0sBQG$M5z|;f*(-ts%%5+bIkW+*M`st5Kn)X1_v}LX;sY18m z9V+4{mp#&?Mo3ul1cXOh=A9(nb|lNF%9C7;lH@*!j<(EYEP=~k!?@i>(E&(?Otodx!_EnU5J^HIdnK#m_ zDa-;F;LCyhxX`P2qa~2>5LxBB;kOxkgPaLiP7qz@a6bVmgzqh*a&bDSx3ixi*6Md! z+6-uU=Unjm&Uw)C{f`MPAHj{6#^c7R{XHonPh5ef;Nflz50{YD_Bj0aoB)1fquGDb zMzh%5e5tr_>sIl-!04EGVQyw(EV|h8v@d}sZ@&j}ynQZ8TpecJtYJ1rv5`SWY$NM) zpS0XNy2xR-=x_r<-}g}Y^WSBJZG;NpVY#=(-js2Ed3a`r|Aedp$^92C-%TRk}fw_^7$3Pu$$>7GdJomGQ($jW;}-(z_eqqx{cf%m76z> z8?p#|#q zIGWD{UZsU$HO;|-F7WDVh$3O==%5^)V8rY1Z=JG!PtyblqznNTnU-cO?C^L2=o+3hTFHIwvA zE$?MWrOm6DcN2tfO0;!|cHV@Gsrmr(Qc}HvR2R;~m~<7OVadmALdq-ZsrdOy|JRCm z1TVU1DZmmw0n}Q&BCH4kUNO-=ripfix`i^eQb>9-#jcbh-)&BY54hMda(dRyHYQ2t zUiq+x59{&6hWb#^O5?-xJPa$SeZA2-QQ@J@8<>rj$mO0C&6@A&cHAZu*kIk() z_Q?fv-epmy)8kO4IQMOt4#n}hDb7>YG3ziNZkY`cqn_3V#BOF(BxPw<_zkmC`zqg;!F?M{DI#Yd` z15c-j!TECXGW-LXk%F-rL3a>9^X}}&m+`Xt&DoF7z9cZ!q=`o0S(7LI=i%Go?}xvB zZ|AA%GM4E)bw@+B??@9o0)uVm^V_(?AF-ZHL%5{XV+z3aGM|5m87S*sJV!JyMgz4H zm{y!D?G0tTDr)#OV9+wVnsk}6nv^wdvv@8{s~b+ur0{qNG*V)X6!4UA{DLlNp!@v{ zdM;RTlJW98l$vD9OyFs5d+jMXvS$=G3J2_nhsA#b;8@t*P=b8r)z3J8&Rr1vXgYaxrJ03GN73>-;VG7FW4|5LUemrkE{+6H&lSa{9qRz@tQ$tIKUIRdpVKQX zYB}|wFTYbkS=0lbQ+hzo*^h#DkGna5f=rciJm^l9a{Z~9Tx)7Z&y$CaA9)0{*0NVT z+JtV~0cJsorD*`;WKuH0`CJ+_!q$~g#HF}$RB!}R-eBOWyoLxI+BbNO(Xg}JZ!+L`b>kT-i zLz+FAc$G3=O-!BeXN!IktVzebL%@>9aO8ekz`p9%lYxMb)+ok(`dOzR0vr_C%E^hj z0lVU+YTFZ=6D2qhf`&ZRoHmy-!pg8!UP+q;m8OfjRnA@2SMl9!D;%*4^R2}l^i{m0 z`zqdveHFtMY}+D>?I^yAMFa|?Hq{&zC$CL91(x7>?5G&FY)jiq+p!y(ZJV}swCrxH z{+qY+d2^evFx!GH(Y$taaxzUP@a%asZmN?LeAml--h4@!yrfJjFPC1%uYYN`XlIG9 zr_R;2#EVE@Fo2W(B$FY^3zYfOVnX4N(UG(_2wBR3ij~hTjx&!~ZK&EtQ)}z2fYr ziGK>Upx+2;*57G`WjQ$24u7kBxl)F2kiSD5ioc5qvVfzJd_s>sC>4HmNzX-x;{j2P zh}ENu08zys08#G^h&s>#QGie&AQTZRKlCClfl#fWzYZIAfrRqi{u;)q0Am(KQE?FD zTBPfSu!RwxMVxwl%{^H6FO{It`4RVwr9xD{*8wjV+ zJ(eWBsrg~b3u-dZC`=O4$en+HlG%9@j(?RzuyuIt2QfXQxCC$ zXHIcs%at($33q7m90Z1?_@P!MSaM8@zKtMgP!0GbzOCR>2+QPM)?jJ^5Jxbzq$j6< zaLEG!bHnbPM#9N(iy3j3PvPO>aL6YMpeJx~IzUehjTACYgj&o{2TM}&BBJBeX97c~ zM=K#hPKIXz@k(V@Pa*MABT7N!HL&>lV@vbePJ=ATeH!VZMraAjn@R9(GiiL= z;I9wg_WC^F&4oOw{{j;&T48>Vu83jA9`!$+g-LsGSwdCqRpbW%-WZP#*k)(F=;@dj zdE;L6f51ADmDBw(IXUBU`lmD*8d@f!O9h}l_KSB#8UNrI9`JCb*po%eZ+vNbMvWF2k#+Pfs< z!|$`n0WxVHMj1$A%|=4rkZ3tB!{YGj^2G+HzF&fa0~8;8Hz{e#l@)pQl0|+;RZH#@ z-jb6Q@2)j4Z$*5$0pS&Op{XZxHTa(2MkbqPOvj?0# z;p`4)k2!nF*&1i}Ia}szowGNb9dWk8*#>8KIosjvIcM9Pz2xi}XD>Lr$JwWxea0Dg znd>6@qps8s2X8{~p=;0T!H*#Lz_sV};H~Hbn5-`g4M-zn z(i>z_{1fGSn7loZqZRPru6sU4!?~KG{t{2x-;=97kn;ZlS=fI;-k7PN3j9%!_{f5G z?SbjL)+k5yfpU381x;W&W9qY?$=1_F9LT_oTn+n9F%;CrlaEkLpt=7Q9Up&!;eQLV z!m}?WcM^f_(-4m?!aD|L=w=XEuPc{V-UG(@grd^E!Ll4B1z3@#-2fj3F0flejGZLL zbLH|%O1s^K3GN)q_-!o0%jCV!WFcSJ1GDW~>>kGWG>P$d)lgz} zwdcCb&rHBMXxrg(}Up4r}DJaGPwDC*F{ZMhn_awe7;E``yxK@Mo`Ehg#a?Q zLm>wgvhU{e`xJ7WLJr-0{*XfY6msC^^9K|%ppe%}N%pkstEriP!a70RkK*XHOs*te=1vSAbF#|XxPr3QCoOAj;<6rOm38$B$~uk_Y^1Dd z3jgtCeUeqyr&mzc$CH-z!Ng@<&noN66_oX8(y}g3T-N7VWqo!9WqmnmS$8Hb>t|VI z_4ySP*5#9y_S1<=+vZutb*`egwTX)xq+^aRZ#T2Ntw~-*B|VHjm|zp(8dLostP={j zF?sR#GK>Fkw7SO#sIuyLb@Gqbn+sFFp1kl6G7JCsg9?A=g9^VjdEu8c3xD)Mg@1FI z!V@@t@&fN<7Wicn`hp9YS{U&H4>rm3tfe@%eh$8#>p|172v9pd=AFZuE8O-iX<~k( zlBySku1-)l+n27JyOY<=r%F`S^6rpb2NCTdbHOLA<~=Zh!H0^WCB*e0E?m?ok$|z+ z$e^;O7*q<(I>c?tL@i3xA|vw_8JV{f?nD7yhqzlZ(E~~(49y=9eEop}Ul)EhAntvc zXqgf%6KZ{#+-fX?fpW(@Vk_{o!Zs-GU72Wy678_(^s`MrFX87Udj>zx*b9n#PbT`5 z5`D@(qaV)c*Cn<{kUgWm7bMV>BIGh{z$r0GrNxCOFKT#!a%!{`0BJQPtH&8MLCSN&%0m~Y-;KSL7)I~Wf{xISm&r6Fin^FN}34Mq|^}@ zZ<9qzyb$B1)D#$RjfG0Q0OO6SFEHu`3zVpBjH;_OFxm^&R-$F}tpfN(~`Sl0&S+Evo`!&g{Bmi_vw3MTe&QSZYEhP1k-! zni0%I4#s`R1V*RX6qz(-CYq*XsRfy|Tzi%DD42;Hwug`jjAOGUGHJ<7G`-4F2Quln z_CwOTkaSFBasZjYh&MYTla9iYa$&0)4;-0+t zl+)y1V%*hf4xU`jUCJLz>*Us7~To0ma|_-k6(Z4Ez9t~V`mh`AisvbDR_qrq6t|dxMh63f*X6I z@(ZQmT(Zy`gj`UeT!_3lfm~5<<{C2K@AP9~nzuqVOL!?9qxG*M4g2v*b@6L<@5(!tyJSHuUr%J z0+pt&lz=c<@^e*GR#W@jmH<2{5d;S6Knc1o0Y&-zDpw&-4|zWSkgJfVO`gwhQpjr# z+yQ^(XBe>+Xid%ksZJur~*VjMk8`QrWHSvtr*wPXOlN$8UQo4 z8J|r)QD*Ano3b6faxD(XYR2Z6X6z*4`yh#CmR&uF8w^GpKW@>OZlp2^eRLUz|TGU z`BXsYm4y&qeJ^FhPyL1b9)$3q09tP=YQ& z37V-wc;y;BY{^(1d2uK&4nzsA<9o$Uk$Mw`_c2`T7nSe`RVJ=MN#L!Fz-i({Z0dof ztUzQ%+~X4pBjw;z#F5E(l*u0J{wMoQh^-6|8P6Q;?a9L(&_8~Zy%1;)mF<>Np6v0E zLPl@N|LAhSgwz=VnLy_Wzk}q&~0gzFRk*J26C0#B!m-3HyoFJ zuCk<|svX9xxyngLzRHD;9K?1@5Bbu=B*TZ?z9Xc1jIpxP zff?#2+bBtwt^VJ=QzeYR`LV85V|c(}l*@t%$l(39Q+qAt;E^;2kK`_bCbIzCAp|sd zaqMcJhrkCURFRP)1RedUz6HjbQl;nEwcl5p4V^NuXw-#(uelJ2fXZ+!GLg#3M;8K_ z&6}bjjdU(kN%O9WHCj`*=5oP-8#aJ6VKC+Nc#vVIe__t~d_;W5!o?3YVu&oO3;A%j zC>S3D%t?HBU>6sIYy-%q5x zi$PMi5AJ`XyOE*GE`Cv$!5$767ibxImJ~^lz!el^l8^yKWj04+Fo6u5kt?-z~xB zDT@f=oU#Y97X_nG;)sO`GO>7TPArR$%#hLB#t)=7=jpo=Cdx*N*R)iwF0DtE<>(ZW zcI^htwN1M_UcZ!P#t_n0v{wADg49vgT(04T9j70!j1h6kkG_pjq3W{WL`uQV)af6l^p_zaR;$INdkAwkw028UW1*Ab(&-tbj4e4RrNr=TcV>)pdK7bbhh!7<4)qTC=Qyz<3&$9U36{R zHfhLM`FwM!8Sl)R0*#8}h&5r`OTg7a#|+i|S!h`}rW@9ALrk;{q11*v8sat-zkzH5 z+7x1#{Po0dP5e4Ur^O<(u1yq2$U@@ ze%A{-eJ6C&gvo(_*K50*ZriPKw_d3ye(M`V$?SwqCt7h`e-#H>z0!qBvR&4MKH0*C zVjVl)nd?Nm8Ghxp8!rUTp@9KoPBNVnXwD!9M=kf$(Y zU=mc`9K>=ad(%vqf-Q6(AH-C_P`%fRL>24_FY-=0r+zc-e_qL;2t%!yO3@CQY5L!+ zw`yrfD0FVJ%y)U^+T{}wCh+{K8Jloz`8^T}c;I9y;nr-M#LNy;nx%x*C>-OKROV%F z9UtxTC8Os@Ew90iiqY*wEu(7EoZ7NELptpiY-8x1y@ZN+<8oBYD-k5Zfu+`j(i{>$S8lP<#h`SG$5OUCRbo@6s>;uN z_pgs$dFKMSC7rAAfax_trvnE7&x{IDSYx66h48|A{TTRPPj9+)kAGpEoIErm(D~I2 zh7zoZ8CWR>i%;4KWbb=KzkD4wUL58(lui4@h zc+ireSVBT57|bZj;8;=CYqz5sTEN5~qaE*|{8L@0>1Lefg|Fs#hm8(=uVvK*SLy=A z&2e3vGOxl}aE?^q`S>01PQ>p1;0xpYb5jf!yxf0+pF!q}*QFy$)*<$VWWP4Nu>!^2+!XX@}b1~a;00Q;Rn zuUiMm8#1H66R6Q_2}JOEFY485ZWM`G^EXHj_SL8dp05n%hT$F#@IChsX!nibFNa^9 z{T;;qt(p{Mc<7j8`1`Y8NVh=Oa;umV_$K&!lnDL3k_^N+iWekwVt~BH#2-bt#8{33 zPD3Fxdipg|0{$H#`G8R#%IVbWR94_x$1naBtOPl<7Lw?{Z$Yw@6#cFE#Ks=hZ93)G zRL^*cjA@c{9x4(N_98dj^8+4N&%X}8Ld3CfWU2XL8h!)!LhAXev!8U-1?*CfOvwYm=S=3EWPX5B6aCg-tK?B~h90B;7Su zAyj4@d2aQXC9aZr)D?12&KRnAWCA99>Na%DyFPE}J)ZjFcjUYx zN9a`ueRuYg+zdX0uyTxjyXDvEQt{GXCh8>!bwG>tODQntZq2qK-6StQjDBujei}hf8 z##udY|1W0glTTcW1^GPq>axT(uYO`f_^D;Zs!u3w5jG3!MoqYopA=gT$r|dZD z?MJoH+jlDsZXN_)Jy&Ess}KjDF2Y`=cWO4cX@ot)!lFQB+Q+AseLFeJ((VnsMYZu^a42#mJ5dq1$ac=%398FP5;;j!s3bSXOdqxHpNPp;9sS zGgK<4{0x2i*LM*9Z2ZB?4H*wFI(U_SP(8fov5SYA2!aK&LxtmAErD7WSMr>Y9lXOO z5Nx}?8U8-$UTGOd?2IT(I}uXE1mHxd6gv@8!~?1mp;5^II06cx=}`X_=$$s8iVD-6 zGSI6n>$&E2#z!ABp;m#eQi0=)Nu}onVM=PdyE9c&+eV^if~VR8+(}~iniftwNqlhM zb^#u;tm0w_cyeC@o-FV3s_lp7y~uRgea3ZMjM7YL3jIb9cBJX1u+&oRplbHOd<;r( zP=)tY&3c`ftQF#DHC@vl07R^n*e%L*dk~cRmgSLeL3j>XEN*HF_y_g?FlV~v8v%m} z{$gIiUnJIIv0~hdy{<=Y=u0tGPeIcoaxmv~yRH*De$AcoL1j;ZF9|Zt^$BL!0`Ot? zaB4bLfVS(@J-<1{L69bldx9Qsd%nnyf&@xYJdq_q1Auh#1WW*4BZF`~Y6Wc)$VEZN z4Se@Mx`$4u+ja}Jpp!Nn>+DaFU-<5OS6^3FUss-hQifDlQhlBMsSl~czNo`=8ATnY zgY|m+oA@tnyVlvCn!~WoQQQR=j})NBesikd^0+IpsO7_Uj8Q#o!)Gt#x_oLb*WI65 z$i;1=@H2~A>Ntl}v2lc-GEHbrkhzQF8+ObtYtmhde)^EOPl;t?P^!I) zCx?7~nGkluIs77Aty1z$_}K&_hbJc|<{iMG^kV3`yGtnbz7j$h^-YCu0GTbGXmAg& zVUlz9$AGPTjGo&^r+0*6*1(ox2IBS<2)R;603`1*u2&o7{uFY5s^uQ95tw-ss2nl# zzMi?PL&&_(xL&R0nS6}agSx#>m_y$#F8awj;wzZL$i_YFeZV^|@A}mx_*duxUdXDL za081?WHAhf4HsTeI|#s`pR}A$E$0isp$xa>yHDx!*WmNlw9ikLLj3**Y;BB?pB^h>27WCE$5TMIz$0sshXZP9+vz(V&ox|LYncY9 z#-hs2o82JfPP^a*yhAF!LJ&4@I$iIk)8nn1G?>_NC#bs>fY3w+>$toX)GNl*C!1Ra zYq?I{4Wr8OGU5*_st4wquK+>A3;}+e+JdDtBgQG)59));gUu(83lSp9y~e-IMK*fwhWJUyX$@%nB)mlGjo=i@ zdP-&Xd_dTk1`l4l{vK3S*?@^dQ#Rp4kYMb)IZ%+-D>;m`$_vea2c~gTNTy)x9MIPn zLKn2+rgfT$Yf9;+!bCTvb_PX7MF^$j5ooI9@dNRes_SXFlIWn2@~Dq$xhiBuB*;oT zMjr&>rIcY|$f8hDhH0I=qOWYh@%>cmjp@rz|EWX%i3P_sXXq26<;Z2lmI`Yn$f;Ag#IG?p>G|h^InRUpl?vuEtm2> z8JdAt?~(;pNH)Hk(c45ggO|8!kAh`8LK{`;#F5g2Bdz<&p63fM)>J;#_cVscO2aQo zdY-;P?u?B23*6dg`D9-UufQk!h%fchMZVNCOolXH>fsoF=;dN*n*4{Cig3i3+#$L? zpEOM4reWPEG4&}P zCGjwqtn#L+LYS*kZeU1JtO}aU({rfw(90k=8PuCDv_+|$8W2+~kwG%R-b!c|iAKpf z{X{N8Y$Qpo5_8G;yoe{rj$8M7om?lJDuZmOSeVUq2lyj}W}3T_cs$2rI5sN7i3%p8 zw#KDci)W%P@=_dg+hrwTHtHc0{FOBVk;sGSsH7XO{#n!=;0BcjO`Al+e9YQ9tK^~D zYjO77O+LK31Y7X>LvKIYCAQKq09_;4EfunAa2#ns-Gq#`4`{@}w z62WxMq$GiceMFP>hZbc??h_*1Ct$f~gMj;jky+fw*#s?}e9fpFOFC{QKKK(2{P|?y zPv81s;Qui2FE#M5e}sX5@Mk*k4?fPo@BfJg{(>^_7k(J{KMed!4gA4J82J4^(}Car zI0OH6_P_^=$SWWEjyCjfDMNq$GD9DS%xm*6asm)^bM2E8)6?bw2Ou8f=7AczcDm|$ zp!OFz542$(@br0L?<33uum4Qvf!7~r9(Xk(yebuOfX@8sRj{SZ(oLX< zT^+N@A*QkEYGJ?Uwd?tOeBX$c3_x?E7lpqAI5uFM-z6~j@!VBocy|7U9LGbZ3NnBA z8x)`Z8sOgVV#1Q|Bu2ji%vY~Xfeq^-GHhfAWN03&#u0L7dl_%r=DBr{@|;!CJ!`?V zpz|bWzRp!8YhFDE|E6j|I|5M5ej-t8%Z|_Kj+RqDp#?mb5Ki<__W}mB#GyMRXfVTPuHm%w?E;n_|blQs#P~`5C3ua z)$q4uy8%@2pWNiF+quvET*hBk@?WA^3z#ST;?hZ_g9n*#@}&QaCN955Gnsd2BJ)#abcp&d8n}Y-2`Vg!+Dal&SX@BDaJfQ}7{59BG%Q5T^sPlu z*PIHi0oZ5+*0Ek4ZJi>ICIV3fLX+Ux9H-Yh``ZC9OH!H7Oj7{+8=?w{8`9@Gz)3ZCCIsf{hJ31}c!9 zz;`Rgon9Dp-J8!m*Y_Rc6!${Zx_kESR>&TORrX5LO0Q~KX|Y?mYUbDV*Lez-FOJ6MjYv?OMn(5-VWMYt56B*-{xbtyVtYf}O(UdZ;*twJes- z>;N*;`>$|#d@vfh50S67cjL<()+ZCM(5^3v-d4A5J6yu*p?XO04zG4Yb@KqXI^KbL zDr+n?;-s_Q(PR@1x*mIl_99zw z)+pg2E_3`=VQzVl6$ytiK7Nw*xDiz~;m93TI8rWEsU0oFF`O2mJR0Gt7GZic!kRWK zmB-9GBjMU?HS)9(Ej!YK$2 zB<7?|&sEz32=2+}b$VV`tOy{u1;NWIc;x^tpy|}WRk+v`6KX8)GOumY)E3axwgpq$ zBqLBvrCXMsMJ(95V@a`6(p=Wa>mESl^T)EVAb2qHA_x6#+mGo*TH}ts=m|tVXI2oN z>Yt3fr3ne4$?+{(KLAf`wr$b~wDS4orR4&VQ&-Go5(m++WXt)yNnIM+=|Ghq9SAfu za2hX)ao4wPyS;=BDD#tZ{+r#lI_JZ!KIhYzWv`ZA#c5N+_*FdTzk)gcRiR_9swG;D zr~gfw{$EkQQKo+iNl*V=a&ihDPWo64B(Tck?te-<2Knv>}HQAYr5G~(+N!Xn*<1n zwNMFlfFn&5X(acgdy>)J0Ybm!At;I$>j*15#$_L$F2Vv8kqeQ4$UALlA3`h!ass~s zz_@}~)GPMsi27o}bC@md^Dd5>&u?BKe)sCjr(u9+OLG|@;LSf@5b&DTf)|0%`qWXri&m8X>z0qM31ECyO%+)u%SiWkWuRyQFpYcJ2Gk`BkHym zbz4U5W<-6aMSUitHt`Ev8oxu|9+>w9O9Xq7&%Y1{Vz|AR&)*|&M|it6LJYBfd7WjN zAYsxZ=cpUgyHI=%pngp!8Febj?F`uMC%1E8zn|PL5Q54(naqWApiq(RB5TyKg?f zGn%e(abM2oxAk<=_2PwHJD-0>DWNtOV@Hi}(V}W?0sR5o@4-EGa>b7ydThk5t^{t% zi!I7x3mFc8_v_BdiTN044qB?yKJuNnr3TFbt-+l%t$}&%$;rtKX`U1Uf{B+ri(J$^ z1zEzAlaskPtJs)dUk@?9$JQ)Xnjg`3U9hN;9_&rF9!xA`zO{G+daxsvumEmgv5PEr zBvoHWr0;^x7ZVm7X;~k|gatC(mhV0VLWt4wk6Asb+$-7T7AvN2Ep9-$H`H>&4Xmn> z#WrNQH)Of%Nx3()tT*Cv%W!+;{BmEoOw$+K&He(hH2c=#4t&9m`UP+U%Xeh49r*=2 z@(UWt7wl+R@5Emq!|l80f5Djj0G0cBcDcnKz_%8+q1@YQx#0%(36aINWx2OyxmCAX zelmCXG>?ZM6b?M%cc~9iS;MnNOGs-`sYPd}rukqTOe3L3w47eprO@^tfrPB-@~$vGoWHx!a7cuWLF z?7%#NQ|y7cK|ee6v(4l=s0+8x;@f5-o5bHeu>z?=Nm_oAkWKNsWx)ahQjf>FC%^Gl z)!mRaejxYzXjawB=Mj*UilYo9NI%kOJ5lQ?bxg&-P{19$YvY~MZUa$>=Qo0iN1lBs zMWr^%VbUYVL6IARM;GA~h~|V9P;OKjHZpCJ523ETTV+kGS>zsVE#5axr0BqECwh>5 zU_F&uzK)&snC&aUz>Ok(!u0$?GfnbAN3}~ar__Q@*K51sP53aRFN+Lz9FwG6NQJ_d zd%P8d-VugXzF2Xc&?RQlFHTt&4a>bdTgGX^h;oZHQ)DT+YY{GH(0tyMfM22DG{Koi zxDMx-1E&q6T_ZU0gPbRx<)(5D_+odW*SUHC{ApIjOhpDRexQ`&fTo6sNUD6zuvqKl zM2{S2i>_ZhznMe&F&BWy(Im?J*PkT@6{jbF4VI4UFs;(7cBEguJK}*E?A}8XUKAwQ5sHE}~rB@Bb zKO1lrr5}SYGFng+2W{X`O@vy^P?i|Q=^A)cQ=V8c4Y)#|1Rm8y=r{(YS@e&lF(?tI zCah43b2e~`CWF!2TD)i}j@cUMYAt>OTuilCikwK0BX(Q_{)iHAl}m>I|AGYaUk<-9 zSQ%*Shu<1(TIaJjPT3(lVAoln2_pqqzl+S>jikMdeT|DNz)JiHVp;a>1Jh#MzTMCI zY0$`?Y%PVl&X_$hqeIy0z}v1Tez4Xr$3(Rpvik`WRf&!4cgjreb*7oR&zWIzkCURW znq~3cW{#=*n)&hWtlo@ayb&tFzG*}UP1NJ}O#|$Aq@Ep!OCQbWN(;_RVJ`bVU@oNycM@i@()6sPCR6;VsVB_E_@D@C>uqixD?DRv2G3Z8JYz0HD>_n?s)|K7trAYD z8MB@%9Aj<@ZvK2!)o7zgc0wDP?a;iN*wCD#LL$_|`x!+L88iJ%d4An%2B_r_AwWt* zt|CZ7yZ{1m@>$4tXQ!*=?h@P{=(>>Z;ZzCjFH2IR(3Tp7*mh!aYYD+}wD<&g+@KH) z95KSVIRJ^buljPHCI8NP*bK^PAylQR{#pV{!Op#q&jFOg#6hT~Qi>8Ud z-Xf|l!M{S+3{h|eH_&_lZh&wQR^UbaDMA1jC0`xUS4TnsC&Oc-i_`Mlt(k?H;aA#Vj5d!UB0+Qo7MHon!a*GGls4YNGAQ z5$9ysT*j{1bP_q&@9pgY|8~5rhHk@P@dkaoS?ah#KKp<|{-039v!8;aorwz?Q=DGD zs4pf2!gutk{Cw0)YhIjSwrVMXo>{kxs{mLQ9 zw0*ch;=ed36hT1})D}Tr5>yjGP7>4;LG>i4A%eO|P*Vi8D5#^N%j8msJcGC9XQv4Z zc2b&~UYN=I$Q_9smm1fgA9D@5gxm|Igax>-7iY@lSx}CR=F}dalVB}uC#J?wrt+=1 z>2gL!wecARlu<0x>LKoMdj8fdlqw^y-uS#c%Bv^yYCvA4;{5cj;{42PR$Vp5XXa35 z4VhUJGn<|%m*#I_2I;(-Ves}iwV8S5m8DeXO--@IA4Fg;Uelz@5r<|VfD5%Y95soi`Z8f6; zmc)LalEm{|WPQ}*=BMLp)b-;UMM)UI3<`B8YO%I62znePU}z4=y67FA@6K0QKYH4W zS{1%KJ72w$>MYOBB^3$S*#>xV0?@PwK@82`QudZXCvC} z_)!27KE69wuEGX5p|=;o(-;gXJzHr3+K{roS8uvJ5{*zQR~fqNk@ux41J?tq7#Uh) zp~^t1=RXXZ&{DIvsw{N(gMiaU$Gp3o)=2Xfu!eAVJtRNyrn!>+QY{7fX+FykVJ@^hfM1% zHdDGaGhLiXV#wOIv9>LC&Cll-O1H`~26RLgj8rvyN%a8z5Wf3bl+V-hDbhuhZlv~Q z!bl`^Q#KLdm;n)9w0@mCAb2o##&M#I87Db5=^b{a%A&}tucEOD-<_MK9>3{w4!3i3 z`{)hb&R1FFa_;%fc!i%pm3=aflGEvStJwODDoRGe4l zxuoPamfT`aj$1JE}UW+;RGLoqh%pN8*M4IX%|vc*R3jp z9M{1qSH%mMQ?IYN2kXAbalTk(zT02Jx4;`9zU$Ywg5`FbLUHX9Q>IK+uClHh0+_o3 zOleR`c=Y7J4MVRE8O={unW8P;z%oJj%t!4xP-lraD~^!VqAei26LhQD>A8jZ;;oX> zv*N0Ox79jf^pVZtt3()qB_cT$S~@ zpaj3`g`K_=V#`xDD`C)&+;Ge5U|?#AoxfFOHSl2AUT!;K2MSfJvI94ayugn{H-k7q z=sqG%J|vqiR$1WR_1f+xO6c8s1-axhS6^w?)(V2i^PA5ob9y2d*Nu4K1=)+Mo*0x@ zmsvfdxc5f-;eJ-iTFp@Dz0@l4gcipbozSTJCRt>4-;$DpTC-?J1A}CKdVZ#~P@YMm zsnu;`b<;|VAk0WvX~XPlO)s~xJVLi596fakm~#@m4%!qX3-juR8;fAeBK)zYjBtEyt%n)4B}9&+s(xgFPHlrV4L;vpC|5NU z0MeVpNC32T*3kfHLmNW~kZks2Hcbq4DbJNlGc!q)^vBxxvB|zPj+ow;E=(^h%oUYJ zRzBax&xb{0ety2JEgkeG8*9X3nz%=-Pe~=&SVA6AY==E(FWEEp zg56`Evdsqr12&pVvRb`!2c0yaty-4wIO z^Z6ddRJb}~M?*DTyP){%_MHPmunrN22;#5dl2^^ zRyX#gy0M>9H~t$!-@Zy%W&!**z7=`zhoD^p|Hp zHiX^hqd12xnZs5phfHZ55NSdBCvo~aGX0%2kM8g-@>6^>{C@cRv!6rS$C&nMoOVs7 zT}yvE`Y8MH@ZIotn8(+{ufPf%nV#a*>oWCvD)s*yel`5v@Vm30gNZjb6E*q~-mJtK zY~cM}xbHX!_}qyb=y}pLo?+s982MB3_Z}b(Hv3c~=%{-KlA;5BO6$&|b2S05RSjbg z4(+DogWOujNzMm-M@qTq|%+(~OP-wnBh=0ix;8fcnu2=(bvJ~qkBz;a#70##gsr5y1N;NC=Ulf9 zj??+nbmB^$%>L45(4q}QPJ!c@4>Ql7?&uAT2AhYm(x>%H5S2%@t z$5m789bV=&Tg)={7Auj?O6jLavE?chdtOi2E|J&T<7SO{N(Kq%WykD+U-)_fM~Yj= zdce>IJ?zp?lYUxcCw%}v2VgD@cLVy_gP%Qe_}(Ii?=AKSejWiu8{9phpC|D1gx#UL z$Mo|Qex8B_GThy#pJn)2X6tnK2B%%PlAqFINA$BoU$j9#cj4zQ+ku}Q_S|B)-WNLN zbEOjQ(a)zA`wR}HoCAK11AuKKWJc&l-VveI%7|dAYY4X4j4-t1<~)J5p(}v7>XO5k z=Hv+&RGyrbtcvMydx!9w(&!N%FxlLeRe{!zjo{#EYy#)-l({4NK<)9R9*?~S^tg?C zI3_kIqKC9Cs{$Ry>~XTx>``8FvxPE-x%pCYVPQ@?-M0gfPfxn1vsg`@-&rh6(EFLi z8XVAKa@z+`v92hT+ySyKr_h=ixBijjtMlxai*i%<(zb1Hi5gngfULR}-}O`jLcG^4 z2*sX|JzIJfCm-1-K8uYApFvAKOL`R8n|^k3A_X%q;Ilq>;z1a*GLgx%$7gi*a7YVY z86<^ zrAiToZlUK>dR1B35CsHaDi~w>InU3z76+qpfMLfFbj6Eub`pbZ&Wvle?W0Aa$id3U zq8W@DuC8)nxO!_|7_Nd{6UZeBEhlQ3f-hLO)i^$7HG8hedUlP~p;t6ucJ0Dd)2;`# z9`w9IYzEZ|B93-zEr?*55X4oz&-|Tbmdx!(bh>^iA@pQ!S)4yY1;!=b@u>% zV5d@nUVR;k)Q9W_@b5MJ+p~?F!Ct|WRrvQ1{%yj)NAPb8&X`;F?lF|CVoXgL%&Uvv zZl%fk5g4Lit->p+Xf68yGJXR89z$}d6F87BL&!S(djnY?;k3h6=x2j|?!p)E*vE;Y z`C3WSL&p^$?-Z3I-l~#!xR=^C@S5Y-))GAsRgk!oQ4~o&B*qVucR;wB6lz3{cdZl) z+@P|b!-sCe=e)Fw>=}IV3+=#u4~%Tg=@MJBBl1wh13^&@Q!zfdVH+n#$})D>s~Th{ zmV=(|G~J2;n}q>P-n1`;GrzqC_7n^300pPen-1VHJz6p!aiDMlBeV_*nJXq;(>C}7 zhRB-5J_U}m1ju1p$FXMMWj?>j&6jM=I$h=HkEs@V`!0|IXtvTBW$y$%pX_aEO8E@V zt!TV%!XOE6-zpX@_JHG|9ycUFr3(L4>s(sEwhE0PyyMhbCYo=14U-GY(tQ5;E-&=K zmr=>KZE;fwU8g?Scl^>HSLF^Y#J*MTu^V(3;iX}cXzhH54K}Xz=L>s79`KXlwLr#DsXIu z3!Cr|vH*w{@HShD7Soqu!s zg@p+>Ao2JY^EX!0y{c?_p0k8Gf-&B_+GwyOVJu;MO=&S-T3SN~7d7Ugg1UHowRzIc?iyNs?`ASgfOT!V~hH$5l z)k>nDJ;d0@FM}mZM*yM9_*6uI;x}T{jjBoUJWt$m&e&0gGb`+tw-jp_^G;!sDeLre z@@$9QD$Cngc3=hVU``-0wRS{rE9{S8%S>TA*mY62*KdG^XvgjOK{q;vh3?tCaoDpf zPH>@+1(63VP052j2!3qNYixY1`b^EN7*idk6EjUZ{*5cBu=2`l7{=?~O z(z9BVFxY!eren^T6Wy{`Wh^7?BdFCj6%rEa&+>ySNJo9HwMDyYgjuFV6%ci(-yuEG&1hD6=+yQCLaw9nnHAb@w3^BTV3gZiiH@trasE~ zCvKkeM&m(fg$F)R(8OW5Jo7!#s3#Hn?ks?i8+^+^Na-?~&{D3ZZbI2ToD3G}=3Rc@ z=tkck6ZG^+?|?{*^E)87N?Y3~`>Gv}h)`!-ddU8Ur;HMp&qqP6W>WaP^Kd(J94x9=%`m|vsNz>-BAK)L4+e#$s*erXIvU5 zcwbiGO^=si+legdT%Cbt0NJxv%C_`FNFRVKcAlcIb!?#LV8DlCvA_ZfViARw8k}Nm z5^ygyhE76dap?ZgDU6<8N{@cqdg;wv*L}%d*Odt`P5?6XyON7eIJ8tyI}ymp7qRn_ zG5yWtM%>OEee2XqYu5u~>x|cP+ee z|K~a|=x#q8h=g17uTDRke|P$4{M{RR6^U*f2IsNxocP)1d1F=*p27ZNb5>NG!aAH~ zr!py9Kueb@TZm234GeAz9t{2n9y68(o=pCtR&z!q2tfzbj=EsEo6)Qv%|etRnOr~# zu7Z=nCjLH!dghqMiVvV)kpeRNo!MhGloIFQ4>7hJC@di-4w)hO6Q(0}NiVCc+pD02 zSUnOEu1!0qsId>DF-Yqbstj2jyQ>u8Zn;9K0JY1zn{F@YpxUaz$KIyfI}%ZzG8CeA zEi=-zVSAGA3zP(r#Vu`UY5{7kAe2@l`ocdFgM!AwIH~?Ou=yWImWXjItSTUcc8{V+#B9 zEfOfaIzVn33ZRP6?S(2Z)B}T(vUu|+@d^TDGVeCyhatqzRhr30%8xCf$X3D1?J5lr zlvNS$cfoZ9f?XAQJ2ZML%Py4RXA9`9d(fTWr%O;`sSEDd+XY@1I2Vy>52d%U6u{M+ zqnf67fpOw&^V>{+)Pke$hX*}Bz`^INJ=v^Xyv-blxF6jV^q=lCvAChD=tdJl^T7ok z8R|ZKw)8a^TC0sJl#Z4#_kYK;>2>ULJ}Vn0gXsP=(1A>rPcC<>i1j4OJ3C zKOB!q7ix6@L2-JpEj57g*7C|mBa_}LBpH-8;|gh0C`|-O9o{6wb|iAP4DpASKgJ`Y zVk^4kM2PzcmSNZ_%PtXbW9-aAb!bSlu_?_a6;yWjE?^;ZGR_EXOVnx=P4T;sm=7V$ zoCRctzSX!8hs~#n2c*e$gK+BP@3a*Dw}iCN-3UC!SDWH8&gD}K4Ak$A<%zCFnP`tp zW{OA43rSqu(w@|UiS8X%{~yBW;0`Er0nP?7`K8;POz`%N$j_c6xhOZT_CxFRb=hcj z-R2Kr+ov~nCgFRoVm&U;piQz$a_4hC%ZF&i(5h0?q+G8Lwr{V@-_E~Q8Q^}%eCl7H zem?)t{F~Fiz$?0o%Uct_wKGbEl*h>h(*(?3K(s1;mG9{L`FA)$S%B8WGzDifHD~fL zJnoK9?0Vsdm;yO9E@z54(MRTOl?u2!!h5I};S@MN1%J;U24TMpf5g%zp&xYv(T`8; z`ZIM+{h?_;(u3gw4UoA2{QElke$^s1r3j0fAvzeB8&_{Rd3hXM;)|LoX=~Ukc2@ODS_Boo1*jMOGY@mS9l8?=0aXv>%A!W)JlR z=ow!Cbesd^4;{GjJqFa{x|@+Es012Xpq@8Gy6*+}kB7v-cme(Ap(3ICE_~g?NDTc~ zb$ivW@4Nm03xVqoxE=Uouo{VLHA()T5EvO1OCbK~=moW!-RnlsFm&OTkIksfRcZtS zrdS99cAK{ws8W;b(po3Sljx>-P9mz` z#|K@A5lh}ab{Hv3*yD*vyo{!4SiC|8YFNIC zW@=cxj&^FAr^3c)Q>HFsRI3|k$ab+jcElJeAmDC)smYI6Ym_r^9BJmMK!hgUs4oWA zaNOOCEz~uF=x||opD;}P1*+V%i)T`+jq`qp>&6)PetJ%} zq~9NjXuBJaOgp4~$&tZ>AiakxD_{pdsMQ{WeKK*$*U$!$ks%|t^7<$oT;ZYT9IiML zo`3H&8;z9)TXh;MlGPiGAKvsD5H~ER(%WHq9%IMkF9K5!H$pXJ> z(-pLeff$=;7y|{i?rc#JDGu5xY^n+{cteeDim6SR2459y_CZ;D`~hl@ACU3HM=*UE z7rg@2#qF?dZij8y4%!k&N!XCx1*~uY7?4qI=YkT!gM1Ghx-S`!8QN*yya60}`aN6f zd&t^D*}s{_Z)hE-EZ^2AD!%t|V2+ZByvykF{{-H5(1c z+M~>Y!Je@J29U1ne#|i^frLZ^9~X}v>7!9F{G)>hN;g#n9y^Au)d#7q6`Tau_+#&( z8l>?>4@ga)>9Q;AoXDJ#JQ%D&6ix==GywBTR13g~y|lChc29UgjTHZnV6=!LxbAeL{Of9iMzUjM}wCv!LZWa@QD}Q1p7=QbFIOv#r*=Sb`M?-K#8PU zP~Z#LjRGp*a8buhBb`M$ahlnQW8@P;93#NIzFNa4LGJ`*finQFRRM0Famdqnt@ucc zr9jojFQ6ycKuUYKoCbs8nQVmVuh5jd>L?RLAcfFRgKsJnTw0C7C=w?#`%+!jFWKvj zp_we$Kp)N0{~_A8L~;y>fJp= zw{5VFKj1x;PGXD>+#~*s@ALQhrgGzMr%v0C`9tNjeTR1?pUB)@_n!1*!e2;!AbC&n zSCSt|zAX7O$?r@4K=O|ye<=AK$?r*iTk^K#FD3s}nqn^`{fN9r5qX>LKxP1zm<^tK zcQLFyE}|R!X=ag#Ng&{O$%)Y(G}hidWYVmfqK&h{zPFK*e0+C+?;wSRF5JttPNyx0 zfRQH^!^HAd0MF>f75+^1eNThEqYFJ22Ve&W(6XBX009OP~dA^iBfWB1!@9bK?K+g?t=B{Qq3?i}Vk&U^p|`jewI+JuyHR z#FgJZvHjC98V|rHKXF*=oz>OfS#fw6^~L?}1W5PeN1I;nFc^&C_5!rl@B9~B4{E+a G!vX-&ow2(B diff --git a/myProfile.json b/myProfile.json index 9a32b8bc..9df5a735 100644 --- a/myProfile.json +++ b/myProfile.json @@ -170,6 +170,14 @@ "path": "src/modules/virtual/Loging", "active": true }, + { + "path": "src/modules/virtual/Loging2", + "active": false + }, + { + "path": "src/modules/virtual/Loging3", + "active": false + }, { "path": "src/modules/virtual/LogingDaily", "active": true @@ -428,7 +436,7 @@ }, { "path": "src/modules/exec/Buzzer", - "active": true + "active": false }, { "path": "src/modules/exec/EctoControlAdapter", @@ -506,6 +514,10 @@ "path": "src/modules/exec/SysExt", "active": false }, + { + "path": "src/modules/exec/Tca9555", + "active": false + }, { "path": "src/modules/exec/Telegram", "active": false diff --git a/src/StandWebServer.cpp b/src/StandWebServer.cpp index 6ac28403..4ff4c90c 100644 --- a/src/StandWebServer.cpp +++ b/src/StandWebServer.cpp @@ -198,12 +198,19 @@ void handleCors() { { typeOTAfile = FILESYSTEM; } - int updatePartition = (typeOTAfile == FIRMWARE)? U_FLASH : U_SPIFFS; + #ifdef ESP8266 + size_t size = upload.totalSize; + int updatePartition = (typeOTAfile == FIRMWARE)? U_FLASH : U_FS; //U_FS + //#endif + #else //ESP32 + size_t size = UPDATE_SIZE_UNKNOWN; + int updatePartition = (typeOTAfile == FIRMWARE)? U_FLASH : U_SPIFFS; //U_FS + #endif if (upload.status == UPLOAD_FILE_START) { //Serial.print("Начало загрузки: "); //Serial.println(upload.filename); SerialPrint("i", F("OTA"), "Начало загрузки файла: " + upload.filename); - if (!Update.begin(UPDATE_SIZE_UNKNOWN, updatePartition)) { + if (!Update.begin(size, updatePartition)) { // UPDATE_SIZE_UNKNOWN 0xFFFFFFFF Update.end(); SerialPrint("E", F("OTA"), "Ошибка: Недостаточно памяти"); HTTP.send(500, "text/plain", "Ошибка: Недостаточно памяти"); diff --git a/src/WsServer.cpp b/src/WsServer.cpp index 2adb1f5d..9acba04f 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -254,10 +254,18 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) // Устанавливаем время if (settimeofday(&tv, NULL) == 0) { //Serial.printf("Время установлено: %ld\n", unixTime); - SerialPrint("i", F("Time"), "Время установлено из браузера: " + String(unixTime)); + #ifdef LIBRETINY + SerialPrint("i", F("Time"), "Время установлено из браузера: "); + #else + SerialPrint("i", F("Time"), "Время установлено из браузера: " + String(unixTime)); + #endif } else { + #ifdef LIBRETINY //Serial.printf("Ошибка установки времени: %ld\n", unixTime); + SerialPrint("i", F("=>WS"), "Ошибка установки времени: "); + #else SerialPrint("i", F("=>WS"), "Ошибка установки времени: " + String(unixTime)); + #endif } // timeval tv2{0, 0}; // timezone tz = timezone{0, 0}; diff --git a/src/modules/virtual/LogingHourly/LogingHourly.cpp b/src/modules/virtual/LogingHourly/LogingHourly.cpp index 4d4ed935..74ff9c74 100644 --- a/src/modules/virtual/LogingHourly/LogingHourly.cpp +++ b/src/modules/virtual/LogingHourly/LogingHourly.cpp @@ -160,7 +160,11 @@ class LogingHourly : public IoTItem SerialPrint("E", F("LogingHourly"), "'" + id + "' db file writing error, return"); return; } + #ifdef LIBRETINY + SerialPrint("i", F("LogingHourly"), "'" + id + "' file created http://" + ipToString(WiFi.localIP()) + path); + #else SerialPrint("i", F("LogingHourly"), "'" + id + "' file created http://" + WiFi.localIP().toString() + path); + #endif } void addNewDataToExistingFile(String &path, String &logData) @@ -171,7 +175,11 @@ class LogingHourly : public IoTItem SerialPrint("i", F("LogingHourly"), "'" + id + "' file writing error, return"); return; }; + #ifdef LIBRETINY + SerialPrint("i", F("LogingHourly"), "'" + id + "' LogingHourly in file http://" + ipToString(WiFi.localIP()) + path); + #else SerialPrint("i", F("LogingHourly"), "'" + id + "' LogingHourly in file http://" + WiFi.localIP().toString() + path); + #endif } const String getTimeLocal_hh() { From 7b9da809f5d2017fac186e60eb96d83a45bd2663 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Thu, 24 Jul 2025 23:26:28 +0300 Subject: [PATCH 108/118] add Board esp32_wifirep --- data_full/index.html | 2 +- data_svelte/index.html | 2 +- include/Const.h | 5 +- include/utils/WiFiUtils.h | 3 + myProfile.json | 16 ++++- platformio.ini | 65 +++++++++++++++++++++ src/classes/IoTScenario.cpp | 15 ++++- src/utils/WiFiUtils.cpp | 113 +++++++++++++++++++++++++++++++++++- 8 files changed, 211 insertions(+), 10 deletions(-) diff --git a/data_full/index.html b/data_full/index.html index 407b5bd5..fe91a206 100644 --- a/data_full/index.html +++ b/data_full/index.html @@ -4,7 +4,7 @@ - IoT Manager 4.6.0 + IoT Manager 4.6.2 diff --git a/data_svelte/index.html b/data_svelte/index.html index 407b5bd5..fe91a206 100644 --- a/data_svelte/index.html +++ b/data_svelte/index.html @@ -4,7 +4,7 @@ - IoT Manager 4.6.0 + IoT Manager 4.6.2 diff --git a/include/Const.h b/include/Const.h index 410b89e6..a948a78b 100644 --- a/include/Const.h +++ b/include/Const.h @@ -69,6 +69,9 @@ #define FIRMWARE_NAME "esp32c6_8mb" #endif +#ifdef esp32_wifirep +#define FIRMWARE_NAME "esp32_wifirep" +#endif // Размер буфера json #define JSON_BUFFER_SIZE 4096 // держим 2 кб не меняем @@ -109,7 +112,7 @@ WEB_SOCKETS_FRAME_SIZE создан для того что бы не загру //#define WIFI_ASYNC #endif -#ifdef ESP32 +#if defined(ESP32) && !defined(esp32_wifirep) #define WIFI_ASYNC #endif diff --git a/include/utils/WiFiUtils.h b/include/utils/WiFiUtils.h index 90934b90..9e60a2cb 100644 --- a/include/utils/WiFiUtils.h +++ b/include/utils/WiFiUtils.h @@ -2,6 +2,9 @@ #include "Global.h" #include "MqttClient.h" + +void addPortMap(String TCP_UDP, String maddr, u16_t mport, String daddr, u16_t dport); + boolean isNetworkActive(); uint8_t getNumAPClients(); bool startAPMode(); diff --git a/myProfile.json b/myProfile.json index 9df5a735..fd7485a8 100644 --- a/myProfile.json +++ b/myProfile.json @@ -3,6 +3,12 @@ "name": "IoTmanagerVer4", "apssid": "IoTmanager", "appass": "", + "wifirep_apchanel": 7, + "wifirep_apip": "192.168.4.1", + "wifirep_staip": "192.168.1.160", + "wifirep_netmask": "255.255.255.0", + "wifirep_gateway": "192.168.4.1", + "wifirep_dns": "192.168.4.1", "routerssid": "iot", "routerpass": "hostel3333", "timezone": 2, @@ -27,7 +33,7 @@ "projectProp": { "platformio": { "default_envs": "esp32_4mb3f", - "comments_default_envs": "choose from: esp8266_4mb, esp32_4mb, esp32_4mb3f, esp8266_16mb, esp32_16mb, esp32cam_4mb, esp32s2_4mb, esp32s3_16mb, esp32c3m_4mb, esp8266_1mb, esp8266_1mb_ota, esp8266_2mb, esp8266_2mb_ota, esp8285_1mb, esp8285_1mb_ota, esp32c6_4mb, esp32c6_8mb, bk7231n", + "comments_default_envs": "choose from: esp8266_4mb, esp32_4mb, esp32_4mb3f, esp8266_16mb, esp32_16mb, esp32cam_4mb, esp32s2_4mb, esp32s3_16mb, esp32c3m_4mb, esp8266_1mb, esp8266_1mb_ota, esp8266_2mb, esp8266_2mb_ota, esp8285_1mb, esp8285_1mb_ota, esp32c6_4mb, esp32c6_8mb, bk7231n, esp32_wifirep", "envs": [ { "name": "esp8266_4mb", @@ -55,6 +61,14 @@ "partitions": "0x8000", "littlefs": "0x310000" }, + { + "name": "esp32_wifirep", + "boot_app0": "0xe000", + "bootloader_qio_80m": "0x1000", + "firmware": "0x10000", + "partitions": "0x8000", + "littlefs": "0x310000" + }, { "name": "esp32cam_4mb", "boot_app0": "0xe000", diff --git a/platformio.ini b/platformio.ini index 5b6945af..07ff82ef 100644 --- a/platformio.ini +++ b/platformio.ini @@ -375,6 +375,30 @@ build_src_filter = + ${env:esp32_16mb_fromitems.build_src_filter} +[env:esp32_wifirep] +lib_deps = + ${common_env_data.lib_deps_external} + ${env:esp32_wifirep_fromitems.lib_deps} +lib_ignore = LT_WebSockets +build_flags = + -Desp32_wifirep="esp32_wifirep" + -Wl,--wrap=esp_panic_handler +framework = arduino +board = esp32dev +platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.5.3/platform-espressif32-2.0.5.3.zip +monitor_filters = esp32_exception_decoder +upload_speed = 921600 +monitor_speed = 115200 +debug_tool = esp-prog +board_build.partitions = tools/partitions_custom.csv +board_build.filesystem = littlefs +build_src_filter = + +<*.cpp> + + + + + + + ${env:esp32_wifirep_fromitems.build_src_filter} + [env:esp32c6_4mb] extra_scripts = pre:tools/patch32c6.py lib_deps = @@ -894,6 +918,47 @@ build_src_filter = + + +[env:esp32_wifirep_fromitems] +lib_deps = + https://github.com/enjoyneering/AHTxx.git + adafruit/Adafruit BME280 Library + adafruit/Adafruit BMP280 Library + beegee-tokyo/DHT sensor library for ESPx + https://github.com/milesburton/Arduino-Temperature-Control-Library + plerup/EspSoftwareSerial + gyverlibs/EncButton @ ^2.0 +build_src_filter = + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [env:esp32c6_4mb_fromitems] lib_deps = https://github.com/enjoyneering/AHTxx.git diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 754d12c5..e1d8543e 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -2,6 +2,7 @@ #include "classes/IoTItem.h" #include "classes/IoTScenario.h" #include "utils/FileUtils.h" +#include "utils/WiFiUtils.h" #include "NTP.h" @@ -343,7 +344,8 @@ enum SysOp { sysop_mqttPub, sysop_getUptime, sysop_mqttIsConnect, - sysop_wifiIsConnect + sysop_wifiIsConnect, + sysop_addPortMap }; IoTValue sysExecute(SysOp command, std::vector ¶m) { @@ -449,7 +451,12 @@ IoTValue sysExecute(SysOp command, std::vector ¶m) { break; case sysop_wifiIsConnect: value.valD = isNetworkActive(); - break; + break; + case sysop_addPortMap: + if (param.size() == 5) { + addPortMap(param[0].valS, param[1].valS, param[2].valD, param[3].valS, param[4].valD); + } + break; } return value; @@ -507,7 +514,9 @@ class SysCallExprAST : public ExprAST { else if (Callee == F("mqttIsConnect")) operation = sysop_mqttIsConnect; else if (Callee == F("wifiIsConnect")) - operation = sysop_wifiIsConnect; + operation = sysop_wifiIsConnect; + else if (Callee == F("addPortMap")) + operation = sysop_addPortMap; else operation = sysop_notfound; } diff --git a/src/utils/WiFiUtils.cpp b/src/utils/WiFiUtils.cpp index 25cb5547..0bda37e0 100644 --- a/src/utils/WiFiUtils.cpp +++ b/src/utils/WiFiUtils.cpp @@ -7,6 +7,39 @@ #define TRIESONE 20 // количество секунд ожидания подключения к одной сети из несколких #define TRIES 30 // количество секунд ожидания подключения сети если она одна +#if defined(esp32_wifirep) +#include "lwip/lwip_napt.h" +// #include "lwip/ip_route.h" +#define PROTO_TCP 6 +#define PROTO_UDP 17 + +IPAddress stringToIp(String strIp) +{ + IPAddress ip; + ip.fromString(strIp); + return ip; +} +#endif +void addPortMap(String TCP_UDP, String maddr, u16_t mport, String daddr, u16_t dport) +{ +#if defined(esp32_wifirep) + uint8_t tcp_udp; + if (TCP_UDP == "TCP") + tcp_udp = PROTO_TCP; + else if (TCP_UDP == "UDP") + tcp_udp = PROTO_UDP; + else + SerialPrint("E", "WIFI", "Add port map: ERROR, Must be 'TCP' or 'UDP'"); + + ip_portmap_add(tcp_udp, stringToIp(maddr), mport, stringToIp(daddr), dport); + SerialPrint("i", "WIFI", "Add port map: " + String(tcp_udp) + ", " + maddr + ":" + String(mport) + " -> " + daddr + ":" + String(dport)); +#else + SerialPrint("E", "WIFI", "Add port map: ERROR, change board to esp32_wifirep"); +#endif +} + + + #ifdef WIFI_ASYNC std::vector _ssidList; std::vector _passwordList; @@ -286,10 +319,65 @@ void ScanAsync() WiFi.scanNetworks(true, false); } } -#else -// ESP8266 +#else //WIFI_ASYNC + void routerConnect() { +#if defined(esp32_wifirep) +// Set custom dns server address for dhcp server +#define MY_DNS_IP_ADDR 0xC0A80401 // 192.168.4.1 // 0x08080808 // 8.8.8.8 + ip_addr_t dnsserver; + + String _ssidAP = jsonReadStr(settingsFlashJson, "apssid"); + String _passwordAP = jsonReadStr(settingsFlashJson, "appass"); + int _chanelAP = 0; + jsonRead(settingsFlashJson, "wifirep_apchanel", _chanelAP); + if (_chanelAP == 0) + _chanelAP = 7; + + // WiFi.begin(ssid, password); + WiFi.mode(WIFI_AP_STA); + + String s_apip = ""; + bool ap_ip = jsonRead(settingsFlashJson, "wifirep_apip", s_apip); + if (ap_ip && s_apip != "") + { + WiFi.softAPConfig(stringToIp(s_apip), stringToIp(s_apip), stringToIp("255.255.255.0")); + // bool softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dhcp_lease_start = (uint32_t) 0); + dnsserver.u_addr.ip4.addr = stringToIp(s_apip); + } + else + dnsserver.u_addr.ip4.addr = htonl(MY_DNS_IP_ADDR); + + dnsserver.type = IPADDR_TYPE_V4; + dhcps_dns_setserver(&dnsserver); + + WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str(), _chanelAP, 0, 5); + jsonWriteStr(settingsFlashJson, "ip", WiFi.softAPIP().toString()); + SerialPrint("i", "WIFI", "AP SSID: " + WiFi.softAPSSID()); + SerialPrint("i", "WIFI", "AP IP: " + WiFi.softAPIP().toString()); + SerialPrint("i", "WIFI", "AP pass: " + _passwordAP); + + String s_staip = ""; + bool static_ip = jsonRead(settingsFlashJson, "wifirep_staip", s_staip); + String s_gateway = jsonReadStr(settingsFlashJson, "wifirep_gateway"); + String s_netmask = jsonReadStr(settingsFlashJson, "wifirep_netmask"); + String s_dns = jsonReadStr(settingsFlashJson, "wifirep_dns"); + + if (static_ip == true && s_staip != "") + { + SerialPrint("i", "WIFI", "Use static IP"); + WiFi.config(stringToIp(s_staip), stringToIp(s_gateway), stringToIp(s_netmask), stringToIp(s_dns)); + // bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000); + SerialPrint("i", "WIFI", "Static IP: " + s_staip); + SerialPrint("i", "WIFI", "Gateway: " + s_gateway); + SerialPrint("i", "WIFI", "Netmask: " + s_netmask); + SerialPrint("i", "WIFI", "DNS: " + s_dns); + } +#else + WiFi.mode(WIFI_STA); +#endif + #if !defined LIBRETINY #if defined(esp32c6_4mb) || defined(esp32c6_8mb) WiFi.setAutoReconnect(false); @@ -309,7 +397,7 @@ void routerConnect() SerialPrint("i", "WIFI", "Gateway: " + s_gateway); SerialPrint("i", "WIFI", "Netmask: " + s_netmask); SerialPrint("i", "WIFI", "DNS: " + s_dns); */ - WiFi.mode(WIFI_STA); + //WiFi.mode(WIFI_STA); byte triesOne = TRIESONE; std::vector _ssidList; @@ -396,6 +484,25 @@ void routerConnect() jsonWriteStr(settingsFlashJson, "ip", WiFi.localIP().toString()); #endif createItemFromNet("onWifi", "1", 1); + +#if defined(esp32_wifirep) + // Enable DNS (offer) for dhcp server + dhcps_offer_t dhcps_dns_value = OFFER_DNS; + dhcps_set_option_info(6, &dhcps_dns_value, sizeof(dhcps_dns_value)); + u32_t napt_netif_ip; + if (ap_ip && s_apip != "") + napt_netif_ip = stringToIp(s_apip); + else + { + napt_netif_ip = 0xC0A80401; // Set to ip address of softAP netif (Default is 192.168.4.1) + napt_netif_ip = htonl(napt_netif_ip); + } + // get_esp_interface_netif(ESP_IF_WIFI_AP) + ip_napt_enable(napt_netif_ip, 1); + // ip_napt_enable_no(ESP_IF_WIFI_AP, 1); + +#endif + mqttInit(); } SerialPrint("i", F("WIFI"), F("Network Init")); From 2002a6b45fc79c2e9200737a8a0858f87c52aa44 Mon Sep 17 00:00:00 2001 From: Ilya Date: Mon, 28 Jul 2025 19:18:19 +0300 Subject: [PATCH 109/118] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D1=8F?= =?UTF-8?q?=D0=BB=D0=B5=D0=BC=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D1=83=20=D0=B2=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B5=20?= =?UTF-8?q?\\=20=D0=B2=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTScenario.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index d920c77b..7b7ad05a 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -744,6 +744,8 @@ int IoTScenario::gettok() { IdentifierStr += '"'; } else if (LastChar == 'n') { IdentifierStr += '\n'; + } else if (LastChar == '\\') { + IdentifierStr += '\\'; } } else { IdentifierStr += (char)LastChar; From f1ecf3d1919227fbf365415ada5abbd157c59bad Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 14 Aug 2025 14:20:15 +0300 Subject: [PATCH 110/118] =?UTF-8?q?=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8E=20=D0=B1?= =?UTF-8?q?=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=B8=20Dallas?= =?UTF-8?q?Temperature?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/Ds18b20/modinfo.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/sensors/Ds18b20/modinfo.json b/src/modules/sensors/Ds18b20/modinfo.json index 39639737..77176e4e 100644 --- a/src/modules/sensors/Ds18b20/modinfo.json +++ b/src/modules/sensors/Ds18b20/modinfo.json @@ -40,7 +40,7 @@ "defActive": true, "usedLibs": { "esp32*": [ - "https://github.com/milesburton/Arduino-Temperature-Control-Library" + "milesburton/DallasTemperature @ ^4.0.4" ], "esp32c6_4mb": [ "https://github.com/pstolarz/Arduino-Temperature-Control-Library.git#OneWireNg" @@ -49,7 +49,7 @@ "https://github.com/pstolarz/Arduino-Temperature-Control-Library.git#OneWireNg" ], "esp82*": [ - "https://github.com/milesburton/Arduino-Temperature-Control-Library" + "milesburton/DallasTemperature @ ^4.0.4" ] } } \ No newline at end of file From f46e75786a6db4b0154b79d3858c208bdf67d2a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <83164375+DmitriyTychina@users.noreply.github.com> Date: Fri, 19 Sep 2025 18:19:40 +0300 Subject: [PATCH 111/118] =?UTF-8?q?=D0=B2=20modinfo=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D1=83=D0=BB=D0=B5=D0=B9=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20moduleDefines=20=D0=B4=D0=BB=D1=8F=20=D1=83?= =?UTF-8?q?=D1=81=D0=BB=D0=BE=D0=B2=D0=BD=D0=BE=D0=B9=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrepareProject.py | 8 +++++++- include/Global.h | 2 ++ include/classes/IoTItem.h | 5 +++-- platformio.ini | 7 +++++-- src/ESPConfiguration.cpp | 5 ++++- src/Global.cpp | 2 ++ src/NTP.cpp | 6 +++++- src/classes/IoTItem.cpp | 5 +++++ src/modules/sensors/RTC/modinfo.json | 1 + 9 files changed, 34 insertions(+), 7 deletions(-) diff --git a/PrepareProject.py b/PrepareProject.py index 2f8c1241..2451cc0c 100644 --- a/PrepareProject.py +++ b/PrepareProject.py @@ -182,7 +182,8 @@ def updateModulesInProfile(profJson): # параллельно собираем необходимые активным модулям библиотеки для включения в компиляцию для текущего типа устройства (esp8266_4m, esp32_4mb, esp8266_1m, esp8266_1m_ota) activeModulesName = [] # список имен активных модулей allLibs = "" # подборка всех библиотек необходимых модулям для дальнейшей записи в конфигурацию platformio -itemsCount = 1; +allDefs = "" # для каждого модуля создаем глобальный define "-D" + moduleJson['about']['moduleType'] +itemsCount = 1 includeDirs = "" # подборка путей ко всем модулям для дальнейшей записи в конфигурацию platformio itemsJson = json.loads('[{"name": "Выберите элемент", "num": 0}]') for section, modules in profJson['modules'].items(): @@ -191,6 +192,8 @@ def updateModulesInProfile(profJson): if module['active']: with open(module['path'] + "/modinfo.json", "r", encoding='utf-8') as read_file: moduleJson = json.load(read_file) + if 'moduleType' in moduleJson['about']: + allDefs = allDefs + "\n" + "-D" + moduleJson['about']['moduleType'] if deviceName in moduleJson['usedLibs']: # проверяем поддерживает ли модуль текущее устройство if not 'exclude' in moduleJson['usedLibs'][deviceName]: # смотрим не нужно ли исключить данный модуль из указанной платы deviceName activeModulesName.append(moduleJson['about']['moduleName']) # запоминаем имена для использования на след шагах @@ -250,7 +253,10 @@ def updateModulesInProfile(profJson): config.read("platformio.ini") config["env:" + deviceName + "_fromitems"]["lib_deps"] = allLibs config["env:" + deviceName + "_fromitems"]["build_src_filter"] = includeDirs +config["env:" + deviceName + "_fromitems"]["build_flags"] = allDefs config["platformio"]["default_envs"] = deviceName +if "${env:" + deviceName + "_fromitems.build_flags}" not in config["env:" + deviceName]["build_flags"]: + config["env:" + deviceName]["build_flags"] += "\n${env:" + deviceName + "_fromitems.build_flags}" # config["platformio"]["data_dir"] = profJson['projectProp']['platformio']['data_dir'] with open("platformio.ini", 'w') as configFile: config.write(configFile) diff --git a/include/Global.h b/include/Global.h index 278630f0..11c31daa 100644 --- a/include/Global.h +++ b/include/Global.h @@ -66,7 +66,9 @@ *****************************************глобальные объекты классов*************************************************** **********************************************************************************************************************/ extern IoTGpio IoTgpio; +#ifdef mod_RtcDriver extern IoTItem* rtcItem; +#endif //extern IoTItem* camItem; extern IoTItem* tlgrmItem; extern IoTBench* benchLoadItem; diff --git a/include/classes/IoTItem.h b/include/classes/IoTItem.h index 0c9be041..012c920d 100644 --- a/include/classes/IoTItem.h +++ b/include/classes/IoTItem.h @@ -55,7 +55,6 @@ class IoTItem { bool enableDoByInt = true; virtual IoTGpio* getGpioDriver(); - virtual IoTItem* getRtcDriver(); //virtual IoTItem* getCAMDriver(); virtual IoTItem* getTlgrmDriver(); //virtual IoTBench* getBenchmark(); @@ -63,8 +62,10 @@ class IoTItem { virtual IoTBench* getBenchmarkLoad(); virtual IoTDiscovery* getHADiscovery(); virtual IoTDiscovery* getHOMEdDiscovery(); +#ifdef mod_RtcDriver + virtual IoTItem* getRtcDriver(); virtual unsigned long getRtcUnixTime(); - +#endif // делаем доступным модулям отправку сообщений в телеграм virtual void sendTelegramMsg(bool often, String msg); virtual void sendFoto(uint8_t *buf, uint32_t length, const String &name); diff --git a/platformio.ini b/platformio.ini index 07ff82ef..e0dff157 100644 --- a/platformio.ini +++ b/platformio.ini @@ -228,6 +228,7 @@ lib_ignore = LT_WebSockets build_flags = -Desp32_4mb3f="esp32_4mb3f" -Wl,--wrap=esp_panic_handler + ${env:esp32_4mb3f_fromitems.build_flags} framework = arduino board = esp32dev platform = espressif32 @6.6.0 @@ -777,7 +778,7 @@ lib_deps = adafruit/Adafruit BME280 Library adafruit/Adafruit BMP280 Library beegee-tokyo/DHT sensor library for ESPx - https://github.com/milesburton/Arduino-Temperature-Control-Library + milesburton/DallasTemperature @ ^4.0.4 plerup/EspSoftwareSerial gyverlibs/EncButton @ ^2.0 build_src_filter = @@ -805,12 +806,14 @@ build_src_filter = + + + - + + + + + + +build_flags = + -Dmod_RtcDriver + -DhardRTC=1 [env:esp32cam_4mb_fromitems] lib_deps = diff --git a/src/ESPConfiguration.cpp b/src/ESPConfiguration.cpp index af81f47c..83984386 100644 --- a/src/ESPConfiguration.cpp +++ b/src/ESPConfiguration.cpp @@ -35,8 +35,10 @@ void configure(String path) { void* driver; // пробуем спросить драйвер GPIO if (driver = myIoTItem->getGpioDriver()) IoTgpio.regDriver((IoTGpio*)driver); +#ifdef mod_RtcDriver // пробуем спросить драйвер RTC if (driver = myIoTItem->getRtcDriver()) rtcItem = (IoTItem*)driver; +#endif // пробуем спросить драйвер CAM //if (driver = myIoTItem->getCAMDriver()) camItem = (IoTItem*)driver; // пробуем спросить драйвер Benchmark @@ -78,11 +80,12 @@ void configure(String path) { void clearConfigure() { Serial.printf("Start clearing config\n"); +#ifdef mod_RtcDriver rtcItem = nullptr; +#endif //camItem = nullptr; tlgrmItem = nullptr; IoTgpio.clearDrivers(); - for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { Serial.printf("Start delete iotitem %s \n", (*it)->getID().c_str()); if (*it) delete *it; diff --git a/src/Global.cpp b/src/Global.cpp index 9843a65d..f5b20197 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -34,7 +34,9 @@ WebSocketsServer standWebSocket = WebSocketsServer(81); ***********************************************глобальные переменные************************************************** **********************************************************************************************************************/ IoTGpio IoTgpio(0); +#ifdef mod_RtcDriver IoTItem* rtcItem = nullptr; +#endif //IoTItem* camItem = nullptr; IoTItem* tlgrmItem = nullptr; IoTBench* benchTaskItem = nullptr; diff --git a/src/NTP.cpp b/src/NTP.cpp index bac99e72..546e10eb 100644 --- a/src/NTP.cpp +++ b/src/NTP.cpp @@ -31,9 +31,13 @@ void ntpInit() { synchTime(); // проверяем присутствие RTC с батарейкой и получаем время при наличии +#ifdef mod_RtcDriver if (rtcItem) { unixTime = rtcItem->getRtcUnixTime(); - } else return; + } + else +#endif + return; // ToDo разобраться: если нет железных часов дальше ничего не делать ??? } unixTimeShort = unixTime - START_DATETIME; diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index f3ccfc10..6380aa62 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -238,9 +238,12 @@ IoTGpio* IoTItem::getGpioDriver() { return nullptr; } +#ifdef mod_RtcDriver IoTItem* IoTItem::getRtcDriver() { return nullptr; } +#endif + /* IoTItem* IoTItem::getCAMDriver() { return nullptr; @@ -266,10 +269,12 @@ IoTDiscovery *IoTItem::getHADiscovery() { return nullptr; } +#ifdef mod_RtcDriver unsigned long IoTItem::getRtcUnixTime() { return 0; } +#endif // сетевое общение==================================================================================================================================== diff --git a/src/modules/sensors/RTC/modinfo.json b/src/modules/sensors/RTC/modinfo.json index 369d70c3..2eff1496 100644 --- a/src/modules/sensors/RTC/modinfo.json +++ b/src/modules/sensors/RTC/modinfo.json @@ -28,6 +28,7 @@ "exampleURL": "https://iotmanager.org/wiki", "specialThanks": "", "moduleName": "RTC", + "moduleDefines": ["mod_RtcDriver", "hardRTC=1"], "moduleVersion": "1.0", "usedRam": { "esp32_4mb": 15, From a71e6088ca43c1e6531d630512c418f01ae0e8d8 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 23 Sep 2025 10:28:44 +0300 Subject: [PATCH 112/118] Update PrepareProject.py rename moduleType to moduleDefines --- PrepareProject.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PrepareProject.py b/PrepareProject.py index 2451cc0c..e71c6fc5 100644 --- a/PrepareProject.py +++ b/PrepareProject.py @@ -182,7 +182,7 @@ def updateModulesInProfile(profJson): # параллельно собираем необходимые активным модулям библиотеки для включения в компиляцию для текущего типа устройства (esp8266_4m, esp32_4mb, esp8266_1m, esp8266_1m_ota) activeModulesName = [] # список имен активных модулей allLibs = "" # подборка всех библиотек необходимых модулям для дальнейшей записи в конфигурацию platformio -allDefs = "" # для каждого модуля создаем глобальный define "-D" + moduleJson['about']['moduleType'] +allDefs = "" # для каждого модуля создаем глобальный define "-D" + moduleJson['about']['moduleDefines'] itemsCount = 1 includeDirs = "" # подборка путей ко всем модулям для дальнейшей записи в конфигурацию platformio itemsJson = json.loads('[{"name": "Выберите элемент", "num": 0}]') @@ -192,8 +192,8 @@ def updateModulesInProfile(profJson): if module['active']: with open(module['path'] + "/modinfo.json", "r", encoding='utf-8') as read_file: moduleJson = json.load(read_file) - if 'moduleType' in moduleJson['about']: - allDefs = allDefs + "\n" + "-D" + moduleJson['about']['moduleType'] + if 'moduleDefines' in moduleJson['about']: + allDefs = allDefs + "\n" + "-D" + moduleJson['about']['moduleDefines'] if deviceName in moduleJson['usedLibs']: # проверяем поддерживает ли модуль текущее устройство if not 'exclude' in moduleJson['usedLibs'][deviceName]: # смотрим не нужно ли исключить данный модуль из указанной платы deviceName activeModulesName.append(moduleJson['about']['moduleName']) # запоминаем имена для использования на след шагах @@ -290,4 +290,4 @@ def updateModulesInProfile(profJson): # print(f"\x1b[1;32;41m Операция завершена. \x1b[0m") - \ No newline at end of file + From e3121a24671f8e20df7de91eca976a8dc7c2bab6 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 23 Sep 2025 10:39:56 +0300 Subject: [PATCH 113/118] Update platformio.ini Add build_flag all project --- platformio.ini | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/platformio.ini b/platformio.ini index e0dff157..a30c681f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -18,6 +18,7 @@ lib_deps = lib_ignore = LT_WebSockets build_flags = -Desp8266_1mb_ota="esp8266_1mb_ota" + ${env:esp8266_1mb_ota_fromitems.build_flags} framework = arduino board = nodemcuv2 board_build.ldscript = eagle.flash.1m64.ld @@ -41,6 +42,7 @@ lib_deps = lib_ignore = LT_WebSockets build_flags = -Desp8266_1mb="esp8266_1mb" + ${env:esp8266_1mb_fromitems.build_flags} framework = arduino board = nodemcuv2 board_build.ldscript = eagle.flash.1m256.ld @@ -64,6 +66,7 @@ lib_deps = lib_ignore = LT_WebSockets build_flags = -Desp8266_1mb_ota="esp8266_1mb_ota" + ${env:esp8285_1mb_ota_fromitems.build_flags} framework = arduino board = esp8285 board_build.ldscript = eagle.flash.1m64.ld @@ -87,6 +90,7 @@ lib_deps = lib_ignore = LT_WebSockets build_flags = -Desp8266_2mb="esp8266_2mb" + ${env:esp8266_2mb_fromitems.build_flags} framework = arduino board = d1_wroom_02 board_build.ldscript = eagle.flash.2m1m.ld @@ -110,6 +114,7 @@ lib_deps = lib_ignore = LT_WebSockets build_flags = -Desp8266_2mb_ota="esp8266_2mb_ota" + ${env:esp8266_2mb_ota_fromitems.build_flags} framework = arduino board = d1_wroom_02 board_build.ldscript = eagle.flash.2m256.ld @@ -133,6 +138,7 @@ lib_deps = lib_ignore = LT_WebSockets build_flags = -Desp8266_1mb="esp8266_1mb" + ${env:esp8285_1mb_fromitems.build_flags} framework = arduino board = esp8285 board_build.ldscript = eagle.flash.1m256.ld @@ -156,6 +162,7 @@ lib_deps = lib_ignore = LT_WebSockets build_flags = -Desp8266_4mb="esp8266_4mb" + ${env:esp8266_4mb_fromitems.build_flags} framework = arduino board = nodemcuv2 board_build.ldscript = eagle.flash.4m1m.ld @@ -180,6 +187,7 @@ lib_deps = lib_ignore = LT_WebSockets build_flags = -Desp8266_16mb="esp8266_16mb" + ${env:esp8266_16mb_fromitems.build_flags} framework = arduino board = nodemcuv2 platform = espressif8266 @4.0.1 @@ -204,6 +212,7 @@ lib_ignore = LT_WebSockets build_flags = -Desp32_4mb="esp32_4mb" -Wl,--wrap=esp_panic_handler + ${env:esp32_4mb_fromitems.build_flags} framework = arduino board = esp32dev platform = espressif32 @6.6.0 @@ -256,6 +265,7 @@ build_flags = -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue -Wl,--wrap=esp_panic_handler + ${env:esp32cam_4mb_fromitems.build_flags} framework = arduino board = esp32cam platform = espressif32 @6.6.0 @@ -282,6 +292,7 @@ build_flags = -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=0 -Wl,--wrap=esp_panic_handler + ${env:esp32s2_4mb_fromitems.build_flags} framework = arduino board = lolin_s2_mini platform = espressif32 @6.6.0 @@ -306,6 +317,7 @@ lib_ignore = LT_WebSockets build_flags = -Desp32c3m_4mb="esp32c3m_4mb" -Wl,--wrap=esp_panic_handler + ${env:esp32c3m_4mb_fromitems.build_flags} framework = arduino board = lolin_c3_mini platform = espressif32 @6.6.0 @@ -331,6 +343,7 @@ lib_ignore = LT_WebSockets build_flags = -Desp32s3_16mb="esp32s3_16mb" -Wl,--wrap=esp_panic_handler + ${env:esp32s3_16mb_fromitems.build_flags} framework = arduino board = esp32-s3-devkitc-1 board_build.mcu = esp32s3 @@ -358,6 +371,7 @@ lib_ignore = LT_WebSockets build_flags = -Desp32_16mb="esp32_16mb" -Wl,--wrap=esp_panic_handler + ${env:esp32_16mb_fromitems.build_flags} framework = arduino board = esp32dev platform = espressif32 @6.6.0 @@ -384,6 +398,7 @@ lib_ignore = LT_WebSockets build_flags = -Desp32_wifirep="esp32_wifirep" -Wl,--wrap=esp_panic_handler + ${env:esp32_wifirep_fromitems.build_flags} framework = arduino board = esp32dev platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.5.3/platform-espressif32-2.0.5.3.zip @@ -411,6 +426,7 @@ build_flags = -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MODE=0 -Wl,--wrap=esp_panic_handler + ${env:esp32c6_4mb_fromitems.build_flags} framework = arduino board = esp32-c6-devkitm-1 platform = espressif32 @6.9.0 @@ -441,6 +457,7 @@ build_flags = -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MODE=0 -Wl,--wrap=esp_panic_handler + ${env:esp32c6_8mb_fromitems.build_flags} framework = arduino board = esp32-c6-devkitm-1 platform = espressif32 @6.9.0 @@ -489,6 +506,7 @@ build_flags = -DNODEBUG_WEBSOCKETS=1 -DLT_UART_DEFAULT_PORT=1 -DUPLOAD_PORT=auto + ${env:bk7231n_fromitems.build_flags} build_src_filter = +<*.cpp> + From 70896f6c9238716207f84c22647d297cc2ef2165 Mon Sep 17 00:00:00 2001 From: Ilya Date: Wed, 24 Sep 2025 20:53:29 +0300 Subject: [PATCH 114/118] =?UTF-8?q?=D0=A3=D1=87=D0=B8=D1=82=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D0=B5=D0=BC=20=D1=87=D1=82=D0=BE=20moduleDefines=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=D0=B3=D0=B4=D0=B0=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrepareProject.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrepareProject.py b/PrepareProject.py index e71c6fc5..11eda3f5 100644 --- a/PrepareProject.py +++ b/PrepareProject.py @@ -182,7 +182,7 @@ def updateModulesInProfile(profJson): # параллельно собираем необходимые активным модулям библиотеки для включения в компиляцию для текущего типа устройства (esp8266_4m, esp32_4mb, esp8266_1m, esp8266_1m_ota) activeModulesName = [] # список имен активных модулей allLibs = "" # подборка всех библиотек необходимых модулям для дальнейшей записи в конфигурацию platformio -allDefs = "" # для каждого модуля создаем глобальный define "-D" + moduleJson['about']['moduleDefines'] +allDefs = "\n" # для каждого модуля создаем глобальный define itemsCount = 1 includeDirs = "" # подборка путей ко всем модулям для дальнейшей записи в конфигурацию platformio itemsJson = json.loads('[{"name": "Выберите элемент", "num": 0}]') @@ -193,7 +193,7 @@ def updateModulesInProfile(profJson): with open(module['path'] + "/modinfo.json", "r", encoding='utf-8') as read_file: moduleJson = json.load(read_file) if 'moduleDefines' in moduleJson['about']: - allDefs = allDefs + "\n" + "-D" + moduleJson['about']['moduleDefines'] + allDefs = allDefs + "\n".join("-D" + d for d in moduleJson['about']['moduleDefines']) if deviceName in moduleJson['usedLibs']: # проверяем поддерживает ли модуль текущее устройство if not 'exclude' in moduleJson['usedLibs'][deviceName]: # смотрим не нужно ли исключить данный модуль из указанной платы deviceName activeModulesName.append(moduleJson['about']['moduleName']) # запоминаем имена для использования на след шагах From 366c0472bfafdbe124f2e548141b345fe41ed169 Mon Sep 17 00:00:00 2001 From: weoleg Date: Sat, 22 Nov 2025 18:58:13 +0300 Subject: [PATCH 115/118] Milight: MQTT control + profile entry --- .github/workflows/build_esp32c3m.yml | 71 ++ .github/workflows/build_iotm.yml | 5 +- build_esp32c3m.log | 59 ++ build_esp32c3m_4mb.log | Bin 0 -> 5088 bytes compilerProfile.json | 199 +++- data_svelte/flashProfile.json | 118 ++- data_svelte/items.json | 805 +++++----------- data_svelte/settings.json | 22 +- iotm/esp32_4mb3f/400/firmware.bin | Bin 0 -> 1265344 bytes iotm/esp32_4mb3f/400/littlefs.bin | Bin 0 -> 983040 bytes iotm/esp32_4mb3f/400/partitions.bin | Bin 0 -> 3072 bytes iotm/ver.json | 2 +- lib/OneWire/OneWire.cpp | 604 ++++++++++++ lib/OneWire/OneWire.h | 183 ++++ lib/OneWire/keywords.txt | 39 + lib/OneWire/library.json | 61 ++ lib/OneWire/library.properties | 10 + lib/OneWire/util/OneWire_direct_gpio.h | 519 ++++++++++ lib/OneWire/util/OneWire_direct_regtype.h | 59 ++ myProfile.json | 61 +- platformio.ini | 68 +- src/modules/API.cpp | 66 +- src/modules/display/TM16XX/example.json | 3 +- src/modules/exec/MilightHub/MilightHub.cpp | 994 ++++++++++++++++++++ src/modules/exec/MilightHub/modinfo.json | 150 +++ src/modules/sensors/DscKeybus/DscKeybus.cpp | 450 +++++++++ src/modules/sensors/DscKeybus/modinfo.json | 78 ++ 27 files changed, 3958 insertions(+), 668 deletions(-) create mode 100644 .github/workflows/build_esp32c3m.yml create mode 100644 build_esp32c3m.log create mode 100644 build_esp32c3m_4mb.log create mode 100644 iotm/esp32_4mb3f/400/firmware.bin create mode 100644 iotm/esp32_4mb3f/400/littlefs.bin create mode 100644 iotm/esp32_4mb3f/400/partitions.bin create mode 100644 lib/OneWire/OneWire.cpp create mode 100644 lib/OneWire/OneWire.h create mode 100644 lib/OneWire/keywords.txt create mode 100644 lib/OneWire/library.json create mode 100644 lib/OneWire/library.properties create mode 100644 lib/OneWire/util/OneWire_direct_gpio.h create mode 100644 lib/OneWire/util/OneWire_direct_regtype.h create mode 100644 src/modules/exec/MilightHub/MilightHub.cpp create mode 100644 src/modules/exec/MilightHub/modinfo.json create mode 100644 src/modules/sensors/DscKeybus/DscKeybus.cpp create mode 100644 src/modules/sensors/DscKeybus/modinfo.json diff --git a/.github/workflows/build_esp32c3m.yml b/.github/workflows/build_esp32c3m.yml new file mode 100644 index 00000000..ed15b79b --- /dev/null +++ b/.github/workflows/build_esp32c3m.yml @@ -0,0 +1,71 @@ +name: Build ESP32C3M Firmware + +on: + push: + branches: [ ver4dev ] + paths: + - 'platformio.ini' + - 'src/**' + - 'include/**' + - 'lib/**' + - 'data_*/**' + - 'bin/**' + - 'tools/**' + - 'PrepareProject.py' + - '.github/workflows/build_esp32c3m.yml' + pull_request: + branches: [ ver4dev ] + paths: + - 'platformio.ini' + - 'src/**' + - 'include/**' + - 'lib/**' + - 'data_*/**' + - 'bin/**' + - 'tools/**' + - 'PrepareProject.py' + - '.github/workflows/build_esp32c3m.yml' + workflow_dispatch: + +env: + BOARD: esp32c3m_4mb + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Install PlatformIO + run: | + python -m pip install --upgrade pip + pip install platformio + + - name: Prepare project + run: python ./PrepareProject.py -b ${BOARD} + + - name: Build firmware + run: platformio run -e ${BOARD} + + - name: Build filesystem image + run: platformio run -e ${BOARD} -t buildfs --disable-auto-clean + + - name: Collect artifacts + run: | + mkdir -p artifacts/${BOARD} + find .pio/build/${BOARD} -maxdepth 1 -type f -name '*.bin' -exec cp {} artifacts/${BOARD} \; + if [ -f build_${BOARD}.log ]; then cp build_${BOARD}.log artifacts/${BOARD}/; fi + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: ${BOARD}-firmware-${{ github.run_number }} + path: artifacts/${BOARD} diff --git a/.github/workflows/build_iotm.yml b/.github/workflows/build_iotm.yml index d30a26da..2cef098a 100644 --- a/.github/workflows/build_iotm.yml +++ b/.github/workflows/build_iotm.yml @@ -14,10 +14,7 @@ jobs: steps: - name: Prepare matrix JSON Object id: set_matrix - uses: nickofthyme/object-remap@v2.0.0 - with: - __case: kebab - board: ${{ env.BOARDS }} + run: echo "json={\"board\":${{ env.BOARDS }}}" >> $GITHUB_OUTPUT build: needs: [ generate-matrix ] diff --git a/build_esp32c3m.log b/build_esp32c3m.log new file mode 100644 index 00000000..2035da4b --- /dev/null +++ b/build_esp32c3m.log @@ -0,0 +1,59 @@ +Processing esp32c3m_4mb (framework: arduino; board: lolin_c3_mini; platform: espressif32 @6.6.0) +-------------------------------------------------------------------------------- +Verbose mode can be enabled via `-v, --verbose` option +PLATFORMIO_DIRC:\Users\IT-TehNika\.platformio + , ! C:\Users\IT-TehNika\.platformio\packages\framework-arduinoespressif32\libraries\WiFi\src\WiFiClient.cpp +CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/lolin_c3_mini.html +PLATFORM: Espressif 32 (6.6.0) > WEMOS LOLIN C3 Mini +HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash +DEBUG: Current (esp-prog) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa) +PACKAGES: + - framework-arduinoespressif32 @ 3.20014.231204 (2.0.14) + - tool-esptoolpy @ 1.40501.0 (4.5.1) + - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 +LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf +LDF Modes: Finder ~ chain, Compatibility ~ soft +Found 67 compatible libraries +Scanning dependencies... +Dependency Graph +|-- ArduinoJson @ 6.18.0 +|-- PubSubClient @ 2.8.0 +|-- EncButton @ 2.0.0 +|-- TM16xx LEDs and Buttons @ 0.7.2503+sha.ab716f4 +|-- Adafruit GFX Library @ 1.12.4+sha.e4df4cc +|-- Adafruit BusIO @ 1.17.4 +|-- Adafruit BME280 Library @ 2.3.0 +|-- Adafruit BMP280 Library @ 2.6.8 +|-- DHT sensor library for ESPx @ 1.19.0 +|-- MAX6675 library @ 1.1.2 +|-- WS2812FX @ 1.4.5 +|-- dscKeybusInterface @ 3.0.0+sha.ce12e1c +|-- AHTxx @ 1.2.0+sha.701814c +|-- DallasTemperature @ 4.0.5 +|-- EspSoftwareSerial @ 8.1.0 +|-- Wire @ 2.0.0 +|-- OneWire @ 2.3.8 +|-- iarduino RTC ( ) @ 2.0.0 +|-- ESP32 Async UDP @ 2.0.0 +|-- LittleFS @ 2.0.0 +|-- FS @ 2.0.0 +|-- SPIFFS @ 2.0.0 +|-- WiFi @ 2.0.0 +|-- HTTPClient @ 2.0.0 +|-- HTTPUpdate @ 2.0.0 +|-- TickerScheduler +|-- Update @ 2.0.0 +|-- WebServer @ 2.0.0 +|-- WebSockets @ 2.3.7 +Building in release mode +Retrieving maximum program size .pio\build\esp32c3m_4mb\firmware.elf +Checking size .pio\build\esp32c3m_4mb\firmware.elf +Advanced Memory Usage is available via "PlatformIO Home > Project Inspect" +RAM: [= ] 13.1% (used 42884 bytes from 327680 bytes) +Flash: [======== ] 77.7% (used 1221944 bytes from 1572864 bytes) +========================= [SUCCESS] Took 68.72 seconds ========================= + +Environment Status Duration +------------- -------- ------------ +esp32c3m_4mb SUCCESS 00:01:08.724 +========================= 1 succeeded in 00:01:08.724 ========================= diff --git a/build_esp32c3m_4mb.log b/build_esp32c3m_4mb.log new file mode 100644 index 0000000000000000000000000000000000000000..9cb04a1e1a298c7503ae19f696be2ddd5a4a10bd GIT binary patch literal 5088 zcmd6rYfqa;5JvZdKUL~~a3diRwKn$ z-r5F-(4>_r%YOGVJJ)As=k=d|Y==&0hr@6jx_r*Ud3Y6yadr{r!Yn&;p%q?)d43Pr znG7eKXfQht?>N~BZ^9$i8;p*^+sL6EzGdZr-L&d{lUXzFzKA?uz(Hwek@kYUM(Dv? zj;+X1jV_pF%}$~|#qdLT5X$j89qxxO!xy3SKmVxXPuS6kKIt+lVq+VBIXcAh^XM;U z$BY}$H5nZ-zr;fgo-eWSGJL~GYcJUyaC^yW8(;OHZF63E+hH>-hrO^Go`#)J3mZIN zgcY7Up@M(w;TiswOPBEmlqJ5$;WTW)u<OUfJtFS_N~zEK-1Zr*@~y+W zgQR-ME0suZBzpMZ5KS(k)fIfW#hHz;hWB=&fA#BD#Oo>4Jt(`(ruZD;t3zhvy;x?q zgJo0EPA!}o%9t**@wQB%+lMl#O!Rsnt2q_{W?>b5Msupz&#K9htSW}@q27nShJCw? zH+gPi`BseV9KSVuXa0(Zb$qb{y7uF<8vRk_+;-$%;kOuOkTA`u_3&%NvDIZdJPD84 z)0eflI?vOURjg>B?P=t{f+mmg`C8;$q0V&pqzGA)lCMh9wl-e94~J^F!W$yojB2tn zNjzHcJmXs;J`LzaY(6bQ&R91ZqwChSCfu}mct>9<&oy(S2j2sIY#1Up4~}CWya;WYs?37 zdswdRrG9kt{35)EPTn(|o9FZbU&qstqf!(^1=S!8q=iBWGl`7A_zH_4mT=(SDw<|?I@E9ic~_nf%(t#HEHtC%^*Q48@}g5roB{g(7FuhY$B9WxJyrTxyzzyso|0(C-zSW>P? z??p|e?y`TvTnVd;-$vbw*ltZwv*FWbg1y4P52;#vdKYSMN^4H)QuNBGe-d>W%ga&X zcn_`-33ETymf!G#NL^-i(82r|HTPZ?D|Q?+!I(}*zWK~H_8g#@zr(jiIwd-9p4r30 z*1{`3*3~L;?lRIgZ~Vt_^CmH7t}9=RFY=v@Xq^L7R>lS^_6m!U-w9~ePg%ERxHV$_ zS-pC2StA0^d0xj^&IU8foEUIFW+p!7@%`aPxT|-U8{%nSXLD*MYCWn~4NpJE{s-(W zKsy}m;oS86?1)V7XRH3eyZU7`B7Sm8Fh?WA7O?_zM3nBGSFv3+m8 z4Y+)aE_WQa$y%o`+k@YDeBJawrhf*)MSyqUZT$DJ+dj*i(i}TwWFF{;&WQi-%5k5Q zW`*Zdr+SwVrnt7?Nn-!wd+H}Nk zsvbUz@vN5GYv`xkmwP7Hwp7#7DZ4oU1R-cQcnFqdeOyS$X=RuC&?M&oEc ziw*O{_kuxhA(DK9OYxY4Z-IaE5jbaJ5V1Ts#ZQo?j()4~u+E6b^OzsLPiKVh zGS=fFIqcU?Re_??zpu~BezlC4*##^$x$CAt)@ZwBfkD-KP}=Zx!ukC Z!&JU?=;Mq9Bc7rz^6c}*OZ(I~`~^8Z0BryO literal 0 HcmV?d00001 diff --git a/compilerProfile.json b/compilerProfile.json index bac5d993..6dd84da6 100644 --- a/compilerProfile.json +++ b/compilerProfile.json @@ -3,29 +3,37 @@ "name": "IoTmanagerVer4", "apssid": "IoTmanager", "appass": "", - "routerssid": "iot", - "routerpass": "hostel3333", + "wifirep_apchanel": 7, + "wifirep_apip": "192.168.4.1", + "wifirep_staip": "192.168.1.160", + "wifirep_netmask": "255.255.255.0", + "wifirep_gateway": "192.168.4.1", + "wifirep_dns": "192.168.4.1", + "routerssid": "HomeNET", + "routerpass": "Wi73Jktu0205", "timezone": 2, "ntp": "pool.ntp.org", "weblogin": "admin", "webpass": "admin", - "mqttServer": "", - "mqttPort": 8021, - "mqttPrefix": "/risenew", + "mqttServer": "192.168.88.10", + "mqttPort": 1883, + "mqttPrefix": "/IoTmanager", "mqttUser": "rise", "mqttPass": "3hostel3", "serverip": "http://iotmanager.org", + "serverlocal": "http://192.168.1.2:5500", "log": 0, "mqttin": 0, - "pinSCL": 0, - "pinSDA": 0, + "pinSCL": 9, + "pinSDA": 8, "i2cFreq": 100000, - "wg": "group1" + "wg": "group1", + "debugTraceMsgTlgrm": 1 }, "projectProp": { "platformio": { - "default_envs": "esp8266_4mb", - "comments_default_envs": "choose from: esp8266_4mb or esp32_4mb or esp32cam_4mb or esp32s2_4mb or esp32_4mb3f or esp32s3_16mb or esp32c3m_4mb or esp8266_1mb or esp8266_1mb_ota or esp8285_1mb or esp8285_1mb_ota", + "default_envs": "esp32_4mb3f", + "comments_default_envs": "choose from: esp8266_4mb, esp32_4mb, esp32_4mb3f, esp8266_16mb, esp32_16mb, esp32cam_4mb, esp32s2_4mb, esp32s3_16mb, esp32c3m_4mb, esp8266_1mb, esp8266_1mb_ota, esp8266_2mb, esp8266_2mb_ota, esp8285_1mb, esp8285_1mb_ota, esp32c6_4mb, esp32c6_8mb, bk7231n, esp32_wifirep", "envs": [ { "name": "esp8266_4mb", @@ -53,6 +61,14 @@ "partitions": "0x8000", "littlefs": "0x310000" }, + { + "name": "esp32_wifirep", + "boot_app0": "0xe000", + "bootloader_qio_80m": "0x1000", + "firmware": "0x10000", + "partitions": "0x8000", + "littlefs": "0x310000" + }, { "name": "esp32cam_4mb", "boot_app0": "0xe000", @@ -122,6 +138,22 @@ "firmware": "0x10000", "partitions": "0x8000", "littlefs": "0x910000" + }, + { + "name": "esp32c6_4mb", + "boot_app0": "0xe000", + "bootloader_qio_80m": "0x1000", + "firmware": "0x10000", + "partitions": "0x8000", + "littlefs": "0x310000" + }, + { + "name": "esp32c6_8mb", + "boot_app0": "0xe000", + "bootloader_qio_80m": "0x1000", + "firmware": "0x10000", + "partitions": "0x8000", + "littlefs": "0x670000" } ] } @@ -136,6 +168,14 @@ "path": "src/modules/virtual/Cron", "active": true }, + { + "path": "src/modules/virtual/DiscoveryHA", + "active": false + }, + { + "path": "src/modules/virtual/DiscoveryHomeD", + "active": false + }, { "path": "src/modules/virtual/GoogleSheet", "active": false @@ -144,10 +184,22 @@ "path": "src/modules/virtual/Loging", "active": true }, + { + "path": "src/modules/virtual/Loging2", + "active": false + }, + { + "path": "src/modules/virtual/Loging3", + "active": false + }, { "path": "src/modules/virtual/LogingDaily", "active": true }, + { + "path": "src/modules/virtual/LogingHourly", + "active": true + }, { "path": "src/modules/virtual/Math", "active": true @@ -164,6 +216,10 @@ "path": "src/modules/virtual/Timer", "active": true }, + { + "path": "src/modules/virtual/UpdateServer", + "active": true + }, { "path": "src/modules/virtual/Variable", "active": true @@ -178,17 +234,13 @@ } ], "sensors": [ - { - "path": "src/modules/exec/Pcf8591", - "active": false - }, { "path": "src/modules/sensors/A02Distance", - "active": true + "active": false }, { "path": "src/modules/sensors/Acs712", - "active": true + "active": false }, { "path": "src/modules/sensors/Ads1115", @@ -208,7 +260,11 @@ }, { "path": "src/modules/sensors/BL0937", - "active": true + "active": false + }, + { + "path": "src/modules/sensors/BL0942", + "active": false }, { "path": "src/modules/sensors/Ble", @@ -242,6 +298,10 @@ "path": "src/modules/sensors/DS2401", "active": false }, + { + "path": "src/modules/sensors/DscKeybus", + "active": false + }, { "path": "src/modules/sensors/Emon", "active": false @@ -306,12 +366,24 @@ "path": "src/modules/sensors/Mhz19", "active": false }, + { + "path": "src/modules/sensors/ModbusRTU", + "active": false + }, + { + "path": "src/modules/sensors/ModbusRTUasync", + "active": false + }, { "path": "src/modules/sensors/MQgas", - "active": true + "active": false }, { "path": "src/modules/sensors/Ntc", + "active": true + }, + { + "path": "src/modules/sensors/Pcf8591", "active": false }, { @@ -320,7 +392,7 @@ }, { "path": "src/modules/sensors/Pzem004t_v2", - "active": true + "active": false }, { "path": "src/modules/sensors/RCswitch", @@ -332,7 +404,7 @@ }, { "path": "src/modules/sensors/S8", - "active": true + "active": false }, { "path": "src/modules/sensors/Scd40", @@ -348,15 +420,15 @@ }, { "path": "src/modules/sensors/Sht20", - "active": true + "active": false }, { "path": "src/modules/sensors/Sht30", - "active": true + "active": false }, { "path": "src/modules/sensors/Sonar", - "active": true + "active": false }, { "path": "src/modules/sensors/UART", @@ -382,7 +454,11 @@ }, { "path": "src/modules/exec/Buzzer", - "active": true + "active": false + }, + { + "path": "src/modules/exec/EctoControlAdapter", + "active": false }, { "path": "src/modules/exec/Enconder", @@ -402,7 +478,11 @@ }, { "path": "src/modules/exec/IoTServo", - "active": true + "active": false + }, + { + "path": "src/modules/exec/IRremote", + "active": false }, { "path": "src/modules/exec/Mcp23008", @@ -410,11 +490,15 @@ }, { "path": "src/modules/exec/Mcp23017", - "active": true + "active": false + }, + { + "path": "src/modules/exec/MilightHub", + "active": false }, { "path": "src/modules/exec/Mp3", - "active": true + "active": false }, { "path": "src/modules/exec/Multitouch", @@ -426,7 +510,7 @@ }, { "path": "src/modules/exec/Pcf8574", - "active": true + "active": false }, { "path": "src/modules/exec/Pwm32", @@ -434,7 +518,7 @@ }, { "path": "src/modules/exec/Pwm8266", - "active": true + "active": false }, { "path": "src/modules/exec/SDcard", @@ -452,6 +536,10 @@ "path": "src/modules/exec/SysExt", "active": false }, + { + "path": "src/modules/exec/Tca9555", + "active": false + }, { "path": "src/modules/exec/Telegram", "active": false @@ -466,7 +554,7 @@ }, { "path": "src/modules/exec/Thermostat", - "active": false + "active": true }, { "path": "src/modules/sensors/Ds2423", @@ -476,11 +564,19 @@ "screens": [ { "path": "src/modules/display/DwinI", - "active": true + "active": false + }, + { + "path": "src/modules/display/GyverLAMP", + "active": false }, { "path": "src/modules/display/Lcd2004", - "active": true + "active": false + }, + { + "path": "src/modules/display/LedFX", + "active": false }, { "path": "src/modules/display/Nextion", @@ -496,20 +592,53 @@ }, { "path": "src/modules/display/Oled64", - "active": true + "active": false }, { "path": "src/modules/display/Smi2_m", - "active": true + "active": false }, { "path": "src/modules/display/TM16XX", "active": false }, + { + "path": "src/modules/display/U8g2lib", + "active": false + }, { "path": "src/modules/display/Ws2812b", "active": false } ] - } + }, + "configItem": [ + { + "global": 0, + "name": "MiLight Hub", + "type": "Writing", + "subtype": "MilightHub", + "id": "milight", + "widget": "", + "page": "Исполнители", + "descr": "Управление светом через esp8266_milight_hub REST API.", + "host": "milight-hub", + "port": 80, + "targetType": "alias", + "alias": "livingroom", + "deviceId": "0x0000", + "remoteType": "rgb_cct", + "groupId": 0, + "blockOnQueue": false, + "normalizedResponse": false, + "storeResponse": true, + "username": "", + "password": "", + "timeout": 5000, + "mqttCommandTopic": "milight/command", + "mqttCommandUsePrefix": true, + "mqttResponseTopic": "milight/response", + "mqttResponseUsePrefix": true + } + ] } \ No newline at end of file diff --git a/data_svelte/flashProfile.json b/data_svelte/flashProfile.json index 337a4283..af00edb5 100644 --- a/data_svelte/flashProfile.json +++ b/data_svelte/flashProfile.json @@ -1,7 +1,7 @@ { "projectProp": { "platformio": { - "default_envs": "esp8266_4mb" + "default_envs": "esp32_4mb3f" } }, "modules": { @@ -14,6 +14,14 @@ "path": "src/modules/virtual/Cron", "active": true }, + { + "path": "src/modules/virtual/DiscoveryHA", + "active": false + }, + { + "path": "src/modules/virtual/DiscoveryHomeD", + "active": false + }, { "path": "src/modules/virtual/GoogleSheet", "active": false @@ -22,10 +30,22 @@ "path": "src/modules/virtual/Loging", "active": true }, + { + "path": "src/modules/virtual/Loging2", + "active": false + }, + { + "path": "src/modules/virtual/Loging3", + "active": false + }, { "path": "src/modules/virtual/LogingDaily", "active": true }, + { + "path": "src/modules/virtual/LogingHourly", + "active": true + }, { "path": "src/modules/virtual/Math", "active": true @@ -42,6 +62,10 @@ "path": "src/modules/virtual/Timer", "active": true }, + { + "path": "src/modules/virtual/UpdateServer", + "active": true + }, { "path": "src/modules/virtual/Variable", "active": true @@ -56,17 +80,13 @@ } ], "sensors": [ - { - "path": "src/modules/exec/Pcf8591", - "active": false - }, { "path": "src/modules/sensors/A02Distance", - "active": true + "active": false }, { "path": "src/modules/sensors/Acs712", - "active": true + "active": false }, { "path": "src/modules/sensors/Ads1115", @@ -86,7 +106,11 @@ }, { "path": "src/modules/sensors/BL0937", - "active": true + "active": false + }, + { + "path": "src/modules/sensors/BL0942", + "active": false }, { "path": "src/modules/sensors/Ble", @@ -120,6 +144,10 @@ "path": "src/modules/sensors/DS2401", "active": false }, + { + "path": "src/modules/sensors/DscKeybus", + "active": false + }, { "path": "src/modules/sensors/Emon", "active": false @@ -184,12 +212,24 @@ "path": "src/modules/sensors/Mhz19", "active": false }, + { + "path": "src/modules/sensors/ModbusRTU", + "active": false + }, + { + "path": "src/modules/sensors/ModbusRTUasync", + "active": false + }, { "path": "src/modules/sensors/MQgas", - "active": true + "active": false }, { "path": "src/modules/sensors/Ntc", + "active": true + }, + { + "path": "src/modules/sensors/Pcf8591", "active": false }, { @@ -198,7 +238,7 @@ }, { "path": "src/modules/sensors/Pzem004t_v2", - "active": true + "active": false }, { "path": "src/modules/sensors/RCswitch", @@ -210,7 +250,7 @@ }, { "path": "src/modules/sensors/S8", - "active": true + "active": false }, { "path": "src/modules/sensors/Scd40", @@ -226,15 +266,15 @@ }, { "path": "src/modules/sensors/Sht20", - "active": true + "active": false }, { "path": "src/modules/sensors/Sht30", - "active": true + "active": false }, { "path": "src/modules/sensors/Sonar", - "active": true + "active": false }, { "path": "src/modules/sensors/UART", @@ -260,7 +300,11 @@ }, { "path": "src/modules/exec/Buzzer", - "active": true + "active": false + }, + { + "path": "src/modules/exec/EctoControlAdapter", + "active": false }, { "path": "src/modules/exec/Enconder", @@ -280,7 +324,11 @@ }, { "path": "src/modules/exec/IoTServo", - "active": true + "active": false + }, + { + "path": "src/modules/exec/IRremote", + "active": false }, { "path": "src/modules/exec/Mcp23008", @@ -288,11 +336,15 @@ }, { "path": "src/modules/exec/Mcp23017", - "active": true + "active": false + }, + { + "path": "src/modules/exec/MilightHub", + "active": false }, { "path": "src/modules/exec/Mp3", - "active": true + "active": false }, { "path": "src/modules/exec/Multitouch", @@ -304,7 +356,7 @@ }, { "path": "src/modules/exec/Pcf8574", - "active": true + "active": false }, { "path": "src/modules/exec/Pwm32", @@ -312,7 +364,7 @@ }, { "path": "src/modules/exec/Pwm8266", - "active": true + "active": false }, { "path": "src/modules/exec/SDcard", @@ -330,6 +382,10 @@ "path": "src/modules/exec/SysExt", "active": false }, + { + "path": "src/modules/exec/Tca9555", + "active": false + }, { "path": "src/modules/exec/Telegram", "active": false @@ -344,7 +400,7 @@ }, { "path": "src/modules/exec/Thermostat", - "active": false + "active": true }, { "path": "src/modules/sensors/Ds2423", @@ -354,11 +410,19 @@ "screens": [ { "path": "src/modules/display/DwinI", - "active": true + "active": false + }, + { + "path": "src/modules/display/GyverLAMP", + "active": false }, { "path": "src/modules/display/Lcd2004", - "active": true + "active": false + }, + { + "path": "src/modules/display/LedFX", + "active": false }, { "path": "src/modules/display/Nextion", @@ -374,16 +438,20 @@ }, { "path": "src/modules/display/Oled64", - "active": true + "active": false }, { "path": "src/modules/display/Smi2_m", - "active": true + "active": false }, { "path": "src/modules/display/TM16XX", "active": false }, + { + "path": "src/modules/display/U8g2lib", + "active": false + }, { "path": "src/modules/display/Ws2812b", "active": false diff --git a/data_svelte/items.json b/data_svelte/items.json index 8c476da9..5ea4dedb 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -19,7 +19,8 @@ "val": "*/15 * * * * *", "formatNextAlarm": "%H:%M:%S", "needSave": 0, - "num": 1 + "num": 1, + "moduleName": "Cron" }, { "global": 0, @@ -33,7 +34,10 @@ "num": 2, "int": 5, "logid": "t", - "points": 300 + "daysSave": 5, + "daysShow": 0, + "points": 300, + "moduleName": "Loging" }, { "global": 0, @@ -46,7 +50,10 @@ "descr": "Температура", "int": 0, "num": 3, - "points": 300 + "daysSave": 5, + "daysShow": 0, + "points": 300, + "moduleName": "Loging" }, { "global": 0, @@ -60,26 +67,47 @@ "num": 4, "int": 1, "logid": "t", - "points": 200, + "points": 365, "telegram": 0, "test": 0, "btn-defvalue": 0, - "btn-reset": "nil" + "btn-reset": "nil", + "moduleName": "LogingDaily" }, { "global": 0, - "name": "5. Math library", + "name": "5. График часового расхода", + "type": "Writing", + "subtype": "LogingHourly", + "id": "logh", + "widget": "chart3", + "page": "Графики", + "descr": "Расход в час", + "num": 5, + "int": 1, + "logid": "", + "points": 24, + "telegram": 0, + "test": 0, + "btn-defvalue": 0, + "btn-reset": "nil", + "moduleName": "LogingHourly" + }, + { + "global": 0, + "name": "6. Math library", "type": "Reading", "subtype": "IoTMath", "id": "math", "widget": "anydataValue", "page": "Математика", "descr": "", - "num": 5 + "num": 6, + "moduleName": "IoTMath" }, { "global": 0, - "name": "6. Погода OWM", + "name": "7. Погода OWM", "type": "Reading", "subtype": "owmWeather", "id": "owm", @@ -97,11 +125,12 @@ "round": 1, "val": "...", "debug": 0, - "num": 6 + "num": 7, + "moduleName": "owmWeather" }, { "global": 0, - "name": "7. Ping", + "name": "8. Ping", "type": "Reading", "subtype": "Ping", "id": "ping", @@ -115,11 +144,12 @@ "data_size": 0, "count": 0, "tos": 0, - "num": 7 + "num": 8, + "moduleName": "Ping" }, { "global": 0, - "name": "8. Таймер", + "name": "9. Таймер", "type": "Writing", "subtype": "Timer", "id": "timer", @@ -131,11 +161,27 @@ "ticker": 1, "repeat": 1, "needSave": 0, - "num": 8 + "num": 9, + "moduleName": "Timer" + }, + { + "global": 0, + "name": "10. Свой сервер обновлений", + "type": "Reading", + "subtype": "UpdateServer", + "id": "UpdateServer", + "widget": "", + "page": "", + "descr": "", + "btn-startUpdateAll": "http://192.168.11.112/iotm/esp8266_4mb/400", + "btn-startUpdateFS": "http://192.168.11.112/iotm/esp8266_4mb/400", + "btn-startUpdateFW": "http://192.168.11.112/iotm/esp8266_4mb/400", + "num": 10, + "moduleName": "UpdateServer" }, { "global": 0, - "name": "9. Окно ввода числа (переменная)", + "name": "11. Окно ввода числа (переменная)", "type": "Reading", "subtype": "Variable", "id": "value", @@ -149,11 +195,12 @@ "plus": 0, "multiply": 1, "round": 0, - "num": 9 + "num": 11, + "moduleName": "Variable" }, { "global": 0, - "name": "10. Окно ввода времени", + "name": "12. Окно ввода времени", "type": "Reading", "subtype": "Variable", "id": "time", @@ -163,11 +210,12 @@ "descr": "Введите время", "int": "0", "val": "02:00", - "num": 10 + "num": 12, + "moduleName": "Variable" }, { "global": 0, - "name": "11. Окно ввода даты", + "name": "13. Окно ввода даты", "type": "Reading", "subtype": "Variable", "id": "time", @@ -177,11 +225,12 @@ "descr": "Введите дату", "int": "0", "val": "24.05.2022", - "num": 11 + "num": 13, + "moduleName": "Variable" }, { "global": 0, - "name": "12. Окно ввода текста", + "name": "14. Окно ввода текста", "type": "Reading", "subtype": "Variable", "id": "txt", @@ -191,11 +240,12 @@ "descr": "Введите текст", "int": "0", "val": "текст", - "num": 12 + "num": 14, + "moduleName": "Variable" }, { "global": 0, - "name": "13. Вывод значения", + "name": "15. Вывод значения", "type": "Reading", "subtype": "Variable", "id": "vout", @@ -209,11 +259,12 @@ "plus": 0, "multiply": 1, "round": 0, - "num": 13 + "num": 15, + "moduleName": "Variable" }, { "global": 0, - "name": "14. Виртуальная кнопка", + "name": "16. Виртуальная кнопка", "type": "Reading", "subtype": "VButton", "id": "vbtn", @@ -223,45 +274,12 @@ "descr": "Кнопка", "int": "0", "val": "0", - "num": 14 + "num": 16, + "moduleName": "VButton" }, { "header": "sensors" }, - { - "name": "15. A02 Дальность", - "type": "Reading", - "subtype": "A02Distance", - "id": "dist", - "widget": "anydataCm", - "page": "Сенсоры", - "descr": "Дальность", - "int": 5, - "round": 1, - "tx": 17, - "rx": 16, - "line": 2, - "speed": 9600, - "num": 15 - }, - { - "name": "16. Acs712 Ток", - "type": "Reading", - "subtype": "Acs712", - "id": "amp", - "widget": "anydataAmp", - "page": "Сенсоры", - "descr": "Ток", - "round": 3, - "pin": 39, - "int": 5, - "rms": 1, - "vref": 5000, - "sens": 100, - "adczero": 512, - "btn-setZero": "nil", - "num": 16 - }, { "global": 0, "name": "17. AHTXX Температура", @@ -275,7 +293,8 @@ "addr": "0x38", "shtType": 1, "round": 1, - "num": 17 + "num": 17, + "moduleName": "AhtXX" }, { "global": 0, @@ -290,7 +309,8 @@ "addr": "0x38", "shtType": 1, "round": 1, - "num": 18 + "num": 18, + "moduleName": "AhtXX" }, { "global": 0, @@ -308,111 +328,12 @@ "pin": 0, "int": 15, "avgSteps": 1, - "num": 19 + "num": 19, + "moduleName": "AnalogAdc" }, { "global": 0, - "name": "20. BL0937 Напряжение", - "type": "Reading", - "subtype": "BL0937v", - "id": "bl_v", - "widget": "anydataVlt", - "page": "BL0937", - "descr": "Напряжение", - "int": 15, - "round": 1, - "num": 20 - }, - { - "global": 0, - "name": "21. BL0937 Сила тока", - "type": "Reading", - "subtype": "BL0937a", - "id": "bl_a", - "widget": "anydataAmp", - "page": "BL0937", - "descr": "Сила тока", - "int": 15, - "round": 1, - "num": 21 - }, - { - "global": 0, - "name": "22. BL0937 Мощность", - "type": "Reading", - "subtype": "BL0937w", - "id": "bl_w", - "widget": "anydataWt", - "page": "BL0937", - "descr": "Мощность", - "int": 15, - "round": 1, - "num": 22 - }, - { - "global": 0, - "name": "23. BL0937 Реакт.Мощность", - "type": "Reading", - "subtype": "BL0937reactw", - "id": "bl_reactw", - "widget": "anydataWt", - "page": "BL0937", - "descr": "Реакт.Мощность", - "int": 15, - "round": 1, - "num": 23 - }, - { - "global": 0, - "name": "24. BL0937 Активн.Мощность", - "type": "Reading", - "subtype": "BL0937actw", - "id": "bl_actw", - "widget": "anydataWt", - "page": "BL0937", - "descr": "Актив.Мощность", - "int": 15, - "round": 1, - "num": 24 - }, - { - "global": 0, - "name": "25. BL0937 Энергия", - "type": "Reading", - "subtype": "BL0937wh", - "id": "bl_wh", - "widget": "anydataWth", - "page": "BL0937", - "descr": "Энергия", - "int": 15, - "round": 1, - "num": 25 - }, - { - "global": 0, - "name": "26. BL0937 настройка", - "type": "Reading", - "subtype": "BL0937cmd", - "id": "bl_set", - "widget": "nil", - "page": "", - "descr": "", - "btn-reset": "", - "int": "5", - "R_current": 0.001, - "R_upstream": 1000000, - "R_downstream": 1000, - "CF_GPIO": 4, - "CF1_GPIO": 5, - "SEL_GPIO": 12, - "kfV": 0, - "kfA": 0, - "kfW": 0, - "num": 26 - }, - { - "global": 0, - "name": "27. BME280 Температура", + "name": "20. BME280 Температура", "type": "Reading", "subtype": "Bme280t", "id": "Tmp3", @@ -422,11 +343,12 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 27 + "num": 20, + "moduleName": "Bme280" }, { "global": 0, - "name": "28. BME280 Давление", + "name": "21. BME280 Давление", "type": "Reading", "subtype": "Bme280p", "id": "Press3", @@ -436,11 +358,12 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 28 + "num": 21, + "moduleName": "Bme280" }, { "global": 0, - "name": "29. BME280 Влажность", + "name": "22. BME280 Влажность", "type": "Reading", "subtype": "Bme280h", "id": "Hum3", @@ -450,11 +373,12 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 29 + "num": 22, + "moduleName": "Bme280" }, { "global": 0, - "name": "30. BME280 Tочка росы", + "name": "23. BME280 Tочка росы", "type": "Reading", "subtype": "Bme280dp", "id": "Dew3", @@ -464,11 +388,12 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 30 + "num": 23, + "moduleName": "Bme280" }, { "global": 0, - "name": "31. BMP280 Температура", + "name": "24. BMP280 Температура", "type": "Reading", "subtype": "Bmp280t", "id": "tmp3", @@ -478,11 +403,12 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 31 + "num": 24, + "moduleName": "Bmp280" }, { "global": 0, - "name": "32. BMP280 Давление", + "name": "25. BMP280 Давление", "type": "Reading", "subtype": "Bmp280p", "id": "Press3", @@ -492,11 +418,12 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 32 + "num": 25, + "moduleName": "Bmp280" }, { "global": 0, - "name": "33. DHT11 Температура", + "name": "26. DHT11 Температура", "type": "Reading", "subtype": "Dht1122t", "id": "tmp3", @@ -506,11 +433,12 @@ "int": 15, "pin": 0, "senstype": "dht11", - "num": 33 + "num": 26, + "moduleName": "Dht1122" }, { "global": 0, - "name": "34. DHT11 Влажность", + "name": "27. DHT11 Влажность", "type": "Reading", "subtype": "Dht1122h", "id": "Hum3", @@ -520,11 +448,12 @@ "int": 15, "pin": 0, "senstype": "dht11", - "num": 34 + "num": 27, + "moduleName": "Dht1122" }, { "global": 0, - "name": "35. DS18B20 Температура", + "name": "28. DS18B20 Температура", "type": "Reading", "subtype": "Ds18b20", "id": "dstmp", @@ -536,11 +465,12 @@ "index": 0, "addr": "", "round": 1, - "num": 35 + "num": 28, + "moduleName": "Ds18b20" }, { "global": 0, - "name": "36. Аналоговый счетчик импульсов", + "name": "29. Аналоговый счетчик импульсов", "type": "Writing", "subtype": "Impulse", "id": "impulse", @@ -553,166 +483,36 @@ "pinMode": "INPUT", "debounceDelay": 3, "multiply": 1, - "num": 36 + "count": 0, + "timeORcount": 0, + "num": 29, + "moduleName": "Impulse" }, { "global": 0, - "name": "37. MQ газовые анализаторы", + "name": "30. Cенсор температуры NTC", "type": "Reading", - "subtype": "MQgas", - "id": "MQ", - "widget": "anydataPpm", + "subtype": "Ntc", + "id": "Ntctmp", + "widget": "anydataTmp", "page": "Сенсоры", - "descr": "MQ-135", - "Series": 135, - "Gas": "CO2", - "Rl on board": 10, - "Ro in clean air": 0, - "Rl/Ro in clean air": 0, - "PPM in clean air": 397.13, - "aLimit": -0.42, - "bLimit": 1.92, - "Warm up time": 60, - "Sample interval": 20, - "Sample times": 10, - "Calibtation intensity": 5, - "autoCalibration": 1, - "autoCalib.Period": 24, - "TempHum correction": 1, - "temperature": 20, - "idTempSensor": "", - "humidity": 50, - "idHumSensor": "", - "k1": 0.00672096284322792, - "k2": -0.0159038179354688, - "b1": -0.741244323718154, - "b2": 1.77535862501753, - "Debug": 1, - "plus": 0, - "multiply": 1, - "round": 1, - "pin-Esp32": 34, - "operating voltage": 3.3, - "int": 15, - "num": 37 - }, - { - "global": 0, - "name": "38. PZEM 004t Напряжение", - "type": "Reading", - "subtype": "Pzem004v", - "id": "v", - "widget": "anydataVlt", - "page": "PZEM", - "descr": "Напряжение", - "int": 15, - "addr": "0xF8", - "round": 1, - "num": 38 - }, - { - "global": 0, - "name": "39. PZEM 004t Сила тока", - "type": "Reading", - "subtype": "Pzem004a", - "id": "a", - "widget": "anydataAmp", - "page": "PZEM", - "descr": "Сила тока", - "int": 15, - "addr": "0xF8", - "round": 1, - "num": 39 - }, - { - "global": 0, - "name": "40. PZEM 004t Мощность", - "type": "Reading", - "subtype": "Pzem004w", - "id": "w", - "widget": "anydataWt", - "page": "PZEM", - "descr": "Мощность", - "int": 15, - "addr": "0xF8", - "round": 1, - "num": 40 - }, - { - "global": 0, - "name": "41. PZEM 004t Энергия", - "type": "Reading", - "subtype": "Pzem004wh", - "id": "wh", - "widget": "anydataWth", - "page": "PZEM", - "descr": "Энергия", - "int": 15, - "addr": "0xF8", - "round": 1, - "num": 41 - }, - { - "global": 0, - "name": "42. PZEM 004t Частота", - "type": "Reading", - "subtype": "Pzem004hz", - "id": "hz", - "widget": "anydataHtz", - "page": "PZEM", - "descr": "Частота", - "int": 15, - "addr": "0xF8", - "round": 1, - "num": 42 - }, - { - "global": 0, - "name": "43. PZEM 004t Косинус", - "type": "Reading", - "subtype": "Pzem004pf", - "id": "pf", - "widget": "anydata", - "page": "PZEM", - "descr": "Косинус F", + "descr": "NTC Температура", + "needSave": 0, + "val": "0", "int": 15, - "addr": "0xF8", + "pin": "35", + "R1": "10000", + "R0": "10000", + "Beta": "3950.0", + "T0": "25", + "Vs": "3.3", "round": 1, - "num": 43 - }, - { - "global": 0, - "name": "44. PZEM настройка", - "type": "Reading", - "subtype": "Pzem004cmd", - "id": "set", - "widget": "nil", - "page": "", - "descr": "", - "int": 15, - "addr": "0xF8", - "btn-changeaddr": "0x01", - "btn-reset": "", - "num": 44 - }, - { - "global": 0, - "name": "45. PZEM uart", - "type": "Reading", - "subtype": "Pzem004uart", - "id": "upzem", - "widget": "nil", - "page": "", - "descr": "", - "tx": 17, - "rx": 16, - "line": 2, - "speed": 9600, - "num": 45 + "num": 30, + "moduleName": "Ntc" }, { "global": 0, - "name": "46. Часы реального времени", + "name": "31. Часы реального времени", "type": "Reading", "subtype": "RTC", "id": "rtc", @@ -728,91 +528,11 @@ "int": 5, "btn-setUTime": "0", "btn-setSysTime": "nil", - "num": 46 - }, - { - "global": 0, - "name": "47. (S8) Cенсор качества воздуха", - "num": 47, - "type": "Reading", - "subtype": "S8co", - "id": "s8co", - "widget": "anydataPpm", - "page": "Сенсоры", - "descr": "S8_CO2", - "int": 15, - "round": 1, - "rxPin": 13, - "txPin": 15 - }, - { - "global": 0, - "name": "48. Sht20 Температура", - "type": "Reading", - "subtype": "Sht20t", - "id": "tmp2", - "widget": "anydataTmp", - "page": "Сенсоры", - "descr": "Температура", - "int": 15, - "round": 1, - "num": 48 + "num": 31, + "moduleName": "RTC" }, { - "global": 0, - "name": "49. Sht20 Влажность", - "type": "Reading", - "subtype": "Sht20h", - "id": "Hum2", - "widget": "anydataHum", - "page": "Сенсоры", - "descr": "Влажность", - "int": 15, - "round": 1, - "num": 49 - }, - { - "global": 0, - "name": "50. Sht30 Температура", - "type": "Reading", - "subtype": "Sht30t", - "id": "tmp30", - "widget": "anydataTmp", - "page": "Сенсоры", - "descr": "SHT30 Температура", - "int": 15, - "round": 1, - "num": 50 - }, - { - "global": 0, - "name": "51. Sht30 Влажность", - "type": "Reading", - "subtype": "Sht30h", - "id": "Hum30", - "widget": "anydataHum", - "page": "Сенсоры", - "descr": "SHT30 Влажность", - "int": 15, - "round": 1, - "num": 51 - }, - { - "global": 0, - "name": "52. HC-SR04 Ультразвуковой дальномер", - "num": 52, - "type": "Reading", - "subtype": "Sonar", - "id": "sonar", - "widget": "anydataTmp", - "page": "Сенсоры", - "descr": "Расстояние (см)", - "pinTrig": 5, - "pinEcho": 4, - "int": 5 - }, - { - "name": "53. UART", + "name": "32. UART", "type": "Reading", "subtype": "UART", "page": "", @@ -824,14 +544,15 @@ "line": 2, "speed": 9600, "eventFormat": 0, - "num": 53 + "num": 32, + "moduleName": "UART" }, { "header": "executive_devices" }, { "global": 0, - "name": "54. Аналоговая кнопка", + "name": "33. Аналоговая кнопка", "type": "Reading", "subtype": "AnalogBtn", "id": "abtn", @@ -841,11 +562,12 @@ "pin": 34, "aValue": -1, "delta": 50, - "num": 54 + "num": 33, + "moduleName": "AnalogBtn" }, { "global": 0, - "name": "55. Кнопка подключенная к пину", + "name": "34. Кнопка подключенная к пину", "type": "Writing", "subtype": "ButtonIn", "id": "btn", @@ -860,11 +582,12 @@ "debounceDelay": 50, "fixState": 0, "inv": 0, - "num": 55 + "num": 34, + "moduleName": "ButtonIn" }, { "global": 0, - "name": "56. Управление пином", + "name": "35. Управление пином", "type": "Writing", "subtype": "ButtonOut", "needSave": 0, @@ -875,34 +598,12 @@ "int": 0, "inv": 0, "pin": 2, - "num": 56 + "num": 35, + "moduleName": "ButtonOut" }, { "global": 0, - "name": "57. Пассивный звуковой извещатель", - "type": "Writing", - "subtype": "Buzzer", - "id": "buzzer", - "widget": "toggle", - "page": "Кнопки", - "descr": "Buzzer", - "int": 4000, - "pin": 14, - "freq": 2000, - "duration": 1000, - "beatLevel": 4, - "tempo": 120, - "tempoCorrection": 1, - "pauseBetween": 0, - "transpose": 0, - "cycle": 0, - "indication": 1, - "val": 0, - "num": 57 - }, - { - "global": 0, - "name": "58. Энкодер", + "name": "36. Энкодер", "type": "Writing", "subtype": "Encoder", "id": "enc", @@ -915,56 +616,12 @@ "step": 1, "stepOnPress": 5, "pins": "4,5,2", - "num": 58 + "num": 36, + "moduleName": "Encoder" }, { "global": 0, - "name": "59. Сервопривод", - "type": "Writing", - "subtype": "IoTServo", - "id": "servo", - "widget": "rangeServo", - "page": "servo", - "descr": "угол", - "pin": 12, - "minPulseWidth": 544, - "maxPulseWidth": 2400, - "minAngle": 0, - "maxAngle": 180, - "trackingID": "", - "num": 59 - }, - { - "global": 0, - "name": "60. Расширитель портов Mcp23017", - "type": "Reading", - "subtype": "Mcp23017", - "id": "Mcp", - "widget": "", - "page": "", - "descr": "", - "int": "0", - "addr": "0x20", - "index": 1, - "num": 60 - }, - { - "global": 0, - "name": "61. MP3 плеер", - "type": "Reading", - "subtype": "Mp3", - "id": "mp3", - "widget": "", - "page": "", - "descr": "", - "int": 1, - "pins": "14,12", - "volume": 20, - "num": 61 - }, - { - "global": 0, - "name": "62. Сенсорная кнопка", + "name": "37. Сенсорная кнопка", "type": "Writing", "subtype": "Multitouch", "id": "impulse", @@ -978,41 +635,31 @@ "pinMode": "INPUT", "debounceDelay": 50, "PWMDelay": 500, - "num": 62 + "num": 37, + "moduleName": "Multitouch" }, { "global": 0, - "name": "63. Расширитель портов Pcf8574", - "type": "Reading", - "subtype": "Pcf8574", - "id": "Pcf", - "widget": "", - "page": "", - "descr": "", - "int": "0", - "addr": "0x20", - "index": 1, - "num": 63 - }, - { - "global": 0, - "name": "64. PWM ESP8266", + "name": "38. PWM ESP32", "type": "Writing", - "subtype": "Pwm8266", + "subtype": "Pwm32", "id": "pwm", "widget": "range", "page": "Кнопки", "descr": "PWM", "int": 0, - "pin": 15, + "pin": 2, "freq": 5000, + "ledChannel": 2, + "PWM_resolution": 10, "val": 0, "apin": -1, - "num": 64 + "num": 38, + "moduleName": "Pwm32" }, { "global": 0, - "name": "65. Телеграм-Лайт", + "name": "39. Телеграм-Лайт", "type": "Writing", "subtype": "TelegramLT", "id": "tg", @@ -1021,74 +668,92 @@ "descr": "", "token": "", "chatID": "", - "num": 65 + "num": 39, + "moduleName": "TelegramLT" }, { - "header": "screens" + "global": 0, + "needSave": 0, + "name": "40. Термостат Гистере́зис ", + "type": "Writing", + "subtype": "ThermostatGIST", + "id": "Thermo", + "widget": "anydataDef", + "page": "Климат", + "descr": "термостат", + "int": 60, + "round": 1, + "set_id": "", + "term_id": "", + "term_rezerv_id": "", + "gist": 0.1, + "rele": "", + "direction": 0, + "num": 40, + "moduleName": "Thermostat" }, { - "name": "66. LCD Dwin экран", - "type": "Reading", - "subtype": "DwinI", - "id": "dwin", - "widget": "", - "page": "", - "descr": "", - "tx": 17, - "rx": 16, - "line": 2, - "speed": 9600, - "btn-uploadUI": "", - "num": 66 + "global": 0, + "needSave": 0, + "name": "41. Термостат PID", + "type": "Writing", + "subtype": "ThermostatPID", + "id": "Thermo", + "widget": "anydataHum", + "page": "Климат", + "descr": "термостат", + "int": 60, + "round": 1, + "map": "1024,1024,1,100", + "set_id": "", + "term_id": "", + "rele": "", + "setDirection": 0, + "setLimitsMIN": 0, + "setLimitsMAX": 100, + "KP": 10, + "KI": 0.02, + "KD": 8, + "num": 41, + "moduleName": "Thermostat" }, { "global": 0, - "name": "67. LCD экран 2004", - "type": "Reading", - "subtype": "Lcd2004", - "id": "Lcd", - "widget": "inputTxt", - "page": "screens", - "descr": "LCD Экран", - "addr": "0x27", - "size": "20,4", - "coord": "0,0", - "id2show": "", - "prefix": "", - "postfix": "", - "num": 67 + "needSave": 0, + "name": "42. Термостат ЭТК", + "type": "Writing", + "subtype": "ThermostatETK", + "id": "Thermo", + "widget": "anydataTmp", + "page": "Климат", + "descr": "термостат", + "int": 60, + "round": 1, + "iv_k": 1, + "outside_id": "", + "num": 42, + "moduleName": "Thermostat" }, { - "name": "68. LCD экран 1602", - "type": "Reading", - "subtype": "Lcd2004", - "id": "Lcd", - "widget": "inputTxt", - "page": "screens", - "descr": "LCD Экран", - "addr": "0x27", - "size": "16,2", - "coord": "0,0", - "id2show": "", - "prefix": "", - "postfix": "", - "num": 68 + "global": 0, + "needSave": 0, + "name": "43. Термостат ЭТК2 ", + "type": "Writing", + "subtype": "ThermostatETK2", + "id": "Thermo", + "widget": "anydataTmp", + "page": "Климат", + "descr": "термостат", + "int": 60, + "round": 1, + "set_id": "", + "term_id": "", + "iv_k": 1, + "outside_id": "", + "num": 43, + "moduleName": "Thermostat" }, { - "global": 0, - "name": "69. OLED экран 64 8266", - "type": "Reading", - "subtype": "Oled64", - "id": "Oled", - "widget": "inputTxt", - "page": "screens", - "descr": "OLED Экран", - "addr": "0x3C", - "coord": "0,0", - "size": "1", - "id2show": "", - "prefix": "", - "postfix": "", - "num": 69 + "header": "screens" } ] \ No newline at end of file diff --git a/data_svelte/settings.json b/data_svelte/settings.json index 14c4c94a..46072a98 100644 --- a/data_svelte/settings.json +++ b/data_svelte/settings.json @@ -2,15 +2,15 @@ "name": "IoTmanagerVer4", "apssid": "IoTmanager", "appass": "", - "routerssid": "iot", - "routerpass": "hostel3333", + "routerssid": "HomeNET", + "routerpass": "Wi73Jktu0205", "timezone": 2, "ntp": "pool.ntp.org", "weblogin": "admin", "webpass": "admin", - "mqttServer": "", - "mqttPort": 8021, - "mqttPrefix": "/risenew", + "mqttServer": "192.168.88.10", + "mqttPort": 1883, + "mqttPrefix": "/IoTmanager", "mqttUser": "rise", "mqttPass": "3hostel3", "serverip": "http://iotmanager.org", @@ -18,11 +18,17 @@ "log": 0, "mqttin": 0, "i2c": 0, - "pinSCL": 0, - "pinSDA": 0, + "pinSCL": 9, + "pinSDA": 8, "i2cFreq": 100000, "wg": "group1", "debugTraceMsgTlgrm": 1, "udps": 1, - "settings_": "" + "settings_": "", + "wifirep_apchanel": 7, + "wifirep_apip": "192.168.4.1", + "wifirep_staip": "192.168.1.160", + "wifirep_netmask": "255.255.255.0", + "wifirep_gateway": "192.168.4.1", + "wifirep_dns": "192.168.4.1" } \ No newline at end of file diff --git a/iotm/esp32_4mb3f/400/firmware.bin b/iotm/esp32_4mb3f/400/firmware.bin new file mode 100644 index 0000000000000000000000000000000000000000..9b2b3570599b624b3ca5e571375ef3d315bc3504 GIT binary patch literal 1265344 zcmc${4V+}xRoHoD3v6bk(MSBCxRe#6sn>ao?F+LhbE)-jycg!0f9Y3m3w%DOkx!Kwb)5L#2_sYs6 zfAyb!;)8$ZYjfw9|I^u548P+GfAWu?TE6$Oo4)w>-udyjeKel-#dtnk8a`YdKKy`p z_}s+dxrxJBldHE174Puy*vjQe?}xpartgPu0}^}q@DUe1SFUaQayT%f8;3_vY?#A= z$4jkH_02(V>sPP6^V*MHdt&P|TfZkyTOZx}jOT4V!|yZ1KDYIITc0Lo>-V=l&g;jw zewRe|nGMD~{S%!DWZ4hQ?Tenkqq_LCI&>8)qB7x&Js zPi&EzlvA0dQL@>mG5d5bmCV?u++uPnCF%M#{bg@?)NmebyLV}9&uG3hV;O6ancVc+ zfnV~5PJ2t))M93FVJ1DB8X0a>3ayoTvs$i?Gz!Jbg;hToY1QkM;##3x8`^03wV*J> z5l1nA^H~ABYwrX?KWesqg&&Fd z%+^N){uE@N^G4SEN@LnzZm)V%isf%4HGO79L^!(X8#iwT;==zkN-=2MGemXUio~N2vd#Bd?;^lH})r&@Ecz9nt z!9uIx1ugoa3n%_1*=Ts>z`IhYluLtN({osq!5O}q^*Yu0^X2}B-FmP!pz z9%?c;p!xv z&loRh%;zUf;_Lum0ZtxBmA3`b({Bi*fOa6~EAw<`wI;mGbI7W1~wzX3O`= zbw(z!drDW)T+Yjt`S08J&GEIM_ zykVO4ddrO1w&j-#mu&(UVP776*o*{4zeY#v!>tXHR|=c;wwt?=a;@ZV46n7S6+>?; zzBxH!vYP?@HVcc>sYL^@umV@=?OMq*Zu>SDlZ*2#oP#FmRSJ)9dIKwLbC1hNR_gVJ zSFJNnt+hhUGhQ_~;st&&0>NdUk<;Q1dKb&BH7`AV$_#b=W3@EtbXOcNJ*hgM%}jc6 zjwYqN`Q%(mH!~B%S)I?U^DMZ-^UTH6q!+!}9Ft4w*=aAAb|nyLmRqJ#u4SiY^=CS1 z%Hu^g^vC2^g2&gutAnzd<&yNiRImAFnMsjh$TteLaxq_I=pbUGys3r76o2Mt(r3K_ zeUhRBZq8H4^14ZudK-Cc zSF~%#TFP7(Agkyjd-x-i%7{s^tJGz=O{~g8`o;20Im{_2 zT`OKS7O^$`fAy=8j#e>{1bi2lUCmdq3wa@A*TZ89BTOkEtNRrSZTxLSQ(=U%qG*ArgreqYz~E8n)o zz4rC5<3IhAfugFHfb&)%xE$E#UMMu7E~-^8c-*{MHt}>VXs@i4i)GfQx6C8MEpsP0 ziHRCBnT3m~MQ>r=q%P%Bi}T4@FO!}(*@c;$V&276HkISsR4OCnnK$BPlJn^)lb$E_ z;!-B(T}l!Xot@?H+`@FqOfD{5oL^YVne23W z!OSmsbE)J!fRoIabUl}5s|w7TUuc+iqg9nZ>t>~5mIX;J*UY;7URW-)yheSUPO%&m z+nQ{Br6rWCL%yZ*YFRipnF%xNuNI1%-bJCCOZC;Ak_bq7*^2zN*t@HMMMdb#oAhIf z?NE@nEFHn}UFmXwP18HuthXDZyH*!VIJRrT#oScqyKP2SjZAc_*$xCPw0!n?r6O(1 zVCvX#fM{)xYpz8043$LfP>n=`zLJ@Y$D`{m9i2n(J8@h(G!bQQmS+!WI`TSYgt07YJb;-qj#UO}miQ}>Ki>cv6@e*7M<>bKVF zrBnB07P7f}PM@q4mi-D;Nb}S^Y>7a~J*Vw{=_O%@Ah{<_LMD;s^vSYd2~Q}zQ}?vk z8}IRC$Bgm`_1@-nt<`EwjEs!kKR!Hm--+R|;qi&%$45u0D_#H_WwlHZF4K~3kfa%r zcAqv<{)p0IKXOQFWdAXp z$|Y03Y+DH{$|w6lwmbtjVYYq=dBaCl1_9T%^>GhDf(jkp4TJc5Tb~r+fh2kc5yLaQ zBC!zO`eWCgxb`ldKC$(jcdaYwFJF5PMSR4H9kldk9XI(5LXgi;j1zl2BlQsVoY{)y zvBm#BB8_)a^wzV~_35ooU;F86KTa~sn$p})s*vP4X|A+J+fThJIoUa#2vJnl@*b&w zhbrS`JcraJWQ04lUHe&6s;}27@LDE58+8b{)(}h7FI3HNk%3j9kO%1buB49^t`vl5 zYqZR8qqb_wRo2mnJPogwSKO;S4L{llzdqXV!^e%GGUS69-VoAX08bu<8>N-5N;ZZh zX87@PqbFKohF2f&iCvZGv$7KiZ#3Zv#ObtL-X#PQZ(j z?-OR92kX6*nlOkh)=ohNmdY*RP)sJ7JLe@A&w6v|Y?htEOeUwnL9t7Ui4;?L{FQk#Z)qv3g0ASc5%uOJk2)0kn?61VDQZ%BsnaA%chl^i;L+_ z-otF6fmcv^W}g9Bv@6gcE1=72{faOFO6VM>Lx)TIOqklzDo`IgW{JMSY}$O%Lb{qY z&B%0tY!4c9vq1f2ng8)apuFw$K+d>T9~JX_U0r_a@^{>hO7n}HU5 zQa6Iwp76t-Fk5u*)KYF{=tNh;*#B%3vj-ucW>Y|GG&#yvc8`Oyx;hk-B7^T5jYy0o zqhWdC?g8oU{SH{vX4?AbwVwt@eg^dVX^Ts>$F{<*5@mGuFc97Kb~c6`kt?!m5kG3G zkIKek=fDXs9jkGJGZBY`&VZY)cCi6o`>`EbwDo)1fcd(sI@s&layUGCtfb_$3h$t#kw@9b2M@O&_7txpeASofScSyVRtZJhA`pgSSz*ACbk*Q; z^h+=p<35S2L$3&%v94@}m1`?kEzGiQzZq$iukxpU)no+4+JeB8?R{oMJ`@ln2Ui^{ zJIw;yWcQFbq+=qY;G2_*@gPz?hadFuQ8Th$F0J}47inLNm70NI1fiG_cG6nCNcL8{ zzFDa7P%k$NbkUV9orS8tYO)A$Md&H`Yb02OJA^nRxd>kP3HZ#9V9=|u(WBttSPl_1 zIO!^hT0vPV3REB`nFPy`ZR_Vm+8#U5QOX9)Yu>g&|$ zi`j01#hwU71qczw+STGMVI)|UCQ*H(Srnv#&6L%^r& z%LsHqQ;KN%A}HfQq_8p~mj9OsONCxFkqjWX;#ZK!BK;clfUx;GZ9;k)tV-KjGLR!G z1>l#rW-MpOdzDKhRiI^_J#bqAc}c~ut+v)I80oi_W?@yR5l>hnD=pgTs~n{0KDEQg z9imuXHH2ufFUSpPxB#R@oHIBk%p#qU$Zy^kPe%I~{foV-hT#{J5(3<9SC z3KNb)wW4qsT^TKhceieOHph){&gX0XpJ$nk+9-B2{|urI(n z!%WPucqHYZrnV~u5wA)p7QyHSffyo3eRRZ?lx8fd-@y5?Kta5aVV0KXZhou z^6t^@)><+V^ANkG`XmBD*Y29g__lsk`NL0o$_B!UUVGAm%6W$Qm8g$zeL`@5`0q=v z-=Fvf;Y+XEpGeHUCUK4setVYq&&&56zTHgxU4)yx{fSIZz83LM6TWtEdznuSv2F+( ziS6IMI=DYE$hSMw+rJG`-XnxpPup+LQg7JK1bMC!24eL!H%!oAaT@_`)8HVjRjJuu z`}dr`5$2cQuTtk<6Tb15*CbBP97t5?)5)m=36JLwr4A%={I-ZYaP~mrJ&)d=2=l(- z&HEE42)7VqO@3|myN?InL%RwWMAXBgLSSW*x&S9zwXl`Od^ra$CJ4T|dSU;|g0Cjq zt(F`i8IDW=aKAV!7+j98=ISMB`!Yzn=ui6y;$Z|g;0wSS>G=%eRsEaKEX~d?Az76u zeVIo38g=sNOZyYg62AH1cAWh6i#LXo4duKLoNW8Jfb1U94gq@9I37+u%vvGH98?PX z6I=NXtPBu;BYVad-}b`VCx?Ot$!bIYEYvuw1x2PfXAo^C_nYS|7>r{h^9b73I&bpn zT=%zgu}*%OetnbhrIqb-@ZH)MGZ*J949y7%(5knKYbL*}z^5REnC}CkM}$c386i}y zXzf`Q4gSv7C$7CK)}MzS-JfU>9;v;I{aLRfU*#10F@s`-9L&^MHuN&j>%YHJjO-aWd)( zhi60V_af;XhWN8Wm6lV-8E&jKL~((#T0=QeY>0~|H-^^N*M~$}J=AVOJ_}5j43DRz z@Bj%ogESnK#c>(Z3?xO;KF*l~#7k$SVfk|Dl(}0(Pp8bup{SACXfy&KT8BI$?SEj+Aa^z@Jn4$Cq70RUE2+`Z;CVvo&7%Qe0H>QMb-W9C|4$2F4HO{!YgVJ*rvEtPp}ek&fUyZoLek19 zuMljVq00c+UjBS$LjI=p?=*j*K$N=K1(~ydsrW|;R`B+l&T#1q<@LgGd5CsA z<=XPdJ6@i)pf8~s7(iJqkVDmTIZow+%|RekR51e7^3WF)rbgMWSTfl98mb{^grKM4 zC8y30IxgRd;|4v|eyI(@%aeVbg%EfH=%}^P^;3fW2ua$)>Z4wy$G1TR{@ojhs+Qv^ zPR8NPSYSs`u{)QW5Q&9T%Rr~l3#tWF7==l;OqX(aFL_I}A)?O#V_Wj37N<^V->Y(t z-)W%457II?_7${RM5!-2B1J!-f==G1^l5yK%V&S-Wok>|%4!x8nNd_mDp@Lq z%`=aD5IGIu>0jTU_|~tzJneInI$8C{PmD%$Y+u*HDYvhU?$=Ty>Ie@5A4V=mka_70fNOLEoV>;$>dueD za}WfcZvNQI)K&-JCuv8KO(`VaOe-at^;{GVT*HVZMdu&656CJh-NviR`d;OCKR5-R`O%O_`895a(X;=|mi zSsXPN0yEz#A`34fb~fJN1v&B5r=0x6{(b6sWLX3m+i(5R%QLp3lh;BYT{xd5Jxw4+ zWZ`0vCYn{EJM~HUM~u>}%*P!gUi(?gQ6X#BY+Jub0#Ob46p1C92#7>QOG^@7(P@uG z`OSJESz0?+t_GWP(+`+JwNXvZW#&w_ja;*qYx@`dQf{q1(=2BTtv45HGyd{ip_yzn z=L(x|Zr9%2t|Z&5S-*if;e7qdv=6ay(<^TNp6`9-kN)VHGq3;lkG}I=KmL;LPkfdjaQ1cL zzxn5T;|VL&-yr>7&fK1*-rdgJ@^U^jEPwK1uOdb(rw(bvDYKMZ%o#n`bTgyJ4l^?| zVMqCWg0Xu)Av`ZQ@wL76;dP*I<7a22Q^{-+_i}D-9I1QR)fD$|=VYT?ZCAH_my=p#k(M{DayGwHBA7fZ z#KNL%(-C4K8m(4gZ_%ISs~Uh|L4fWb;!?U^m1FWX;gyJKR3(8-T2fE@p06ow?M z&NtQp=k)WO%EZquyW(jncqdBB3H&lm;nd!a?qDpVZ6I(JAYYRt_k~jsmRObZUr~(~ zycb4_iGquoSy(V{M*n^$HEHIOizb;_a<; zZ4T3c+)~Qq&Mldl#k9$SL5;cNbmGhp5MD!g9pMn+Zo(T0!-R3deS`_ZX~HC7hVW*> zJmD|inmn_}?*+nJ2_u!&(g?>~D-0X!W(bo;#KN%gV$HZx5LHe6!iJnHjjp5XOvdEkNrn3ir^}ubqr`$aMnna26 zWq$#V*G7yTHBs0=$0nRa`?_rwdp=)x)?6`rnKqa7dh_=7!O)^&?WwaTW8vj_um$AQluD0XiKd zE806W@gVkV3LwjzrU~{FOGZT_%tJ*i^~9#RdmY8C;C|%L21Xi#hc?If8B#My?=Z(y zKAKjlQ3=K`u=Aj-@0~jB)p3LYJ{Ir{!2Kw#SR3S$0|C?{`4=XQr&9!`A5MGYn8PUY z?i6D`vj8ra8x2nCEJUTm3bWIZzA&)$0a?4QyVsk3ht=>$Al>P=EdF~$46z(to=5xGEL}ThS*c5oU{Cv*yDQ< z7@Kb#zb!FvpM~SuOBRlAN!+G-X;;T?4358g;kN72T%S94TVi(nw!~|J;}285z;W1` zle8n}+VVW@`cCAFm1E?m{2S4c%N@Nfk*??Fz{xRUfu$n)aWFzc3u1NvX%rk3a#qyR zlu<%SD_xT(Yn^Cf9t~_N%{~n2XZ5)d>Z3wjl5(wLbEn|pa4_W8zb$bmL2!(WQ*Mp% z`Y!7XW@J_G!#o|99*u!j*`ZqOIpt#Di5WX%B6i!*pHP(nCn#!HYohasK{Pg98rEKb z5}=NxsdBC@I%yPJE>;_ya6Wd*a8v<_Vh_NLhl>HCBso7QKTGxcXTl2)FV;AT_H@La zZ`_txt1~{A886Ok@~R}>st5Yj{z+W9EpdtP?!dy`&8_eLcnXx<6QDS+#)$$~RtAwq zvsx{Xr&0I=xUfamr>5WFRHxI4ryjp8@j-&X#Pb`sCAK!d`+ZO%#oB*hTL*Us!D(M- zvR!W%jg8K#Sz^?QZ(hAE@#?pC;QBjR=l%B1lhm;rUw*+VUPWyxy#w4ukZ~OVH^tlZ z3~jv;-t%*$e<8dlcFbi}pom&!%o~36w!{g7v}?4dU7^m$OMS*(Q-!W1On+U#w+V~i z^5iKi6t7^hi@+$VAeP#RS8>R=3J*K{1bxp?gL?JJKr2S@etYp6ND^LD14>dD7PB^L&ALOAXUw+Mu9wYXC zjr}biYG!OyUw(rJUTgus&I2zt^KbG{Ghg|ocUz7N6GzeizzhP#QaE=`Y(r%xQ8yA( zH`knML2dL$1fPwJ4<8?K@n=AlcegYin|;r1iKhty-%tGdZHX@f>)-7?ZbnE=u7(kW&6PjRYpq7BTCkWgs@Vwkgwu> zXxXI4ry!BlJ(1PN$G%_ABSfq-x?#M7j&N{NsP38cA8Ot;f1egC<~TsM z*hH#^y*lEMjU0+UicL0~sL)Cpt9dU^b3THY1?89FgH<^6u=k*O7+$o_MB-VXvTE}6 zT1r1HzBcRfVjXg44oE04QUcXC2!8hmB(bQ3JlsU-3vc~Vm;NrE;Q7L z9;72C^Tehzlprs_8-zhwH`RI@T*uO&85bA=7B0KJHhl7JQz#4k{k2qCjw zW`hxlY+ccuVLCe{+i9H>3YiuBtDs9ddrFbO|v7D@Vt%zguoXJm5j^ zB9l6T!MHvQ7aI+XvhHg?{9x+g2eHN$qsPO+z>x_ngUwwEy`!kq&u`u;He7v^FYY-x zQ#9=)l-cQ|2NNL@SI=7Jc)}$$*lr7zzV*cmn8G{D4HvMHMJCZ$14~T-S}lJLC8`Yv zQhjTM?8bmt&_$uBa(!5q;^n@{MX#(-q4<(`D?CWvX9J)r78@k znm--Ha@cym!&a$py?XB8+yPw=;BT~z;eK5L4*)-$Hx$O~UV*?zoEp z(Y*Lc!{MA&c4SO+XT=O_x7?C(#~c_lT{Z%n*iMTvU2G81(=NqF&ukk{IS!r@*q5aC zvk75SFpLF7BS6p6jMHXzXHi3Gp1;|CIhJcnN&BJQ>B+tp(S5)JwGwoiSfaOTh7^#|{Nhxe<0 z`}(B$r62mt%%Ayx{p9WcZ2Vtc{L6@Qe$V8A#Pfu`+G`a=nxDr(qG0f z@MRZF?Wj%mEM1f8_zH*+!9ON~;lGF8!gvrK$zpSM(e5ufo?lJ4i*SMvANMfd=W+)U z-y&@AebnWXeJT9@)cmdFy)|*y1I!6Q_N{O5TOvF~7<}u2#FzOE=kvuLtWOLd@@o#lD%tI&Y-HK;3@sx+s}o;Tv8+ZvsqiUQk9r zOBz;hyr5dOOO9E;@hQl5>b@ttkk8IfiyPO4doU+=)9GM+c+a!iQ{>{*g&Qam$6RIH z$8ij;Bn8KM6}SDzs0)@?R=d4mrCV;!I{0nyGB}IyKJe9ZMZ1rDeifd`KahBaIFIM} z{`6YXJVE@2*4SSjJ&?GIbZfjHs}RpOL);g64{P`a&k5q6B3(wlFLl0sjc<<-*Wz1) z-@oQvncyLFIFR)mhL?8Dp7jyLl#9D8TIR`{L$u~i&u3$JXJ?j75>ImY(r)ZI`3x&r z9FgxSL(<-E;OY4)%@Wq+x{d12gqCe7mL=In$jaVqef7By1{5w>N4fMq+$TO)u9U^i zfo$s*A5XwKi0sD`M!zpc3K@Lc2kQya@`JHv?L55QS>Mw3+oJm>tmJjG0$X`iKFO=+ zWP1dg4^?&qOX4GlHakY%rVaY^y}KPbyq-E<$&N$+?a{UXP85%8&3t(DiwUq;BOT2y@4z^AlhqkN5-jHo>e$x zu_8X(V{JQTPiA(_E$dFl%`!^63`8d-cDoIv=GOuK4nEdpvkS(VJ~x$_QqmEL28MOv zx*WA3K%~kp&>>Q938H%W%qC2`GY62tU$3$#9GJe7v7(ae|I1JwC$)VHZ$3~Cz9a&LYR^fDX zrZR9CH~yl3!FJ?H{~Tu>%5e01SUbD1Bnwz595XJ{z#FXz88o6jIwH>1U2$5gT^7`a zCI!3L?p-*`&a+FQ*hRTJJl&a%s<;=Vm**?F}x4T8ZY zH|Loe5m;I0P$U*kN#%)hae{q8|6FjFv3u>5ql46?(`p!)NZKbIrTyb4xGdh02(4ZNwYks#-boCC-I^^qEd5i6BtroN5YMW zus^c5H(4#hX$IIcb77KISq5{s@CZ`$KjhSJD7h-StLH!;Mwp{|v-~*Pb$rz(jEoJN zTldLV&MI%+*U6!;Q|>smUgPyL&hdsge!?@M`XE&w=#5s?&Iyn6by%;~<_|x1YHYB$ zh6bHq;(2s5rfkJntPCL_K85`%nl>GQPK04l+QZrcy%0=V-usK}7_aB0& zWiNiY9Nz21bmo)^T{WY%Ac`ecfkn>Em^s$GZ>HJ%WbD+9&#d~n+&&ek16#%tSJ6EqS5uZ?S)} zDiJfP8?DDXZcjBfDy5=OTc?YHnGHE*)viie8C(|aN?(i5iqijC=C>9CnPw3!ECH;! z>EoVW-WAq#5krJkxb{`9$`H*JjI+YKvn&@NJU29nWxG33Nxais5hhp2rWxmA*d&+L z<^GF~4y?L{q5}Ka+yxITGen{0>@G)Yx?shKNKW5Q?{@emUOkX$Sb%1>cZPQqRXEKP zzZzf`@eCrz=!2+P$nOYlPsu5#WO+SjbD}YeQ=K-7A_CTvqLuJP#^23yptGD+B}shw zU?9aePDVwML+0Ixf>K9F;td=dJ$A%!RlCqk-A3b91jB6cg-RU4;`nb8Ex6pZ$ z(4OajGkAXod-HftC04x0PS^dwRsn-*!Bne$v56LGUu@Ppue(gVO+Tz-8g7-I5a}}X zJ5QR+!k#88!_M%*z2(tqbcp(AbiIlq+K`2pFh_v;b#ZM-^__d-s-@#mL1D7B!uav~qFAv7?#WuZJcNps zIu#9zQ_|TM5asNoVTAk4LLA_6WY%}Kf(E*vfucB2Fg9n*ROtxJppQc~IUDGob%p`S z>If*V6cm0#`7MTY^g>A%f$r$ap6F#*qZ_IF`&Vx#)lGZctfEA z<$4{(0A~*NFDF{vqHG~!BuSg?nu9GX>~k-p8(5FL*vt1~cx9X7Z1$7@B50ST3my&` zfzVb_#WLZ5pkW0f)jJ){GA@?;08$RVLY=N>l+#+J^AHUJ8An9t#OXHl*Zj~8c>)(t zHT6W?7Z5`eQCHxuvgOd2L+2#C14Jc5){`{*?TF#pJj{pXSlK;>WJ2KHLxMuAr9>DP zkvZyeX+iIw${M|cmdo}s4{#C4)WWQp;}%ha1Tw=Fp40k}ksGPZ(){eg)OoX*nw0pZ zdHqRF%@UL0Qc-dzxpDMDI`@E?I+vO{FE>%mr54Yo%v?5=T%?5gg`8X;x-_3%n#@iu zrYEUqNfVr(O3re}XmU|%Nzb1*hc^xf+Fmv5&azxUCr}-T>y<#~Bh)VjA&wg50Uehi zM`j`(gPcM4&K`&h)eGt50K+V*t!enC#0yrG;k!EOMDq@sr_Nn>ftlmp!jdSK0VUA6 zkd9g3_ZE=cSZ#H*m(*-q$Zl!h#-_=kcvwekZj-Iny5&bCK)h?Eleo-CGGA%GY}Rh$~)qMBGN_UYjrO5Pk@FL(-T zE-}Msx5@7;2VVSIl}XVFwJNGitmIk z5ckFZav*WbzS|QY`o50O?3-`CJuyo7dD2M!tKV~bSN;#~zdiBLZMP>*QpY2NSKo4b zV)}0mB<>`=Av{T(!yH47d+cI$jlD89Yz~es@l9c`F6+d_pY#H!Sj2VH%Z*pDf1180 zF7{cygv8%9y}hI?9vwZ)Wm@rn;*TS`5v_BvR+PkEYZ1M6ImOk>lRBUDNpIwe#dR*{ zibcjA^~$c;yG<{*ckTR7@AQg&vg!4DuUKs7QSWZ*yt>=L+#O)C`0#N!xUw2P%dah; z$b03QuaC5hru9@t`x)d>!ug89(C3wwGFRx6Kky6c==j-&v#8f-pR0I z`q=kjA2-FZfAREJYNg?7pq;R`%A^|(R$?v#Ocy+8dwRa>HEXf*6+U+!N=>B~vBlEI z+aou!_5RZv+G3IM^l~R#??1V^E&eZ_eq%_laf^R8!z8e5myNdTQ5iGnhw_TJ$=K~* zy!@^^?p!9>z!2VzdB;Y_yf`6o>pn~4PjDeb38SI5s!ShtT(cw$8WUXt{*T> z1#A_2IwO+CgL2QGXWUg@n62s^YjQ8O?Kp(X4ujegdmg*P?sOp~+!LMRW@wz&;12}i z2pOpr4e7v*0WmvJ(z^^`5CV>C^n~0jWLw=mOz!)x0MgxjOT@Cl??`Cb8#Vdbohj@y zA7cN$mA*ak)J1fW2@hp&PkikMZcmi{?(Kxf*7k)np2XYWdab#ydXlsGK5w-@Uf_=*UWA-y;Yvmy_XyuA3GItOl&yM%!& zELyaGZJ62k(dW)WH#x=@pJs^q^%&GsZ6zV#9Us{Ltj^ZuId4y_)3Wsyg`AbsEQsJX zfv+$HRv%zgh|*o8z;jEv)FqE20Sqx!xIgS!6C0Hx_LmfNhQEZP2b4#b3++-9CU)3! zZ4{$I?ABB(z}nh5Jq5Am1+m7D`Nb$v+#m|=Zp&lQOUnTR;RNAn!XTkUm?oUO#9dJQijBqL_Hg)rRLC0Nz17z z>%Yd&X3`6X+agn&ki_GfOBCXq-JG}S?_wagEw>^G#S4f|FP4X9%EMm9A`9%VJ(0P~ z6&~2K2gCG-#fhz?UJ=rWSs@RVODiLOjSI5HIhxodgVwQ}AL2aON86z2k1+7gTrn7t z;gAbce~5=6^%$>nB6inkJg_r>xK`@S(9RgL(+QH~^RbK1cqtW=trkQm!}=1yUS~>I z8|8Z6ISrQvGYPRL>hpeoae;J)BRR2lby#-So^!qLqF_;#09n};Vku8mb;x*V01PdV zB)C4C;=-oXVmiN=I-8$MX3y&gPm2%}>eH&Q;zos(8kgUe{>UNk?z_E#g9H4NcIGqb z`TX3{B`NSh8G=09$-_sEc&AUHPH}W)g*$>rM~`Tx-7}nY8ODyz%uF3QVn$w^^~bqo zB^U`xmmLstK|!Tm@<&*OJH%)YDwSbwx0Ak9D(D(j-QqEUAR9iFN!8H)RR- zC{&O@^O^ZYCW^TEMX^7Q(?lIW!?j@1+0sgWrCsT74;+D|oQX1V zV3GbtmAdOYtQ5m9+$PM~>Sn!-j1B8_T9?<>shaJ;ku!iGacb>4?MuFwdT{yrqP4QCC7YJP9)QPP*12;iM+I0Itoq`oz{M#%z=4XPWo&|H*aRpCLD6P!J( z463}!uYQvUH^4llU+RHI*}nf4#(t|TOxiQO{C z<6NnWNM7^|mO*^+6nzIz8Ua3SVXR??S++@uL{|l0P%q^wL=Ufj{~Z>FB1QQX@iN-F zqT47W>c#0?-|lp0o05HRl$)-&vi`<$JD)4t3Q%@uw+1Yrmq|K3cHz!cRFWJrnCfm&5SpHAuC#FC{lq-`;$5yE&@w;^f}_W z_AscO^(9%cgclbp4&})=r)w&zd~!4+!#B!kp@!1+x|EwbTq%jgVq5A==U}q!X1!^q0`hb z=-nNCJo1t*ZK;N#)7nX@~xZ>_EvhE~KA2mz+PF z8dP~gcU-J2InSrdvZ(z|p;}BfeRe)Mo6lXE&Zp-ucvo#fE_Ttz9_c1Ih0+uJi=5@RZx$hsRKU0QEFvdIuZvYxD{cyw_vX$$e$ca)v=Adr#PnFW z40>bt@#h4ABx1f|Q}%7j3n_Q6Wy7giMJZMK5cEq6ZM&yXDf6Z>OPxM}sO1JTVUg(q zo!dqHMm~-)klJ;LOaOy{Yh%Dfb=5AU7>#Mn708zn0VKQ_0D3L zso#R!SoEthwiGH#zV(#>Sz31J^W0c@V<3E@KL{%lyHOZ^W8;c6XWTpKxyLaRfi){$ zhPeyZ2?`ichnb+hHy&X+6jSsYvYpcIGExd&+aSj-H|PIM^^8IC#=Q#`ruB>I`LmNt zGx^*DnG_PoOMrK0k1!3}O+o&#g(?U?!a)&2>0}!^y(9jYG3nj_KuFN2+v5e{I83!; z1G*a7r?#CcGqJwm=O&IxuXLKvt>_$rnOKZnzcOJnSmh$m-T7m@_(gk_>QW-dL#;joaNT^jQ$L#lp=iYC5C6!l|zFTqwyT zxkOL1BhS|rRZFy6vGOGrOPQM1IzE(iozaSwIaP0LN;=gRjf(7Qff(#eDq|+4gc)3{ zM7gSBF`cTy$XKuK@vBOTO$xnnL|JkOgC|H7sO5K`QBl5QkJUtFJ8yJxF`Y~8fiKc@ zah?bQ0Qvf{W60ONdl9ye9zP0&b+0!Nis8LCddCFL!2#Pu@q5n9qSwrkSiXmvx}F?e zM}Wgxr08DMus%Z}Y~o}(w}-)SDdWTO(w;_WH;_xva>V{#OOTuGg?`}{!3rYJQWzNn z2YV!Piqm_n%B|l@WG#BEfNfs~Y{K?)REnff%l5V<=qiI_nvz$LLwy-ssU1;!U0jhU zKBct{NnUBQhmWzqWgUTv%k!ks>)icG_IhjDstc?&}Py(-S!w36OBu z^aDq%TQOUZ97xp|k$Cqwzrb3%n3rPm*d!D$3sYd_i$cpD-Z;|LTTL%=Aks(HWKqIx z?d=HlU4!FwYwGpFWgj`QIu3Q3+H%L&72i&r+-HrGt`Y`rI*;%|!x6w@lJ;FcNV}m! zG)dgMQgyCmnp84@tW6{AFyx(#vn$RWa@jd%Zo>mXn@DEcsXX(gie}y;<@c{URUp>N%2EI+y8AbB4x7% z4alf%OC?HHeqJD^6Qw|9UsaOXRh!1x7UAU^DJO=wu10`8-c%`FQwy@OX{53eH(5wG zZ48x1kr=URNjpZg8{0Aw70+T{&t*i+lw7Z0hBk&Q+YNbe&IIm=;V>d1TT-NmmqQ^-)-927CX`J)}N%ao>l0t&e+jF1qdmfyiRPY2guRrENv9iaMczt2- zqm@X1y^f8cHELnPtQ9#jlS*Z%-Pm!?q%slt^)yeVg9@qQpJvCLQg3I!@0-L4-PD{) zz#OT%xH*sX@32u7RXQYC+K!b_^wz&XcgK;guHC^#JkoXOl)fdZ;$2f@S`}*)wR@>< z%I$fz+iQ0$Tjb=r{<-RqehXQ{jBE$iC9!o3QG#yvR;(%Ri5dY%@2WqLx7qWuz^z^% zGZ02f>*e@6{+?eJ^ZZ!ky7+6}IX0e5Tz=`h)Fh*vM=f30n^;kFyV;8Huiamx{Y=v7 z#=wp%&$4euJ8Ae)PQb(}P2S_@JQ^VikF7kXNGs))dMt)>q$tKt1ISNVNhzjxfW*TN zc5#~DrFKY6PsrnF8>y~%y2m{M_ZFX+%k$S!W;@PofXB*`?s+1&M|%|Q%noetm_<+g z7t)U^kU z#*PhiQI^`RO_Za8dZjJL(@KI%E1}{!-YG*tvYuNQJYvDvE-F<^QTesUMX^CLGyP%a zVL5cQGY&_v%TNhHwDUm4S{x3DF11d-#ZNv87oh_ckMVMoy5q>l3KaZ9!%uM{(9>|D zx?1ZHnO+st^nR%4YuGRus20RQW}Q6dC%Ry(F)eoOZ}dUx1G3=`G}~tJ=bB^ zN8e6s6IMYAGC{h0^YSKhWZwi~Y=6UTUu!LIyKB?68=!kXmeh@%J8kcW)9esbF6WCY ztNB(vzlu$Hp^`6FE_bT8T>!jolznw{z2>(u_@1^2mQmpdVI!~K;u+}>j&Vgp6d9su zEN0H-=N6`yW~~sh&!VVGpOE|La={p74dZXkpUR|jz zd!`oQU1dAAtvBsX&FmDp2Sa+1A|V+({@JQK&*$6(L4` zT+TehcLr7zgYGkXk_Ot9uh3&3SDSUz^I{uMi2KEX_M&%oabYO~=Q(HZTI$+(!j$JO zdN%PMlVy^N$vG6{rx*8BDBgP)z4Sc7$kgKE!s6~tNG|0T7E`ke$?3hM4#yDsFM$1( z8`d8jAGG87u+zTkPlHGOPR=G5cN!o&DvnI=%l?JK7*eK|UsBm-C<3&yIj5}^3RYAi zVYRlLup%BKo03EMcA^!C++&;$?nH?^P@HF@s9$pB3gi|lg=V$)J+F+li)C3_5LXC| zC3WK)i^1iDh(*Owor`T0AQ!_FO3m9ANr|XP2=C}B+W|;bXG`|#{zIBA?KhE-`l zIR@W}19oVVO%~H;wGo1_JL;)$7rwpWSxbQF$$!#OrkS+;{(r=7FkJu#|A*6w};4Z<7es*mZY{fFS zsTy)uVzZW4?OVqrXktg|_4ZIEA+8{6OVOcnCapF`(uGE@oiy}BE^h5KHuf%M$fl5I zQ*fgth4e&8DqJS(3dDs`r>J-&c7TS!|9Qxx{8(s%VV7+D(|FIPuI+9DaNK7url)h~ zgs|c2OL0XS$rbMR-r$wjgB_?24rsot#t|vD3na0{?kjHOIAg3i+u6drB zO=i#Kr;<1_8_%43Ae*1T6~MORV}zo4D@+h8y0BGjanL;BsgX2Q(kVd&8$WiRun>pT z1w2-_7#XS&3Ha0c-EwdtI76gpXr`81hl~na5quyH4hxPA;9_W!;zWm``S&0v0xC;f zE8q>SP}>A*%j!7Hqe&u&_kv2jg^EVJu(rLWHM|p7c0t^Xx41JBXQZy1vH)w)1Frib z%(Lz9N`d!4xmKmmR~eNkpB*2wT(1l5S*^xfgq4xrc?fWz{+piW%BhWpT92|-3~~k} zH?;N$64TWJhu9*`R9_;R6GI(Q1G#dzG%We#s9WRdppEMqhkhl%_3c)I^gw8AXlDVs zct7;2TA9(FG+t{RM{`}3Q1EvftoIRMz7NoDTZz+jH+%cUG*Bjd$e*?G4q;Sr1^_P=iRaB56kM~#gjsmDH z%S4Hngi5h3*3c#G3Dd)Yi|tbk0M&z%ctMaaI0uUkj35-m<*>BS8(_VwLqKg71>%j* zKhv!}(OppBud0yVE<^~A&`byNV`u1b6dOt9U`?E9uCTCKG!fK#QIf9N>m6z^CmnTa z9=2nnf_CDawr64-HriIYg0~G$)_tc@>T*0hJS8DT%7V8owF^ecVf(48wparNNLBL$ zn;X$Tan0;XZU<8EBf9c3A?r;Ruiq`Y?+l6(>QWeEd6K(jclaO!&GpnF5{ykOR-o!8Sdmm0>?k7c8s|({0H%&|FM?zYkzZFr znfeaylpC%^H!hE zoy3;t70RPKhb#p$^hRs)9g_A$sa@t~Pb8aBPmF9$CeQ}c{#B8CuM}&o2g?szLjkd+ z;J~iAnMeIXqOuE9`MJ5Jd?tA|g;AH?{|6*%@Syyy)gOk}y&DG_k_q77bEfUwaA!6; z7@q0axw)cCJgO8!c-UkieNfKT9MFgSUAx9wW?4cmbhZzTj7N}0$E1sTYBOSPOC_(I z#fPF67F-D3pYu{^FZ+~RB>YKNCypiv;hjsadV7=qrcLfXfx zw5_TYo0|>ULlkDb5Cevn>Of#A@5Qlud6hNMwQyX=dWvw!HY~yV*k%18lpMPc7dq`A z@96ZB0-9~Jg>Ve3Y;$_Q#NOR1!Pb+lGMbxs*RYba1dWU#)bQmaRuL$~nL;BfT4hvK zdB}QJw^(tFCFM6Y7j8wO){lcVBD&D8+wRS`d6Y(^75P}R|1L_P!RiWX(6lzvZ?@YyC_Oh zODJ|N4IGJAgiW4wWN6Gl3P5i0j*Sa3V_I6MXE_l2ipgoLZ!nq4*NF6g&rhSh&gey}X&(y92 zM(oN(i+rFKq-!N#s0y|>(V`jjF8iBM+$6|=6$jx>{OXb3^AF0f;GlG;yurRVNw3a{ zWTt5r1{!>sn8?~s6BD|ev|4At!F}wKK%#P5Hw-4XcEMjZ--srzzKB^9FS0bmT&44G zaQ2SGG~v#B>{+=$F{~9n(TdvQntP@CyIiDNcnWwq>XyGkOOPZQC+jO(X6Xd=c9g#N0r* z|H$)npNc{Oj3Ov1*{Lz@nl>j);_9ylge=n^7$K?L|zVTe$k@hXZ?h zBMT3~d$dNPqPpT$*a_)mrJE=XxFaKg5K*o%-}ooC=;EE5sv|b zX<>dQeKtR{m`W|?7P9%J`ScWr+ESq1g{=~&Uu)a(+h^QO4XQDKCQyC@jek{868R}x zJ~#jsn*6044kIY`EqOU6--h2}BQ0(pM{u#~{BltyV-EDPvhTd}&R0oFsYi!v00~G- ztf1eqn9bpQESX)v4;c>4IGEd!#Oq&=t`Ct@aPM(6$s&2TQF_WOwF!pl#W!=-o1iRw zE4DGy{&IU&1uPZ^*h0jet4?6HY^-s z8;y_7aN&DqlCGae*Z?MWFZ1D>wj>SL2IdQ)R#DW1(W_FNh*G3FVz9%s$}#5zs4111 z8uR!kypQobUdOv%k9NNvi(a{;RsR_-H?0XdZ0QCYxN;{3dm2YAU&uP07Or(F-xNlc}@v z&B%Qm_F-yaX+B5HEniBU`F_Id2=@?13HK8w3Fiqp!o!3WLY=TdcqifS6aFFL{e)j5 z{5Iit37;kWOTwQJ{*2JsGuDwYwQCkFm4?Gb#sms@^6I|e_p}Sn%yhjiaubp4*}LL9 zNiTE0g*s^G6Q+;NI`?}7Fw&h^K*iF`9#~5E2RUN_^?<)e&2C@u0W4%WJB~Y5SNXC; zl|p};0)P}%(5of5y&}y?&?*-v3gEV_ic)qnke!{HqPQ8kgGu*ruAwWGgkbjFs~B#L zMU65^u@Wn2E7=mKRc&c<^R0ffZZcCB3Y9ijwc(eIPq zD$Jy3reOkXtTv9AozrzprAZXba9EBGTkL(RF*=R5+EioA{*2q7qxR>R{W)%b?z2B{k{|v({O5@? z6~a#tev$A|!siM9k#O_>kvMalaE_26tPt9SA16FXc$)Ab!p8`2`*$|{bDsYV;Xf0; zP5A!5NSrxH7$ZoUY4;nZe}MN#2|w!Me~#Y|xMxZ85uTqT{668I6aJ9!1;U>ZzCyT_ zo1G>@!ehcr2!2DpGkW3@kMd)@t0#xp_!gHkaHj5UK9`$Hl^gsLP;*0u8L8hOW#s=0(yEfe7vWHS4KgLI(|07~@eA%(o*&}*Il|Mi zIEmlOzi+xccYWZF#0f$?&j#=BCp<^^V$Zj4_Pk5JOT?{+s~r{g@^sQWx@`_!&-2np zx{n~JwejFe>0!pw_t8s7G9pW49wjU@GG<1`jTVV#99V8wrfOYSX}dmJ4o~x1H3~La zr%$7IKG?_=7K~HC5kb0j?Ui2%Hfu%O>o5OP+y8UF-5G}janF7Dj>LNiHr3w$zQN^r znlirLlfU(wcO>5Z>vtr+MP1+ct?sf%KiK^)H9qyLcO(w{#owGcMz};s<<8|{m*#V5 zb;&1XM!^G)CW_P6yHVXDlTUWa2PUD;VXok4}0 zT{0Q_(r7e{54vE)jQL)fRQGS=|Fm-~uQKO1e>!;vd~E)a`yT%h94D~xG4hmn?sTED zPF=AHl1u5;qX4pe*c%Z>h?_~_a(fOZ1TfgXmM6kvPYzd5<>1CM*WEnO3ACm&Np3_x zJCD$KKs^RfIs6+g$m8|OSuN@k;xl|(fg(8Jn*yFIBi3SRhr4;%w$rtzOR8a^c!$Q` zNZGiA6>68oAx1hXpg=RF+*Q$(9Wx!U&YGC$Ji_2JMs8fU>3;UhE<`Dt8af3vq}wRB z2;G24q-{OnPwb0kbm+8GEY$6$TIR;=!wqy$!sQTsw_M3Y&qsj=*0ng$USaj`{1x## z9}jmeUfUiy2SHoTp0*4`mF_64(X}-q6~>mZyt00Q{y21iqq=0Kkuk27b0F9k6jWJH zXBZdfHLiPv;&?{;h)5^iz8F9OYH|^}vQr2mS0bUaLbrbE4~=x0+gic6;pz!R%Eg8b zEG>;Jw7USOlM#^eWUG>dbc-C)gk2J=5V(J0kvMlyTL?E?BBISyP_~h$4mXhaDO|~U zExQKiC!t!gwTukCK=Pqmu+or|BoR zA9PQeNXsG^3MWDv+@n90VZMe?;e&tGB`Q)#$!wRxz~M%yD6$h4*R{$idD%pDv1zUg z{`}DFor!OpzccYU_ltay%U@c?Cp{1*Clj z&9?1{x#J?ruq=9ZU0Gsf+wE6;i{|CnLrL;&YTuniJAdyq&>~fJcOAAbR+$6dSR&QA zjk>aHQhT)8zf=*XYM;Am?=*cIK`GOtpA}!|6R0BAhMy zif0PBF+s0vVWM|v`>WHS&_=06aj-2@+3wsK+O;G*Ln?EwUFw=bi*6A%x4P8W+qLhc z{%Az062s9=W>(%34L3670_NZpBgt{X%~tY@u; zi6R`@KS^vJh5{0iZ#&)<>w+UMa{|L~5)&4dzRn(*p>c}LEF$_Ey7jF%kStPk)H4jVen5lfBn-t5?>&Es`#2jDw%=tRi-#oC^y&3 zEK0$LsGh*bK^vO^caV#x(|W*BOf#tE%N&!Si)bHJ`M#HMU2hcfBH5RFDQgJNo5c}H zEm0%#t<1smwxaC^E!sY6(ejA4Pu@lGV|t<}nc-3%SZGHHnYr`cJU%i^qk1_ggyss) zoEOzq*mm6l;%h{_zln-R_{~dBowthVkO=6kWTza38v_P)wdS=;V13lFA@6p;1W_UEW5p%q$WEO8?y61MSukNIaDa62P8MsqYTc21fMB~LYeu6i>hI7B{H!g)w_KxC4|vI*YM0lREmXJdk;`(c(a4Eu1*FeF**<# zIqZs6+)3P3dRVM7rj|!l&3q}5qu-SR;?wwe2)fb)oHk*v6|$9`O*vL&lr}<2&?C)_ z;Otr-Ki#@);b=ud1J3GJyC*bU zt(^%K69NeJj?!n3?Xoft`bW?xB%GW@f@?$sAbAnXMS2bLW$5%uDX(5fIO!ZUH5^!3 zT(QdiFWhV(?umjmy`m7Vm%|VWlS5Q1=D>-3xOo+ET}k1CqB7{MYX;Q%{ic|7_9imz z+T|LORJ$Wa$3w1WaG&fY*3U}5xQuj6H2*~~CO!ar<7u~zxBWy%bl4?XcTT(YD7Cw@ zB4NcUtZOKu7YL9-X;VE;8k?=BK*W4#Q~(8g1&RscS`h|JaCmxtI=3*Lx{#hq zaYUjD)sE8u9s3&w>PYj19SKL&4Tnu++aWqgqRSNxhB9uQjUZpAG(txu@V14(WvW)0J24e8dW+&pyjF*&p3_}>MjKf{wo50d3Hb5 z9*&v<*1PPBIziJGA}RB&V#B^!5vJJLsqJDebKF!TzP?brV5*L+gEg*qj|7VJ+H_$ zE~9C!H}~o!L@<3Fywc!0GF)@&9|onfW9Vea9xrrG!);EI)JdeG@pG3JiU3|C%a-@2w3YE7P(BQD{lq3*vk)N&=r)ugHmCtN}L8 zyyL$m&RiutPS_w^A+!ihLW58vR0xj})(9(v5@DI}2;psnhX`N)p1Y8byxJsgI$#d) zD}NK_4a6NVvu4X=%sDmzIg@Ch{nkNE8n=gDYdX5UTwg^uyurRUp}R2C(83%~He}Id z5TlB4<2Yz596GK1DUyC%}!O*+C@1>DM7*ck3;jfTFA zAXvtaAGalFtDFI9Zq$PgL?mQhEAz<{!$yLOGB2CMhQrPqZ(Fi+3fUO%bDa?$AxfnNVmp_#TRQUVUTf>zp3+qnRYP+{ zqYp2H+gr)0EmOI}2NxyK>>gvo9Hx(hgNtJoN`2)+bTM|7Bi{UgsQ)WQyecy$vcyg8v!y43$uA1vgx;`ENnm~ zbM;?jEf?XwIXSS@${mtJR{^?4Zl3G33wRe!dctc&(4<+S_{XAn@KqkogDT9NGah>^ zT-{m?@hctFAGrx zTwdCF>10t@g!am7wYH=%B?Dm-%B^1d3&J(n*_TgMIkNOtf0~qIVTZ0s;H765D}`U0c(yO-1X@YssgS#7Q>#E zffH>qIZA-l^45LtQ8`Pqy(=9wQ$jC@1+VVx*7}uMwRlZOiqe$Y5N=>453MU*0gHnV zg^1K`dcvDcXLG6fJv5FiG)~CAaNStqJIIR|TKY-+s3bt!MbL_XtSy~`7663NlDnYR zSsIK&#CksVQQ&rTV}*b0>@rYNv?u+M337GF zfwW&6qLM)Cz;u@*`Ucl*g(VXcArQ-QSgK8%*frJtlR=x?>g5Ece=<>AifHqwer0oF zbt*=cZm8`(J8Gw`bVGaLuP}`wdaDM36}WWLl#qyXxGe>coUsrG=$+4D5q-YNctOo- zhn$(S_?|C_4}9VUei4aU`{vGvdOh$T+aBFBErn%Ko0f(ZmJu$YWGPV4J3|(hux^i2 zNnxwQ{mE{#;>7|bN$IDQ(&;4LW-PZUl_`6f57yc(aY)`tBxMp1j<{>Nax?kGOH;E8 zS=8wyqjI6Pc@y42w>;zn{utIBkOPZ;*OXD8;^RlADE@kFXsz$1{&=cg!AGmxzOpnrT#EWa zr`@u$uR;MyPg&mjD~m@T1bes`i*@Xa9jYjWP`%{dj{P(`wjA``!lON^5^PhcuYxVP zc)(TemX@aNhI}!M*XS5r?~qKRqLNjr;#wF+V%=2ObaA@dzUS@VI`ahKDq(~0%J049 zuF*#}ZhFNlZ~mU|eU<$uT?9?A>%duy{6bwQbXH?g@bL9FMk%H&#t-rUX&U%QvpS_P zHTuP>a=3mD0mr=`9>sZ_a&y$XPHlk7avF+dlpP8v3!t?g~TRYa1mFjhH`jl)l?wm;HAU5hkDngSghZ+(Njz(qG zLof7FuXYj~McbLyUD57!lXYVk*Tx<3cnsmYWC}E4`+4yOoFgE$^|ip#H)&x-4$-!! zj2g5n8jKg)v(wm3Ea-w|hEt^c&JT%DgGv?4Zf6mQ-yAw^QA<)A>Fs70KH zz@Roj3>#(X+ZCl_y?sq(VE8jO02J118q_ z-jD^rm57A@-8uWzrgdcrrR`NVetI3K>KR6nj%~ z``Lr#lpK#GbO~@?7xa*%u|&!(I<}>I2x5uwm&J86da4p97^QELN|lKr7kCfEQpO^& zQ>VoiOkAFc`Hb&kYxUZY5(M#_fYbKO%UHJCOxWI4|9|q{13tmPs8hEPNhq$%!z zfB}INLJMssjYQH&0TggZCKD1#BOTWguq(RiT3E#u+gjI-*u}EewU=ExmbDk`4dws+ zp8MRVOeV$meLwI2|Ns34Zq9Sh?f0JB&pEdd@}OLh$`L0SsH~?_up~y6aG}D5GWV;( z64lm>qaEyt@cKcw?raCO9t~LGw7L~=AdsTX<*IpuJsJB142w_~za<&0c76 zRHIK=q~Q}%n6uiVcT3-9FOZz0xFwo(q$6_F;S^!OW6yxW{m^KG>@tjM<_eHxd3z23e|l%4`y{%Y%g82 zxh{m7td-S`Zaf|AXo#d?or#Sa*4b28(lvA!FH&?XPDe$k$I;9|Oz`dsbb1XNJ)KU@ zQO=2X4v`prsmf5Csl(qvJ8XZ4-SJ7X3bRT)kPUK#chH`o&Eei8cNxVa;2kLWboD~P zXrfn^uyIF_?#W9~9M{+rr0jxG%5J1rt65cvkdS@TRL_c6t(2ZtJr07U7*`{_yy1`o zQFUxI3(HDHm|6z(KFqQzMqZqinvpXR8U1mrw^q*Z8DZXX@W_`z{2e+k@V;tdDn`ao zu-S0r&-sm00!Z@xjJvD6^N0EP)cs3e4fCz}#4xr2(w_N=f*osyi+y<7a3AlU)mlaM zGlg+Bq>O4q&bka2|r~MH*K+996h*kvpVAy?DrXftT_Sfx@EF+`@tqs4eKr zsbEcGTWTUxK+QQ4ik!ruX2OzYr1Tsyh?d^2(ai6fNoOEZUe`c};-&R&lLKvFlBp8G znFKtGs=rNLv=TdcBEtRQke;FmJS9^lH#;jX>(dlB4Rz{KF(I$i*#2GCkPE0SwGZBt0udZV@)!5t)-$HKl%eT7$%!Xj&~ic{DiDy<$5 zEJzgU8j3>J%C2Y=w2Y%i@n9l!?YNNSxpyL*--_53#%>!UD&|1X6zqfSy?E~h_)i!uJL1Q?vBn;XqFSS23{;V z<;TX!RYpibrRQZC!X{dE%xO@R=RjCf+P?oH9&nDC*mra4jwxSEO{x&}6x6v885 z(Yi*(<0K5=Ji|!tb3qzYQI1|}-kgQOWyVRkrZH7-`f;^}0ZOjd`dV=a%#O^;YfP0c z4Jo&J1G18Pd*kVGx(fp*H;^3HWq!eSk^A|^8XR4Y`yIu{ok#gvl^yx)tujbvv&^p1 zw`67|N*Jbrux+#SXu!rThh7ezW%9~XacqfSAzlnq3a5^~Sy@WCo?2B!@Yv`4G|u`R ztv<_a_F0Z*=Z$JwS~h-Z&StT`$*<)&-NZPVTQn<>)8};+>I|GER@11@z80^(lEqu^ zoaQQUL#+-yYHO;%X9KAS#rlcU61;aL%>KM$RvO81G=aM$+}$a~ssg*GWY z$`UO@ti&L`WSCtqpXOO#fDhbYe+L;(Q>%bln?#(_X6c!WT47qu`tF6Ag&Gnuv`ZKi zTz{Iu%{E~V+q+kdwLCW`SA!@X6X~spRVzB5K!Y<<5?L-P)Jo*erMxLvjdbj|$W-l! z%j6fuZW536;2cL)JZ>1&Sx*x7`c2+s=#oTS;Oe9d9=8liE>Pl9QCl9G!6;V_4l=nm zFd6v}DfGsm6r5IUepNFh8BvvxvJ-)phuokOgQ=ISU+jwNG*1|KSwJT*J~OH~z*Jb) zAMIZHCLbQPq++;-jwZax;9$mAT)9$66&|EUaYeO$9$?7+kgB|}J1kxjz|j}>i>1(% z1x`0aEpjH-nKW}@Mu-hM4rPd7LFL+3Y|OYqVHF^y4MW>F2}ofw+Xvf%thR!oMb*1y zMLWs26jZAnluWSX+<}?90d?&YX-aUAl%m`ATF4QTqe*>8HH*juluBR#T+0L0rU01v zMVWKLB%rm%IH|mn!i*(ZrGdii?2@d~sa|Zd1KF7+UBr-u@7a+!V<(Q?1ri+EYI0lK zDI0jPWUXMG&C2;#ZIQx-AN0#X3}%YBa_0k94e(EO5dwGlR?;VZ@QwAPx&Ia=bHPP%c94pap(4Zo2 zBilW>y%$n|3%QKLq)BvG?39=YmK)*12NCmyK8b@fXuYCTLGKNqn3>s=8LCSGblp&C zHAWE384|CY=(7!UYRtQC51BAb2OEi=0X;C5AEh-D;{$~Lu?n*ALYRc9_LJwySZ)Q|L|B1H zeJ?1JhGGw9j}3KT@F5GeoGF@phIFj#T(^tZJLhvoqx=QhFc&mnrA97N92ICsrYLue z7KV+?BJrr1+db^nELJJ;jl(UqhcH(qC@#3wE&J*wUcjks^b-Hyx99 z=J5~M{9Jr$7>E1TxtRb@s}&rapihHl@~@ z<0-MIB}4RF>*nPYs&>`nAjLkzTsP3O64=6lDl>=4&ui8yFZNK!^kVI{&?QtfR#wU1 z#4BU#I7qleDvb=Ncwp+~CPx;#5;_eyvC+FY@QhPc#{}ijAyPX??S=VpR4y6daP^ND zny4PkQXXhU9J$ghf963Pw#;p0#K6*%YA^V%cqLaAX6ra>Uw2hi^C;1DW=?Y-D6GT( zw1uRR_UYy;8uQH-i{OLTlHCSZL>~ahy|5jV5Xq%S|9DPJ^$Z*tIxbYyMH$XOR0YZ4 zp+lf+ky)5L`l7S_x#sHutUgC@bL`z@5Fos?#_6z@D)39u?E(F265H=vc!%TS#W z`eB#4t~;uH7N2&o#Gm$9IPB&%<^>ecetTsfV*gOWkByO-pYL6d8y50W>Grodc%W%m=`S@XA8?B zlx1~3>;ZAnjsDRkN+}l>qgbn8=h4Mk3PO4|$hz7!2DB#y5mBS0Z*kY7tUE3|C_oSN zX#ED^s|IEuOdAXpl#DR#jes36$HR2Oa8I`$u-df80rqy91Euu6&mL%FoZ4gZP#@|t z)2Ja$BynIT&jSW>>JeR;Py?L^$&HyiSs7V2jC|%As-+2Sgm)Og9l%zvOVF<+fF&5yZ`VgosGKH|e~?5Y z@9$*E)qONr=ub8hRBX^_Jj2xemr%(afNf`tdW;nvkR&=to*@$`j>Q{~(M1nZ5&{?c z<;~-bE}_jEPDEe|4)InbQb=Ge8PO1QAoP`~?L~TpZ8bgMRYV94c13Fu zf7?Zgv}tK~gOzVyc=K{jY#af?11N-K8JAKyP`weLhzT!8yO0FK+HEB}Lo}Ggh$DDj zYT?OL-ml}uJqru^w6V}V1O?P`@sKb{ZzeHwN|?zKh^HA8anuu}L`2$9J5e1-f*7Xm zQOP$B&Z#q29Hs~H8l$N^6QjN3DJ>zxKqDTs3||;Cp+sjCk{v4_whMN_GHNOD4Hw?r z9gB2yf5`Pidlst}`;l3 zkv7u-D{w)ES4J5M%T{M#bKzih0;N(9J20-P^ywO3aFvUSuF6oQTBH$}4Yap<3k5`l zN=y)o^g+qGjpJx*dzk7Ku}mQ?c^_%K1eA51E;AP0B8EBMOaUXYbXqeBJ_exzneu|z zzterZF;38Y3dZ&?f(vHuRD!Z8az(%jup&`$uufGdcLXxXG6&9B;MbwDfP5(94Q#;L zq^kKL`N1X|58udbtC=8A9mZoAhm@p_vPYlN{OZJ@TY|wR$U!hHMnhEs_{Kz_m0SGD z-YMP;T>e2#Kq>i*F+Y<%5E}_R4$FPMc{s=%S^jFdImMM27Vs`#;|;qxIRV*`aTGFN z%Mtoabhx>qkfJ+cu{2=FrWY?$)q-`PQGDr1UoE{cvw>ry0Yokn5g$~gM~ug+Uc(!5 zGE2+6^hQ>?D=DH<(U?RGRtYR%uy*T-(rr&&soiq(DhebebVv6#4N7V%sG3v`RchQ0 zRk3iSgEW@#B=XZNpoF&)l;YcU5`cnUsZ^B@#UE%2Y^YOV29MmQoE=v$Z_VX2_VB9O zT=ehdbE(j^gl##GBHhP6;oY1eRSFV^3c*(8)(`z0blA`ey~B2j&8@*|XHF?$2-ZYr zG&PiZ3`?Be!n$8C8MOx(NkZbYv)X+cb~t-ra#o_IIC4Ad>L5$KXuMFPzFsFtnh+hw z>P1E-v#r6N)X-F6T9hj*K!s(ZrjxX@`7J4kTXRT`r}bN}s^6Nv$hibgL-A*JZ=MpU zn@6nIDbXdaW++ppg8og6du~q0eGiG0bMeGRJgTdokrPeg9r8qr`oxouN~5?rt1~3d z)oS|^Qc}<>hh8Rl%)ofol)W00nqwB{a#!Ye?qSsf-ws#ZAP$t&5zg_*5>qK^VYt-g za>$9~4RORA$sxEpKMsJi9ji*~u`@fo_fT)L@Himig|2vIK|@Uh;QukhJ5R=O9FGS- zO0tTVVNI8nUs!xNtc$@@g-GO)0XfE3YTY|9wwldBUWr;Px|Bj76RBOHdW$z_WPjzA zsFYi-20$O!?if?~$LNF}WS_CGeB;lqpBIVpMr}8KS!8SeruQ(rvB&M-8)o-~+1G^G zJHzbT!t6W4?7PD3#;;-NhuM8$_BCPl&M^D7F#FCh`>rs%@!KL)pVE=ObD+=gIqaRV zcf#JOb*RH`?6vKk1KjL1$8?>z{fI-lPTT>+iBecwSNC}0 zI^hrbh&IbJ0r{B-GYRGp7%$8?nDH7QfRJ}^878Vqv)%xIV~Fqvn6 zyXaIHAIym`IWV;_YhWs2s$oiDR=})+NrjmMlLRv#CJ&|vrV*wErUT{}m`<3@Fi66f z0GI$X)wC0*e+L5Rg&7Vr3MLjN9%c~C5SW7w8ap-_o>`tXYXX53K%Pl0E;Ni|PL%lL zd6uO#Rmunccwx-OGmK8_3s}~l87_7xzB$I&KM-T5W%GHhPgUn;xMrAltT6mCws|a%Kz`HY+kKzfS!@+jtl=+>rgn z+0K|s-6SNGoRR1sY3D>qFIvrc${YVu36C?QUdG5ibPx>b=+r)jV`MrU%d}a-#rB#W zi>t$pv%*D7clN@LqQG=Yjo`2Tp<1FO9P{XfIZx7yH>BN(P%Vchf!9v4^G_$OOm8d< z%etkn;ZUJE9D*5J`x*|3=x}V4ZG8=g3f1A*$FJ;bIFwk2~kz6i4lwqM>TisR z8fc7<@)%R14hD{K4K*qT4Ka=y)X!)d6mJ|oXaaC-PpoBef~XEOl5cLSv<_(TE!hzd`pF{(7KCila74&^Q5=#(cW|pbzh(%( zpdfIS4aTC@rXcD`xPwJAy@PEgo!a5^{TUYD2976qP3mHJu{`PBeL1d8aR>rlMg$#T z>X*i;6`p|c&XIQS`Uq24nW3;(GwJq}9Z{H+p0^~49BoJ6}< zIF@c`=d-H84GE^{HB_+X_ zM%|uTm}P)5BV|d>(O$kME4)+{yapn(SYybo26{%yy6*ikFH$aOHq%sKG?zC)omNv# zV>RARXsUJQ6Bk<~s!*kROc(5M^a~*x97op+*9qq@9u(OQdJ?j=7)wfgs-7>F;C>p< z`r-@Ea)a-pu$T(j1KIxEJoz9iMnNIZuql#~^52!j449oUpdwd^`F9IF*!-m)Xq4j6R1cwUxOT!K@#E_lod z7EUshTaa6l<4C<=SxF$>??{CR`h>^QT$KNaFwYT+g%G8O7vTUfwr^u}U)%FE3_e-7mN)3a=9pc}ex7L-$DWkzsIFZLH? zs7$g-Zfr31mR|r>;8-6UZ%b z_ao&}oK=*C>}K+5R=Yhi3Nv$^9nl^L$_lWg%oHL?=SIjTg-m}w`f8?(CCer^M8^nYc`qp~EGi0j$jx@gkPij= zZj8IeB{s6!x;>$jxe?A`UBciYK6^$H3?JuPUI-RG-CTkVpKJuV+`mK-mD}&~!m_-~ zfHZ~Mf%TyIfnBi|6_$im87q-*1v(~6m0#3WBs`-=#tZFPOJ#cnhKCZ6I37@Or3h?> zKfI8AP zs|3>lN+hz13;gzQWa6_{plntVv}c>nGV#152Z*v_o6?9Yg`i9XwC?%-(o(y+^0Ux; zT)jdtQj1n6u<{^oT`I@Ia;$TV#}*z`;g|_*v|1o_ja^#b(ZS3R=Cz~SKboXW6cwX> zWQ8W4@wj{zMv?r|GPm#WP9dI2S&HX9Jk6zLS(wsUneJ#zymLXJ^N5k3Q=EIE*N(-Q zK@gv7sVHtrJ4HZPrCkLv9m)!pfL86XLISP8^n&Hcay-}J=q%zSB$e%4Z3)`!L-suA zE>?IKlQ7E)@eH>;sH>Fo9RsFdRE=;2=#H|;9?ryHaaP7M4DNYZ&V?vT43_@fY&Rv^ zXid7PTz|eDqr*eCtY?_Mz52ABsfZ$jgAkTsVN`ktZe25>?1agvPKhzXZW%i>`FWYMdPo3*y`p%b z`$SN&7*r!wteTizLyJOTI$(SjomklL&Z!*qaKjx6mDw`$+=(gIvI1+N8pv_ZNnM>Y za`;@OD>RlXrC5kLV$CTn4O?yshQf!a!Ca89JtB)s`0Oai<;A(^=b8Rezm=fiv%zx@ zZ5E(X$I?w)G=*a>E5K&ZFTOem{N^?c7IAX4s7v^P48}-soPJexHU@??m2k}J#{H~g7EXa z>sv(LshO}x17-ro0ImRx1*`{*13UrH19(1QKfvn&;{oph><{=7-~hmn00#mZ#r{Qu z0EYwe5_~dX6kr-)G~hD87{FRUGSHk17zel&&;xiEU_ZbY0OJ8a2kZ~nuLS7;dI1Ll z&H@|+SOmBa;5xv;fF}X&3%Ct%2;e<{Ljhj}+z;?Oz+r$xOZ|(615O3pAMh~15r8#- zBLPnb90hna;Ap^y0eLCE3or`sE5K;L0c9u;U;|0a2?=_fVF@h z0bU6BGvF4$!AJNP{RMC$py4x&g@93jMS#(OwSX~zn*d`0F9M7Myamt$_#|LI!1n;b z!D;*q2u@04$V$``U;^Mkzy*MV0G9*q1K0pK81NLpeF3io90Ir#a46ubfcpV{2RICH z$STwu;30tf17-t`09*+;60iYq6yQd{(SUye90PbQARaz59tMm8d<`%f@E5=sz%i>) zF2F^Aae!5T9>6mJ`vLw9Fdpy;!2W={0S5pMJ`&{uoB=opa4FzEfX#r$8t^;;Mgd+A z7!CL!U<}}EfU$r-0>%N33?Mx~Y}pnWjfPPG7zMZnFdFb^z!<0$@B~Iv^S9 z$^nN0b^`7PcopC$D$fTI8}1RM=`C*T;sHvkU+j0*Y} z9SArPFc~l(Fa@v`a0cL&fT@5_1I`5e4saIWm`eYm*?{u^=K!t(G|o1RV*#T8&!c^t zVcbeP;3I(1fV+sl*)YB(9A_5-{UFdpz;Kx3z2 zJPQ~F_yJ%vU|bc#15N^r13V1Scn)+47zKDDU^L)0fH8ni0mcG;0~iN5YAw$$Tt5m$gh6nP3%n;G1 z%9^$szGCILTyJQP%FvyZH>PvpJXq;)KR2yG;eB6w?+lqLgM7hNanP}E6RKwLl`Am6o z7iI{uUWuwQVT0&^{{80iM1G?Ng>B8iuNR)PZrJI5C(jy862A`9M>DN}@* z0nqFBqJNMz$9yag{5Fa|$FMm!Dxpb)Iu)kdyn32%q6_n0V@DBcG1u(E&7l&;&dLn? z<-p#ZiGrK7HB=J?+AHyH7otnx<~SGkx;%NpHYcz=6I&^zmOD^_j@;B5GRZ~<1D{wz z4IXF;fN2ptjwJoYO6fbEhzQztITLhOj ze5nBcV!{l`2k-{A7SVw7cBcxh{d`gvdEYyCGxEEEf38P%;*C+QN=JC~V5Aubkf4 zQ9yBLq?|y3VDLiHB^Mf4k<%&6WrDYtIJ}dMHoI;!!6FA`%Z}Pb=9s7xC8Y{SGLM35 z>{!|wY7HS=MngRncVV6lAB8Mh#mL=Co~;Oh@c2hZJ_M!lxVNqV@P&2bF;6|&WV)iI zB@YS*36tsSgwO{}W@BL*iW z*-1nQZjnzH(w966)stqz(*rLx(ar)3)tb$K?vq=e4h`DPP+Q^%4H`BQtlniM0fES_ z0m1Ou6^lyFFYm|@rfTU)h+GYs3I~=?+lN`DZOnXWgR1n%HDWd)Ti+_F(05o1mZ1vG zmO>^PHxxk$kUaPrsmrF&v+%ZR0%H6oc_8*=iOfp6F_=SmiGDhM zdPhFhLgs*n6|0}HQuR5I9)dDj!RTAx!hW9vZtz-+LLgR20Z?krRX0d4$*f)NYGywy zCtb?lZ4tuCttiDzTh}?pl{Ph`qv|53#GyyE^ki3#dudH8-pH{=s)O!hY?BO_qng=C z!Uh#XWwKbk1ec8`adS(GO{CSvrBEX4_GsD`LnEv^%wp;VstJ}rFj+e^HnkNr;1%f& zk{j2^s1kRCG2_jEKy*t;dJ;x{D<3_(sv*tv!z>Hgpk%Fhl&MV@fLV_0pmMH~*5z~J zT=AQEE{32oUi9Sxqx)gLg|nDmhkzJ@DkdzjH~6UnjUwTCuH^!Fj!d-ZwT3LkGWZPc zGAMSaL@HQ@& zIp=Jz^pS$rx{6R!VHHO{S?hI~xX{}cNgS^EjN?~YSF~EGpa@JwuWh8F%{8RCKw}2b zgk|-j4gr}$TcV1wtt`Yd!u+yUIVeFZ79H(H*jYja+Xj?B0q?cT_}Sdr%vXX{QzofY zBQ2_=yLMevA)z8DS)ksB<)B?AkJKa^x%JqN%d=Apy-67Pe_z}}M_eee8q7j6c5bhv zY|_nGPAJ^NsMFY?2jPtLl|q0hg`%B=$*Yw=j%d<}Ld`kQLt_R;$$AOQNfKIN%q8P| zD6qFMYKTCECadC=HYkjhV6E6|LX{x%*3e2cgc+9^ay2u592UH&wghwOmywR;qO9-q z%8*S3Wu|S`>I?|?P}_Y!=8gtC5}9b56C0aq+R$^cwNWxzdQ~SogXVz9)+n!#(8?v_ za!0YebuRtFI}KC|#XfCp6-`dX-23u3NIrM*4?@Q4KUAR+cuf4;s~BqiPpwh1N;v!G)4N3|g3T2pNRjWO7bb2Hhke zOH3z6W2h2mr71?w#VyjY)q0LSshV9TypO1JK*3tGv#QkqltN7c`OD@zP{*~Q(O2J4 zo~Y((GaNgdDvxL#H6Rig458x82x)K9YN{Dylr3)Yi&>W&XoL99`V9)Lpf1oeeeVFSw-cj78v-NXm=^`co%)HI3$ zJEcD+0h(vjfePMO!zbp|F1p?;S`xA8r@AqmSR{f}@P0uBPya|Y6+HgYj?i#ar>O%A z8ohJjsLDqt+aQOe)Y=P~cXPnhUQ<;=70x_S75zSPZe3SikKHlfIkDUWb!&074#j+} zlcA|E&6^D^LyBmqhTj|FNe?BHKt-nPqKU%`GmQfr`QsSw&L1VUnp((zmYJ33KirvJ zM}kF;OhU1hWKd|t(eYgpnRX7>;w&a8ds@hPHdCD+a_%o`?#8D?6@I1Ig*snEVkQLM|+c3^jcCMK*5!*tCvyuTGMnPyP| zwJWqZ6?rl1LIpMS61yDjYH~EBFh_$4Vj09$G6!IY2RTtrPMr@rTEz~H#T@I*?Umwb zz0i!ERAv_0J-ejlBEf(Vnt2*e{i#aa(@m!;tJJkr1Nmfk_)2JG=aGE}24yUBRCK`# z!_G$5GH^HJ)vQWvS{kNF4|EkGlVq+1LFZ4bgwjbz88JoU%noaB_J>-)0Y>6l?&bdq+fSZwljt;r~-ucM95i+G`1^Cwm)dR zmv~%08=-;LnJTO}d*`!m>@=pje&~KwN>jrGCF!}b98@RoA@uG)*VKz%hj;IA?NWt< zPdtyII_G>ZADc{`CHhpwNi^vyb$%{KM;(>bms7+O!;aN$Z*naKC?mFj<}@f z$b5xj1>AioJG1*Xw=1}{9rW)`R4mP)MbI6_+QjDsUD>`;nyj z;7c^0tr*{pPkWeVV=0Ptr>&}AJq$q!Y)*C9;K5S>)F4Y7XR!+Kk_gt0O5veZd^`}* zhN+1};f}qoyaWExi7@s%d}GwY%F8_@+7+f%H*ziMDwh?5Y6lnLcO7GqRXYIo(?QI- z$Of*oP)5A1)Y>F>GOiTBLROlWm2FCPQW{Y7c47<{b$U>vPt65*jk>wo8?5F_K0MIo z&58`TuDE2qs#e9WoT@R~T{1m3^`Z0YVMmq%?gVAFtrCZ+)a;uuu?E+y4x-F1@#3Ai zcJn6I;fFOcZD9p2XYdF`i|ZvLn>ZcBlqX|pc8M!?yRXZ$Eq3Lzi}lfG&*W@%4wXJ$ zX$MuS*qtLhSCkl<3CfiQGS2#OoR{Wga}>$)Ii7t#gW+QOqB<~}SnH4ZsRLy-;Z zlX(%X8s3RXb2_Ff>Q7?+gg#@6e$^Js#Z$R2RmTLw1aP+*?2I zhNM>~o$Y_4?c1g6)~zVNHGls4xFYWfcYdDv=Y4m7bj2&LY`(4hshc0Fy!fRTUOc(u z-2vMU{QAE8oNZ`~tK}r9be5`l5Z4Q0#i>!aTW@O#-Q0-?$UOrpiCQ`gSg~}&TTmDt z5+u^KB$3c`AbAm#)B&9z)Zo+5)QD}ZFo5(HiYj)JtE!x#B(3H~WPAn=AULp^C5u!P zRYp0bV)j%Gv`n6+&ThM{0lf8r`z#sfkerkyScMI#3Qv4k(p^))>urva2)mhym1(G| zhNd(xP9vye0fRFr7(*)lU}5z~j0GS+{ylbLGhRuv^)=ZUAhD{o3JxZu@}QoGIm41z z)jUruoDPoVP4_Mn9c8qWK%u&c$?4xtIn2LZSx~HF7r~LC?gQX}H92JtNy;pripg?1xGiIgEc6canL3(D;WKnR0mL@~5Q&5`fjqTWb|MUrEt*B9Usm?G z1iTrA>5sb+9QANOKov8D(h-8K4ismZqXRV)%`k_D${IYsC8LAsUpU^eLC=Epv)SS* z6|)mMaE7Bps;mfAbl2zfo&f7o9zuBACRVpjhhcZo-%?%OMNn36Y7#@Ywb~yi6&ToX zT+!#C7J>Z!pcd)$EvPQB)EO6AXdQ+`fqToaJE&gnIYV+n3Dj}x2{r%RdZ-o^47eW6 zt)1m*%4C*%vJsKWiZjEgOd({_`dw*&EES#M1JCZ_H6~_2Y8+2NW4Bq)`$8Mp6~ncL z?T$d|JsvBXFe^N8v~+}U*_t=h;}ltEK^>f`iQW8bxmlT&a|5CgwOYif2n4~kthQ3! zvpJ6nibduDKsg=_WB3XThB|q=wKSEJ^i}DJz-c9~Pq7D51B4D$RomKJtt}iR^tUWq z#3I!zb9k4~c6BsEu@!ZaOHpfL45I>^ZAH*1m;*yavvXjQU=m=wFx$RcGzw-8OexF? zm=>50nDbyNYS)SOFpe<%p05a8aff3C$~!$m;1hJ%tYLo_xqj8(;QeH{lx(m{Z7xIk~F_E{a6U`)obyRHHYi z?k&kwJ6o(f4Qg&5Tp&@$npT-6Wp_>-#pU(b#bIM7Z#23edJu(WLGb=!Z`_QvRUJ-H zD!|62j!&?uN9^D?m6`T`tc1PRFBW6E#in>uyVE1bVs+Dw>O3?&mM%4gor8-~RBWht z*;Kfl&^LnMGBea|J|?j63*RpHOI(uIGzKlA#5YJ0e7s~T#>7EXhQ)+(PW^3uOA1HS3Ll!8o^}X;8co~W1KRBv$3vGa!pHsHjXulLzIcx zXdF_5wHqn%eWRNCss{De7VZSq+6*;5BjtA_BS#M?QU>%Qwo>~W9&RB|2O>0b>v$Mp zS=||_p<_TCMU)K+l^{u8mQU42*@Z^d3P^~n&rofZ`7Whh49R&U2Pqr7jX_uRJLm>n zOa20}H)D)7ThWTtbT{7y5pO2t;0g|h!_M$By$ITho_<_`c(E(5?_yVPC8Cg4zEnIi z@o`xUK1z4x==TN#jG?g{MC^7~;o)dBx2%H)ZdKis!cmxRZ4umhZC>8QB${mJcAXQ8 zmS#~RB!)gHgcs%%mT{6FBj8wx2?&H5!2>8C7u%pAUS9Q@Sv!N8(vV3ra9C!zOAS^- zzM&y~FqgWSmcN6S#A<42Jw=%})T%(%9@{P1=D%2^anz|srtNOor!k2~@X>st$ zQG)7J)4KaJRb5f_>`9eP`czmx>@y&_^g|8M7v(%C<`L!@H(IE(DpaWS5_SWj#m=RVV_r@=jYe%rl!_pV*L zMvWR(kdr=tPO1?V6&)R;JZoS74M=$o{s^^+WG9Y4?O)k!yT&`AjxX8_=d=^2@r+Bm z>F~tyr}4_B^lt00&hXkjJbXXXLC1rYzND+;V5RHtzQjjA&R=hKrl-?pINF`RSkt2O z?X(joMB(tG!|OQdUx%f)@bYPQ?O(^I?YX!K#)%*AgqjQyXz{KKZQwwKBTznRp1Zho zNf?T9@q71*czjsuP8IHZO8i;g97N0!nU4$>VPS-CL-4$^!RdBZt*}2v!g*Vhy+z59 zT~fS7DdMsuV~L78e~GFFmhZW1AVUc_1aK!{(bWnPcf90%@80)M`F!b++snsP1e3FN z)(@^eZ{s1cSu;LJi;8=@WbA2ApObJ^?EJ^ZMA!fD&3o&MTA$%%`CM^75p^5OyCZ$D}8jVq6iS^51B2hRNU@0riO@UOyiWN3@MR(jiD>gLru0NaEw!jnnzIOSz>W5Mvd9>n; z&NmKxesXj{{ON1|*%CeQ{=dx|cJcV7hsAF=D>e4bFV7!++tXlXp8OPjtS@40lEwAOwIjTEB=1Lffe5@ z^PW_E&tG4j+^_M13+mPmnptqzy<1|xYN?HX^5Et}bjEcb!;aec%xouq54zUBD6sYX zd#@`{`dHTH=nz7=<;2k9(~L_|D89ESoYq}UtRjh zQLpts^V6*9lG%kr>^{m zv2DyBubN=|(EsaS$9Ft??E|0e{46E7Z1tSCjvfEwUHA4MKl6<0BaiYeE~+~waO_=w z{$us?MQ6VB+`Aorn78+={?C2;Ma8_^9~|-O_Qp#;Kk3g$J+I)nH1Pk8e`cOSW<$hT$f!uU6yJa12X{tXX)c-LcJAA0r3p~r83{Gv0S_-guq z%hD!ZbHwV;r`;Re^2w9_)N6)}_-VoK@q6Z*Po4LVyn}DZTA%XnY4g^ck$go`$2U1? zE0(RfF5#p{H%&|2yD{N|&MQ8ca@o^2rdL0Dv2k(!vFm%OzfdUl6Ju|vtsn7++m@An-hX}K{%`v~C_1iT^}Y#pbFSEQ&|RDNFPT5dAG0Za=*Dx} z$7N>^PMCboPla(?->F>j*>95v?x-k!`PuW&`t+7nS3dNUw{`6Oryq3FON-yV^^`BK z%YJ26>aIy2eKh30LBBnD{Oj)(es$c3S1dkt-J%C~Y)t#x<$JT9t=?UE;Mk#gML%C~ z@{Y9go_PKI=()Ea^K!+f3$Ge{>h!<8@J7FPj@^-XOy=$prQ7G8F)87h@ozqMO{|8W zzLZvU*v6|)-}k3;?*1}#&ahJsxwY`D%kO_^+f8xL42W-z6#t zSbWO*F=Nl3eD#Yr96WT#@uOe6Wxw0IDeu+GaxUC7_@J|Y_*?n*D~_JKdHtCuTypk+ zs)hGn`^9CiFaPD*3u|H%A1fWZs`RYSrwz+$f9Q#^<-^Bh|9IiAkG%Hq%pZ>{tw?$1 zqWelR(;hnbzW3faH!=l6qUoxgmz_h^4o>-S$QPnx=?wf_;vwwKiZVQkJY z@?5`s@b~lTo5J$v_s@E6^N}w+FmGGVO&`2*Wq1CJm06eR zxw7s*-KT%%uWz*+m0h#%$UR?Aa^~@p#3Nrl^}0>I)RXVu|GA+5#H$mQZLLd8y!hDK zU7y_Y{8eL9zunOpeeBJXZv1%p&cR<5zOLu>*etWa^w7&<^BG?DC(}F zfA}VSd*ol5zPNB|)xtwY-gnc;>dcFm=VpGl<<$d@oqBuV^i{Dt=Uvos)a1FN5J%O0 z|9L3+xZ{4hIQ^)T9=t7Q##`6yz5I{|$NrXZ_=jJ%AGzeRyBFlITXR#wkK?v4ikrK! za%=kS=O0}4)WW|${c&vU4$oO9J<6t8RJ87;KV*IRRqE6Qr@q}hv)==^%)4)A@rXbE z`MA%P&Kh(`%Q1;XCP$ZR0LF_YW5xcvksc3(sGQC?XZ{ zci~W$=E?u~=TW0S`|RkeZ_c@OpD`=mo;Lg2jrqaHx{D_;_>;4b8JltRB^!?$`^+tC z2JF0Z_x54QuYG*X@QV`e8~g2#lixV^+y}P&b#=qkNf#XU*2q~q2DCNJIkGgZc5>MR ztG|ven=_?!(=PuHhi|#~>N6_ljjeC_yZ4)e9=qkN*>PvwKmN&6uKRMzXD@#K_(@YP zd4BroXU<*r=n4pzrCCOUf~4~ZTWZB+{?b*HsjN28;^}?|JrwD@IN2i`{UyDsqcLK{K$1n z*1T}Y!uik4`~K#Vf8OjF8@l)8Ep27@eR|u6e@?sZ-!mUQLZ?S4nKu8hj}o_F%Boda zliwV+aQB_NE+0XR{YyR0IO#7NU(T#t-0z5Otr<^$@b>t;Uk?6Z`>Da%_l+C7YUnGS zDXHU!KD6w`2V)Mq>+E4E$3JlUy88wV-f{chvV$|`4m{-Ue?RcA9XDqdElcr#cl~X# zgH9R{cRSP7KRYG$MSOC?3%B3$#Jb_LethdMPWPcX8xFdx{io)apPsPp^Pxk69j`sU z_xwXg_uFsC-c7#_*!!(<>SY<9dLKCE`?Hg79(>K2qi(q?`@zrNy7RZ(qzO&ee|+`6 zA9im2&*->ul{(Jwc7y&qtb23(G$|>m0%p!4n1THtz|7v3ei zTcLjhc3&snal$wKCE+_3-}LYGK^M_2&?SQJ1M&SWz8QWvzngrE7!UR9$kQV{7Sdt{ z5G`qJ713-_V;g=13^}h#JU}h_8WNkU%Z0TQ5XU9l3ggRp0)euqw_qmX))L1()*YtW zjnj9>w1xG&S>XYDJ6Vdm9ErJ-L?YxC$2-=od~b;S;p$cvoA$cK8lw~C`tSTY|2u&Z zc1z;v>E~q5UjOVbJGWo;`u2}kKD2D^S3|!#{K`#>&VBjF1Fzq5UB7=vtvq4B`%g-q z@bIyN%34<6-}KupZ*^YndE?@iuP%P@!J3QTKY8)}Up{)tgZuvTvOyCXrhYu_x)WOt zd*j-hSG{)XPi@6Z7jCJ0H2Ipx4~e^Nl3 zxC5r|shgTVY@azLrOg9E_Y63yZTb@rZ9Hje)47*@^uXmys>WQ?c*c^4u2@?8*yxYW zeSU)HFRz?5bMUu~+m0GC;=wCN$Jfq2D6c)|knQ*0oO;`!1Lq!g-MOd(Jm(lhMz`-NAObxN!7MY@1OV>t18~q({eG!8W?T zp)rf?wE5Qe3)oig-oE!`wpYVxfBc$lcFP4L=CR#o?)TV4w%vJ?YMy2Ly>Qr9e`OoK zH?eRI+j0BLo6lfdhPK|&&h~7LKJ;+5=?U-ut)A`r(l7q|*tXkChMvIoz5ea0FWAOI zQf{Bdc3w2@mo04T_XmG@Kim7EKV7qcZ9ehp0e@z@H*AX8#kOy(A3T8VzbEm9Y|_A_ zCnl{T9eh6Jkt0Y8Z{K$QC8US9f;XK(nz-iH_W7iX4{rQ?F==Do%uT~dAC)m*<&j3B zlG5)bot$&wkI#`-lI}0{kX}X=fB6b&X2`XnGSbZy@A~DWojaeuCx!I$_;WAZNg67- z-oKP|^p{W1dYiO#P0q#dke-4^Jn;|G)KjPX-y>Z$zZYyLZC!Eat*?;2_T2jAYSP%6 z#E}`Kv!?5JUq)K{Y;NTk(p$no!GlS2AK$m>Ez;fo8y>xtw0CGp(|e@9t>u$Gd1m1u zPxgCg=eWo2Jo)*9KHc^7E62X}Nyqc`UmRa}?00uJjBL7Y?QYNCwmg3MKaLF!xN)DK z?vLHFXy^fp4;(gg;Q9kjJT~^=@7iBa`16Fve1E+D$&`EVe`5au_y2W%-abRNKC*Uf z#vSPkpSu60f8!#0o3tcB1MWM0-ndxRcTdmhg? zgo1YkhnS&SGa!dm4yO_eC8v0$#f#4wkh!#FU?|#&)0YJ0PuL+tB3B~JMdLa2ni*-v zOX=WouLucyEZ-J4hiWx+S~j_Z#`8uH*Hh6M$ca4F}4+`20rn5(-lU8IO26|BcdbaNJ#xh6JZ%qcCUnGDrP3lnmfDP zm@^}3PDOdDkuq!6oMedJB+U$_RL!n3H!L-wP-sq4N^&yvv9X+J?ukM0JynWCnNd^K zVN?X`A%Wab5i;u5*0mVHmRh5{uDP<+0PhSBWGh4E5OFeaE!sehVgXzd^4bF!QHK`0H)9Fld?6=9&8dn`#5R)2x zNYof(A3L41v4W0vl&AsK zjS?vpXqDh3lt&*c&DJww2E`5nVv{eF7=wLFTY0TmaS>UkKPuYg zs~l0AAHpIad4P}|#3Wm)8&smrxW{(d>uTzoke~#^x6l^DHP%%HR4Mq?B<>Y0;MbS0 zCMeNUUv(7?_yQ40VF7tzj{@=wl6IO=Tq*;P3@zQ?uB?`sp(Avw#fE z@+pYo;iI{}Qb(mSM@PvUKLU#Wa2u>Gh!&>AxhOQ+JK<1z>i-l)Yn{|G+*L_Osp{ z;Y)}4C(P0B*=7X3X%>C}xBrarJpy>&hqlSYH;qk~YSRV6jEck4%uz8>YU}uBKcnbt zP$KdY6AO;)D5D=iw1Er4BSHGOC`>fo97RviU0mB#K?9CC`~mY}lcT4jvJpFe>@$&m z$Lx>p5`9MW+s5(Y{NohZV=jn!*-$JyAIZjZlaUscCSC10Y&c`1PK=697wNil3`-VHRR&B2`;e*+#9;|lO z5}|9>aE*#3H&iy+o`ThNfy#DBCOL32h}&M&Qo*)kcn8Dn20XPHSl=4LAnA6}Xi?ir zO(Je*87Kqcahi)*qrDad<;e>_>M^v-vITs$oEE67DSdfLlCeCih-MlzRud#Ar5c44 z5cP9qv%JVZ4Uanzrc9$8vV2&WjEp7uM9r9ni)3TDzbIGv<_BM1FpQ5M@h|%ERo|j- z0Dpmr{fDye1IX`@FvNQSC!61P8Pzfi8K1RE{WEI8-2%HY_}!7d17W7Xl)_}f%!Z+R zX-6i6o5gEsM>chv%6F0C!Yu8`qHK*DRov3t1?vy4)B0N&s~J24Iv`E0E)Hy7L;YIl zooU*T4H-jc)FsuJ<0HD1LOB#vwo)01Bcco_S`gg_g3O|RFXTU~gXFvx3J*af(9kQ6 z6vBsCc=sNx0++M~h5r^H+)3Ue$>9ZcROZu2p4vw$mwxfkD$z`P8z z6n1TXhCK%MK`{HnB*4TE88n;=J2eYoCX9+Rrr&KCZ{w77B<7fx<;0ZkoE4&t%W-l_ z_v20XR=Ag8uA6G~H?G4RM_5*dvs1hdf8BKkX0L(9_xmaQ`U4ewZ;o<*Y`tw3T_;#;7&YR&-5NYQ-yyYa~ji4PgJl8a~|CEZzk|R0*1TMPPa4|A58xdqkJdsKgxIG zaJNYXzNJaJm~rF*qkM2$g2VWoY53q z9BL`%dRe~wb&Zv+qEF3euMD+u6weH`nO!=wrm1BEbj}Gb05!Uptcp9*dCJo)-c5hS z9q9U*;FI%XPGa~#xPw`&=3t zTS2K8YEt9~_Q*5-MSK3~UzG5)e-Ye59l;PZ)ng%x-x}aX2|guB0yQ<2Z=i}PsGVo3 zI(!oR41%GZzw@3Q<+}#v%8oH&=07*ecW?U`-+_Sd1HT*JP^whlN+nCwuY`tzDk}&R z2182Y6j}u{d$)cdbS~$h;;Ue; zEld%NPU}2;Ujq|f$6H?;3{d-x}qc8fJC?|ANE)=MP8u9)$T948O;I zggGwEJO%s*4tHIQjI_iu^o!=i+|p^Kq3VK~b>)fE8zDYIk-C}&oc9OUK|G{6QFP?v z(sSK3Qxy*mSuuDt*Hqz-Q<%-6wX8WYyF@tCsZ^l6u|~9;t(-Wkb@j@u)hj94-MShB zTEb)~tb&xIS82!5UDs3xvd;h`au8Ig7Y{%{X&w~!bn6R)sU@c+C;Q!dh3sWzYh%L1 z=E)}acDIpMiQr}*JklS8{`wMUnc4=cOJ}9sLPXvujDkw)HZNTZ2sHt$L!=9i{)VOv zJq3loa?v*gPl-^=Uj>~Pk*m9@4iPfmR&Fz?CA?_^b)=LO;W71+p3(@be=~blvXPT> z7E9(NZ+i_C8720V5QM3{?M>Kws7XmxVz&WA-61)Et3-`7=Nz-$$8{UVnJb~DshDNF zc$Nc87KBE{i_#X1{D@*%b_vNk7uy;`YR{+>eH_rMO7TvmTgVUzR^9(@_-T}HC(KJQ zu|JRUrNWfL90T)F%xGT@@QpBU;CsT+V|+P3U_1c4q2FlV7WjDt=E`42`ECY`2VTdU zitjb>J0I}Q_|d*pd}}uiR}C2LYlO*zpGugH!ZE&1n9ur;_EDo{sLA-B9v(nDGClyx z*Z`OT*_mdYC4rvjp3V65*Sv)eq%Y>qcg;Cuw+VkVVN!q@YbXF-h_iGtd{)LdMG2^UKlt+>cMvI$ih=@`tUr-L~J`iPkf)CSce=6WL&i!vO4 zi>h@qF-nrQqJLM?qv%;OOAu-X2C3CIw63l8iaG}9BfDW+DpHwXgA;LvG)mDR z&`G#Ksrq6yH*@4t4Xg@U8EOtT)!^F8^_ULw5Hib#b#)WYUvQ12s=+AbGZ4~bc6CY1 zOCVhVt@XH?Mp!7kk~$Op5>PG&(qwCh3OqKL#a?9O;y!(Cd97C@>ai=ToYqiZyFsO7 z=GZC^o1)oBZ)#YF6RO6V#*mQ@rA*K@iDwp2tLEhB#Yve6EjREH5z$M9J0V$~7KfT! zYg-h>nuUchlDq&RAwtb0GMST%To4a5s@I?j)Cg8-<+TEj9U#NzX-pY=>}$Ljcl_@gtGWhkVt>PQ>LCq#f2fw zz5!CPb?aGu-fElX4Y+^8DKf?cHWG?rszp&cMl3yObm1Pv@T+kIb5LCk8k`hvQ3a`4 zm&Ej77g$Ysvg_dtgv(cqF@`zRV0tkH|3Gk1T|3QmwyKNi*qL#3q$ZI>boDK?0!A<9 z1@9nP8FqAP9NAlFcf=(PRW0q%bOPx%c)~u_F(|Od>ipV$TPfOf;B`7?P_#{m79f{I!yK~6=4)v+vkTJK7taHPB z+`u089d*c)`AYUb!#;GpZT@KAV`-y(Ps6+j^D4~SF#m!16y__KUtwbAjrQ#evp>uM zFymk@L)b$Ar@_pCnG3TBW+}{am>QS{m{yoS!fb>&6Xq{4m%>~Hb3M#0FgsxGgLxQ+ z@%Ch%g`d~^;4e}f?;uW09br#% zd^^K9zf0g}GR#bvc`$yM#W3`f4|6z72@0_o|djF5LWV{M{=jW;EPTnc%4& zdUw%i-$(gqGnkx$(Z17QKLsWUrW9sqG4cic?xmn%7}~WVzB@y|PB)Jkj}ss4A-oQ& z({F)a`qyb|e55#-7V$bw#-+cV{`q|=%quXRg`<6UzbhEUNYKu zUW+mxJHCm#%3=Qk-@8kdzfS>wF~6rTLp%1t=rkh1+^I(?`&H{~d{l$|t;2;wXZm-ArN05`5qGzl?)fI%Q~_E>`rB%3H>O{Ydb-(> z{s1$5;-L@E_49`PpsK{EXRbdz0}t7g{!c$~wC~Q182eyGZ9;#B zeL0K)GXdtElhDtB-wAjv4DH$w-<_dfr`s#0-HD&kLwFrlr=JPG^sm#__(*XuE#h^W zj7xtz{qws4=5H`XCye%;4D%?=2e7X~95FD2iKgNADW{_UU#radj&I_YI_wwWd+TY+ z--Uozo8PaUKH9gd4@RdE3BL0u6>r-aqkTtgMxDT}O}KwA{Ak=q7uny$rCqA*hi|j- z+pn;{b+~ZoOg|Ks{zRllT(z05--I(R9PRrC>6iZ1c4PWuP*0VP^zS#*C*DQWu!NDd zHy8S7Ar`&CC@3#5inDM9Z7P1|1~(WA;UyR&v7!|l$L2(ErzQrual_iQc3Q#W#OdOY zm{V9%I;~^QtiY_)Y3(pzty2e1Czn}bCrauiA5Y-`G<>PnU2;ZWqkf+}IzJJkPqX?XzD~t>}^zi%tyZedn$NPpq zqt*qb!JiiCI$%BYWZYMATr>DfGIDc!sHxuE@$TvW4&Bw^oLMepDIYW%=2$b=eOuQ& zKEUYQHG9Lu{*00Jaoe}w`RDBKep>W#OyQjTl(9)a<+N`)V*Ufo$G=&)zhWLU^!d^R zpGxL%1$}=~@YIJDJnBb*ohMHB8~8o9Ur^wQ|GH3M=;@~ky@74f>3|=#<;*6${Jb%B zfWH51O}ZTL?1LV;_Z7g@N#Cs-l%ex!Z2R{~%TwDjjK>Ss);)NAhOywBHSe!@C&RaS zd&k(D_RlQ(^4(Y7AG0L$+?Vq`&+hKb{Qj_a9*dr~J@fWUUfqz<@k!=IZ;kdn{yO#> zFbQv9j{y5xm?1E!Fkiimbu94D0p0~eyEepkXXw}I_JL`4;xl>(ufyu}OW~LPb=n#q zDGsJZyiSvG>2Ifhejg8W2h5r`NBb^-c?ITs*lQ8TFc`u`rs4PX?_$ljN11ya-^8^# z><{Am@%NO!hXMa(e)s_r6L%^g!&jMb$|s|J?;`zEzk)GwOg|0v6m+CtYt|w0z0G$Rm|_%*d#322{Hzbt9u++>c3_+*YM}Koa9|8D1LbFZ zC~I6iJP+&#OMiwUasV;vr$1seB3^x%DS->7mtVj5_~Ge!z2F0h&z1$f8aL&ErZrFV!`9&0bf%*c!mame`%1hk1^QT z7u-RHkv(yYuVwrg-v*eMVD^W77|gvB#`t!@Trz2lum8bge8&KWU})Ed`0fn-I^E7S z?N0ocNYCjf(zj0EKw9*#)7JP%aWF07b()M?s2`%t)5zzjlJ(_uEjTn_sv#PI;? zf$&p68h$UHJjS;tU6~b*Z{mhJ?5puzIYs#k05+N5R~PNOH7GIfk^FHBE< zoNf)NVSeW*`|i0m{@exjw=-;{Z>B$Bn%n;eC>wDT%zQ-TRJ3Q2yXyir$;#^8}tpGXpqcSH&_gio?B!-QDu1}3YvNG zLMN_8)Wh)>>vev9ZkELJzn|(v#V+-K0-#z?QwA#yGV9P)*aY#Vo=Vn)=iEXS)J`X4 zjBA-nk|u(6!I{z6M6K@ZamiRwF4s9thWZANTBsup_d#U(ms@}Z6C0tsvXNcHbd=2T zls^(45;0~}pfEh!L`klSH1-n3+h$&z2#c@W&evmG%*YX;JmwOD3dg2O-bF-;2N^*M zph2=CLsm!%;7SQTn75w1h-8$o;z7@<$Tf7QP*F53GIu?Ch?ET!xVN0rOHWy?F`s*) z6mMORl%Pff++*T$5{%bfMijI8<@Syb*6}hu4b2IGDLf2_n?*x^V^H)$0lfhUwG>=a z^QxLRG!(5>o+UF06B{Rok8tW@56_HnJOmwrov+>&&!s#rsgHFD9i|Y$!#$DYZ}l5Jo7=?IzS9x;-yEqbET$kx06+^NV>Ae~VaaPa~DvjdYJ@BI$zz3ddVhIjgod)tfEMBQz>%)w8oW zFPPY&C=L#!Q1B|?mRh&9nsq5>XAvsS%}5V?k^;1($xF?m@J3yQGM>@ZoxlHW8!l}j z1xw+>?mDhJM>76WgcQw!ho1OV6Ec1eRun0wWZ|OKlu~6Js%gzgaj#F_D_-|vDhjKh ze9Sni`lU;A$x!0=E=4P@$8~G>Zg>k!*>t?cmx= z1-$8~$hS=v4BMBP5nUJ*fL!DtU`U&WA$7qcmIQ)T0m`g059TU^6SnEsA|dopFoZ&? ztR>LYT;CzGt^x9>r+N7tCcC|`9*r}qTT+rzlh8_`4$Pz&BpigHqs_*+kG4URgZG(Z znl~dOzessEr`)XNrrrp0cOF(R+S(HdT6v5;GiYvAVo1SG-oiIytSpq!|wHXYBgdND9?v+ z#^q6-*W-)_qC8K>88Id zp7&yn6wk%6#$wOevBq-GiLpj!6p?2{dG3xiE{gK(h&8T@^4yLR3jU2K&%?3Cr%|4r zvBob^p8H~rE2HWErfAPUW07;u6S2lK(Vj;{@h75< z1wiC_UW-QC8OBkbOJa;;@Ns&S=gnw@8TNCuaeI{KhiEq9u4v=SD9=SP%=3jY#^z|x z-e}_`)-Y2)XpCVj@jM@81b|rQIV;*|_nZ;U#83TyhDT^!dyWUHm?w;xH>7F|? z!wd{Kqo6Qc7L9SS|7z4|q6Uqc=o;4;b=4%UNsOyT5fBiNyMTazfPjL4fPjF2+yw;W zE+8NvARr(RKtTBaPIb=!-q!t|{l0IW2l{lKs`stSsZ-}#?V8?>Y;z3bwsp%J2^TG1 z#h07pOUL|H_B-YQ+3V0^zN3q1Yeh2nERqXMMQMtW>y!gQ=*#fCDwwq@DVSuBVhXYTHaYngfVw_iUAr(kC3@S-V$?9IS`B9HN@0abPk#I zjw};%)DhseuB;21zOMWeT6F&aJe;Krnh7j!(9H32mIlohuh9oV)7#Hm5H!<$X&*Gb z0@`XsK%X!vARR+yPC#A=ndJd#6Eb@PvLR@OiuPbpnpk5+qz3<1R-T>isg_L33YUji z?b$(=ds5KcCZmE(`oN%hq8LP9M|KC9zXWe)r_Q#0Kk1l5&gH-p*rY+T#JvFcq$}@* zOczfM&@WG6MldR5W_t2^$Sn49hK9^;_AOXnc=8lq>&*3K8ol;qbjTd`UvMbuF4>?* zi7aJkA|HgzERh8v^O4Bhkl7YY&GAplY8yzUy9=$fa~ari2kL^fp9bH-kvCk^%aIXE ztTN0s;~W{{n*M2`yg#2x^<}BY{+#WZJ4lXxOg4DtSy|_q0Zy5*WbNs;{KQk@Hp-Q@ zd!~;*V5nRCxo4ItxZX{)_YD+s!ZY2Jkqq+WMYgAc5JDuioo=Cf_ItAu{3y-kd6%C5 z(}5#$v8?oVl`Hme%_x1(M0S#E=CG4o(>dMUZ$2iOBCjKkxl$&(?5@Esbl%Hl-Cm%T zqlGNoMAwXTWV~x8z;0c5Y!2mT(p#Z0PG)+gOm|GP(y1_n?3W#_XS-RUe63t4z7*hU zIpCO^b!zX*`&{Su14pOF)=cOC>(wQiR$g$-bE(3PP6a@7S?n{+@xHlF_63;VBR=!{ zrLQ}6xvx8qQpVXaU_OGA_-3Dz|9QZ4aOLfQ>E+7UfEncGyb&-nTBM;%0L|`ed6UfyB1B=`RXT5jhbzE9FYy zkwIybFmr-hzA-2-B+O9@cMD0!gn2Wh<#R*QIbpVj>H>EN%anxa6PD2lGdwJ>Cd~A( zbWNB&;W}XZX2`098I_TkpD;T!>QgcxQ?~G&Oxct$Q#0k`gjt>`YZIn@M4#L@BHO@5 zN`Y5I#^3ubaLNvJr;kiODWO= z)W8vJ%uAjJsSNST4TR{8_00y4pb_2w_2p5v=QHMs)ay!=@080N2Z>>pV=k8&4(J{n za3thXzrE$i4djT&;l(vcw^IE+`O33Q4YGX6H+>xGY$k6zh=%apdlY&^#yY7ZfOd=A?2DE29*e+v z_eS9ETO#I*1UA6)kzl4rRdOB|MOv&kCTfnt zN28{xdi3QNbBc|9yI#LUVt@7foZQ89BWEU!={L;A$bD;d%&W)`Zrw?0E& zkD2WmGBjrXnIVH?W>{vaF$*$fF3mG#cFb(al=ot0Z)WXjJUk+!V`f2=mQ3bz*;H*I zBLi^z;Q{0YM7!U~pn!QKdjJOx2a(TSssrnERQ5aUsJzEHiM-dtm8k(U-DNd7dbR{~ zzi$fYQU7tkyygjF;Bv2mk$JM0NBOdwv&)yy0_JsJwgt>;|9;zrwvMv;=0%?h0@gu& zJ#y$HdDP~#9?j|I2&j`z_GUB>w-)NlbXPWtS&SSiX06+@t(Y;MmQ3|jkKnxHK>Ey< zboFJunEt-37Bj(@kHpOMa}h5$`!ZZipMbX7mX=JPRmq{TtO}YNOWz11S5FV=aW^$& z`Z@9rLYX5w*#fSB?Cdoi5k_#6m%=LRb_%Ol(;=+mn;9~jd;xpRm+oORCZI4IVrW?3 z^it3a5LrX-Mfy=5RP0uz85U!{TMBTod=NF4-n1a9;~(dk;ZAMfg^sMuG^-q0nrXH; z@od)Mw}cXwp=-pv;YESb;Ce*Neouf;c+xjwI{VT) zVn#7L5i`k`H4(GGm;Mp6-OmO-i4YpmZ9O-_w!UCW#LNxI=m>PLPuLxh%@Okgawq#n z?Sj$I*rC-!c3CqhoGc0r2#$g#BH7CO|APV7U&yJe6GvvLfc`rkzMa>5p zl~cfG$V7HuBsG&(vZ++L>ncu}wCq)p4YHZMtDHrJ5p=uXsp|KLs(#PNV#mx&^Pq^H zMfFfz?@K-I!W=#u=E1tJRo2}~IrlyCs*B_XtAE2O27{Jj7x5Y8PB%!GfVq!Em!Xcl zic+M{GOM;Q-ChL z+v?KxH0kM9KSh>;8h@O|dF{2lpp|O4zgGqKap~=;{`$GqevKYk^F6cC z5#&h}=~ z%Se4F({+~ zc_V1H+LF&X0)ys6K*j}4PtiKN^r&E7Epb)K^$aleUCRrk4ob289#08EPe7{w27%eK z3+!2W6O!)}suOi`iUHrWs>>|ra$qac@bD5_Q3g3Mb*Nv3q~FU>M_HJCP`=_TE=Mq&!?0^?UrKB>DDzxe7`W>5fu>NJ{jrJnE`fjyLo1eQ^CpO#HV_yl^|`n^1f$= zxH8i-6FFo(1n#@-8z(t+ko~TgDM51wYUwkoxp#rFqt`omOe}1bX+N#~>+Q<2Al9wC zB|$R_+6Z#6)U|r!@u0GJ^l4c9)}S)p)j=397lFZX+lS0hU)qM$s)N8W%gQH*{7a1) z7m%JIGd&>PLS{igx`fQSfV>D>7tY~nB7>|6U_i*Mf*Xg-4w08J7NohcU8g#74Tqu~ z$TuhGo8J>^SE(m$5MT@b!&-!x)$c5fr50(dYm%o^d#zCC=vsNpF?S%sFg>q2s-N2T zUYC!~{Zm=)!ByB?_vZpVEALrdY^(C0CFy;#+>IH5k@KIOA;WnNM(}TTiN+x-# z0K$-L4|A1bOXXgx5?={%J)9~ZVMX=}rM0mBm~eh2J%s)PJuO3oVJbKb8-%FU2N(`9 z3KOE+;*cl-j21PO0dI0I;?VBs$rQG}cL61vu>iq4J;k1a8o>Iwz=M5RClG?d^L^PM z2&#Voo*9r&5EcSjpJVuds2yl4d^Ei&Tc&2_dC#5=x65!3l5eM*1E{Z)=-^>vYXXb} z^qPm}$#rn+T-_A=Tyhs#=?5Ay=#~YDH}|NG_Q`CZu1^qYiud3n}pvluz^Xk*{Dl_DwC6&>A&E>3C4S zaL^LkyUN}9KF*OBE#n1-^P-V3uU%XyBGs~;V>h)<<8>DrL>xG57pM7}pjqI^5<$qz zLm=WLqXbsE5*FynE-?!&yw1&A9#ria16VgN(Ke{|WlENNf*o$Xmv}E|4tR;dLDSFg z?NBr!pr*5hfjr>0Qb5%?>FIvnsX$G+}gi#eenh7PD2&$T){TJ%n~z1^^ExbLX|)^~wx?UP0}GC;^&#Q@f>fsUIqTj)9`$5|U-rYTaw9*1engc8^LW535vy#BTJYMAby}KrFGA zVMLE{u1@Wkvv$6QsmEY(xtb=eWQSvAg=b|~S{LJZ+2g1pW#=O&pU?WLj8*-lAEuXd z@g}>)E98|BMy(fvuoMiiH|9edkIE)NBP##{iysfMI5He!aim|+d$EJgR3H0|dhWvE4Gj!*+nX>;N~~0fJ?KSf3dnFaw;-OHnsNIzUPo;5-f> zPu>sd08t+p;JYF78p8=e64`695c{$)WDeMp6TW;LGCc!|9TbqyLgvkYYzvvm0olTF z7LZLLbKGJ(iR?xr$4tdUi5#JyB41)x7TF&%Yee>j%nL!q_6^FhkQpCJE%o(M_8=XV!S)I^2^a0?*V|6KY7FhK0}&Fk7n*umEU z=pgSzK<5Qjd5`t39d%@JKy8x4FuuAMf<5Bq9Z_AmE=u)sudj0qo{`?)f6zf)D6e=J zJq>-CtD^N359Tu(!>J0-uz47oBda~LUqQI#A&+BI^*pM~yDA{n@H zoWl!Gif5K7!(=QgLtUL~EywNFNLR2+BTl#c7aJ+#ZP!SxtBWr&2lPq!FJ?6|ojjS= zNKdLMjm$VS5*pbjc`~OF2QL({+;8!IbKP)l8k+$DIn&6D4CJ3`q_Wpnjg)~cZp0@0 z8Fdbd3~Ox8AaFHS>U*KFSrW{n{7_InZERYHWJF^#G^8+8xv;TWZ{a;5ZzHWjvbeFC z99HbYuxxH@_J=*-&KadVVM2!NXl#~e{0nfGOgYrp^v{$7jm^YN+0|GrA(ZdWl#`9k z$xJ!kSnVPIY;0ylw0v1a+Etm25qZAK9FEB8#%6F-%g09Lr7AN$DxIp#s;G3RGHqg7 z-YX{EtIUL0KJb>9^r|waEj$`SYL!`>RY3W%EP18Mbc`1PkBrN}Dl;dpZCAu)aFy9( z;p1@`Uu8NcWN4L{lF)frosbz-W?MqutuiMQGP%l(%+^+uvt@pjnVT(h=x4UfsxqB& zw0uC0EUGe-b8>-K=E$-tvnxlIRGBWh7Mm*{fwl0$Tv=UZcIW0yCnZl9G)Dvc1Y2Dkui-TPQo3heEA6 zw@^N>GCK-e0*|XD`>V`?T3Nu`Ysr^Yrd^S)%c>$dLfayppI*gstjdfn*0!^XPXL~W_cay*3|5(BVC%B0d;karq-1KP0ixE(yyu6 zURPdjYI>FDP(HR?hBr0S%jLDEW>vWi0$Z;2Ti27fnwoC)b!o{Km4CNNp^`6<&?rR8WeV_G_=V!zp6S-@MlyGg!G69O#Ay zHyW7iTC2;vUKl+AhTI#0USZH}I@~yds}dtf|aSnTc-q zHfhH{N_p@GapXCA@Y%NiS}qsks4&h1}vvJnL z4Dj=Sr(*KRP^qJL2Ktk9%rIa3TBjpsjttWuGe?FQhG8?qd>GL3O_)3~)FM71!yLop zkzrmFEgvH?JHyNrnVw-5icFk~JA-L?|10 zW=M8rm}Q~d^%-gmw9{Ua%V(LqiA(`yJ>e~P(1)iv8g!9bQmcsH(8bZ2vn7qJoKVmj zIU(PmH4RleN)Oj`NAGZz>TnXzbqauw@zXrIGCAd#weOWtDimWVL6)|~5!IjS7ydhf ziv51;wOb(eH+^-rEbwt*ZeyO%g7hfI_H!y|I^Y!`JV7-MB(ZiOos;K7=8zV&4#tsE z#|5Fc#X%K7cco1av5L!$c}NZB&k)6<{mCw)ex*!MhsZ-X)2PG zQm7pw4dD_9L3G_w`^sVquXa?nK4f7WEZAWBAtYdlan-M) zV4`v`%iv-Ho=sd)NY#1Z-9#FNOnX#0A{~6eE`vn}7;?l?v(~~}eR(aUu}73cj>AJ5 z=m9)FAR|L&sfAJV-=uFAJ{6F+LOTD{86+}3q;?!R@+43a~R=BmAsT>U(Jk#^qnA zFYqZs$8dFFgC=$XUpSn_wkW+EYHB6(pm1tTCw9tZ#mb?8wr(q1qf9qLh3xS#Fz!+> z{|*m!)!7~9=`tAVm^>$vEe)J2 z4nk;6P5Yj|CAruCJ{c(H&+MtLh`@qKo@+a`5CxYo4pHeJ1^ROvYJ{FNPvGpe-xoFB z4i@~dSP7{vreRK*t7{MJR+#grr^d1t3mKZb<$)} zayqE)pFYT^VRhkk!>NuEb+wDosABA{}BSym`!wtJh_Ngr9EJg*!tksa$^FU1UTc{Y?&5jL)R zHt>`DPMs*v@(p9+Yq(ah58-&xe&OU88C5-ecr>LxuzlZ(>O{SX^F_&MlB>RyS+06r z2;;#2=*qiM_3}-Qnm*c#;q2F_DgiU_qiVq>Pv%EeAD9!>4U8?{fsGDF7x7uRg|y&EK(pqz}FEkQXR)x~2zLh^jf^bN^r z>xg1LLee2-mWQNW%13wTBS?SUj=E!s?0blR=H) z*6%tlLtVnlv|y8U%I>mG+4h+f^v+bb>)=dvQCrbgZT+R=!998_1-$Nh92c0f zY_psq_T{zmierA`wRY4dV2e4H04|r810Z__cqU<&k0|uC9QF0I1>`9C%2#Oy7{#9R zZIgx3WLx7y#v5isoZ8x$RA8J$?KLR%K41)fFJd?4_`uMHAB=D(KL>au0jU9VP^pUj z|AQkgD&+TQTA zgw1GF#|w@}h{!CbsqIx+{vBNZ;vLbbyN5A(y7IDT-f_JbkW*d44|#i}2u69O$IpwU z2GZKvp02-TKH*+?(3la<8|%XZhWU30sC;}nJBkY=1VlUQa>`xN{YQ(4h0yZ)8YhmVeR)C|ogmUD&@0!gQ&!e9vrJa#a-t|3<_ngVb zyd3a$V7}G1J;XbXHB-0g8u3ozs7v$bk#<;DE3>~@-WRBDX#j!*>fk8X9Z0kaHhdyu z)Rv+!6OXk7hb1uQ48{_40bm$9wv-tbM%cjivdg`Sau`z^P8e)zoG_leAR5U5+zVM2 z7oxA_xV>kJneEGTQRm)NH5uo;BL?SQXHh5je?R)miaK*NPIkO)9>HfYJ`($Puh3uQpsVs5 zAPgMS6~_cHr#jZI<<338=n`K6yIM{J(|_OTcrgkXVTImyC&m6Dyax4Ycf9c*a2{ruHS;(}uFs!7If>Zj`MWG|m3FUuE(q6{61@9D|Jb z-}k4RlZ%{ixhf5Mcs->W1`Gwkk<$toaTDPT^VC3uLZ~`}Rlgb$4N67}!5W1{6A=M; zIcD_?vmHr`;0t0=!f=O19}}hlcLMO?c&&ghs?ezfHL}3z+>i_6I{CDA+b*rntduB0y|?;@4GwrucxdG` zjU%s|qB3RaB=~__io585TZ;dvr&m5&pqum6A7!G9lr76NO9FM5WSYZ)x(f)< zk^H%tYI9$lp<)PuV?lX6Von8RC~-I;85}YFL*)aBu?gkB5>XO7lxgOu*zs}L8x=8! z6l|a25q~pNB@5o9$_P z*uw2eMDSG!q@3K3HgH-CudB`^q5L#K6P(2aM=(2hERcsSjQ72(J%uShL@^z?!PhsYh-aI&!@Y2m zx*L8cA8V}5T9*M5{?Hq>!_@(P=(6(^W`HYPjf(=wcT+b(Avmz-lPxk*ba+J2O>lk#OvjG~%qTYw zjI>Yg&tf+hcrW&U{G6WFCls~=8_2>0Uvv`UWa?4QQTh^bcfQu2i>_`D(e9%1JSA|x zK^(CG#V$chx32fs2woz_RTrd%Y*q<&w&tJ!JtzoDECL|hVWXqMjUCSqigK}1j2FN1 z2p}C$J*T;F)gLqWKeFBhxxY5%zdW*RAU48D*gE#~g$6%lGdY^3V*6QH0RJ|xcwRTZ zn&)aR7y9&6-yHO02q{gvFaD?N`9AAe4l~lz=%8@a-o_sKFSbwzo7IEU3YIs;=Kqj4 zWP8)bm1!7kTse$(?A``U-brgbmEPsR$j*d49rtp9;bD04=@;Qpo5?k?&QrYi?E;Er z31254B_Kn|t0A^m9r>F7veja-@{J9eHe%y=M6ts}-o|Mw+Lmw{!hHw`oD|e0um8U~ z-RI8XjXz>fzya!*a;ETN`58G!w_vFy&Re%Vn{y5EE~vknYjz9p89ddaP>_iD#01<#kJjHe<>Y0#wUkAS0FQJ5?U66|)`|sW=M`Kg1{pXC` z8*GJluuPu~7x;&A@n*7D%vG{m*yW_AJfToG_6_+dC^GO3N1n%Q<2D3_|G+(#xPJh~ zGWeMgeJI%6bI&C6l#kjo3uePTWtE_XQT~U7>0!Ag%nCT8VC+wG!Wpyn3sIj zQGpk@n!>Zwy&4z|B7 z57viQ>(NIj_i^UJCLs+!Pul3_Z3^gCK?<82$LwTl`4=Qb}o3wOX>FL!=HL;mfq}XFwsV0Qf-vth_n#-jLv3Lb)&bG z{T@^?OugNUIb<$cXfgvh1Ta-KCEgXrOkejV_2y`OO*ew7?8baCK=6b-WrJR3l zygRhMC-5nxM&N2y_+sT1^<=l|lWOh$+F|~`av(ec=~9jPkdjfHP+I-v-yFAO%ccL(=hEn>EoUg1hc7WpFmKbUcZ&Y|!njOx!-K&>CXuOsV-`W794BMG#VEQy2bz`0EJP=bIW=o9smaf9q?81N)49b^TsvQIG4|=3q_6%wLDI`V3%_a+zAk`;s28XqL zY*+@x&4Tddy%R+J$db6GOuiR4Lo-UJ#)FRHiA_Wjv@!0SLPs8unU&}3ws*Ydtn1z{hw$NaB7Lg$YO4vXU zU^v4Uo@%?m%=|%wg7h}~9!|t6)^H-=AK*k_Yd8_`4{#!|-^qz6hZB)u0w*F(0#5X* zRrE1r_X*^zi>qR~I&PK)bd!^nP5B5ZU>h%xdgOHcpk~w2-t-D2oAx#VAuCH#=Kd3~T}xGl{I}44Ix#7DKi+EM^qh*BQ!6 zU@>4}G4Cgo#Q?)%+GZ<@X`QVs=4;DhPFNOm%(9r32{SWVM9s}nc{|(ei^|w+b0#XI zvrX5Sw9huPV;53BH!HOtFHiyOrV0{#o)XeU(CtRs*rHJ`X@QyoKQt{${Qt+PKK~Y{ zqNIjX0e^#2QSu`>6*d3&IaU1>OP{YSy)9t)Lt#XdNYho5D zIX2wrn1c(I_bg7!JPXq@PdQ5L)3w%<+lR!h#(veIQQd%dktq{YDHyTkv{TyICZi(M zOl6Y=3FXn`Gfd;adu;04QCCyY+IXd;ppEu4K@C3%*oB@lj1n^Q^BWk zeIj3eBb{9H2kGFN|J3{k7H@@<${+hNCwAl1`g8Ng&C)^L5}0luZnjI)B^thOjmNkp zh=?FSZ+i9KDrOxk6R+z1K+B+;yd|oeoRg9MbSiNXL-@678E>Vg@_X{Joj)h*eYH(% zs$2rC__QN^NM|H22onfb5vYYuQ>o{>GAW?4Iwp++Zen2on_V_AVHOxgCXi-~NNbI+ zi@k~tSUK!99)r_r;6O`46-7ka+@;wG59qx*SbG7nJ7G5&VUv62kwMJTISt9f>EI@? zs=VuF1ApYITms+CPt|pAPIEOb~m2Ld;AHmyIJYKP)GBa)zvnnZ+5hny8Qrc|T_6XL^ioeP(KUI=DKE z^@<6>xkeUcLcTLH%{^t~GgZ_anyKdjsPUW%nW`v#nF-;Q?ax#Z=<`g(o=UKX@DDPl zp4J>lmT^=$!kJ7Jdw}PXA&+Aq4ic0{D23u@aO$gr& z+A~&-&Q2c24)`Zgox7E|zH+=z-5R6D>uv#g#y^##5zJ?YBj)z9gAwH-P>l7>pd7Wy z(yclel3+_l(JbqB&>VaDDq^;xO`^QGLKZs2MizQ|uZ%48i3C;l#q~%jXGC8Jq%Sh6HPMFd z5sYvUnXUD%Wj~EoA#SO={$^zr_bR7gQsER>o!}J1$ot}`vM_Qpc3i@KDBo{66qZQf z0azvNp$6ZX=+@SQ59QQq?TRJ%hjd{t8<@k3{4p#Ez{tn&EHc4>C;LV4GNi?xLBfG9 zq6Dr4hZ-Hw47ACCoVS8zHPNBgMPYmYgBnjc?1yWFuyhe3#OZ5~@F6yG2-?)G>)cP#pH=I4R@IOWDChRpBpdvQp23-b=79|ZU4+91R|Ldmuh2rV zNhvBMrQ4_fLAU)KMda>3g}ZAgS)Cd;g>`5<8ji0QaB-jANjSW(a`r5nxqHM{Iwd3u z37a6PQ?A}2g{hO0_2`g<1X-8&Q5#6LKW%*}(ihc{$IYdDCgmj!^l76PBiL@VcFOx; zhs1!zf-G?~`*x#~m`h}hQ#Qp$;=CbT0YqiOaoQkc;9w^B#!X;v+3%KNlNn5~IgNB! znDe=n21~+P>xDuI9^mIAbxg5R$40+Yl^?$hDTNGfOgNq854IB*m0;w$TDSYnvXRZ7 zAW-H{WyH4jbV^rNd*+s=m*vWOe=}x?qgQ54arDY8CY|dLzOy%`c#{u8`IgJd5>a>vhTm7obOG?I=E1WZf*Mog6G?gs&c9 zP2C5$S$r#>i* zaT(J#d878JKS;B+RQ~*jhrgLo8~l_W_EZi5+p>Z7=VHA(@TV#@J**JD!1Rh)7?@rl z1EV|t_wT7wNT6{eO;m45Oz-WQ?(hI5&uEJ1$n*n#n54cZim*6Ehfk*Iu$R(dM<*3< zjD+{Y&m8Gi()UYSz8=R6GaUxbRNClQP7(&!gCJ0+DM(~yF4{q6{+jE2h$16I)Xn33 z$0xRiQ`@UYoqbrkIIl4i5)DdhLrf*)9x>v_{v9mlz|+KsA{)o_mciqk-GS17a>@rv z4-u~^^{}l?m(qRM(L+c;O$F`-y+<<@|11j##U!ML z$Z1CtpE2{l7f@cqra3_gE;7zO0xwC?4iKK43%m^h%-%u=+@2(D;-9$cQ17DCEjY`< zxI0wPwJ_Xg3N~l1I;18VzjY4*SBtejNacfk70Me#y4E!}5w`T4jJF9qZ`4)K488-7 zl@WEdd(V4htjnOfT=ns;H?~}Frh%6oK)HU-m>eBXThK$TKgEFN$uU9%< z*X)YQ$-3rLG`_N~>5wHnVNjM}FIkW!qsz^nEExb9#bs2vSs0h239~sahZE*RT-swR zNXYBurcJijsoYG@hTU(;mR>oU?Ki933{fla*c^Gg+-y|vK#q*aHT`pCQMs9r>&-7W z%W_FZIh-ql^Gu&S*;{VL=E=%@vmj5F=bMdrvNO*tAia-XwOed21%FWCYy12bWy45!AYfJlj zW>9U}P--UEmUX3ONo`qE+sskd-$$k1i}f^V58qXpEGaW{%A{vKv!P5@)-i|5WO*G! zwqB1qW&s&`^~@J_ye{=rvtH@cqsc`jSfp+$e>uxMlk6VRGXQXl^Xo-OdxYR-sp8W! zOEY7;WkI&ZU9!~u%q2)FVq}q+uRIa&ll*~d^%r6DZ&bIDHJHH zYgeFd1f%Ycz6E-WbS_X+o6%U6(FJBT*WDGU_k-)<*sKMni!Wmf)Dl3{sxMOt^v1|Z z1!`L+e2ooTU{0}Nd6J%!Ov2m(Wr4E`%t|fT9FPwR%swuQD&VFS3a~LRFEGQowX{H0 z1g=8j3akRNNn|BY(gG%IV}b6?^##=dh4N{ESr(Md1!ixM8f4+@Dp2KNM}Zj@qF@{v zM1kgq?cqsUusbA&3v}-uEHJ$_Xl@7sZ-E-}j?%F(GCu+PZ3>B{y9)^NNqGNdr&NSGh<-Y7JyV$?VplL>{UOO}i)G<~yVOre>lmcBJv z-aEWDiyEEdGPBSOjLY;wO&6Y8XjaFm@mbt^zt9|xBZmx4$l^jXF(C^J&CG<%D>Qo& z)c88#eOPEZXE!1>JX_Wln&sKDs?co6mKBUyxx_0u-p4#Nhi9zKk!^*VBD|&09LkYR zg=UcEk-VMjeO72@Y5dB@T-jY{j%eu%dEVYa(<_hCae1=8&@9TM^y575OCFI&pS$JD zkwP;{&+T{fy<<#_iWz!VD+4K)o4D0U^|fIRu{Wx(ajzfP|Dz4+)&JZzzf?E%Z}f`K z`*SgHa`NEd>Sg2XkV|%2Wp29$$mVTz)m=@z1Ganniu#2~E)Er>zen`Go4@BRRcWy3 z16NIF_{H$9*n0N1!HYHMu=#Cd(Q!)H;!Cur4K+%!Szb?#HtdE?P@@zd&?}gq)cTkm zz_dB{ISo|oX?jDubYKr-iR(z~)zTX+YmzInQ^H>ls$Th|idknn^6du{rYdiz@{Kt1 zo=d#v=!G4&N&4Y`B!TEz`gHa&4b`XI>{pz9bJJBDTN{c7D7MIF-tNq1+8)bg);c*w zW9+@uz+X8U%(x*vq9?TLP1SIfRImKa>VSMyO;}GR$a6#a0b~vc2Ab&T$v@xT(7o45 zP|mCnMvC@^Ul*2x?{}no0p4K3NU?lz-xhU{0x*Rk1-yW-n85r%>Y5fNt*H_~xyI2o z(lh&Vy^-xk!MgSoxI#0oeWc&8>8|5{<&KyPH5&2T96XQYkrNn^{C~k9I2H7~G z0bHNt)b3}e?HKncbD5#95x1xcFlGC&NC}?}`jj2GI9Y?itIh#dq^`S z;DF1;$iu;|%~q@;=FTvl$3*RA0k+CI_^D zbMhp?(|EGNdOO@2dmrSauwI4nTG%WPYMnhn&3eTVz9ei$hh!S5-e;VQo2B>J>)tQD zQMxL15*+e~bX0O9c!#k;^Kd^&hDBe26)#zei zatTQfupmt@>f=<*x0_~;eZwppLq(ni1`M_oy#ouANYTGCrt*dlVcWCcFTGiZahHzv z&pO(tb+mMu(ax}=Mf8E=W3!{$D1GlFHx8&>zFGTnmv;Hj+U2LU%QU6SGzCRdc0G&? z*zWzQZX7Vxlwos)__rsDrl4rb9CK$1u$|)>Zag(n7st6jr}8%+xtioNN?i;Bj2eog zVV-jl@L?x0@2sPt{72pKpOS02vo#B5IXuhURSRqI^G-1_7|`e%v`!5D7z`b0jXm7L zkoB7p^%WukujDQ-42gusV3u?*;Qm=+6}gahrdP?GwfntF?yMc;mmO6DX2oG_vG&T_ z{(<7RXp0~hGrL5ur|pIc71Ipa0bD+7VMH|IO*(}NxsG;8r~qu6u*Q?D3Tu4GE@C#a z>?NLArfWuVzbs8>SdV_4w&|7@T&JSJtQ7a}V1vO?KCx23-0k{bqx`T^IN+NlX6tSy z2uo80+Bn$=1RPHGQXF>lVkevQfg`q=jcV)cCRpieks(K)^E+dhzsFnyTY*Qh0q5K@Dply72J}O#sy&*j*J2id~zV+LD zjDAn+tv%Kf!x7E>dCSRrA<)**>v+CkyLskqrBsY&1SONhHjr>DuEO%oXAqR;jkmPV zf96suU8{HMwo-llUe(th*L0(idSSsb463Nrq(5*c9*j(*Gw)eN*eqrv!edd=MLFc_ zdI4F^P!W!o0=)=;2DSg&Sq81Fy(mw3JiV2_m~bo=%sA$~HN1<7)L9;9jTUgD(V8h(gt4I$cN*D?^0|V+vz88h72YC# z00Z+fxf5;uyd5@B4P(d(pY(fXW4v=c>cpS)D$3`m-Wf}Y^|ej0cJ9%bE$!8otaUHK z?{QKQH{!-O=yiH|I7^q4#e@$|-_*-X9KgfM<@`bOu@I9m@BK8)GZ$Dl@t9AQ1< zeCbP`8@Y)g^Pw-NgL)$elDEC-U`zlZoXdI1irYf8mHmwiE;slZqqp8SF^Y4RPXDy< z*BaJ{h|^6e9?5Dy(ZmWuKCci5qaY_6ybH@V>~1uHF`DzstSYtV%avH-Qt&w$=!&yf zWtPjYxRuc2qbh|~sP(w%y|&~xvydS8YHB%g)gwRr_}NwKYx>c zyxwsTlgpjk*FLizeCl#P>T zW;h!M%Ym@$ig6kxFKaIJdZhaP$8_LWg8Nam+zoGs^EOlMAh- z_9||xy;U?fi7?iuWf8IN_6{5lJ={hF%%Rxz(bXO5K0*k5ACl?l0l!e8!SV^b7dyQI z%G>za2N3OSm^_cq{v|CQREP27C|0W-wjHIB6h%B^Zn)~~_bOigXsS~Wq_QRnq;6Rb zk9;nBFE?y*mT2~QHv4#klS>Jl5`Kzl9hf9{V%LYbwcw-c-Ct9JLk|`;$5T$X#rq{C zll(ZGb+7LMSBGF{6>^DrSLgSf=s2KlXJS|Lc}MMcH0C$Oyla)h03VLG)+o(i*eLq$ zR!p(g8<(he>1uT@-Kt{K?^XAGT;oSb=Hs#!E7QOunM5|HZK6|9+>{g`#L-&F5Bqg3 zPC9iFY+)_7N{QM`ij_(lXl(Ii(odro9#eB}dcRouFLkP<1;(VabcD=ayQN&`JS2ZY zu(N6y;yTTiIL-lWoFX`S@Vcuexdy49LSeMm>g_bQ>ZX4}U6o_B@>=IQ{FTF8y~P{h z4tOyM(NRqm0OnxAU5=IrjFyN4eS%jEyn&=%bw_JC1}U8EWBmre#D8I;CqWyyEms^y zF+gekIo$22xAJTG&VaOzac4wr;GrUIxwnDHTm%x4_Uc#F`rP#LB5w?8`B<*_02}-h zFplVMygj7lhq;lQ;MlOjeYuOAn&Beg72HmaL*JI~=SFgRf>juCC_@GzN?CXs0jQYz zGpBhVn5pSb?nTBVbJv8;UF9poxTzmq9#(5QcapSsF9V+E<}Tn`CpUX;SQQ$SjxJsv zFqa;qP|Wp;fVY#0=j&y+z}U;V&T*ulH;U^?xLKdX6>expB?;t$B`R)g7(b`NhXe99 z$)+HQ4n2^??Bq0etTxhq}1;NZ3mLgier+#(H^dNmS!ypjZQHQ-=n*{2s0 z@$hrG-??zaO8;_+WiHgKQ_1sMsK49xV7y6)F&0UkCi_D4yQ;wF3DID=jNy$2W~=6qxqYPh-l3`Bc= zOCYMe3L7i8CE#eczY($3!pFI-6O!_kWHmGf2fv@gRU!*4vF@-X`~2)))Cs6-|4q(m zVphnmQ;(4hjj2PLlC3Ntu6lCpVk}fHCD@g@8)S{#2}}?Gw}os7PWAZ0Eh6~*CueSU zw3Zqn7svDw%s_3GZ5!$B6W8fYmiH<2v_^(+&;g&Vz|oVg0CZl3sG9s5a1m~sbPHdd zptRI~k>DU!dPpjQDYL!)2-O5%2}1rZq^lDbTh*@m@>aM1G%#Zx8{^R*k96 zw%N_y@uR0pu4qNc?={?akW*!U_pT?ux#GSA$@C>;O@(3A>F4S?ti*S0^DFuBJgn9B ziT1~YnsKGVO?>}1k9KGg7W0~?{cIsUYQtz>EjG`V0u6I&jV@NP1DJzpS+V{)2=H7k zFfCERb6bfj^jk`FM{X)n*Wk%wH&2Vh-67 zei`IVo*Y)}^02&BqBqfuFX8G-z0jb4#+8(B=Qj{aFluX0ra&Vl#Bq@6XM>7yfNMwxLe{? z@8c3PG1ohmYxd_h10I{_tti2*O#bzV0VYTx%4 z-VD5=mh3JuCu;R~__9b1dJxkVd!RJ_m+86ab}I>pb-FpgCw&V#g@uu(Pkd*Lmz+d^^>>Rv^wSaL&jLB73#DN^Wlw@CyT3bHP(XBN% zhcwljfJX;qL5^-PVAkM+9Q=Ym0iFOS%rPrMw*Zd{%kmtJsR8B$c%N$~!qPUwEX~jo zF8f)TV~%Ci2F5$MCWjk-Rylm>AC(O`I0N&6w@2lZ9P@h2qeIhT+H7G=w&s|<7CsS^ z?K!4*mX`A~Ogm|Xdmz`W&XPBB&CV?K?;XjKLku#01Mv2^oX9a};#%G_jf` z=7bE%HK!A$z{9d-7*mtY>~_l6S<(&LjBi(ZHNU!MovihnqT1daM^50J2OOK;HaWkd z@*^4%@Pz(Qz&z)2yH2S~@Z@KhitYCWj@quv^=9oVSs><$!r@XaJ1iqFM}KyRN3Pa8 z8F2Y+!>FfWBYIIgUSvdQ^5<;Sw$!dzvxBa zYCv_gBY{?SC^6Of8~wJ+*{cJuD3S_uA*D@WiDay61n}RGGr6{-H$zC@^|j1efsw-& zx~lKl>-DfOGvP61rawVWV@OpZAiA&%(%?eOSl5);q<3{*rFnSA8xrhM{@ zJ5`;k^x!fosohkLI{Sns>JD%eT<27v{I+!y!~qR;b9UKWEK1h8RoLUZap|Lv3SJu+ z4Hsc{GcHX(HAy`C+#|PcY8^>(X`nx8ccY4SzZFEg2eO}0vz6_P{dtP|B%!yEdu>va zQk9<7^`NRtIeztfs>8oFmviw6-z$riiBE96xq8ncek1~aQ9ir5`551qxu`rWGxk5K z7O1zYSXIG>KT%Dw5BW{Vu8L|>0jj0i>~2?+E(Zx#9*%QNK+CO9XftLIZ1Mb*0CzR% zD$q#(<)sAG9(u*|6_#r6^R7@t^HM4`Q!)E$wH&t6DDU5ClsEnl>xSy6&Lnj{pe^H& z!3J#~YERip)o5C%UGI9C?U+XsJI;pVXVtI3KCs;Bjgdp?HQkYT25^1u;%X_swss53 zBZYM}rs+S;L+K+m#P1-MNR_Eb>D}A|M}Whn@|?Mui18=nV-5HO!rs-{{veS3{Y6Uq zx)p1=Xau7;0iA9(Fy|KW3dHdOqt3jUsrv?)7_hf8HHa9Pz!pMC38w%?>zbHJB3Bvk z8RF?OH5LPy=(%_GQWJ&O;quO8ztjTmCBkJVL&ci~RxDOzRi?%&vdx3#n}|x)Q=Zf8 zd4fZ^axD{nn%I(QPKUCA`-HQP>s==bZwP0fq)*}h1b!hCZJnu!*8QpGZo-lNdW$Ux z)gu<`iPU_?n)3?=52;?$HGOAiEtL?PC0=((1ja9h{4&|mfLPl!_i~>3fW|GhCnW5w z(2-v>)+KoyDVEFjNP^dE_E4*NdwFwB{k;!^AIk2l&MNMs@$?rlG4BH-2-;d1SN?0a zbPg(Q{C~O4mTG(ZTddhg{>pOoyC#+87gS*fvERQv09#9+Td(E))v9d7iy4#1YFgbY zs=OhR|D?vcrXFh>cvaTNs;|-S&AcR3c^3cQeQ)SphT-yT{W9-jteI!OS7LR!;(zD6 z4l?s`P53_P@Uui|+fBp^N1Qw<4pc-`#e9wsHmj$m@KGluxRR6P+oGZy{ z%T#r_{Y*bQeh<<9YRDKKaOV0qSF5lozg4l+b*?J=4|`s*()xGCBpkoCR}X@5v=@;N z|Id}_SLT#Kk=#Z@HgQY#{HpXCKAs3E=Nj#-b8r+wHn!(kAxPx0 zr4D!0Y)0CQ^?;z_ICi5f!By$>rvnRJ(W~w5uk~laTN^%q=xijHmX`d+L^7 z80Q%yX2qJqq>1Q|6jw(-^Fzri__UMmGddHiqc|w0q!B4gZ4G;?$u}N++OxC(d219 z{am+t{EsP4=k~G|(d1CZ;wR6?Edsac(r7YAaXrt+=~^7TESfyZr$6(2oT2{ipG1?K z$Hw1LgR^5O0e4L@n&b%o)_h(D?n!WXM!to+4P19{cbtz)>KGmaS9Mi1dBOQO`#vNy zb0@fKzXPXs?jhjr;Paeyw{wQ|%pAWunk+mYS4Zh>D`oMYMU!LonMZ2IH=bfkkA^jv zU5yWU)$`rD8ea$eW7kHLhjgvVYVfnG@kz!1oOz&Ae)}5y5Q>eCSO0#9w#NK2y;q9; z>UY~ccLnWs+!RgTrq8{k1~)|C`(vJ4L$lg})E=v$*@te8CL8e}e^1SGEq&cd)qb}{ zlQA7@WuUr0ww==KsN18-`}A?$&c`XuM(&6v%k-IpYjAdLlx8o!Gu>`&4bDDOX|_AK zTeRKI8k}vXG`saT(Im#HbJx3$9Xs`}`E4{gTX7Afx}Ub4(yV`1G^X= z|57xh-(t2eO0(5}=iux!wfu+H@Hp@5Nge;On)ltJw5My>jp9GhCZ!}qD*P;ez>C(;t_#f)iHTOl6YLD~(QPb9rlV(5IuJ`@X z5HXtrJL1%;2hC@j;+Dj z`O*0s&%fk@(PVKL{DvC*it71W0sijCqRD1DM^)kK`Ahzo`C0$-qVGH>bj`kREIQ5~ z;_2NVk0#qt$M1H2Uv!+ge~BjXZ+vU+bbmAlw@`6|YuZ_Q)%|e_T>LxQ>HdiPHJWUp zW1m&i&eD$22}=K+L(4UER|otxPehZ~Q0Lrr);YfdTt{#feEK(JRL`lUJH_8k`S`!5 z`NtFA#yyy!BOKm^w+xUT$*LfA!wUE3s|izfd@<8#NPv=C>Grh=QSxRGbu>3A*%_gL#_^7nW&_9c%?&Vq)WYjFlZ80>8dnH2DC< ze!rS^tig8#pX>#_^6A%!)vPniWZRFT{9xZ`5<8mlht}Y2d+nS4{Sc4;K0b8??UoKg z#^%%CmsR~gcG7mAosUy`9sW)<*;{deoa%nsXBwV$+2r&X%4%?S3`(!P!4Z^Z z{KhpnOHV43-aQq4mr3#eem+iR($+K5bXb*J{XYB5$H0Bx{#QL}J?(O}pZq&_u2qk! z|6aPE$@8D7dQ|Ib+%4zhwu0LP&aV5tH8?x=Q{e8Ona2I?d|V-WY#+EJb^J~>I6H>s z;4YpWO-|4*4m=-s3%L0E(d24vH?;<5=j>5%JLaTiA1|+ZUMvoyt|^(H*4KYqgG=hZ z9}ccJxTlovAFsjH&^^%>CjLP*IY!@EJHPt5_iEd%;ASk2Cin2^|E>mimRIx4Q6I97 z+V+DQylq1Wldey7DL-?(>ES_W%bgR}Fq8{GAuARp@<_;n4=zEk@Y;$07Y%2*WNqNw`0HGNXM z&+gASx3o_e6<6bb)cjT5Sd`>S%Jb$y$Eox8eRF%K;&!1Y>-+vz^FB*|I)BxFskzl} zF^f~4RQ-1j&aR2_r2BV&w~nAZsU5g%K2z;joV1Lx1E?Rkf!deB+82~16A3C&>)iQ# zHs1puRQ#%%zShuueagr0jV9-5-GY+pxl3wW-Lrq)7frfK3qPyD)zIy|;GaAYO?tW~ zM%CaS)3$nsKJz8#Bto8_s9pWs6%?BY|Mbr@7&9^GDWB4R)qi%3u{xICwCsn@l=Ir8 z8&&c$V<{OvwUl=J7xV7=kyuh`FMT}P@@x2h?{}2n zP5D5|t?lld=O_)Xr~JBaJf{oa>qO75uXCk;KQ!jQ(k4os)Lf-rR6WP-z*#xzp}N&; zoK&37@g{Kg9DT9|XXQ8TU&mN1xe;RUd)44-XtFo>`{S|Xg?xVVoyucIfy??1+)~P_ z|5EMrTS}H!9y678L-d`We*2xuWA4n3CF@Y{oA1;;@+3GbpMXyxxqxN3o*IaMaUabL#(BU#;b2aCECy}| zuUrKzH8-plQ!X>P=5G}i9esx%Vl-O?^Ozb@bY!9%D zXq#gWCVVVDSwAi>J4gB5bISE*T5Y&=ahxvf$9sUaQI`@26J6Mk^Ue>etB8Tzb*HcI z1h&-&8${X>U^!q4RX8%G4)pcLg<)0W!#9q!I$+Pi2BFV5e4>j1dsJWSe_iAPive5g zBa`#b9l*Xs?5puIIsYuXB&@zp>}dxRJ!8Nkmxfg{;?SStvF%9f&JTO<>rD2;-N2@n z!Z)$*xl3$YOC31>EM6AY_pQil*|UIrW55mo^IJok29~-!tZpESy3m#><#GPGtI%p& zk4(-#%dQNo3i5d{&OiHsz10Wf{B!YD{`Tbjb1kp}#Gw*Lml*3XfV9q{u=*2azSqIT zp2NVJUW;px*d7NHyKv3t2(SxK&(QvOjB7sWuM4XNV$V95$mE(&d$D!RL$14ja?NK7 z*zd`gdXa52DUWMDsaB!RRY?0{c1b*5>FUdLD0H*jeU( zUDH?e0`txbS@&_!E?{y^;MiRU`idjKB7W{oj&lBn|skesJ zFCjbh*d=y9lk#Yn31IIc_P2P9cImp!@}b$6+I%tAogtZ?6Sw=fyR<{4HFn>*+=%*7&o?`m)Q|n8sV1z*A9~oqq&y_~+Bz5M zCMb1NSUpagecs`7{FVYfT4&kq>ZP`AL~a$Zy85u{pguTuUxS@EJ-j)ry6F!q9KNJB zwe{(FeOQ%}?;Q?bKZ-EejtX>etEJDCmpS^7m-jAr6%~n4`;q`z&1^n8j!t>QcEatO_{?{*Z&QdBm=WlG9} zR-EsLUVnw73+qU~xcy(lYAyTDAqSg8R#_`Jf_U^@n7iCiX#*N!z1uS6ICcdA!#h+hYXS6tOLZwk|Q&f$cH;5es`yJjV7o^wF@YB_GJT zmZk1&kK&J6?dZYS9!G&aN|wEjOyOgD?CTFJ>{?5ZIgYgSkB3!0+iKk5tEQd|$;O7> zfw1}&@`T=grCmR<8SCEkNz1S9iN{#?X<(lq-%}1IZN$3we=4k25d*pX7*CVwG7dhm z^{*V6Vr%Mh=+hQ<`c<}`f>D=|-C@Q1meBHejJh284_y1~XI1eS+hJnRzm3=q<)5|g zb8zf#Kej{a|FPPr*O4i0#C8|~=GR6B^vnHRSm8qln6o>4QU?~1%r2q-w(9=C)p2#F zU5)~ix<4F`(JsAT@UI{3G6C!>h+S{kA_u}f#DMqMrfLuTI9X^rC@|vEs$}?YQ>mqAHEN>c^ z?8Cgq!MOZnxv|ynT^n?gQr8hai2CWgZT|*#6VNJnJ{Y$Ns(NdtvYM zXOnuee@_Kq?B9h?TkEYjcKbD6_c35{Kfc?kzu1k}{RA-Sr+ecuUbj7?{%ZqVYuO!u zajj(pSd?mbbm3Y{`uF|UKDgGB4=m4zZ#S?CU^1uo$mCkfII#Em@QnfM{6Sc)@WG~m z?E&^I;?UDh-D9*h*IGsog%#V;TL*d8_ake~8@SunTx+QU=2srqT6O}H`zH?{*IM#^ z?7wEqwU)KO9`ey;7}y9f&wdx_FS6G1ldxKVJfT+?+t-9#XIyKU`e|7GfY?VIOzO_H zmXR^b*57k5=`UPssrp6OcP}H?T6O?i>Z2#uTJ{6G$p_dy97<6+g~qbIN1{lNU@V!UpRXTo~_-tueWY|ZPo@Yi9L z!ty>GkMX)KI%18H-;T#9GFkn)f8#%op<@@Te|2P5=i;38+wD4fRfg~;yM3k2dsY`uztj$_r=R({X@r49{c@g9Za6{v3;wb$2vZ-xly}*VjJ3y z^)ECs)Is#g(8CVSZY1{{dk}|087iIpO)7zZ6nJEQhF<%8ED@ig{L?ZNzV&K^CLH{r z-8R`c7|qD=U9T$uHUaE!)M5E`cG=SAWx&QG8A_fxS2);^Ew>2=b!TR1-@15}%`4YC z#3gNmDe#@aGMUk{wir4qL$|?7N2d55w!r`}X@e>Ulk2aYau#K%(`dubJD5Cc<29E0 zstkp9pNvp`iLIw&fA+yc=UVpvtAji3cM$lvnW3WGgM0I8n_uk9_MHSRz9d8MrP;H_ z#zj7_jR@>ib*aDo^MSPk6Z`+v;T8L@1=f^r+5ZIx8$z;Na}79{D6s7Rhxk1XF6~MmFmh#vdJST)KJ)>8zM5^qxo*Q%8H!Ay4>~fXO^EYeyhM0H1&L~ zgA4CIU}L~u#lCu{gGrlH@58{SS7qpZG(SqjIX5|UeTMoiWj}CZT-oH$#r3g&ZHC&! z_1%64KL|F1croz2@(lGAu75mIX7dl*cop#R+cMNhEWj+q_BpJL_bE z^6E46UdiPSpY#RFRiKK^8R`Yr=?(|4CRRnP0ev22hrZ-s(l?z(-;k>WkEA(!s}wQ|E3_PaFIO;?VN- zwq9c6T}*4wP%Fs0%E27oeZZUU%TV|r9P&B1*!U2z#hsS@ACJcXCH40s;FEdGuN^+| z8^z!|cz=c(M(n-5E0MPMfeiI$VxbLoJwzA!o543)x-5&w043F>xC^$U%$wu+s7vmf ztoCe+$Brj+2z-9epeS=cFnNyuUPq?Xo%P%PV20X>IJDcrq<+UMuk6j1p5Hn#zFY`2 zL1W;%g!6=F96srHIlvSs=-rMgV!ava59~LYx7uw{O}G%2moZmA)6Ijq5_+nso(B<(=@0+OvmTV6^ z*Jz#h=g6k#Gu;$PyYIxo+IM9r{IDn1Z5;ay!<2&W1wQss^bz{Z$=hw)PQpDHw8bId z-Ji-(UFpETRcYhmg8(P(>(iglP`i;Q)OMH6r>IjgXyCsy^xlQ{I+&v~+uIHf_j{3M2bXN|Pon_Jzm%cZ$6@13}N7RyCm&a>>`D$^MQ%7E_zudHXhVV0L=a-L-e z7q67r1FZ1NmOgKf=c6$W0b_p+ebm9KDU;*;@K-X_JBfYS!Ndk^Z#%fk6Wg*bNB!|3 zJhl|D+?kn!H?t$o;C-?$0=wV}}ah+rO5fynD;Y8w0ir*!vNOa_+X< z#%c3Dq!&Dzq0WVVq4zoX3H8(RuVc<)3_?3zHUf_|D40R#xR2Pru06PRKdNM=5m+)T>F4rad z_W&^Aebm96vUx8za?rxV8|`{IZBPh&>U$Zg9CAWc4sNpCa$qG-XXs}U?G9EztO;1r zDCS7y1G(?XdV$%&WiRRf1C$9ry^Ji(dr{_k z#GzeITR81Jjr8}MJJoyx}?T=XVh z1w8xbxRz;;ryblWzYF;8u?+p3GhAcKcko@nOMZzljr^sF_&(rvaMgXt*6%Rz!@t5@ zpZq-zzhl>Fmj6tKdH_N~|K;Fvjd0K4;%6=0A9XNCc99gQOZO|g5{Y|%ZRtLp$lnRP z{5MwJuij+WUF7pxVMw;VHu2jGbsOu|>hQ|7ay-6d`-(~?GW33rhaH(Qwqqrz`1ctK zKYj||>0o0tKXvT{9ht&?Ibv-KB6?2}4wBYm5`5?T@D(F1`!5;lA|Fij0d|28){eAl zV1DyGt`XS5)n;A%^s!pI zZ%F&{`Gp-^e1gUNF{uOB3GCqF6KprI>Az-p-yIZeKQQ&T3`N+c!rZNy9mQ?xbb4tDVB!nuPTT$uPeKEJSo3lly0{K5_{O!)ZxB52$R z@U05dU5_s?2h~B6B76%ud(~)WKyokcL%;Nk8<>pa<6sqlo#_UkG^gI*js%tc~*N?#P?ek0lrSk<2>YzB7YymZz0&hrKj)(d<#J^ zeha}4F1~V>SLcrjU$;LdeE49!6I?QdZ?8Wld}K=I&$`Nk_wM%ry8!&UJh7R{I#hxR zV6*yotbiE(*-l`7?;p^gO##~w&nGgEH+S1{PDH_8LYkGA=eFTEN82wrLxz_k_dwl<-KeK~Z7y7ee z@O|D#CjHqYus_9PQa}2$@$(}3`3Z%)?zidB_Lvc6Aa>~~^*f$F+jD{c_!lsDleVQl zvxBRCg3+IiLZ)~Az`jI(W(O}{fIkzN^k;VP@&))a;iEsBfG&RX5&E-fV1DoCos2&V znwuUhx2{KhxjA#w>eoc{zDiem2`V{+bkWI`US(GvvD80oiX2{>c5tU}N8*0SS&!K2 zCX#;u=Q)e5`G-sXKBN~QUFIyV^iiaDAzi*h=1QMH`W~dOMC_IyLLWVf^dV0=ug%>{ zBKlofmmIEH85hQfi{JMI7`&xR<#b#2kd zm0c9^?*A1&`nWz|p1Gc2oUXTY3IWYWjwFO8_5`jq!l?oWgCJl>owh>z*X`t_d6BEH|R;=PC+ zyf$OMwu1|kKF@wV4Viv@p8dM$@`!$?g#uiCp8fg&uvJW+#hiYfUf|#7$C0-Zm|vgg z*lh=wp3;8o*LLt??APs(>DTAkuMYrw2bf)YicI$FiYp@OeZ=mK@1N|~M}Tee;bXrp zTNd$tV@zbSUv~j}9~i0}K*?ALa1)lcksyngM&C%Odn>vW63yGF7Hx@7@# z`|Et1A3*vaSRe7r%2^}XdsX6iz;P&awbi~ZKhAz;`lN41x*eq6;Q}K_zjAzwx7X35 zz!@hG<)o_nJ?SM7T5(RQ{?>}|pDWjRfj9h5Q#HcH3pZ&dhWk zTjMRq$=ssE{G&)OLAuwz6XdmmyIhWwmB?=bbC=8OpcCoouKEVqD|A=WcAKJ?f?sVF#7;@yfh^w7xuPUV9jM%OB0L}-I&T`!8wAUokz4H*U*XywM;K`rN zUdSrJt!IMYu-ZxH6+ZdPVApPxdmk{Zr|vg(NI#17|MaAHA>9tTT%CVMK>8rk_ZLU> zcY$4Yqu)4;^fiurJ%2ll^u^b>=TTbzRDk?+?>soHuh+#1=~{kqLb{e;f%GYqJKHWg zopb)R*Cy)U6Ch_-Lb@(@PeQtuKN65W9*{mAke)E-hhO3KoKKru!QEaZ0qIo%>FojO z+XK=E0@AsLVF$N9qXFp?KItbiA5QkZ{^Tv^D9VuXtxnH#&Ks)H)_%`qc>M>hZ*tyX z2Q8CldhR-iqx@*Z`<+A?uQ(q*0PI@CE?op0N17eHGGEHPAyq~6J_`!hb(iuuZ?J>6 zJkA?RUX|**PQrP^4#>QX;wZo+lkusUPRVc`LF05B^YB{M?80hVtwD=PA7Ydx4cu=4a#ic+bCM{WO5GE#f61WNr+Lp` z44G&7l*fDi3SfR~S-j^T0#@zA*8?naeMFV|U;%5GqG!VOuk{Rkj#Y&+@FVfI`J6dW zUMc4Ao^-ZR>W#Q>^Q3c3&nb(jTc|7a#wGSU) z`nrg^3GLvPBV&4bMDJlqMW*!Aq_5&A>Ag*|bxHCvhOr(AFJQG3AW=Sw+9IS9m$D3=b?|XgG(2&8GTeW_*#%bW4f_f9(`1hU#E{c2)L_LM`$Kl{V*LJ)9bA~MKN6-< z-UY~@F$&VpZ_1MJ@tf0j(0n}8eE98gC%7=tv)>;RUG^ox4kf{+l3)>T$h3lFlRtWn zln>0T^nV7t7FZE56TF&F>>_ojOCqy73AQT-^oU2!1kNXsF5{L<{}3EQ`khukbft4F%SZY$kDNlJSNr6b`)!}}I^?&5 z+YVhw@At{S1L?y)>Ac?_Lppt&+io1o?BJGvI3Rs0AU)md->vrI{q`{0UFMiB`xGO6 z8v1zc$@}d?KKVJ8<=mB+pZD97KK*JJ(hHG)wqMQOZ>Lry>NA4;RX*~0zis;DpGJD8 zPkxSNJCMHIvGeTx_5q*t66Bvox_AAE_uIKu?*3C?aQtCNwl1!7ppAK8H7NOtLEVri z>llLR#voP+8U^-Wh&7*J;umLuk05@JbI1MwY>+a6^-$)R<7DIZ|?`+?Q{*89g{d+7W8~NxD?4bFF<}kg)PDHHJ^&FpmXLn6R zbuwMdp!3rX<|b>uj--!?ob538g) z^XvXizcUDZWPgz8SuXyUe#Z`O`Sd$>aLY;NcjEJ_6Y7`Fm_TOB0onbs0oT{rO!i>x zm$|hO@BUipLu`+3@KJ`BkNt9IA|`x;z=nW{U%;`Yi_MD@n=3C4Sx zBf$LHi0dxK>l4<8r0!gIsRYLB)MXdZCE%W>oMrHyrU`tW@=9yjTFnIq3EPYzWwHU?#($ zBa6r#!9nW3M!fIWNjn|^winoUkvFv8;T0@|%Jsf8flu@?rQ%>BpYuommSeF$R?Rx{ z{ii*U$!k3{=9DLPZTIIBtS<>R7=WcyF9h#=ws*U=Hc10n_fz>eJc@L&uPeO-={fJh zJRNEJGS&0nDx}*%ig&GX$EVNUM;G)()VtBxmK>Sq4%nFyYdJdqKAaD~H=<5=^6UBX zXh8mngmgVWO*WskS={AvK6~hWiSzDc^V#C}yPs$4a=X~6t>Cr~eV85G>4ORB+76sQ z*+J)5GVeYdkUkZVo{npM5A<9MVcP!PV*kZnAAp~i826Xzl(Py?weu%9zyzT{k0w?NI!~n@BKXc zxA}pH8g%NT_2YGG2VH+HXFC!{kYDaMT-VQlof)xhFY&K9Pd2x(*@VX`hX&d`y7U|aUjfRy49uEOcL>^SI*Cl)*HnX#`Mi9Ez&e55@4<3$ z&ik4vVE=+RbemK6ZWcvZF{F2WB%nYtd1DE1Fm{YB40VxLHSwnDygV7q{AAm6R8 zx7%Lo&;)F9Afg^ezEFdMN&EH!+xJP#L&^7mg9+aNu=G!(&-myv3@m>))_#e7D4vhc zYAXLDqIR*o#~sY1o&nElq`c!js{y+NS38JZ0-n_f7VxY_upS7Sf}VcwRrCYf@t?Ri zW&NIX>L51bvzp1zMAXNjP3ZRyCiUa9n!!QK$42h8+d(istC<2eO};z_llu@ptC{>P zu4|bWI@lzNH`u=mfR}tBqJ9h+p$D35x&6eY{ehcbjwp^Dp%q(gJVvYu*yz55bw<&t z7uZAqHUKR2)r9xxgl`y_9iS32@{hi^Ih+JLngq+9PZ>IRW%7IIcJN|l{#Z5Z&X8=3 z=|%m@kVnfz$F=Smi*XcmA6f})6nx%ioGg!H%oH%$Uv#h24q`KoF@;~V)@HXkm?9s? zm?2<=h+Vn}AIBIwcNIQs3jxoi+Joh|u{f+^v0w&*W@#w-aX8h~8Z$TV- z$gy=bZOt(zvOi(XO=NP6=?6CHqYH~j)|Z0%3;U8CT=sOnpJ045;eE|MsBKW!PEZeU zdDitIrygRP9l-Vi^IP8?0(Q{m`$Rn72(Zw%BI;JgpNq$iAgv0RpS^h>(FN@5^f8Y( zd{Pe+n0g#@EBdcrIaoLALI0(2u=A;i{)WUe&9;B)hA63LH8WblWg}Tn?E=>KJ&SjK zO9Jn%B)oh5v3|SUL%@5Vj`;rO5!E@__8x-FUhs!5a`ct{Rf)8sQM~6z3}jtDg3)(0 z0F&oPMGl{|HGRiEVDddO6_3$(*uiBx;iK=!`F=zdA$FA~*tpH)U`)_H-0-)X@X>cT zza>N#mk;3lv>fHVoyjGRo{D{$zT*(EPZ0xIeC5O#lG)msw=<(IPh|4i3Yxdm*4;m_ zo|9F?>q1-S{Ls3t>Ksh!M_ZQx`y%2{yMsx2v~}nZ=9!E^?z+>~+kp)*`8^Jwv@LC2 z@FTPzubq!OShdt0cG>m89_IGFT(+S)uEQ6CJ0?-;QKkd%HJFC1Q1#lZLe7T4?P zl>3H+YXe!5+BMm;qeFkO?p@}!*>c4Ov}^HS{r51@uGPT&*8OPL?ZC1Tdu>O%j^aLQ zu@6SO8h=aVWBqAYJ7}3a3-`k;25l=o3%q_l(nO{mz%FGzkh?8u*PuRE3C#IT=vh9o zO*^ol{z#`DG)5$>eTYK(T08(gJGkm7*Uh*;W=g-JlRIkdhdtA2L*dH>whve>vUuxW z1kC(+Q%FDs}3i$d?0Q`+)rpeMifsAl=srk+A#ui28RV zh3;_ps>xRltYl86{+8(C_Bfx=B!Z9$LCfTkmf4Ghaqv-w#&mhCXv+ zExfCoGDV*;VAXRo^|u)Bb1?Cn)BbY1dAYFMT>twJ!Kr64@RCrb-jCet$d+rTlGwaV zJ*NJrgPD}u4y+3p*Ze|Xb}*+tJ6LXNrk>B8)nVJvWSK+23V}`GICO!7Ntq+S^3pQ( zZ^vFAj~$^*D@e8FkAC(Q!o5+@9MJ@}8!|V6H*}XHQ`)H*So(rYwT0Nd@mM9Wc3|&g z|9PW>#aM@SV5#Yu`ga{ZNyCk@Qh5gl`_ATnp?e(+rv&nGgECgIDbcq_Pck@5=sF)6PM zSn8RXdcPj|t@{M}N$$5O2F7_$sLAO|&V3oj%p+%IsxGp<*}+9F$IP8;Gxa+H55;2~ zGgC`56Mp}e{e+$f>rd*foz9Cb8SMNiPT^ySp2A+DO)&8G$aMATBurgp5`pC`3 z_|gt+K74KHOAeniRu%&9x+SrlY1eXKL%_aCxu4%=`x8Zs>ymar@s@G*z9FtlcCPoo zzPT>h2Tb<83LhI*`wXs2?gr*J-{-pIFfc!V$#u!Yz@$CC5wB;!x}@|Q7N2aasM?UJ zT9HTBZ&pu^6$gR6&IhYRT6#sM@9$7?tO!*m?6H$J`flI0f; zR!u&R6?SmxDfQ!6(R)XxszL@=d4h4Q7zgIJZpE=8bZ4g8;lszVVka=U*MGs$Me4_~ zqWrE*HA?=oI^+5-$BM;wXZqgDa;zu<=64Uwy7~1NUcV+N2EH|jUG*EHYo=`!$PQlH z&?bAqn}*oME4JyhnH-D>dVWZo><6FUw~2pz<9m7Flnc8r1b;y>xTx6FbK@=euKVp7?@ulrLPR~>GYKc z!B^y?3w>qkrcCu8#BOuiLiD7s+ym^Mcs}XB^p)AQ{$uM&%&Vn5`bs-!oAFGK^T(T4 z=R=owB6p}Rz7CvM?*&#stSKJjym}hgXAryEsGR*QU|ubHa$ao*m!5(RC&4(cwu6`N zB<9spUckIs+KBUNJ9x|EyxI<4tj8Y{nf*zyeg2rDJr4z7ydD|6`|idzXDWqs?QZnG zrhJ^&ZL!8Z$_pzah##l~shexxUVM6Y;Cn2?C`Wvrl%w}8vHZhGmuu6NUSbPH>@JUE ztsUIy^f!}`BiFG@&UU1m4Vn6zOp;z6Sif=jzzdMya>oY!A@y_C09e$tbW zuKUBTfb=~9=_3K@;|b~ddY?{6*X1UxGeCd#8HQx@hGfsMieYcRd3YscHURV7FNp8u zbIgB`?{RtKe?gEoNJi*ep?05U(}V7gv6)zd4nBXGDXjX>qP4**ckYBK+h5|hq`BN zoo)&9jvr22yRIwx$3u|e^}Cdr+mxxF54rNwKb9cfMC|rQZ1*~(Z+E2!>5;lMu{`RL zgLLnAN~uRV(r3SgVg~yEvNyQL!P)U~2hy)|^wNHeau4~Wvwpd)nR*YB)LZ9g{i=M@ zS>Ihq??J5Xq01e>x!Go|!MW_0%>RQ$LWqCEF&P&obdoDw%cuXJXt&lDM81;z?AL`I ziRp>{U*}Ks|2m!i-ws+IolgI62X}g+|JV8H|Lx$;pU|&e{(l1c%leedZuI|l&~i+v z?Bb-8~2|AhSQgVwrEpL4y6uPR36^4^@dh8T1W6+N7p@T~z}Lv={cLu~iO6VWNo zu9k7hN1cN1pDJx8#KPj@Bb02+v01%*EU)V7EU`!EVaGn=>sVepFd6?Tz;Zs+Q^p)% zvR3#hhfm~i%$WwZm@FVS-yqMe;MIj=jvc(%H~_OKODV*mFFNIkFXxz34a{#%h}UKe zm^{b&W;`FqoYdE5`L4@y%rSvo%kq90&lfP}h%Vcy3;5QN@7M8s9CL~HZ{!nG*| z&|~8m_>2{n%+v0-*Y%{lX<}Az*-S9rtCoXL*5}TS=L>iSBzytSfCS^*Y$s&OvxSS| zWd_`<3f}J6S0Vi%(u>d^t^9INLO+_o%GGivkUqI4OYi9yIl5k)qwKgo z%k@r|9y{p=N0I(EN50OVI7iX>6Xz&8opY3`wOQ&RkDSCgik8ngN@r=7T8LQNM~NL0 z=O|h}{owW+vebK={M81>8-`@#TYg!VeunmT=bDwi!tt#Vn2gU9qLmPg<6Ac{zxyq= z>mV?bEFd=@$F~t+7x-XOwUdla{pUiYC(R)vI7v*X`i&x=w3SOP^*f66 z4s&mxcPWo&;x;JF$-$8K6-;R8Tk^e28 z`~x^2M}GM(kt;v_=FSTEP4r7$uJ)&+NUy%zdhRUwb-5Er??w9Td|me+`pt&hvh?$9 zmwaAd14uW)=e8sL=6`A}5yE021a?)dx zPQTfGXO_x#()(n5I*jujcV)T0jjq$DkltUFrT1G(eYO0=dpn)J7~{`T z<&Qj^o$y{W*Mk&r)vDK(_1qR63o$Z3yW-h;99X${TnhNAIURPJJOtg4owu zH=tg2aHmtR)F*S|))RutH<6ERYwKy-aXZpwT(zIG?D(}_JZiv`(y0C|g;*XkoDV%x*u39_y6bdG*z z@|)SRDN}3se2R5oJ5K>4zYCM=fbCrN{T$yt0&M37U=8tnqUSi$4g&iYe0}Js zQ}-ClV>|CWl%w86zU&9=H4D*&aI(34&X02Rv&Vdg&kX7V z;!3W^5~S}!`h~9iL2@UMkC-i2>V)%TdIOfA?aRa2u`BhkGXL^ARAQmjF0_W4^b{oD3e`AaH>d$N34qoh^y-(2Q3@3Z7Xzs+m z`!d@_eAp{_t(MfHaXs1& zUYP;w(Za{|XghfM0`^Wx-MJoZ2N$1U0qfCHUcz1hVb*>wU_Dy+0`^Wxc_*T$~%emXptGP9xYhFdbE_+EwrDLDI9bCFd z9rBW3CH|PmtWJV;CBb(3W1`ERB-lZJOmvw@f~C&4YaZvzrM$&SFy)U)c~wcUPJc|w z+mQqt^2emSkt7&v_m48h{Uhn}k1{t+GTutta(&zmu4_}Ue~|H3u@0}`cq?@ec>XKc zD>&Xtc>&|CV6WhKE9C`@w}SQXp1=y;zH}1ft;h@*Zv}gq$6JvZFy0Dw663A--GK2{ zWClF{73_G=e|>B%d>DA+vkso%tQW|$ei-Wgpbw! z2bh^;~{qSUB&s}xIZR#;kvsWTzrE4ldnBV9Zt=Kb?bWD_Mc!bEdBar zo(qf2fVr?>C$aV<{p@9)3yaK?mxhJJFG&)A#wLd!I$~d2_-^P{pY|U7WsYl~uKvwR<{L%& zADEx_^XaDzamvbhE$7Pnf0d)()zMhLjqy2c)p(BnM!yH+T=^)lk0O?Jfb`RZkG38M z?R+LDVgK(m(sv`hf;?JY;GV$hXLI!T`sBI)?B1?@NG~V9E1mX8pFkaurqjzEdkpHur zD9+oFF2CF2%0GehUZmgY$pTv8_=Oz(J;YW= zu7iglv&mSb>X0w=_C%cf$q&w1r1lX1w|Ja-mjLgXyGZX(XVI>1@*5Vp*@kxEC&nWQ0(@-Y$eZ=7v8?%^XeZA~~ zgx{u>{>;8^2bYbVzCMz=NdF!WGwJ#(>cYNWnYKv3D>jRXF6`?Qz~nlZ#hkuwELi0G zZ9Mk%wZQy--)S6J6)=(cv{QGH$-dqLjLUH@y9pMs-lX}EKbg&(?9@_s{aYns)ZP{^;9H zf>v;~!w{Q}byOC{$c3Bat@6kExJ`(>UH-V(Zf6o~PZI2407iW{&#{9`SGhl+KJ@2y zaN*U&^87LB110`gHOs8_$GVwJxeR``CuV~B;7@Ntto4yen<7>W8UyC}mZ8|L64(|wJU_e(daj0GmtCY^aGo{}?1FeqWX6(|$9b9^ zyn4QZepvJj@WX-y_+h~U{IFp3!>MO1@|{a_pKcy7zqv<%AC9pv1^Hpyj&-GHsIm=b zsFF=*sGKclsNLT~{L?d3(Lh)o{ye@X`(?z#VHG+MR(m=#)Y^=Qio7PGM(>HJ2~Zw> zTet7Ah}wzYM%s<<01o0?dDZxqOwol|s<$~yjdW(I=`$CqLuZ|-_)b$L-q|TeJ!TMk zZ#qL&q3p@pGgLmxK8UgxqwI2&J%zFhQ1%qc&PCaEC^rw~j-kvVl(`FK4xr2fC^Lrg z_)ZkxF)D*>)@|~} zy%1F)#NDTXKNW-+$IKI%c`lj<{wk2seJpDJ8)D;Fw72$Hbc=B`n#uyLz;gE1;XZq9 zs$zGYgFp1^N8qAJ%E~um#l8_HifC>LGc(cu=7Gp^#pI{gV|wHw!+75ZRz|PPR?%fK z6@9RBW%S5vRP>JgmC?_4s_2(N!=MdFe+=<=KnFoT0-bxmiv9}m1n9S*{{6@JRMDqPDi(cCa+;%rfv+nkJvHG5ZT?cWr=MjbzKEJ$v<`(cFcDEXa4Wh zL)s;=6Vh%C4`->pAj4o=9Vd^pU-CSI&!}kguT`|*_bQqPVj1OslFyOIHO;2Ec}hju zhx^Z6sD`W4RBBnOI(lQOngB)4Tc~270;J`F%FKmIAz$4mQ`O-cQYC*6^7X%Zq3Q$0 za2&cPRekPjpZytqRUYz9BY*mqbJPUl!=MpR0n+`-+YYQhccCgmIe9pqMA==4n?Th_ zI|TV7ph}$YUX-Q|0pEl32+oh9{Qb<2^qmXR)ZX+owHS2h^fWby^n<_$L0y-osr033 zssuWWT$HA=p<6%d&ARVEzP-=b)Ue=cv$* zY}JQ6UK{kV98f!`3cMuRh2Ns$x0U$aDSk(Z-;v^Xk@(#!enW@fa^iQH_zfa{@2YP! zOEo}7H{!^bvenTqW~+Voq>1gTP;Lk`iFVil>Idxs9RMAIts>{6Z17fq)`AqM4EYNX zo1kJGM-b;B&V>yO98bdbIXE9jdtms#<0D=xHRe)E$2e2&7H&m|Za zSuwu>!E?Uz&G>az%=;dmUt`7BS}_NuN(Dc0ivE9V1KSU1f8_qF=P>9Zr@|=5NI59 z6cpN+rgp#n998+@EEQ@xsPyCqvy}P(zB7xs z5;On`ZN_>bsL-Mq;%-nMs2?;08U~S{!Pc*-cV*N*w%5rAp-xz44mIcp#bN5dA z(N>vvE_rB0;&wbYdnr_$f~C+`EFYI1 zpDX?>g*@8wsI6GgpnUs?H5AJ`wwkj*EI(^cJ9lW7Pv^06p6git0>|<>vz8}Hi_Wtw z%Qz*w7&Xa5ADSoSc=5R+)3Hw6SxP2a&9XdY(>iQ5J5E8_CR!b`MIXC0?Kr7y>Xib$ z%(>}tmQQyqAD14VEB-8nJlgV*YV~x-E-C4b)tt0B>0)`OC0J8wr;u}G=sZ?V`|2=0 z{FRmR?3O->yAk?(rg2_SV9d`hxWbr|y|TiXo4xW@WA5VXR^#Zp>-lFr{;XPQ%sF?} zS{|+ApF8;HPW&lhzLFd9XEl#jZ@`~5rTjy->#yS<9<61TwQ>aU*`>@}N>QccC}p`f zlpFK1Z$y@}%P63XX=Th@b{qcO#M7H9q2#(U9Id;Vf1ts+U5e$J)^p>*~Z4yEZQyK@m&sK90??B9F zdzFa!Y%d2fpY4sm`D}TnH-y;!Tmzr!wLf^a;xoN&r1O~`1E1-Y^%CGLWE}PUsHjY<5US^j#Gt*5lJ{LWq!*1x$_s9$}n)G zkFjB5UJ9m2bB#qNH&58dm|$O$ihn5=hfQogxi|&?=3czWM3(fF)RZ&kp1#Ozh5t@D zBPET;^%w_J(o(`au7cl738yUJaV6e9OIeVT!Q=IYfuoeud3>W`;7A`A83vB@F?6H+ z)2XK=Uyd#La%{<$V@tjqi~Q4dy)5}sUy=Xv)cw4avr^8a{?P60lrvMZt>d#&vQrjX z$7iN2Ov&PLHRhx#St*%3zSS_0s*j-?j#45_M}2Xm>yFJTIMT<<41;A!y{xkAW0qwf zvn)Bb%93NNEIGEyl4B{$vX51k*av03l>QLZPjs82Um3w+9y_(Xtrwgp5vk_3Cydp+ zFPt-{VBI?70UU2M%sJc_WrPX}i&RN@1^S6~ytcfevg#Wfiw&-mlzmrUYuxE!6j=LG z$!F^0IXqT+pREkd<@%V{BY8euI2|PoZRXrsha0TeFG_|DjAIStwOBh?k*d7BeMQ() zi1Y}5lM}T2O03Z=#TrA}boB55_MBm_;0V%&kyeE?^6#}`>UuI^$JME7AE*Lkfc9R6 z{f(dqj{BMB6GG5)%)$-^)mQh%A_no&{=Hm8N<@yFrIQ zM?jOH)CH-jsd&qufA`&heVS|1RAB?~wb++gnx+~+qg&Ec5wKw#kGwle9R|J__#}>V z8<7XtKneDBBF+Iu^>;B1)PG}|+R$E8d#~BHwWh71v3ZLbYi((-uWdIs*EBYDwAP<* zRMfQH+h*2ww6@kaw>RBywstf(BjXBVRr#%E!R1#-tp64mCB3R=ZBun!13Ft_Q9*H8 zd91y&t9$#*;=FuzoLn73Qjz)_Sw9V{6RZ*4o%! zZ*FRAu4%nrs#0HPZfk6BFzZ`eTUxJKQn$dUZ;NfL1;a)%;ArdCmS)2xth5zj8e>TnM#}Qt7&SiGdDM(vzbmUQBd>d#w|fr(7AOUvk_ep&C(HTudh4b zT(y4HH3gkZI?cxBwszVat;F+yI&N<2K)JOwut%LKDxiUjg;a?h7E9 zbuIOrYpVh6Sl^0^+IywUTA-~R7s#xklID%I)}y1j%xbo^x3uE&_2F95Mpv@JwEJme zbF8CXI?82nJ<85^TYYOAu2S^A%`M_`=s-8iWpD~`sicSOWra=y*{;tH`v#I>|F zI-P)yHhZJxIOD|lcFEG_cJu*pk7heYZuE8z?{2HuR!!0|Ip&*7I`hqnRo9&iZyWn` zn^{v=C&QR^O}vx=FEO9=hO)C7l=Nn|U%*)yKMfBzg?<8cfRKoo$>HA15O$ao5tUXP{@s#G+Nt z`Zl+;>T8Nq41ZT~yUaW3mc>u#X_0SL<4Uxzb9>+szF12mFJ{c|T5TKpG9@WfF7Xp# zYOdMpw8;rGSq*A6WiZT(2)8wZOFLPgE+@E$*Z+McBNp+1%REUf-!F zIMCQPcVlxSr-jJYR@<;OKCesKrcE$jTYbBqNLRMD`mHsw2F^=mR%I6|ZE(K1p`oRt zsSZ>4noVeo+Z)$3np<1y>bIJ0O|&}-D zU!U}}(~Sjb5>A^xFWulOzykTRfFU(??t%pweAIRV0jo1!V~TAOD|Z6IoGb~}cek7S zcoiF?rganAg^jZUZqd|}7~7mKgX?@-J3OtNm;+W$$Yqu4sCeq&6|#W6{&%v)ah=Zo zo`YVqI~LuYc1+e486ST2F>dQI7#Cc0Oy0j{%rQx-U7fm0SZWr0%`IAwwV2Q09D_3CvMCU=~))S7J_wYBy2 zb@g?|<(oPho9fywZ>-yVd2MS;8=jK4G%a0s{pFVlaQWJsH&iU`EV^prRfS8pfwtl~ z?Y8C1F7IrwZ*Hquik05w%a&rf`tr8c+RK~kw>33xvLhVUUf$lgwf^!gTNzze`^uEo zRNG_~$7VYZ#BX8U3F-uW2=oOIzl-)~P$m|#3P9^X%$o~h%*&A7)>)w@7fep8qIImC~C3*UtM zcB;ApxPsGb`%ex!p9|CPa-bE;v zMErD=&vYJdg?w9=Z8(0&D%UQ*3cT|kPgU(GcL#_(t5I$}(jP>8Gs<7G_3|ZXm-~$+ zcPw49b?Fkc!`c-~Zqk2OEZIQYH(4)hu)m$?HE=^sv$3XrlW|i`tFbcHiuiuxhK^=X zld-a6i?N|TX53ucZmes$&nT&{HITmpyY0x+DhFV!Z6Ir76B+Btc|Tb@+SW$msqAD6Xj5V!|#)ca3W6v8D0?Y_G+885Ovpz!J zR!IT_5%6@h@?c4gxnz^Mq}~)O!9M1aJB*b#8Rf88B6KIwtuSdROe&dUwCDC^)6qWA z4$w}}E>J&c0JIx42pR(I0qq6t1MLSr0eTw5{67Ny4D>6|Z$VR_Y0$jo)6p;}3v?Ff z9MHL-3qTiwE&*KuDgr6c4WJF6J3(dOF9g-%xD)h7(1V~CTmA>Z^I=f3hK?o8m%08Lm&?ft*I%RHie<|Sue|E& zqSw}Js;#TvyrrS>_4hVyZElIZp|!2Oxl6&CiWFLIq+nV+YCEe<>@4zZnoK5B27N0#6!M~?Xr8&z{BOXiw(0z zPVo$Mfw37+TvwPEENQ#IY-(&q=c!w;xudxj4^i6|)OTW!8TKu;G|Q>6dPDif)$7;a zynf@VwX0X%Xw+g5D9bRhdrY>K8pZYoy~Z{^QLMWbFNW2$ zwbf&zo8Bn2!ZcPuGXoDUH`X@PG+R$4sftlozo}!3JbyITtSl{Cz&TRG=(Ajl4>K@Q1K}SIq^*QPzpl3lvn{(7#KzQqLCEkt$nb)Dj>*VD( zZZOA~tN-AHFMD+J9Ki%}voM3gbK|trjG2Yp`u-QtUyYeLA!8;p+nAY)`0xBe=p^WW zL4U$N^%BH?MxGK-h0Z(2%KLnLUY0!%Z!vOAJ|mq9Fz~J1eB&}6!Z!2L=Fgiue_m)l z-rm*6Y5Mg?%Wmsha@5vXj%q~Q1NsQ)i=d}K6QFs(UJWW@o@KQgvEdp|?>Fiv(QHJ7 z#^$>EPI)qqjj|o+ak9B}_75J}+y5p1)|$?ZTWT8F@kBs-OM6Yz#@IIOaBf25Vvc4V z)O6~D*3IpmvST(MeXw16Kwa%d-4$@~2H6>H7_FU+Z&+cvGPiDS?Yu@hip{oZlO>0} zh^1d~#fpOEE3PPDJ>cZcE3Pt^6)anB6kb_Sd-d{72J$Uw)BlZF!~GlY)0-!$Is~-Y zB=yoVrB@p0yc=6LZ>(vqk*Z?H&}KQXt6`5U8_QR2ynbb=oXL4f>Gg3q*si-SUm9V7v8jDydnZi05f-R# z)^)b*-LkEo7N^PE8nmw+i~dJr9@?3z zegXO|=+B^O(7X@h`?;XAK_=)nPz|UFv<>uD(7Ql8L7xEqAJCgyHa>7?W5=!S6(!Zm z)ECtPd4uHW%pYccJ@d1f(V1`0JTmh?GlMhzGw+#s%S_`;&5U7Ok&oTBTi|r09{G0D zh{J4Ym2>XM#zy&#_sN+!o{crNwH;e&rF`rU0kf46#*-s9Vm=%XeNTJm8#clz*9$-f zx;LE*skApvq+e9504xqm{zxi!0s+4mO)7n?4hPupf(^b)>hMYc8yMy_*H{PGM`q<; zQujKG2RY@?z%&+fP;u( zcX0iJ1qOCbw8a`x&jEaM{xIHi*^T!*7B}O49>n`&_||m?-uJi;+4A)J?N#kWf!V>@Ew^*9D?sdJCR_Ly34 zHng;1lLxkUU>A%vWSL7%*GL>ULSvt~T`~Q#L0$cQjo1Y*`)1l(@8>RH>?^_^=+?%1 z?25m&xe?>MSy}=!v~;v@+{TS|8?BdB&c9~etz~7#<)tNSF2{=;Fcw{OLe z&c4-%X%z7uONY)^N(b0vho!^T&c<5m08cA+n8Nksw!=%k#*(#7`ZjHcZH>*FaA%|2 zX4@vwCYOW3W2KSrmzvL%7W}2uD5RDzGCYSv5U%onDzQy!n#a;ClaA0iD zfp0P%%2xTH3J~6`i~_-LfXo{nJ8z!x{LG&onVDIJ_-}~kAjZUQ-F(D2v_s+dqww2FjUP0O55hA~ltfghCsQ3cd@Pz< zFsC{kT<-1oJ3c19(}6q+c~A~UDdUB;IPOQ< zh%p&G2&%^UZjfo6$K14Hr)Hjnj*OiOn?oQ$UFdA78-~Nc9vj2^Dm8T8QoF`v68;U_r2pF6ObTl3LDfT*?zZ+zj{~N7hj6pXWcpk>fdDSQlG#4}nGFpk)Fz2D(^9=Qr zioW%G_>C&W2cTmE;x~a_jdBgVd;M-4F9IC`Ek+vO#qK-%OqGk{KOyZF@Gb!H{p{X` zEcM^tSJ5AUHiIgWr-E|un@3fM+wrb5N7e@D@DR@50_q0k{u1?TFw~)(GgTgJmDgve zgKb%=>3)2duOGkf^YfV*{!Ul}`+bU0PFnLL6)gu1feKKcLQp=arx?FwQGtA4pJR-^ z1=d`6raA(-#)q<1(|uWL`?f6A{;%1p{DavlwLMF9-J7a9@jF8k;5`a5e|9Xo7=-?F z3~LP0kFPjXo(p+P46F-8Be;NZ0phKD19=KSd7wg2P6}*_-r4bE75y$~7_=Al=5N4E z;CKpDuyQI|2r2>)YeF&>>$L><0ssA;s9@gUk0cETFQBlwkgkTHzkka}d_ zy;*8-Ohte46BYdm;zvMFf)0aL!;a&?4@1rvs0e!f7U>1QP*D@K1Ge4;GEtv_pC5}J z{P%1%kawoqci~y8^2>c2+Qan1C63cv9K8B?D;N2TJpy>>df_AR__Pz57p_{Yoe4aCBg(KDB?j84zY z89pEJYS8U+o~F8iP2!r77sIhUb2H9i|3|g}&yZtfd=kg!;`rx?p9fuu;|auLb6$u} zsu!Z&D6{02xz*XfJQnT4aSx~$l#9OA^sa2R?#7kTdq68e-8eVKpqhL}VJiAC^5ubV zUk`tuYv#0Sv|ZQQmC@}b)FU#?FCF~xOR(=vE2Fo@MAgnS+W@946LLV z>5lG3xpQy9_Z6N!7Tts6ArO_zLU>2>%IMmbmC;8LkAen3^KiZbv={jX@VjKgh&vI- zK;57&P#3+e|of@gOOe2AX_8Dlf&VVoJmXElsNkg*uoPUrZs=#J`C{2n3J z&RbVTBY!&3mg<_M7?h%uF5P22cg45>y2` ztNMU^AguCjhD!gKp$>o4P^ks{K1a7iEo|GF_g*Car&PW)`1!HLAuH-DgP>C`Qi6JNzV=8rQo z{B|q9;mU8h%6DCrQs2Y}QN9j(7_{y;Gc(^u{6o;wAU@xC8|1zV^d8WMK%WME7<3r4 zd--(qBZvn<*W$U#5aQ4L=YL+Z2l1__$2SoF59n*4CqTPlt3!ttsVT%|KU$;~7h-M% zIs`dp`Ev@&Cuzo4`d??tlD; zGs7^zK^edi0dr<>1PqHs1&o?AGl;kqkm8bc0UejJt{UYM=FDg~7~P9of!S>sokWrp zvciP|QgXpUv(nN+bIQyGkyXs||9sCtb?@u{`@jC>d%n-}oM-ty-)B85pMn;U41eow zL1=>eC$R6kA$%KT@g%)Yg}<@36Jsp~ePHmId%9sD8T~V#`otH4ute+|!mlu!d_UZi zr%awwgn8trE*-*TX#KAQ+O)a1P(4Bz;^^uGp>-n5d`SCFG{ruI-A612bN-{qUkdrz z-Chdu50!_?nO0#Seb;2|kD*2$anryGfa4NOJLppAoL}4)7!{R+o{!uF0Tsdo7L9oH zR||)`a_4hT%554y%4qiam)-qnV9`15*0R;Vr*G&N%!5kc~fV>9M-{o}{a10Ev^SV?V z%Ygg@JPh}DkOPs|V7Tk<$@vsP&ZpnS-lzxnpFO?#y!-g3jSSZtJiPgPf8aYe-Ew|7 z+%pljA8FQt=}3Qg2d`TMSqQlS@;t&nhAf4=1SyAP9K7x(q(9`tpc`=?g}em$C2)Y} zz*&S%hx`;W5po3J!1L%!>p>pMegm=;Y$*-mk3vc@_g_W7ZoY~A7WNq}a9>%0@7oBy zf(q-y*Hd%-TVK@cUVaH{8RR`MJWsDn0yzjPf_xmZ8uD9^4EF}`&MNFHa0llTxIY6y zaLX`fFMdU@8vvOJ83Q>L6oHfAF@*gBIcB+D_aeB8Jk~;bvq3lP{vzZsgy;F96C>Vg_+Ns17bJ)9F|eUO!oxriXhoWCvtBoJ zwO;of}QgZl{Nn~>i@z7BZ{auVcM_%NL6Rp^MgM#yo<_Y`dS9Nb?*D&eP7Kr4_io4wkUv5WK==*FQ;;8EJ=qIt;9dvHz?4vL{yoT9 z&|xNY82+45N8rjooyKF@!aT49@vsk)FU6bz9)a5kIe$JPFy=ZBrfy0){AREZG{dIH zz{0{Hek9@^LD&V*3Y73)!7&DPnlzQy1^*JlUqRRkj0u0ReRTk@!roqr{vZf4<^hDI zgRy{4t3jP0X{EXI9`2<|_F(=xhIyCS*P$B@m~@}INRl`xeD=@#kaNWEhhgrcb39Cl z*ok7X!PsP=IUMhT9?a2*izlkg5@y#p)Gb-B`*THIph+^FyuQ2jD-6-(uP1jK1Q$G0}g<9 z!84Cy{|?OHE$|T-9dPjd6NjT{1$YmXN+$-Z8xssu+V{@3->nB%Ldbs>0Hji&>81>>_mCaxL zRjEzAamW5hGUyleCMq^A>YZfdLM9|lj)@ta^`ulkzjx#OUOvq{;Q$pEJFj=6sdro= z7nE>-HP{)xLS?t-WsQ`@X7}o|aUfxTKPGMG?)tr>#!vDGJ!m!DNFc>O-*L% zR7_O)>t))B0UG=2untXwfct{VWquAjYk8PbB3i*{#xk-OF|CmU83}JTZ#0{w%E&*| zn%?~0KZ|@gAgr4UNT^{OM=_RReT7i=iP8Au1bGQ@L$=R@0zH=CegzJ&sZpW=B~U;g z;3#Xc1X7V|?r-^;Mg~L#1tDR#-n&0x;&RG&=agr|+AK0r$++j$ENK|o1_f2BjVhJ& z^)i2j%K1nD7w9P4hWi1Qdv}rd&{j%%uAo7PJ_lW8p9_}uy9lyI`llXqhoyckSZ>{Q z8;K$>lzk6lHTKS?cCrOIU z?|r>2?2h(+WaoG(~;Zrzn`&$lA7Tlzyuzez{e)aC(x}z+h?3KG!`FCSJS6T9@cnpEC?uadH zs+NfkNT_BThcjHj#=O3UPDq?jmMrB0EKB~@_KDm$%L|lxdkVT>yJb;-^wIx7bj?B^ zt^$3~L@^TLrm1tNJGlE`%*Gg%6n1n5qFu&V=1>&0i)jC-<0vNUZ^bN3bqP#DB3tm2 z5Pc>gt}wL=OApjJm-=g8SKF_i)YsJ-f5n*BGnR>zqgA75tx#;z1eiC}y_I;4lUs8G z9JvZi9TZ39P^G8mY5x$EJ6Nm6tK5n_OXT)a6=bR0stFipL;MRtMc>4+0ZnTwS<4v8 zwCT#w)}rwUQhst$h3mc^U0Yn`nyX#9{k*Y065%hU7ByJNGL ztFkx8Agp+KOm%(O%B3cYys5&STdtTJ=fx?l?1Sq+$*^?yP%agU^oqI(<63QJ%5yiQ z*fJ5>Cb!%CIUnfgu21EPM<&D1yiLqHvGEml;N6O+} zM=l$IHc%E&V^}Uxak*^Nq6}q0U@kkd=uHPZoC~#FpzvjE0H@4e9+S&PFIke;G{5Xj zPkyiId&MSJ%PE;5JTt${cmATBTsxDS8(=x!r}?C{Xz#+Mr)0IV{GNqN6W(M~M=@t4 zj4h|qyZM~|9#<|Kv**pQf(2XI0u{sgj5r$NuzSq^D5!a-zPTdCo;|wkKo2A1?e;3W zU25Nr;^p(^tK989m`Rze zfB%7KO{pEi8M_CJWI8LvvC&P&vdulNpA>O0(q=M}uVpjUc$9Q#Yks@9?%_UEP!l_} zRb|e`T5s;g!jx@2HjD}8nVn_%J@(R=VvYaCf}U}AN79YuGrFo&@HJXs3HqN(_b@d1~iH$nFW?^7ojB}o1jA8hVQs5_2 zfz|TxvPw4E7d}^~kSN)-m$6CUiHlU?Hz^iBiLu4;{;F^qb($PHrcsN(3n_-UAZawg zjW7juc#UQ#exua*iKL&#Ul5LdbV?GN)ze~7Oo~sFaFT^rl5%FIps^dLF$sg%)F+wd zWeU~uy4c5iT9zwTy=e0)QI?NbCJmbLR_M%Wi6dsm&m5aHVn*P@Sd~U6Udb{_k+sZ+ z3QSyqpQNP~W5y+gPKUE*X|<8U@eiAl#4Cx$q$?LBS@{9g&WBDX_S7f#(2++N&U03H z^JRtVvAULcMMg}|xG|h7Db{vHxzIZ&wx?X4JXH zQ(J$xyR5ex8w%}>K*#Vvjossnovp49*5t^L!1?gNp{*mvvyJ6~><>X>XEgH$A__MO zF%UZ{htnXIcGSSA6v)(eVcf^nzD#I5JO`-H$&Ls$qeFWeP6p*1=w7fnC0YWz#O-Cy zPm8JWZ*I!~=V=R=6+25mD`P}3D+^~54f6v>o~){*j^z4Akr+EaJgQ}aBDS)7Qam?0 zQ8Lk3T_03QwbPyz8aXEG!#^mt>jwqu&&-eakKNIY_=r3$QPOw^oqR;#?<0)I=Rf&y zoJJb=`TfrD+B0?rvu;DZKW5!CIh2)PPjzS>9yj((y}y$i5GjeXTaaneCj6xS z<{p0~G#pBo&fX*rhVrG3iNOfKKXIoqVg)PvNkI1ePL=5=%D+C$p^2Tf6cJ2A1}H~L zH|BMxNv$4X8H>8#3Su)Bc5~A8!$WF)PzyxVst35$7&kUj!i6{fBrub;h9j^=}oJ55+aylH0ASRyiU)OxG0R{sHrrL7YXjFDvqU%bx1iu28gC6~|)rGrC7` ziVa(8CFR~$F^1`!!m5^RSXVB8bBv^AtzsOVa2yM%o33ctt~gP;uT)Xvv(2{Q^{UC; z`#z!-y(BVYVt4v1|9#VGFwBa?sv>F0q?yk2onm%Mx%8A*tprO_t>jpJxzu@)9H+~r zu3r@M1EiG_ZHM4mtSB4X&9T~bv}Bc{=AS)GEr8H7!)c z4(ql`LVay!bDq^mv9B+T4ehR^OiXDK>z=XZ3aXl8E)%Ql#wi}$u2iuI`f=qbkjqMU zzREMcIKN!$o0i#}qKM_Xwb_bs7y|jdh-G6r(r!~^WN~p&dBCn&E4d*I?k<*=A=D5V z#h0p@Cn+jYFmfo`!l+5M^0+h__cLeWXCaNh7AZ5;rzW8JZN z-@R%0Vyg~Lo80_{=fTpJQpL7y@Roa5zb|Cl6#FXt%^OJjLhnf0p=h%d%^JnX_)3ZC zc}3A^&d0SABY_Jpz@-n^$a1l3lbqRefb(|Pi#Mf_4LSM7^Ih92HreH;&vm_AsMv52 zfepUQ_cfumhRI@#A)H)QxE7|&lFMQW*JhP_`o?oTR=YeQiH))7TWyNi<6Rr7x$O~e z59C;lm?$(7*`TpENtoiD`ZFhH>`G?OoQNqd9(~3@nL3Wocq^H89FGZ&cNjbn@E}i2b(?dx)F4cv8L!0EkR)sBhvd%6nl zVq7qmJzbY7yO7N}D*PCY*%}*uek1SI6}NYFwcaFK{YFQwmfYS6zyIwW{h=l9P&eXEcYWdk+m5fzgZz-j|Z>E>};~zyR=alM~DN6BXic(t6 zdD|DQ<>ymw%N9~lT%?!!1&Wa!Pu`>zZ-sbnIw2svdO?@UolA|{^tU`}5G_(3o7)xR zUJ>P@KcbDSeV)vFoNRi46x2kjMw}QBw^yKnu(r&+HpZ+Wy=a?G`zy{5m7V4BhlFp* zqwS!|o`<8Z7Gac+IF30k?2Wp^Du?}DoTFGKbTK0p$iQxX$*fUXQo1m3?HUzjhW^}i zIZ85xjgqQ$T~Rbo4sD%sCQ72Qe~6$*NVkF>vERpz>(WS=tTtJ;iODQuV#jo0fOt!m zeXW}6Q|aZDOD2Q_A@(d9{O%uGS5keM^b`JB+wXHj-r%YmKExo{cYJM~O@*P*lx8p7 zth{>+ljG;N?Wm;X-||2gcBXxLnnI%6-vzR%*Y6nAvO|#} z>6%R^G0uDJu7DBPN%sheSnk$`W8t&h??ho3O`c3fPbVVJuF&3PBev0@F7Z$R3JQ%+ zrB#+0TgKdAM@c#9M9*0n6J-+uhfE!?w6$}|t7gls&gC^hOK*wpU2w}aWwbex&19Bd z>*T!OkdzO8*`{b&saW;u3a>Z4?la33yFU3ow6y94)*NYMPQ=?w9ct<%mYtMdUD=t&PE05oe)6r- zlx4Y0)CBeJ&ZLMmHZ&!1W6YR3CSEaXu&ruC{7n5smSZP+MGP8<#99{%Gh7t75a&g~ z)Xv~Eamg-~_NhQyMv{CYbt7t{(#E4g==6eGp?J5dI!AI|y(x!`puNbB@+nbVKCh}A zAXY_tfvt&c^F?K-!pEfBb-T8+5n*xF_M4}zo%PnvGHa*F5ZL-}m3>d03LC{YHrxN$ z+*+~Z%+&Kx?JUh_is>XC4M~fh-X$U*j=MAr8Xo;q4qdZZmmYIqT z%Vtko=^1KEh`gQsiz?^wcK(-v40e$ci)N@a^Lii|Wyr9~PGse?LyVzTZ?PfzKrF5~MbcBV=h z)d92Bm&v-yRF}n_Hg?vhbe28VX^IWB9usJvAg)_Y-7STR6E)w{OtzcO-*(GGOCbte zLSlTuj{@cmeV}-4*;UJ!4hknvi`ST0?I!{aO$Eo|v{Jpz<{pDXsc*QxMJr|u=}cd1 zw#u0-xd%*R8PsX6Fl+1C`FA}+HKFm1?sHGe(9R9HoV&EWrvG zQZHw1KGsM@k?oW${Ua3}kyJ_&y=r|b*~GvW2_x$yJ*{P)>jQElA``4-Y(!+FwajC^ zBT|{kTCQ|hBN=6)hsit8eo$3^spBGBcB#X1sRKDVxj<`~bp59DsEOs56t&~Jc zEniZuhc6dRg2i$FE-DbAo{`j_T3BY3&-IbEz*f%+nse7Uz9^_QmA?3FVx#rvts4T_IcH)#An6yH@1P)Oe_tsWP>}Suf#KD>H)0 z)Uve_%mOW*%!P5=gK&Q21!vO+TrZ1F2x80r(;*s8CYnxMGc8P1?8!3q)(#tMqqP|2 zWQ~;CVoQQcCYBX<9A4xoV-E*b%1hW1Z(QfN{w&T<%42OIwlu_Sswj!AnPpqr@u(({rSBuMr{mFI^WW zx@Yl;#~Hq8jEtWa#qcj8Y!xtrFvC6FYmjHB;<;Ux*WCawOYr=`m0&&@$Hq!|-2y<* zwQh&p2O7W`a07UF;<*Em2r@wts0Ituu-U;~K>S0Ko7a?k6UX@RX^`31@OP>v-qSsS@aT!q5zK>|p6{Ir zcRu3O0eb$?{ATdv+Y5iTebjyBv0}s-9nJ941R1X^$FsqayzV80jWY1M>F zvcs}acUfaNUKft=2SFSl+dKwYj51z&?!l-&Y( z9pLd3T^r=9$U6poik>kK1|`Ucp1IDP!0S42{CJoXVfZuTx;FqG zvC|y@_;iEr93WeeU8s-z4vEKcba?zmCkF$;V2}*^k`3?}fzAZIMnh7&Jr4OKAe)oD z@v4}v24ez`#ps&m`QdLth45P-n;_}$XYzQKcM+cBH{*CQ*amij*0=olbBJ>lv~Td^ znMonMDm{d!GCu&j5r^veF=Rbh2fLhr{2EZdxByA>1@#H}EIhaOL0JzU-HAVN085;PZvNIf+Fy5unBAhC15+SgPow9 zB+~DJ%!B?PLLLF%0kZE;kiURV;EQ$)0FQtLU>(>5mZBaDk(NgtYtWvFkozI4aqLr_ zdoJ?9xcCJAlYoP*XpTsRT>mMayFl3QUP4UW8l)s9!t}JH#E<>$bpu40>RC*GYjF*uK+`Ux#w3PX@ss45*!=Ag`K-@bpY3 zJ)4PV6)WhOP3^=@!|B<}8XPyXKR>-6ed$~}^cgpV*CQ+rq=SX%Bh>a!!+iyD)*$XN z$QR*nfnpikX@{CKkM3LGI!K32X!Jf^skqZD9G4 z*Hyw@4L$+MXv2e$p8*=G!p{e|09>67D3p zvp_a@9^`@5fcY1mJ(>~1V=JPYiL&t6y$+9N>vn+}a2P}&zvGbKfuBGdUxF0_h$BL@`c)Z%6+xZdp4@jGce9j`>91N)L z{eJwF20xzKe+lBWp2agokOko1fchQT?M=9;9be7E^N?_V3_H?O`u>wJ$H31(()^%; zY{an`NSfcPaE#Vdn&*SDKGK>@b1IMHN6=U5aGd(eH<0OwQ-?nCGu*cUi{pcU6}%1b z=cMs0JFgR9liMUgU@)(H9dJXihXDDv{rDKHeJOzS{ThANf^e$eJCIZs?HdlkeF{+B z`set!;6Dp!9;SWR4{%doxeVC`c7|X-fW43Hd@$byKkd;x5XONaU=)Z2142kARFX?SHWP^<2A^Cfgy>!?k&jE;9KB@HuD36ff_`D zM4$tiU^bWwo&$N{Rq!_00d|8bKzpyNlX>0u!||Lc{9l4=K#um&f<%xBa=;Q$hrL(+ z1L*H?Q@c_7P#&wsVV%*yhInR{+IA245a7u~{wO5P+n=Mqrr^BbLhulN#YnuH0$H*$ zgrA0SM)sk-#xcaDe()8f66Mg|^8rZg>2(p1(I5^agF(mKdsHLbQ-J@J5Pk;aKfoeD zd)RdJ<$N{z1}Fj9AO%nv%rN(QNcH&7@il8|FgNW{VO>Qy?HdyzlP3+~iyvgfb$AB+ zO8}lb)X6Ud^UcUdjyms$d=246pakpy`@pB*7-$CP!4+@|bOQl+p)5Zz2n+=gAQtGr zR4@x9{t%3J)i7ot=fPhH-UK^96-YZ3%-4L08()xEl6@{9jO>32@+!Ci+Ce9fLeCbA zJq4r^FvIgE(q5a^HmR23r=TwDz&M<99{OCzgv}1&!{Cp?USSxd7NlVxHWD%pBm%Ns zbU2<9kHA=i360KI1N5B!B#MVPa)4*=g<*J3UrKH}TJ9%EJbQ~@ zhMwQgQEr)-iTM8j&x2RMyb@ueFxkJ z47SRC2ov8hW&HK1ho1DeBdi?MMPfdIJOmoRDbNL^2p<6^fTzJcumCIpG?rIEt_C)+ z88FN-!#14!mX;p>3}>Ev)SQ1ebVLU8A56HkD(C}2N52y;o%pQg0ot^EpnKHkyB$j& z4XUG9a|XuoDN)#aW3N?={%~akts*?1iLe~75G)6zH_c@@I&?$f zR)SZk8CI<$y8$`B^0yJO@;&)*OQBOVfBfZ7-wk=VR#!S?6kmU$Z2ZS}YIRLb5A)GT zs|7r00yE=K53n#EbNt_QUIKSo2Gvh#T!Ley(;`UHX$|BGPz=IG<6H+6{VlBx?lOcq z0j2u@lF}W7{2W{dE5=~W?Mp*;_zGcm_|HN92=FR)1KE$#-$PtVAB}N*7;z~6G}x7F zTLV9hAzvH|1ff8RIYt861Sk)R-#-rhYB8rEoNWI0ad;SEwgi;Rhov$tFOSDK&@**w zQsU#EDc^2rvW{ZNN#Aw&2J zSZ64l&WSjz$tCa)f~2$$Kx)7wFdeieAzysQ%LezG;9Zc0uwNl>g8gvM0q5a926+Lr zz}*4v5pwh&g!zLY5DaKd34@FTF(7=U`y7+@x=%r;Dd+GU`(tQd^zZ!y)@IVzguLjS zArJnQ;8pOY7xJ8fF-U$T-ot^siZ!Abaw}*?`;GoKfVIl0m6{C9^`@5fadUvKVZFv zoA%X3kO#nFa1`{P%hP$=SMV?YCv=3o3|xTfv_g-)B=qdB&#UnNy*^W*ZU$GvI#;P+y}qqW-oTerlJGAU_3P zfM!7RUpwT!RChld4jE0L5A4KA9$gEez3xs*n1(3}~L%$@T0~CK6ygG1mmKz2O>xfs`I&OtVPB2S7&~A;umeiljd7be z*1L&QsCji|mpmk{)+)sn~U@2GyXb-;zaxJ(@*AhIiK4Gs%W0Cq&Fvi6LfZBli z#7MZuffNwB8t1O)2WfEAnndT`bgsS#ewyECj$8>hjny*;@Xiw?U9%tj9o~J%n9GJ; zX>NNJaW;T0fW|wORRZ@X;2`)0kS@PN-Ug%T{s_{NKKJ0K_?}N-Ex;)N)inTa6$lIC zbt577Ag%#Y55|KuFa=P0O8X?-SK9~j-H2ztIhLWa<{&Hw(DCOWEui1t@4&qikgYy| zq-!pFIu0H{5hTi~m8+*LsTY=AwJ0L+61Ei$3HDi^8GT2f z8{g*eMc5i#*E|bJ*G@@ix<-5%e#+Y>@#nL#H=_GVbdQO2AC!UhA0&crF}}Y8-+&45 zKLO}|TNdQgfX?+ykoW!=$S+1dF)uO96~tYPuyc@WAnCr#zae*0JY3_X`$=?;UjsK? zPo(RJU*OnzK=<(InoJwq0-$TzbpB4~28vAR4`Kn$sS_Xj-f;e4SXfJ&FqLb1+gE+Vs(1tMWlUO?-=gq*o$zU4% zTft*+7fgd5AQA3w5#|fG&veu+(3`)a#Jh0{yd#HW2wB)|IGB`&y2zQtq8(f>DUo5OLXf_FuV=dN|>{VyN2SZ=w}EL zjN1bJ7^cGD^IdpyOf%+c=1n7GE=+mv?Udx5I93P#%%3qoQiuCtY3&rE`>?e1fbQ%# zZ$2{Fo5!hP?fm%?1HybnI_^K6MLAc1hldBV2VrJlxgyppxe0E3TSj24f?!6N*@AFjM*Zj--94ncfNwsT z*FC`a^X)n*xEdD+OhcKL9Tr4|)dU5)^}<0bQ5b z2mP1K#C=cBo9D8jA2^J#ElD`1g4Do2>shQrIVczYsgP#yCb0k1t22XqPz>tuK6*If z?!d9Vh&u-E3vkmg8JvqX80<%QF{FHhKmRVIZJ9rR4l-gc)?iQ%2F}AgiL`SeOMJZf z#P4tq{o4@!1Ef8BG=T3$Sx@L59#+$e<8W6ZJOJ@GA^u_7FZtrTnn+gz_Z}Q;TZFj+ z$L>S^4*7tI_9UnaWD#&7`~>8F#J>P{JKW~S7>2(4kh~QAXB@+vM)>ggIG=&7o<&)Y z!`-`A5DFk`z;!Te0rpa$5MbsI|Fyt9X(4O^1dxb){s~6UMIQ#+(RU=s&w;RgDE}(- zvV&xV)43C!PhpICg~3nfSJ!cD4dM@d9^)Lc4ry?l84Q2ebC}b?N^k_>?TFh7-h=-< zkS<35fPeVo_jC`#P3LTh*jFl$b_V>b!A>B9|1{(=bDH;H{3%WQb-2R zTQnh#9B%q{3mq51S`r305RbejFTwRA$cI2AI0Iau8_fD1@9Dn)-N6Vj1{gptcnMg+ z8=wTd1G>I--~U3LCHJt#zmG7w=CvP^*0@^8Ch!CJ1zZQ~9Qahcu7W$D7tsB)>ySE>F9mUc_QZ5gZ5G^gKXg9iKY1# zkmJF0fRV*qLcUMIy%u~5?t@1WHV^CpGofQ1SPW?2MteBgU(x-pyj3CmJ)a?b3)qR{ z#gJr!bgch3k(Ty&cOYL~;ohe_y<99)-oIC&eO<-`+y_JWyI?!w9e5SjKp?5Fya>4y z;a33d7ihml>r)-tnbt{K{|eD}{)KoPXvP>wgv3U`UmA%$72I@9hx!5a+aUqiTRYJ| z&=xeFXOn1J>)dbSG(u+63G7koxak&KG2w_x>0}kg^rM3>rmh6IQ|TvXB3t} zt^#X88Q233f)n5e5QKhk1F{Q9SK<06P=irm9GDDBF;7p2TnLtft>8Vd7wiW|z&UUm zc)fx-6g&npzyh!wtOaj@au5YwX*|%L{T}M|Il|~32aO9F5B>MVPb2&$pm9#)^}Geo z2Y`uI^r3w8?;y+#kPDHA4YCH3*6aTDm)7)d^Z`0wYR2&)D3|(XbG=;bH`HgS@619v z+OyJs-y9F$YkO4fP1Ms!HDw`;`b5bK$^91lYd zJ1cgPer1NTTFUvJspq*T9`(54af+?D7}bke1s+m>#6l#r9Y7ZM&i4lg0C z`+Ta;_Eo1OoUiG6&AHQ8FLmEOh372sF#Ju5NNqnp5m0Ld( z9!*ZDtGFg?3Urd0uGZ9F={QqAI&5;K%=z@eaxaUE($}|ioNno`{7mktKIMa-_O<*Z zhJW92`uh&cMX?N@@`y)$E$7AXvmK|;c38e6_bKT`&qX=As}7V|&WguQb)5dH!_rJ{ zTUALJ9p9}#kWmSJ3)Q8umXl(v&pS>Z?XY}7?%f_`4IMYwKO_|OfWmY`$T-*m%?)aL z^(oPFln)*pb;eeS?GV@CpV=@)V`pk4dtNC!(BZr$z%(1SUq0ni_Hjoo>-*~_M~9=HUh0UXw=Og}58~Nk*CioMAG@nV zy{ki+7qBp6!dSL(0)uGu+%c7*3{kj!&MuTtD{<7%QGV-1DQBi|LmTSn)UuBH#qeue zMmp;A>A*O7oX6{$`uycTvl{ghX4*y(lDp`BgSf9qzDiueN)H zRN$Ct6^^~%X5Stn;8>eFqH1kN+1idpiisXKBp2BRu@L8vMj5u=$SETQ?--+adZW%= z{<;40e-Sk>b(GER_^;mK@X?&f##(fx{J^QZ=TdEVhH(=Zt9hIQ4_n{8}a=a47;!zEyGd?J;Fy`>0b= zX#(ocSF1{C6a;tHreSWknEL~6w^+c?6nrXRDD`Nl7E*yPpQPRrWNiXo4lU>uWOoGy zpQw=C6jED-0`XHQ)ED(adv5(c=#eOOG-i`l?(SG4BVzh3iI<&914wNtRcs&=r^;b4m?5&)yyFX^gH`$BOT|-J&d!t7#6MHKc>NfZj z)LAd1DQ=o^?D9iQ*}3*pvWs4LR6gd8YN7|}xlgdq#v4)n&E=btYcI+c?d)3R$fu+Id+7jYO>`r2)3Z1e^Vy3Xh=UxVyi|QX<)^x^^)|NJZ`l zao7&)k6g*N$S7`Kf03kA((44Sn9nPvq#vY&{11P=@$L4%Iz|)|v6(G+hDMq5w|!}> zGVhP7|Mc0^IV7cO``>NqvX9L4c*Ovlx>!tHZksyqdgXe&o(Y?hp=k!-eBC-|lVR<* zVF&;DX3^j@1N7O{G!Do5ZThQd)7RQhd0v#&O8+1|O>YbKNq@6vCx$|iJ6mUm(Ot5Z z9HKqj;Sjs$9pg;0=R(g~DI&W~r1k4JQMyy*wvpSOw~esp;&w4bNJXYrw5LyhWZ2X5 zPurVr8dEDVvqA}Xf4O1&bF4V8yWOOT>vy+%j?ClFw9acrjG6RyjG5HC0$xYPR}AoW zLt_Vx82n=1#=4A|(P7{395l^gXIvxP>v36XJ3cs)N-41}y1qXo`N~ zWR)}fi7X$yMNrSTZ!f{mh~S|5-Y?4-)Lu*P*V#NzmO&I&QA6|?Yo(6*FzO)P#)kSZ zyf1(~0v)MDFBZcu7*Enid$bp5#<5l5C(<(_SWR(`>~qI4eeaIrI#0&%qbkXI``=43 z*gdRvCMIn&UQkh<@u-PQ2n{ZJrD+=8J(e6OI)MZVN-)Z&5if~|`wTtv2CHG2==~D{ zp20VL{3dLYgxa{FcypH9WH{c8d@}7G6XMuRJEJ*%hLdtbR9n`jNBK_(U}Y5YwQ$|ub+%wGH04hhu_fO zy7S5Y;Ec9A`nEfq_a`6m{2@nZ>Any3#l?9Ay@Ey}H|#a@8h>sluTkyWm#s0%4@gG& zLFvB^t-~QPoC}ck2cEtHq8T6V z*fnPGCu0Y+OjaD+4_$pr4<1C4P@4?4G02%r`%md9{!^yU2%_&l8RQ<(-^|!D=|LM8 z!f{MbIJYI*bXm?^{<66xJ8!}0oR-Ck6OFA+iW6VnUA(|K8OmEF@;w#mkM1-LRd2q- z<6|mEc$+FpVl~P~`J|qLP9Mz(l7-qTS=sNxgSON^1oitA_x(TPB4(5XA7z5|uE1}sZb3!2eP=nHZrurY*C|nSu^h!4b5im z{$;NtZhJ|LOk=gca9rc>f`02Ad^JRw_J`L(A7nCe_W|NY8YEqjrS%y zW44+%rAf=#$Ueo8sT2DtkW$bJ)azjtn(;iDqIq|=LGMZ3VZ<*;kv_jj~qS z9-*IIV$`3up(&HZj%ef%RwF z%D!$pV;AkDjdRCwt)V&Gst&|&BpVUTQ@VvPl9<7(eTA4-_Z8yG@9W+9WS_UlK3LQk z%+skoFhg=`w|kC9{a7b8V{eKjXs%NyP>ak+E0ZBaY(!4yOeziozM40a4m*IY^BApgY0{u z>NONf0j}4KRVzsW%I~$mnoZQeG_J4JTnqctlY^9ZE$B1o0{8B{uN?yC;F$A?zIJe$ z$lA$d?Z&&b>F%reyuRF=bB)-4pf~oSN28DSsgc`%IEM;D$4%`O8t)0Ioqx8`ptj3) zL2RRo16saRRoib(rj3BRskH5e*a>ai`LNaP+mLQEI5Yb4(UODmai+WT(WV=58sqM}uq*A$ z&~KY>*AJ$CYh%ll;t@ngy2EBsY zlT2N)l*$ob8h5X^d+)`4E-~ZHXuMcDzk!pl5Ahhcfs@1;g5p?JVO*iXy4Q@uy90J> z;tVSBnukN=hla?^H1Es zm-7rm3-Dzk#>)D0QCy%oX>(le5PIp>oe%b^mI}%SANl0u3EQNI&jpVXKS?Kk>q2hT z`);zYQJM21l7?9I+z)DeOtYG0l#{)nzGXY5Ex0R~i>EpEn(d`3)d>A2J*P6ahxMw8 z^VUByK(n__RjS&g_xoL4fbXId7f%yosS#4Wqg7SBrP!SJiIrQ-s%$E&en78U_N$Q3 zn$6RS-&7-^T@2l%AE>GKFKFr8-{y#)oy(`PISJ?ayic5A=u}Ut%W?`c7>3sR?0S=S zcuf^tI4aCZM&T)bLSh0gj39 zI*T7T}9~h`QNaqh8j4etR0Y)eGwKu>VsbL<_7_PO1*YRqH*WIc zo{XC}q`-^GO&N-fjp?*te^#ZOeW%*~G_p7=toHHEEE+jVHng>79p1NQNEbA+K{Id2 zD6d9*EQP7{p%N+WEkSwW7A^#y5|oo}&G`Z8n}w{A_o7eYBTdbCp*yRhmy0j>S%{QY zN@oVl3X0UEYwDs#<5RQ4UFYeA?`yv!8_U&Jlwpv_GxwTt?!Zk?Pf;0+^4*fuABE)3 zXQy#q%f=7Sln%Gr^VV;T$dt&J?KLl%?!U|~TQXghX_VtsE7Qo#Pi0fj2%H9bHkQ(O zw9j9^bqHe9SfB3CEi{Xfmmy}>xyCPqW%d`A4?2!D_sDQb+)sV<|~P^NYX35EiEo zD$I$~;|mWMI`}9|(B!hhrBRBgjd3|4+6#hJ9gZ*6F=Gu*D53BIKQtGlm~l|&t5?}t|$3@oTq;%C@Xwx0?H*?KjHc+jE`3+iyG@Y zK9v$&Z(dHml345~tv+%x2qu+D^3rj&KEB^@9CB(Bl-uZhzd}%kw2Mk=KM=CM??6{! zot1*}dr!!6AuFTg<`QgLhsg+YsHeQ~nfacW|- z4*pRqqj~CaF(e>s#U0Lw%Zyw+tk!r4jf=H~f6|<5AC@p^C{D~A5+<~ybkl}Sj)~F- zZRJ@&P?iGiPD5Y zUd{u1AN9tiOj`GIm~_cqZf=~xCpNq_J@78$@!ZS)Y-%{OvGZ10=dG|5P7>{DwaZ?% z4c)ds5KlnhIKx$tbKDr5%$noF(=*hDBlqxq>74po=}P1<`DJDXZ@(+iODq9ooO-|3 z(*s&9{^Z6VX#FK5X`^pz*^jrFb>Yjej%rC$h&lT+NH@TqVh)rt>G5@c=Iv|4rK4z1 zZW+83*yLRG)n*j(yV|zBb;dw;FuXpVVVp&J6k9 zp9x`tP9QHP{Tee!^fEq-`PyvTgqjDfxgM57w`K;I$2el*^({txORY6UF=6W{1M9;~ z3x99WaNm@q0E58?8%ItWS~@YHl${WG@~wl%LgP_97nsD#ZvALQ9PBjqOtyS>D>U99XO%%7)?@4@xyL7^ zt+muk?+UfZz;u^R!}^k$dIZ`wFgTyr&%1@DqlT5niRT%ab8+Com;FPlKE8!yKZyHV z2_k5Qi`PCUFxqWj76559Hwvj3N&=?6ytP|2drOm_q{60S?|`|djG zgYiY6lAQXbw`wKawz^s9XRvL{Yl?K6nL1iwUq^duTrgLev(Vt7Q7-m8Q$MzQ z>7}{1-r*|!d`ofRhB*-KdvS#C@Rol#;B)6PTkNg>7BiX3{NdTyF1+K3&)YC{b$NBO z>*@~0_)d?$dhnoiJQLc4@p3}Q+~}{I-d4$0+fB}^LZ-q$-QM11@}q!J&R>Oed$!%) zetJBqyS;ha{|t)_ecBcmx9>{!g~BlMQ6cps%mdzycf|34YbdPTY@RoNA)ERr)45{M z$B`pGPGbv3F~&DBJ-=>q<-)1R1X3RBLG5J1+~GaBS$X zz)4)+3o_i|sjY`;%Iq=psk`Xxc@4e-d4UTbAw%)mr%{ zoE!(NIqEojF%CPwx$oGU9}-`&10L7e`{itAeeoWA24)VWy^6KEFX7kssT6fMe$%8A zf+Okh3wx`Co9^SLNBsxR+B>~-p<~S#Y)LZ zk6S2}>gqan-+i8Y?EWZP!wu@e_)YXo2#TU;bN9NVnHt^ETu1MV7g@9`3{bX!l*Q?V zsISE%W64eN95l_7qnX-}6QN&t^Aug*$JtJjFgb_YQ!APL9(>Mxfx;d2WD{qC&|vow zFVBgmmHgKY4Y*}7G^7ciw{p}^p=<-9`mgi5UNBUx z?K7>@W+;-TNwFLERG#%;CY49aIiK}jzEv;XbPQ)G-RAqXXr{&F{0$!)o#J+D?-*A5 zD1BsEo*rTm)S}Ll2ALo1Ns4T_*>_*VYJe9PEZlcbFBvE^itIW@2SjaMCPQBVCIdFA zlgU=0)3Mp`O8s8A{t=~@x~p|bsKyPGLuPjt&LfmXUpYC3)v|&c0s^4AJIuApAYMkx zC*3a6q3Zg4F(c=>KlL!xp>Q$A(|;*6$AHVR%sm<9mg6?5_GNcP-09E$mHzNwN|F0G8@Ctb_E|i=KZn6sgzQKjGQGk{>6J8>wA_HL5!r3t zsRkK6zwxJk3er-;yC%ayjb^TGWq*ue zKvi)HG$kQsEo*;|?C6|n$lSXa@vA<)af+Q?PC;|-BSO_7@{42esrwmKH&A4)r`t}` z4T#^cHy>&__Acgzo;VhAsDe_uK8}3;FWpRu2IaRQFib5grgLSW+50omX3!9&ieZ%Y zSFJko&x$!m8_?IGYuss%kVEzzq^s+YA?t(`8M^CkiZkH2rq6KBSojtrwm925W8jl# z!bgqmTo5Dn6rE^t+#Hqdpt0>5jE=Is%GzgZ*97Rdr)td&QCltf4p%w)e5r!EYTXY$XdCp^_9ny*IV2`^It*1?Z=e9J)9|PdYzb8={vXQTJRqui{U09& zM1*lyLd9f84+3FV(8}4E8B|iku27PCsl+-~rln=Ol|wfK?Uvc9*^SXoqG|f3&0I>T z$OK$)Ur=0*xK_5gJKxvye!tIv*5~*8eE4H{&Nq^#kCNeT1?f z2wo~+wFh7^@2p*q^pM*FLrH$eC0h2b9xm`S{eWnUSyI1%wDw zbtHd=ygRHfGVhsFJo8F~_7n`TwG8Wa6b(qW+M0Bd z`dLURnT8m^!et79^RrF`adIHCH(JYB9DR<4YpGO_%IZ--lIc_k7U@)50$fwHl|~~$ zfF@5-T@d$}RILw{5l2p`kBc(GRED!fEd!$ctte`ig`>GbWryFC7C7bm}kfu=*IP#z5L-H8^0=m$RGZ3_Jl zAN=_|`IC85+W25Whxemm%BJJ$m_uRziJrY=UEZE6m=(QQjfJlBQT% z@9Yq^>vaoeI5GFcQ?wY>vE-~HJBXKieO1SU`}R<>iLp99GjD>0w|i3Q@pm6i`4nra z_~)3+A{xA9j~eR!>Z5to)DUO&&LnF4@-*-8<(XTtyMdZbsr=c;?gLCI)_?M`0>Cc7 z%1=mfs(`iZ%szY_8_{d0d~iW6&i{u&iGvKfxFZYdn6S{L@q=b42f~9e^i^A;ueN|f{3Hpx){~vv^xfdw#3X|w0&VA4FAUsCk zDh`$b%)+^gs0ISDr~G{=>>^Qy_&c0h990D16^FkQK#sf;AMxDYc-|$R+ZfO5#dD1D z{H}OjdUA1;WrP1Z;+>pgy?k=5+25HSif!nd+p5+DMM@X+Wzo{Q>MkE^0hnx~?G!L2 zQs3b-LS5NGc5WW($}DMU{VOB=1aSMV1mFS#g#c>Rqc2HW&e{XNqODeSBUQoL2cHOU zX`lP};u|jZGXWDTMZ&HsvkYau+z?kTe5S9Vrre~HNFuEfsLDk1Y$8b26+ld_@}O1| z&&#D&`X>el03*T6k4 zp2y;Ok*ZEfrcFESzmkcvs)>pE6^atcL|f^j?iKOSzr2QrG6^2$U*3Z?NTfnQJOFK; zkBd>}`JjF#pIROeeoH4lUsVX75}Eq0@FP)b?+BQP^|uKY^lwwif8_-1hfz9s0+|3# zvalCS0YS-p_0lq5Mg56t6sBC0f<)`F6Ud{yhEl#Z6r3#;ob4;fKbbT3 zWGx+ni%}cW<&(=S|0I{MmH8?*gm~%siN1a(i5KsQQaE#cX9-^FEFT7|B5ETkZA&h* z?31G3(m6A4Pg^!ja$JbQuGxZ*l%$+N#1iY&NHk>#u6B{sugJ&T@CBFifzRhWY3W`Y z0eqpV`VOY2IsQwKEkNZ{AM0n3T!H&Yor^x-KTaA8B$i1b>U1AVk(lrlO9ITXH}<2t z$U=m%TwTL{>g*(8muZrPGR?=j8N%KIE>}*p2L2;;)1RRr7{b?xp=QqkTV)(#fb>?L z4*6Pr%2yO=!eAwGnP>t5C6bmD@B}_VkuZ%SL1-}5mxa|&Xkiuc<#bqcYO;QhCf( zn5;ujR5Xx`0p`F4`fopzR(}GOoxg#w)`p9?ec6|``vk=BwFv6JeU%mQ6p=jC+e1D9 z>VrlAJs<<<0UxV5AsG05>(A+18}#=Z^!G{n`+RIIh{$ou^So^4^wX}U zZ)MPrHR$h^^!Jh>2GD95tOM!T2W+%krK7aFLypq($tYcTraTwS!um!dQ<4wDPO$&{ z)d$K{U&Z}RK2XD?50p_tw075De4u+|>u)59yL`OK2WiKSCuAnDf0GzAb74&a3fhvs zlYEtnHiy;^X;zt5Ek_iF+%&N5lhU@@1m5-tIY+Na1~Jdy`in3R8C)MO?W7JD%Iev? zP$XU|;{SfhOILlCKFu7htPk|ztCu6&QwmAeU^2vNGK73F$R}2Fi!d1|icnHZ%k(Xa$ifiAA2KT;Pw`cop&c-y<^y2ojXFoB!IH4puiBHPYn!D$Y!%0JE z5Ps+x((qhxZM0=64|e2yqqtU)1>&SVQIKIhFeUta5J!w-Y)>Y8DmC_md6xO`MHbul z8U9K){FN^KmBxdM;u=YhyAdpvu833~U;KG4Sw112HLKp$@)6RZV% zZ1wTb8YtCA^=vKnx}ZVJdHgBYAgPK>PcKL!jtT)Br6;8@-B`la(L>^5kVLMJl@ioP z#0`IuAo!>Wl8@Gd_@H{F(wBEVk>-HO*XB6y3KjN3!14JuUY;t$eXLxjPk$H141}p~ z`Pe7NN$NYkwb7!49wwF3yZ8cSFcYO!eNKqh;+pb%gjhGMn`BX=$CAEbq;GXViS?mx zi+JPZFZKc*KZcYh@yVQmZq_-+;e7wwgd01o2Os;*CM`03zFAN)U(|l7C;+Jw#`V&R zlktIcX$J*4c3a;RKd@bEY2S;Q>??Q?PuXj!BG;09Iny{N$}w7R_$I%)qNzi-556I0 zT8zOg8UR^YjYgQF&fya5J~p1X(EFZJ8{suaKbx zy_6UEyBmFMfK*zE3n|Uh_Lx*!xdb|ne9=29+!CLwbmIAe*3ok-C>OlkD@3Iw^Kz5W zm5$(-4OE%-DJUxQWt%1mI+6bBpOUx!hoKw+@xS76gnxHC?~yDVWuitvjG|4$2%rGImac6ehff-B>NR4|)SN$3#9v1`+Ly z1}}^!+CDNLs_S7lGP1g#%+-U;RUOdkz0L9==9F3I4BAEpHr%{4y97$$0SdEWe@ruGL@HlKuOq5Ss zHw}iI_wvDZuF@f>;o`+SrA+Z54`job1fPQf{AHD)()R!;P5O6IHr*C+N3Bp*X* zf%jVe4T0Xr@;S=K4r}7E>Hr`3)i!xqPq>jgXQMY@JywU7bwz$RO6NTp@t2Z{UCL4TKx`fDKysDNrMEv~RtEO9pX1;Q|4{0RG3JiWr6-g3W>nf4gAok;df4>g5Pf& z^?BaFx<(bhjz$H)YZ|q=-oUCx6~9Xx^>@7itx?18XN?Me?`_oI@dkoNRs4=_^sgpW zfTr|y1{O7{3miaJK20HICiD&TYt+rR@HVT`Atm-gn8lp7qH(yn5Vwep3PTjBPAokO z77oM}N!|L5&pk>dXmQVv;(pE?NE@-xW>xo(uzuK>ju@c&v9%vTExX+y~PF z`}RZwW2U#vHY$3Qf=UpmI-w$`KGwSzaP?^5(xxOqenKwg z#e<(*yzD5*saP`FQSTg`MtcH7Eva#hL(SH4jhQx6?42=eY@;YL;3swuU|x>A<7N4P zd71W(*Rr%cFk4h2U-Dv>=gHr_?9N7Lqn`Dy#O+d+rLsu*%!`6fc5r_6vg}6M>L;rC zIVjQdY1|-N%Dfc?dOq=ZQWh)P696bJ3IQZXn+kxGQV4Jn^5b4?@G)C&Y2^1ziDiA5 zNr>a)4gZpD0c8r%Q;ET3nE@tCj_RY5qyC7&@ewlIy<|8HJ{4j69-q-cQO|9N{?Emu z>fNnbm&QQ1My1Hh<1!G}s88?)em|7{GG> z>KHF;Aa;WOaY8~rt~{_&psH_3j!hGSn?pRc=q8@p$PiEcPA{to@zmfgV}kw)mSPI^ z1b3w-#7l3{#7iF$;-!r6#{UcPV_6C_XfqL`XpmA^=`VQGK0OLp)C;I1hDVd)r7K%NL=|Jdyal44jFgLRY`_veKi(_ zO?&sK=uUkLc}SOKY3eLty6I#n%mve+fcCW%SOH!zu4QTbNomg)fCl&Q4ym%nn_jwN zZFIYSSQjy^l+Tf?h=0Sms+Vjc=1)C{dD2HAfGeK?AfFU=10a*A1i0vpi+Hd{k4l+& z-f^WX%CVAZJYKK*LcaYhWP9Z&Pe`U>=d=ZqR?GDkmaeD-Z87u?^gW9GU+dOSr)WSj zhxQK9X*YRup4Qp0qhg#?JwZKOEGVSk;g|5Md~k)|F|3vceK#MqbV$3ALWJFVG?{h< zW7W3pK3;m>=C$6hL*L5fle>xH1@=7%E4gFMTq7kKMpIG@&dv!%sB8ax-YWIYst#dVn+ zN14PMB^~%sP)#_Q^ci78trG;yr+u$t(O1X6(dT3{ea<%dUHy|Xxw5Z!+5~!) zH?x4RN1SY+&m;6@e5B`*AZ;fw*-BS*wV}Wi>#ctBShJ6y%9e*}*!cS45mc1u+p+jY zhNyPZL(`K+J$C}Nus?@5V`#kSJPpG}o@@GijM6CL8K8*6MgWwL6aw-As7C=%xvT2{ zT=YiwU=>Lg_Lu$|#2Q_!Dy#Z4nAOBrJ?uew56x*wDQy8Hb*fs^XhjwllVDZ_0}@h2 zt-(X{%!VG?0j@t+Mc*%AuFZZAb_F%zDfJ#~EvY&bjKriT-~UQU(}P*q^=+`$_jtsp zbm=Qu2PpMbmxNfqhb)q{gR8Plwz1RxIBc{+`6?Cd&gA(QtY?n!7J68EsR&JG_zOEI$-HOuu=o@xe{H$;eb zxw^&UTYe<1>`1_R#B!G<>Y0cVidQ}B=4CYQr`;ZW+C2YkVQ&+wBPO{?)Lz$)fypwu z>rpgyYdt{PS=^FsI8q(RO(Hq)RC5#*U4dtgSRM!oP?y?;fFUHH5wxqD@jrAGvGRk# z|I;S^4OgL{jTgB8h~=pef4zN%;Gb#m|F9YVeOD1H6$bzLP5k#S~W=PBL9r%Rg4>%#k`yvzxRnE>TW$~lFH5hv)5qQ^$zgQ<56!(rTkZ(2pa%=+Nr zKo824#pY`2-j+=9KXe3pyzo;%Kh)ya#-~&V{0oVbUp->!QBqKG%Mt(mM*<5DTiR4_ zS=+X-fDh>Y<7S}EB{bs4`%{<$q$)&z2RixZ&?o40x711WpL`}IB{?=F%zF7S((nH# z1@=I^{JF(eo#kOWLCX`bdHAv^o&z+Of_1OreTgUM`NOf1E!akpC~d)2%IV38 z5FobMerfQ3S@M6`V;sw(f97G|NKu-}i+OXC;I9t7V$iG0i9Yg7kljd;p^T^NSC&6}#OR%R3dt4z zR~8_-^iiGSk@NHVpR`kQOeC9Z_-m$z-3ypZ;_Z62Lj$FFD@tp>YXRz$hE}`XpZVz)lH=*r$KBllHoYrOC9Y^&UQ+s_&+E&{y5p zWUtpCh?G+A3EAtgv{x_ClMc#L9@Y^sB~^XW!>oWQ{n`^A)>g{Ur~buW$%ef~$*S3Q^s6<5h-G|De zURhNfT^nAQWJ5GT2D|r=G|BTG)*xZ!M`1(ldwNGkSq~eEqUu@5CKD>dJZvxUxgPg< z*lxg-T;)EPR));e9?SKi5?_$%8xkdbmQ0p5SSCv!=w*vd34)~u|Ef9enx z>b4AwIaG&p_~4JvlWFZCcT=WFy5?&#CN@6C(K;+WS=v(fkS#S~OLC%~A!R895FgDg z_$Y1B%WUnqAZbz~dbrHcy%l zj!JtOaK0Ek$wjc_SIRj-Zlab5mV8p@CTKy%R0$vjwf+D&PJd5mjhjB)!`HzPrZU{a zr(B3!&Gr=ha*&1?n`T1QFv(l#D|u`Gki7L9J=TVUkD1%9HRAv?>_(dsaR~Q*gOSdX zY5J9`l<#2=k?y2SnWr$i?b_(4j)kp^=4~Z)xiLGM;t5fV_OQDR3e7W)Qyevyr#QRT)g{bFeJDdEX@EV43-q2}7bY zds)#H84zC6FUcHR-aaXk>@&!;(v}{Ru;x>l@rzrLA@T>r40yaD+=MYk@m~8pC^c#U zu{<+Gc*<-8qSJfE0S}AtPoW1UBEf865J0NxVE}k`3G+~Mbx8w?v`F+!vC)9m*HKEf zASTa6C2 z+5t`LQna2P_RK*k{ZU!JJ?vpcJZ2s-%4Wq1Yj6#J$v{bpFhTi=o$j{qwpj5*Wob`S zpyfePmTF^pS!yBmPiK%w>Tsm@GTjo#=hL=-EO==rGf;-!NrtTs=qEC&n%1n~T$M=& z6MJSK?bm>UqkW|R5oFoYZrb?_-^K=7j*kg;+0a$a zDAHi{8K=x_phVUG%$Rn`Xpky1P%@HHmA!B>{%d>4T0_WMw4H-beN{?h>AM7ux{Hj~ zl8lDNBzk+?zrL`vUk-o_l?nawZ5Zl+VA_QS>(U04>Y|sRjP(qUF8Hk>c1aWqHpoaj zoe^3eb2@`{g`)Z7xKkOtGMGqeoy@pqow`_s5#LDX`pu*o+%$U z+#Oxs+r-z>5i9j#2If3?e?zf*?hfsnPbN-* z5b>k!&0sGhMH4B}y**fjfxorkqO+*nWx2+PBoP{l)0xRrT zw0{gCZMqssk3!{5nkyeGI}RJ!LkUyXXR!V(BIQsBeS4{(Q{lViHC*IS*PHM_TLOX0SxbLTl^E<&?Uh?9mW-^8gVO-dRj7 z6M;56gB^n7cpg~NP?&Co--U2pLx|y;i0^Qp(i+EoCYMkWB3*DN`@Z zusp}hD*c0C(Y7n#eOU6=-wW|p-n*8!GQvpD3zD}=08h{JlDG1F#V~c zH(0d#3igpe1Xts&rriE!MpJ^{%)lh&ZL)0o3}sHLu#kQxgRSNM{yhUL0*ts)UMKZv zO@M6ws98o4@C0;8g=BTAR7!sw0FO%oxW11;&8)BKJkYE+VF2NBbxH<}(F-e27BI(t zRKPB5h$*6`2}Ux|oksUY#?~Y$NF{(o>k~7w_!_^a=Fh{;_)VZ%EoVP`E*U%|1<=s_ zZ`5Iz3O$&CrVtuckvOGdcd%%0u&SOKRcMxB=V#S6dXI+Eu3+S*VAhr(?F`)>jI0S} zZ44G|4p!9}`rSurVGtherYb#Hh0`+XQIlfKMf>uKGE0u*Y43PnR}Wa#1BJA=F6>i_x6oEVC{4u_SyKHwg+HX zQSYfwWboEG*;bpH!G_}#Wd`_(-3B-wumU)IKQ%Mrr8h713dMxBIb(SATC-?IOwOp@ zBG-nHk98$cyuVZWLLq=ys&@e3a&iHXaFqZ~l#_u+?MyH*XTSdlImUNnf9#$pW1*}% zA%og6T;Yc@n9Wf5!3;k3M=n<$L_nri(%4V7V5)RSMA9eyHYr#ofSBmRq+n$j3C2+# z<;yVzLVa^>e2_OC=mr29aYNfdOrWKG%xd=w&T2t31CGsLLA>V)ySJG>_x?qnPKG|2 zkWTn20bCy+05XK)qx>69&^xFtq4u#4pwonz1Q15Q=r|M{7O0g9Rb-!loj@Y19CnS^mypGo){v1vM! zuuJnZ38`N;gT5PQ|8)^({}s}^%*-xVpZyp2*R%hgCPaDm-;?`|v;VqWb@tz*g!6wp z`>)I2o&DEBoc;IrNB{k^zH}iS{ihzkP(?@o{oUDrUEraCq2M$^}uLzGJXHQpZ%wG`d^>@7gy90XaC`{ zpadLd)a>j(9E#NJ?7yiP91kNqh_nCV{-?A5v>nFTf9f9N>_2|C-~aOLzvKHL+%W6e7p8oU0mexAik8+mz9t4)Ap?X_vqjL8g1z|a{`zD!D5hbNCiFFTl;JkvlmoOwX_*qm5?jW zsrn}MvE@^{j(k@07ZVq3LN2J!+k?TpdQsx4f4X^pbRr5^?GLxn2iKxA*j+&3g>_yA zYgNzpI8CEs_&0Z5#WdREG*PlB!x#hqvePXob^sub`gQ>M0MzYn9Gum)--6{+`5`Xq zfr~l%US6H{#BaJ{LRUO%0o7;9nkD0aI)3sO(`AEWz8fz<*>(JqkBHZ2scgbNDbkd| zPD&V+xmbWVB!h-WsQOT@Kt8Fa*1B1*dP&phMjx8DbGVL?Xwo7ngr*Hb52~IBZ>4rF zy&0In;^>V&7;oYMplW8F`I|vp4uAK%k>DyrV3nI$41o=977duBsR!JZ6%+XyEh1Fj zM2*Pbe=7;KN;mr$Dat40eQq&5NEk|mfw9gVImm>zC%UK@KBaH^Za4c4MA?M58+h@4 zFS*;;dgsD>?UFmRL=sgqq6Nzoh2M6NN4?)Agj}l3k}lQ10yCmk2_W{`N&s9R0!T~k zOE8WXCm7vvMHpWF0w3e6rlVe;M%156YW*`wtrEbgKMi?Tp6{~uB69HLy-*)hWZ1BS zW;abs5+8j9u`N17^%kj(w5Rgh3pSX+A7@!6PCs>B}F4BMiuK!X1Tz>-cBR`fa zaX>=r7K(5#z|mmQ9%_1He#D&S+RNVGM;Q#8RZEMp5{hRwCs@K$<)y{8ieD@itj}6d z*@?uvZ2~K^^cQ;6+_vSNx(-VD&|gLg%3Ed0E&XM|@)7MuPG{bIrP_2LDPOy7^m1%h z8|$;Ll%Ij6uW^IJ0xWbK#9r99-My%O}^B7MCv{3#MJ` zQ@&sIxi|ysQKh*a>ih0?gQh2ZNaD2lL`mXC3i;Z5LjH)ZHok63n@6&{4qC9hlMwvj zMV?We_{Df2^63%Y?({F=8l-4osuraFlG5IZwO5x)ZSCYRU*#H0#I0S;3B#t_!dycG zLm3??V{5nAzxZ{V&jtM~=E8~uo3F3U_wH>zn=fElW--$}1N~vSdusvR!+{Nl}a3zCQaJ zY`A>_ohWYc$vAe5CmDVs+iu<~R(5H^0N2>|yH%fYd#IzOZIOJk=L|QznZRAC7lm9Y z_`WRMIHKzyPOAT#%drR_YX5Z~Dh;cI;DWsk`xCHsb3w(3+zK8zJru4XVuCYL{Y1#M z)26$T_6H7`vj&-xw!~JpW9RpRjx?DYlE&WOD|CI=jgugg!^9zhh><^&Vpp2ycjKOu z;rEFqs04Mm|?gUI3z8 z8~ELM?gYfEh?#HCgCG+zIda(NQoG>gNZdC|xrnDjtsoQ%adB*$y6${BJ&%y5Dk_hm z%HVN|C2<&+!ptS`!H>t=WMp1Sv;L?XrNt9_khyT*%xat^2a-e%ih^4$ zXw*Qo3)<~jYqpinMqYie1wT~}iy`qauAnFQsZY7B*CATs#fGdW-Q7OJ1Ep<}n+}cd zfTLW+3++dDw|*E$!Nm;s?HRXx+7RqJk1Ojnr*w94bl16sN!L|Y#83DN)*BLm@qacN zOnEsx1$DtR$>KM+QNySs-TUrjxe`fv)SWeuN8Gfm>@fE89$7L^a zc|kqV&HM74|HD*ORZ26M}KTgRhgqaR&V@bIe5_ zU^Y-zI;AaXOoHpX1!No;46WecZ((Lal>FY5fPbqE;lhJM4O!- zKSo-pUEGQ0_gQxXKiwTL@1|99^igYQvTrQxdlv2@1K6goC^rl+*li7KvZH=uGdre& zh4Q+zf!;ydKZq1=av%a&J@QxNKouappil_wS z6ORZ0q^wFnYSnC`fgCO|b+a35_QY&`RT4_4>>?_Xr-4KXbMrxP(pohEpDPt~A>80O z<1FGUF4SuQI#4WY(Uqc)u3)J*)||^&x`f2JvU-TJm(;oF;w&lgiiA1)3*vo#6>2h~ zPK`Vi%zEQW(VQ!EM%I3V-&yeE_-9>3+fWnHl7eYPwZW=QG|U}2<4RW16~K`+-c3o+ ze>VtzcU2wda)0J2u4inY6!@%_ldJrd`XxLim-=^}o7 zsvB#EXnP6!cCmK>r;?#Ax!Bu)U8K+@ z7ct`3NC_f_K%+1E0hp7}RRV~IzF+99?x%D$ttB3eZ(0=+=JF3G`AAS4{TF=Hy^@c< zNAgkkNc-$|WnH~!3~RX4&hBKBxgWx@N)vL#?CTj<;POrjj^lwWrNp*wX8Y2zb@W@j zZe4MEU?wE-@@N}3IW5DvtMS?jzb*L542J1~50ROX`cLxD-Z1|At!y>4@-Wo<4E&q>=o zV&a0any+C@`z0eAH2N9Yep%bQ=647KkPc0&T>Q8+Nd(y8}NVb~3T`z9|u zG!AEb;qZRSgK1CiWS1!Pi*Z^Oxt{sY?y8FltBf)OfN%J&0)2BRThXaKX8pg5xj#Yw z;7;~aGkP5J$cHuh7U!%;2 z;v(vzT2w|w%xzy76;=}F-$E==grirg{=j*jf#O^*^{tRznLFn!+RW3%))Q|etYTMn zAjECnPyTO0y6Kfy>!!~Ze8R%g`tIa*k$bc0sCMN-Fz2&fzTbA*TA1?6qp)a6tSit` z-FX{YvgNyE_Fs$a5142FH7>RUFwg#g-vpcuR_baL1y?O&)+VDYpijyN$hw5D{a0pY zg#aoPwD(;FkL|>owGN7Cbtb?dXmwu1dKe29R+2vB22-0r|G|aXQIn-Z*7=~wkaH=a z@<4cb2%u7ka)gU~SBg~Mks|fCrAYN{S$@1l8T#@L2&8hvSU5&`*Ba*2cYrxIlF%<- za;mQjS|{y75xLl$Gig`Bq+MzAb}kw)q7dOr%W?7xxt7YuF3a`xZ7ON`snA4El~&MS zg#!6ViTWzH#r&W@edmHCQ>-JQFvV1u)E0^?7-xEY)UIOl+Q`|((_bG6)8-dG#9Krf z_*z;wi>3? znVDmkn1KHbMz--JsT+bhH}Q~eLDrZ)eX6z1u2VzAW`ep$=PzL$cZrRz?}-&Zy8dV& zWtaa(5t3r7LQ8kvs&;Uv9Dey&`a-Y4;r8*;Wy@TwyP^Kus8sSpTlbZ-n8r0oh?Wef zKLdbLrxHL;*PeESu(gAn*V%ze}o)Y~@7dyOD1hX>R#SQ`{e(Gy376i;W zz3OVx>$HpQ*~!~h+?KB(&hzQ$S4d3-ostPh@Gq049tr`(QhU_Ed6Yl?fVM_Fkv!tE z9^Hwvg)1y_AKD~}<iY84K!M)x`ELJ&u%!xWv*HZ z+KB`x1-w7W-{ngklzbPB_mevM6U2mvk>1&j)mYs&Jf(Krm5$?tsh>tcE5v4@P#In=rm`0>4Mt6oXr?3gP@*aT7vE`lySlLMm0|I$<<62Y#HK%-nqlb0W6J6d$~mGnNw=7ob*oVq z`=)N6MXhJaw&V;}NgN7`stapX85Yfc-+_$bKSNmxSsmB;{FB$4RR3~5YWEPIanO(M zO(^U|cgO%JIirjV9%>&|xM*`-SnJ9#3p=!9=1;`0zKP$kYxuLq^Ksx%rCT7n^2c~ZKuO`s?{q{-G5VDdU?v4(4 zxBEXQkS*B3&vhXgdVd#NXr#BlYr>afR$G=1Ta8kP5;Dq_HjfN|mAUkoPBx%(^)TK; z#A>6off6fI+*zhU?8DGy*o~z1pitlv{0gC`dUf?JyOb4BPmOMvkhjY*(ko}CRBe!80-n) z8is=pCbiJ$LfM){EA>;WPNOD3|3+V)&4%qr9CO2;6Z*2jI}%fDe>yrc-;Vk7n0H5F z*G_Ec4h#_Bk9l?^I$E%d9pi_cK#q;0J~O?WdB#$_Xh0k0*pWElD6{WKe6|78YL<5a z&gi|M&TsFsb|fS75oWa={FF+ufuv^Rv-UlVOxZ&H-6;sP-vH1jP@h2 zak0*lqhfKTeY=egaOnw85v|hKMNT8rsnHM+UrBvqDM9@P66lli6BrY^c3O&32q5>q4E;{xB@yb+UI-C#n<$4Qow`xd>9tPws-bYBq(f`_YC3JdA#Z~rZv%yh{!zFn zJJcVY)~~kmqTo7_M`#>1fqD%JLvg^v@&_j$OymBn5-`Pt_Pvv58s&Q@3WZf$Q7Fg= z{mxm0gBX4eB12NU5qohl&GR##KEg&FygwDp630qntPJq6V9|+S)ls?zEemT#8wud` zJNC4HC&~-do&Ni%I7bd2wS7j{hZYS;XSv%G$Bg}R!gcKS?TL=N*zoOt4$EP~wkLMI zjoq~!H=wfY?TOEN*wF1?%(UZul?C_p0&7Os8x{@dXj#dI08C(mw=Y`Rm1S+mzLvt$ zw(M5CjA4Ve&p@d&c>DNOpHlyNi*q*0B9vSHf!h~UMih=SX`k~~bS9hip{*=K)XBV$ zTv$M7Hz*sO6%JHd+p4#em#!zHAL}pdRZcU`p?&>ywzoR3Oq4$>$dnI|DP{Vp=%|cP zZ*idyL9a*$v^UPuYM|xK@D`MI^8Y~3{%+fcN0&t3R(>0G(6qhID%_VG;s21nfo25# zr$tIP2TWGyR@UJvy=g2_t8}t9h^%;0xxyJZxfLZ5iaMSK?P!1bMH9|fHJ%u1Dp94+ zHz557fkV{VLKz?nDOKqtSqwCi?D(zhcPf_Y9(EdQOXqv`^;ORD(&;ibnUkH`CShcg z69ydPV#g$mI*lEbu-?j*Hgl^u_xSA;I>}k8vB!x<8n>@@3E6-rY_5~--X?60I*pe@ zZ#JV*cZO)x^O8n;+sSIBEG68@_rO<(!{Uc}E^INIE zk1_XRtb*z|lrE%?e{1<26YxA9Kw#C2KvHN z+zMc*d?I|MKE-8C0V0JrVKSR zUACew=LXjM^~VL1U5S@B)wbb^CC(C^Q1()3!cWCQuEa{&{{&&utYwx54Wo zMznSPbF2sn7tU$I_d+n;-_QHQzD-S7AGFp7BMw|u{OAdu`hPW5UD_A{lS%c_ zqi_~B6LY3T)l}E3>1FIgBRyN4u`~Y|S9*Wsc8m?Ng+dRtAf$)>jg!6Hq=$CzHG1fs zq#oKpnPCS?J=9F8hwgJ)U)^eHJMHr6wzZLKaX~DU&`0#myYNTo?0o&TzHB<|!jnGQ z$=5ZK@3c`)E4>#jas4hQ8;2*J?z>2nNE(Vqc$UYeC9Z zt9@&1bQH^gP;QVR%?xs@letMZvSF6f82VDOuF*@qXp?qIG5nEi_#;W^r6xJIq@oH% zRPpLweX)OF`xZ)nFGtm6D7ZFS=%qZ_m&Hk4G>_BRa;s-JeceeF9?MEbNEy|AjWXJ= zhB8*EjFupkQ4(bM_Hfom)S4r|K);dPt6fhSSeUrG$jg*uMZ(-o@szKx+d{PwZ+m9( zeN&RYYZH;)rKvDbIE>TPu^b6|pLnOX2pi3f>+(=ARAF-l`mubY6bgIPBfe9c<$b$w z2=bJuM)VtySRv_Lv2s`p4@EIA!uKIT!$tf+Lvhc zDJf2|-y^D|LrHq!!eb>if5w&)b8&b{W^u=o-1$im{BE4PRky{nF&=y@?EUCl=KW#` zx7&n{Y2R*U^QasvMupL&q}IzBcw$Sv*=WrMUX2Btu66OhX%ZBuDXf$_v#k0ev(4p63p9kiS@1HrIWG+=QY*k zUATx}*&^5!WT|y|doHjW1d6^f$dc>wHk`+=DA6zo(Yr2h)j9mi_C-yQDRp`C&SJEH zqiEGZW~W@KoeO=y|-&uEoqOK3JZgqLXe#0-PQGW=s zE_Hd1U)h;0SwD!_@c{PkCKu1O3XY>>>_AjSTYsLg#L>?wbElIvR`qYHf zi-O}k=h3bMSnU=OU1uD~(S)T$Ig8q%F2Vk3QCFy8WXMs}HpKZgo%wj@+C`F!@;0J@ zP7JA~)|B=El?z-}xU2!TIEwa3b+?eZCpJ-`CD&mTn2I}=4J_$U-1FT#N^HgbO44zT z^uUrk24pVA_1FV)s{?a$?P>mfRM1hZqV2hU6WhIotFnytPo#@>=jXv!=CN&CM3Hoh zlfAP=)@Mf?>@&c;Ts`b4n1cI>Tw_1teT9;Ke2pA^Qh#u~vXy--iInq>$krxmj!?O) z|KZ?G56)tH5cGnz_6I_lzx);eVJhD`(t2%PYnHL|M)Ij8p~1;B4pt`hKpoLk`Ja+Z z)NdSg3p(jC8(xZiHfl>?i=|Di8MkdyLs$7Ang7>|l6lLBc2p}flWC&_>7Z|S94cLp z?oB1ywPtaq&BcCFzposD*S6fomvy|9!nvr0$yvrNA=;M?A))eIRvWloJj|2g)}51v z{M^x}1?-*6kGG>Z7)ZLlzevbXKb84fFDEBYAty`ejI2ZT6J1@v?X|*zmM9h^75z$m z75MayO>6@BGzs~h2G?b0Vm}NIWAn^DDoqgUOA)66RQE~SY5Vzo?c5Ga9C?pj$Ks?X z)$bhTrT2>z=&KwoSH9QxfVJ#`>8+e>xO}g4a;6>M#0GD%_3WJ3!ORB9_gV+EgACgC zPRd(Z6qE3yU=G4^x+5u`e9_)%p&0PH31!iODeM-5eH$k^RH}b(zou9ULz{r>|6d17 zmDp;G6BkqQF;#B1(arF$$fWDj7^&4v?4iW-6@7H>#w>1162Q+R5hIw~tt zL;Td+oAIOSfy;lJyhWaUJH%LzpgyYju6!>M)mIH~zJWKCY~>9{HASj6hf4pZ{z?ws z>CehI(PvY59N!oU5B)Vzq2CJj7zYo^w5MJ%Gw~$-xNM-iDTazZ0}~Spt4XR6pC_5o58CqD&MH@%g>*DR906n zle%k3UF!97xtQBsw2^&Jaw%T3@m~zKYwtU9MsKRbpn3~o5p@7^U^a>OQzHDgQLflG zldak;UTgF4n!YP928%i(>!mHkmv~WDw{p&(z?j6;-;tQwv>pWTZ}&iBuoP8-B*b6DY1y zvnqmu=M(2rFABA^8=P-PhnJWBLq4XU)}oy%2y5T?oHzc-lG9rhGL)uF+C z8;tP|ZAkFal1f^Yfw^1qVR~|8B#raVa}`Up|isQ==A!s1k5V;4E91LSaYJ7}#cDWKlY z#r;gRMiD+86M4SEl(xQ>9oR%M49lhRyvOeze9pms+9cef>~K(*gwm}Kb;PE(woct> zv-K%9=S8)-tz6h!d)i_Bf$&8?S1&-?VF#X3jyU){DyJXpxb&vc5YX;*MABMb`k)SS zRC&n9h!1*J)?#W+vVIh*^LLq!E#GZo2^%d~>I6IrP|cQX{eIJJqVJ?k7ICT#I|pO7 zBZuwVz`l~n&_+o<`d}D^Gjx-UNxF;ja;CK{rJtW<5ZRMw=3a}&$GLsWHen$A68R=} z!sYdc$}3&+Ae^6*Y_>LwI#jZcqzpAz%FsL{17Hxcr@~6u7 z5Wa>!>FxL@g+5LGA%V9??j-i-lLQljhX?&L$*|Pv;U9aSi~T+Z67W$ul@vP}PU{MGF{_#x*vF7Y_8u-=En8Raw zBE20NrqW@Pm%X&kjZ2q$Lk4VnyJiA{aKB~kVw z)~d$=uZc+28*3_XnhR_#=2|K5=v^JC(J<=x(MH}R(PujHqOSxx z*Yd^J>gJ@pRS|5tL{{P)p-iV;x)N!YWsvfx+^nlzv~w=XMLQ{Q20vH?(ED9;mX!im zIs6ednR%W~Mmji9g_Lnk&f4i?JgM4S)OY-QH~C#TA%!S^zyAVEy z9zAV8b^n&>8!P&4q(MZg4z)r3Kq&Jk-MN;vpXbkQA5jI$i6R`871JoNvdP#VU~v$= zR*qwK6h`GQA9oadRkLpu&5-j`I=@P)Il)HaD`#MGU^>yn?lYc)_N3wPdm$B+xDaJY8GZgZDRx5_=8(F=QQ~vE;_0Pj z(+Ocw5>-wUN!D-RZ)DpX2b2_L<1FY%-}N0*S#<|-DJLN~nQ_I+=^{py6-lVjq*^}# zH=g(hn)sh?#{ae^{x2K+Hyivn+kMNC=y-oF#ZGKWYZ}kZ2RD@1uk4|LR{r3m#)B!f zT0XiQXkt(UhvX{rld!P%9JmmwI>5m$N?5zaQ56OM8Q-*g<@2@kuB5#LyT;jHPb;jYCEZCFyt4brPWPZ66X$=C zj3NO&d+;MtVMh}W{RhOT{{wnK^Dfrx5L_gPq$NF}Fsdyh$|-U!qu*mDD~ z#opZdLF)sGxoC>1U@j4f+oWHz=M3IJ+YCV_450UTUJ|Mg*kfmO;k^d#t26ezd2v)D zQ5mRAxAWy@@qDR5D!plm@;_BJA>XhwKcu)wl>>J6Vhy#Zv*~FXYLaX&O4)1Ad8S4l z(pPU^X`Mt@+DWD70WF`~Roi9fHitH>~rb(?st0|Nw_0dq8^jdq)Aekm* z^VMn6{u4@*S}oE9^iZ1A=c(#}iS&O0AX}*fa1-7RfZLb=GQT$5&Qc9!98-8G-$XjDQY@z|nm6&?a5oD_|0% zNSG__5%1$8PXvpO1*wn0Z<#9M=j2I^-G;_4sj==PjkD^TUHQ8=be2TGWPScec97~- zT9+icBz$`D4tvGE>d^SN((?Mi9z4cVa_$2|0@Ryj^Zq6~+lt1Q1@E+f+AB6T(P`n= z2k4QbkCk+Ky0k~So&6x`lx%y&x+XfsbbX-Gke6@B`-hZwqn)iba|{tIc$ey<&EgE=p~8!CUVs<@dC+*+zQZ_KF!zxatOpt5^lDmSAT^5?6KDD_&^A z)qaq;>h;nd-R*3eVUJtv6;Cwb>fcFRt((AAx?N=hy2exu|A?ns?Lz5};psN+cA`F6 zg~|8(dZzO9BKuH`l$-&b-q&9FA+~~wL@IiBb~lvZo-VcTOR;pX4d>+wz0pS}@V-)> z#83v?Q3q7gqCA-)S3yw$SaeV)QUSX7&HX7-2R;#({=YoMbGe)7C{YN%}dBH4}J1L?qHDysh&SQI{dZ9-&@ z(u?^RBq#|VqawqIdxsd*lc7*y43Uvg7)(SYI4qH4^60>86H=!p=p6+wrTf6hCQ;fz zJ(dIliq>r)OAeYwbW(|Du-%m%#u33(yXfKY3KfW#_A3e`hVhF>KYv(wrR0I~08#u% zcq-$9N47M?08%+ZITzgVv18VYw~^mdKh%7m9EKuBz*>m3(r2Ll5hzmG_}f6-E5Sr$ z;>rVS-a9PEp4mI?_}($cIwb0u-kG$yqTO))SQ`3#Yp6-Ntm?NyR^uDb{6mNP_ObZw z5{*?Pwh|xJM~8v>KJa4Zh#4q% z5(uvebtq>&_>y)vTRRhAYS<(9;9$y8)4zY>nfPP8z6PQ&X@B!X_t@Gz>^T$nl1E=) zihI%XyXI52nBsnDic1A1?kORza>}DGH7Q*1?0xufP4hv}5jjjrVkW7b^w|Ct?wexq zSBLe5LMr12k7-lN4<3CH9+Ob&d5=Cukkr2ay-?aZA(Z;I5XyK<2&GaXmn{d8`qUFb zM&r1ERH(qjf7266kuZ>9;)tCAt~~V(Ph?EgUgu>3HeTc9T#SH#ET*7#nlCYGD8^Ai zRypcHM<&(*Oh$Zf9e^z%QpQrJ{|k1oELP``&4jUVhOYuS@_7m|1fO(I9&Wm z*pC!^I&qf8qT?G6{7?VzK+eo8=*RRAA9);|NOf$FPW#ZK_r))2b>kE>B`T_e2NwN& zsGWcKfb>cUjHZ9UWwG4oUKLtXsX*;vydtWnzT%1ahmpcR#0Xx>yOFk3-|^@+5(v23 z+n%U@cFT zVXfx-&!P7I;fzN=4T`L7uf5Vg9QM?_ap-^e2j$D_xPMqdZ7S@vLC9)s^2|SSi2Ort z)IWrx`q=N$_k$nP$3Bn#q^OP2`d|83Z0cjZsSheJeXKL}p?UPJCbd^Rdp8`a`S<{w zndopQ9e3|ATe8^`aUYKeZ7H>auvSBUL~rj$j9n2wqAfMypZ83h6|Yx;AvK296!jy< z4i9@y)lyKNA*!Wr|9!QzzY2+zH757fqFM?S80A$S{U0WUM$g`R4%KW#wS*rrjyjN; z3-=LvD6G#C!Wf&Q!YG?P`rq)Jgi&Ae=z|3*t>M3fDHXz~j|*Xpa$lL5B2n3FP+E{^G@qZP@H+Z7sRFX(YdZMN8E8R^oKK=Pm z81cIQqi_f(=D;(3$zmA9VJkxVmj^NCM!uh|oXPeNIu2aBOY}~eHfwo~&<5}z?HLbv z$Rvuw`i}>Br1zvp|KT7HptL7E?ZPl4ON3$CVjyP_+F}pG(H42ilCe0E%QFv5>(^dl zX*I+~{ktbM$kqkMhUupzT-<}Eq-FLrpkcV9hc5`3lshPiR4Q|hj=Vz;;PR@o!z_J? zh$?q`HZ8#a*zS%1D$ff*V_k%~cBf}zC2h&EB@=ve(65V&&~8PX$hRX|W&R3GnV!$} zpoPY<7Q#j}_Hc@^4S{c|Mc&BAlEWPWHS+`8tZzeXHBj49=-YD;DLKo&_w7DN%VWvD zT?Z@K_r=P#LRgpYE+VRLKv=#40|YN5OZWim#!99?2?FnaWl=0J~N zZ)S*!YJWk2Rp2k8HU8|$IvFberP3=^dSfcRmP)U+(o6GDaU2j*J1GZG8;<%9_KhT& zP~jB%pVQW+no67^Xsc5=ZDX>h_{!se=sPPU4b{99LO`!}EYvFx*8H|VGl3V2(lwcVidyVRnOQA~$&!6<;*AMC4%2m-g5`If zn%hEh=d#$YUw4*!Vg(zTB@!E)0Puep{xt@tpID*dAzNtsN2_%rGU9BEKM)%NrUJ=r z+=v3nt=#A-j%^o4F|mvr$kw0SPfZWnY~LOEN&nohCzFZO9bIGaKfkL}y~Cq-hG9~D zlx-d^m8PSz+;hx^vCuoM5HW=?Y;~L`E0zpf)ZtHj7+@-y<)Ke<#&GNAmZ$9KEzH{~ zh#3xHi;4q|=>YE{#wZU>4ymHb3`Rxt5iWqy2r9(FxE9Dv9aPArC%GP4+F@cAd&=7) z2|C6*Ve$AHfHH+$Bl=T+52=8i#DK)7w24F}34Mog=tl}1&J@TW^z{^z*$Z}xAf_s! z1NHH+O(XhrAEpZ;P&x{spP3)`Nm-fu^<4+R(1U$o{O4pT%xEY5L}lh@;sE)T)4k^!FGq#Xdk0#*{eiomf*F{C=d~a z3XJmAo}$;)hYMk~tltZ3ykiO*CxkU(g|I3WNLa&)0S5alKb*4SlO$-9>0I*+X{uTODv)NhZ>SC=>DO-T;`yfULlrQN<6K2{+b*{t<($CN zz7lu}6$nrL(v5T1e>de+z7SyA=P0ly`{5@v877DDznE{LqQ#N(0gJBNrynLC>Y$gw3fe@`g&$BxZ5-qG6Jk(AI& zZhcRPTd;P~ZBEIJU)@*63Cd=e9#g?72ut>^P$7djet?2ZPd;$7`3D30$*teG4`YhJ zdKhNNp1X*?xr;x63#dmsWTc%_lY{IUq$MyefhgO8_$b6Yp)5y#xX%yJ?6$4 zPDhBbzoUq9l%sC8gg`Q@M|hd(=P)lbDGs?|ddFH}KgG15Kq}D=3hD|KGRS|k+cqQ1 z27shB!QWBVEYvQq$O)`a)daF6FrN z%>so|x`T!23mbzp_HT;E^=NX%zr-y0-)%=j} zH{6c4{k4I$%~t;Vb@%bW+F+nM@l*xQJ7?<+L|l2OH-N-h;*D+--O!<8#)Ars^A;2s z#uoPlr^Sy?Vb1Osybrnck5Hz!2HGZ2t^c~8lQa(CrzwMS;0hU7z6>M%KvV{`J|cs* z!Q@B<0@Ui<`X{KAc{qB|E%!o|z(N0}_0-krM@2n`wxg#->AmQ#`J|QV{4GsGj6vaI z`lPXF>;6(?Gsp68FZQ_Q_{EL}+arq>bdY*rX$X*Nq9+t9J!UQ2`l-G_)KlH%##g+R zf%2tK8+sKAu^q^Z3p-Jy5F(xx?gpWa{dLMz3) zRHvUD`V;$Wz7N9n(9c2cnHyUd1Y$DFDi#z=rL0DYWfgk$ettQGn&C-Ju<4JO)o0D5 zFWt`srqp8-EW2Oc=(a5!n?KxuHMej;M0}ex3qlqVu>juBCFbMatcCY<_ml6W-~AL|;+RVu7`^+&E7dfI|9WxW-~P zDxI2I*S9hu^QdQz4c}AHG3IHIAwZi;ZG`bK^>Di0N!W%~MNO;6 zbKM$Ci8A7!`U+^!@Ly>fbbkl8>sz9>q0A)$T$OhSof&i7`j7jBom4Ug=l5}%nvZkf zimJGhfoXfn&F$#ViqgN`q+jaRKQ!s1p-_PjO!^PBr+@$dK_6=&5e5D^N`JaZf0|oA zXwtuz(GQvQ|K6Vd!vBN5w;lb-QTmfi`V)zW-Y96Qce9^A@5Knj6t7C{@NbFQ$+~^~ zYM&3?d!`bB7xryA} z_Wy&H@^+M#HY!T%Ax_J9%bhy)DiX}ci5aE;lNcBJ4Wh-(V7Qz5tM@1T)wcXZ1ZE2Y z)HniY0=*D*@-l_ZF!eXh-56L~GcK6E8x)ijtBIoy0bI5I7XfEXVQAAhZDk5!;k}#z zJf?Ro&l2IG4JKT{?}lhy$L`}kRtdRNAL*{&Ak0L$g|YH*+Uf-2WcDMqbN|JP`@HgL*}18GQ+v ziLOv_t$v`D*Zhz43t#WW@}IA_ z8{OyTdim%-Oh4VqufV}*n0hjUM0kyhpt;?)o28$+p7hvUyLjUeP^Q~3@HQTtp zUH`XT8@16sqNXt+9~Uwk4)$|%L}p`eRA#L!bpmb856}!Uskj5a4kk(w)83C;(swh~ z+L<1(+VtH#A&jX@*lrStoA#Q>7;O-I)obXLK1)=vKU$}nh(y{(`7nyBTt&E?rYgH@ zPPDM;u<>dkee;A-oVS~nKw#c{2ofU00j zXX^`nej$Vxe<9$JW`kxDL46LC!w{4$QQa6;_U;d6eR{H=e~IW(ZHU4uF>c<-bkWfr zqLtN0-4o|pN_pd#K@-f68q3_N=^cpcpM?2!bK8*JVVOn0ioOh~g+e7s6S4H_s#69M(F7<&LX9_qjn353#_I z)=_kQn^FN^8cVX>$VE}EcH{d5tU=?YD$_bU$owBZU%NkQgUWY>Ueo9YwDRkY?g#BS zqWxu%=~|6v3hij>UR~8r-gAWn*+J-Di({Z;P&J{CC!?_H7lo(>hXO zHQk!9!8GPka?e_fJNGNG0#5`nsJnNonbG_4UDtqeS>^T!iS=`ggpN3L5L1AP>IOUkl|;k!@Tp zD;nk-6Wy4atqy`Ix7!Pa$60use(G3k#IJ7bW$TU!GKHDikBrItL7|Qx3iWpd7vns* znE5Mek0=vu95JbgFj2n~OfcUYvM)0-J}6qRh#V(ScbYRORA2$*abnDM_9mXOn3oDn zLvM&yr(W=Kko!7gsylT}5-95PxJr!AL1L}`sA;Fh;%HlHN7=h&qF%~b_Vcw@&30Gr zC0Ne>P@(<+>de%EHiFI<3kGKji;Ah5k$IB#abd9ibR$w%P=v=tON;nqTZ zx?rN7VoYumvZ)`CY+}sN{&OV*v(1dUcJyC~(npcgZ;smToFKPd<0g#p$$FV!YrM_a z-Y)Fv?ZTqYSJcfoaV6_W-ISUrZ)Hb>x4K>MHntVcyg4}k+gF=y4IO-H5c7mR7tKke z_8Q}Q6X&WO!!NV0#?dPonsrsyT(+f1GY1D7IyBpSu*CL`XrxP_X@J9wUO^WcQWF9(u4fYGpD=lBD@57KulRv zgG1KQTtmTjA=Y%HH$Qu|&LM_fBeR$P+i+Vt=wiMu2S>5*aIPaiSkw9{kc{VD{&V5f zbQ_u6roBucZFeCSRjFgX-2=;w#{<=M4s@$yR*@E*+?x-nVmwt}D`ev-I~>mF8LgwX zmg>kmwed{Uhkmt}cP0cbsiV@1{=FB{mEvNVs^-|aOunt8hxDpC$K3bK@S#(0e2+xl z9TazM=Y1wrIMYufiwG%{Ekf<`ReTOUn3R&-8xX>=tc>W~SV1gscM!$<)w`NF!M)Us z^z9N09h8kGJr;v;ub^Djj^4kb^d2jWWX))I{iILA6)|Kd#ySGQ77}mib%lBZ-jMH6 zHF!2GN^_T_wE$l%Z5bA~uI(j|I5(-b8mjSiMshRW{T&Koz){>}m6+0C+eK+H&o~MYEYkeVuzg56LR_KIM z@h+d>#{m8XqW^6aem;XACEy<^Y>4%8jA4W^Eq%8z-*bc_%=^wl{bY;i#!E@dx+3uX zg}O(yx#CAF4;F3lY2l5mF)d6;^`S^(LKjiDH;|fBnD1=Sj0y_Ecc^8e84b12vGNtV zc5XNj8to#qP|i{q1*TjR=L)e05TRFEcyw5fg+9%%v!h-k5@5pKKHYKMoS#0UBGXZ4 z20v@B|(fyD6oD*g>pR6CKl43i}VUyb1~MBr4ZZc z#0IBHN4q6L$Cx0nR4U9vx*j+p$xo8}SWO~j`o9c218WD>PzA=r-m6DZQ5^?x#{W-* zM^C6w9>M`M*yypb4@gjr(!koe41R1O-<37nXH21=owjSrq>dJJj8VLoVI8%;4m$=R zY|@(bAIVtYlmR5>;LtN1i1*#lHvi{sq0icEpS2aA<*1~wp@p;&5vaDEX)DH!_V0xKN9knW&E;Z z(EDw+_uGo!YxBR`hAjrLFMhkt|5jV*L>ts~ye;%*o9)fE;y2p-uSZB5H$vnw#fKtw zFb3lRvmh#v;d6t?&iwrYEl1FWE(i{MYM@=eFRQH5ocPSr!&+eudfv{t5l%s8o5yf z6uHR`Kw%8(YJ;MGq9$WJpn}ksVcTg=E!0uMbdU~bH_ahOkktA`NE&?wNtFuBKoz15 z#tIb%lfwImo=VqQ`*GIC*J0Q_zQZcUM&fxo1=@yuBV-*-=eeatk}s{LHduhO?u^XB z+F&0ov+zi*npudwb~@wO_>Hzl?`=kZW4Wk+U;awotB#5#jmKgu9?sfQ)pB|juB525 zSD$R$yf!CcOH*ZzchK(BmI(Yq0)9x#!YdHgrbiGg5rk$rFR)OZ=f=`6`1}6;|Bst| zC9ZL=iCZRcuVgwX!qm?Z$R8Y<)EtNI|lDcCL}eKe@+hrR=FWaih25ztWkVj+9!xmKp4PGG#!a)0#45$U>(#qspQ$ zdv()2R*MBYmYzA*B04BcOD(jCCm;{mauIGDV%R#+TFBmv#ghS|rWAf1n|C5J zh@B}Ly{C`ZGw8)HE->V0GspGo!qW0j*YbDT1s4RZAVJX;nN7yT%%8ib(qaeBhz{e% z@y*a~GiEIG1`F0Mt~s`cI`5?!ICKQXTl$Ql+)kA$Bp zE%W5=%d7G#Di%&mOPXjT>f>JJdWm|aa3=d5_4?UYM%QZJxa71-Zwd?q@6?W-yg?Pt(iln*#9b8QKiqxf zb}|<_G|oG-o7b8#vA}{!0IU%8&?M?7{9ZDrLLb)or_j_$ZK|!!?!NtgOYt8hIc4o( z-+L5?97{OWspjZz{moZ=Z_{u7cWiW3Ombl?qIZ7FdgE1Se7E z=T8{lx%?fZ5edj7mZYX^V9O++){*h1U4H0WnCBjstsyMv?>6aEfzjXPqWEn&iBt?9 z$zo2bhO*NYf`zo9(a~O&)(m8Mq^_d#fE9!F@*`UtEXrrDVvGwuY5ZNgSq@lL96S)3 zYT10FxL2(=W7EY3tGcUjgS{CZQ2iK5X4+Pl$MR^SGrLQJ>W8inI|hXO>9{Tz9TRu^ChZ2$Vyo5CWn9ih6z`kg#cRow2Ef0-v)r2)mndBW zZ`j3>k{L7L-o$u#zeFhkPa5rAgZ9(|J-Xq^8GD)(SaaOYF6ygwNePDmu-HPB?8)7m=fQA0?7%=Z;ZjjerP_HVoR zcu*r1_1mrYeFgZDyO`L00&lx?`zyRt8+%-s(*z5Up2*J{dKvyG15Av7OYbg#v|TP- zVrQvZjEosD<6kBVc%2_}Zaj-tB|P<6mo5uDWrquX%$M+r+_R#Z{8)uQtK}g47{@hE z3tq~asE^0hH|+fQO5x+xRaD6iR7tLnroazuAQfdZ_mz^T}yXe(IAh z6Z5<1zcwGKfzu~_z2vfC-Ced;-_G6DN+NlF7m?KYCcxN2*@|nKL;WTFT(hXiMpr0C zlDioQDZSYeMrm4O&JArGg|=b5L^SBb8pEft8$QtneVzbkb~ ztR57yC}^`5!Bc(Sg*6_|UwO!d;PO;#5Jzstae$2s@+lR523pYa{nZh&?cImaG%=PT7dAdLD(JQkY&5{rOnhVvFNp|Whk#i=}Pibu}U@8_utk9I$>X z+KfGa2ng&Ga0aiOHR0#DbeDiZGl>|3!5E(i7(;dG!vu`>PsVr*7>mTryL&u{+&|)> z-tIbjlkbM+%F-_SAQQfv!H#c%`TZKByE7rn`>1 z%YR-_+FkEs!r#l_=S1QE&<=ho;N@-$O4If3Cj31N9_LpG`L*d$c_z7zc3a?`M@ze8 zn#SGmHv&(&oABs3LauP-xT(NfToL#WT@y!jW!c!QYgW4EU)}@BS>ls2&vl%VbfLMy zyq_qq^)x$7VQpzw@$gUR0HjRqW)z5wF&5(^nw`q(gD(13lQrmU(2Kc(-XW9T&7hYm z=#4VzjWp?vXh(0cYyR6LB628+)lAT|w5Msb3Ysd`4NALln#M3eQ>6l{>d+`n<(`O) z#x&5gUP12_lio1UOB3||XwstsqxT1<)LhcTWEU3r!ewBg21^LV z>>NrAP&UlzDQlEzS|NVL^pO{1-^UgGel?qy2Nz@Bk98g_9pRMPNSU4Ez*3imDl@4H z#b1h(G6nhGcsLl?aQ^stA|AZ9Cc zfgxf#Oj@4}hEVDKs`~FH8StUD1Uej#x-9bO9?2Y>hDi6j~mLj;8iOx`0 zPHb~*&H^Y23lr$IeB2rEBX1=&NlaG~UF=AW5jv#770xNw0$KUB2D$QuL>Mh`rV0OZ zEaNI@g~+Q{xiBvA*cGwqfhPS+3LYyJ0P=$^Xdu)SjCVqwc`p6TZeBL-b+LqIBBcD) zrJoYd)xW#QyxHT$F8zHI{2swnImbRhWBlVNlw#BR5=ENC@5lMNhSgEClKs3)QnPWg zMjHQolm0x(Hv+~@_W^m?olja1m;Ur_K6Dt5x=tlvMH-6Yz0oM|fi+}q(U%KSpXkWp zw2JW9gw!uPn)Onyb?M6>D6{-jbSOH_CWCFgYm0k`=NAif-)=b`zeL_*3IOS}91f`V z6M)Ju1x;Dd{8JPL=ETaf-JU|B8yYYtE7dFAX1C8u#sfCWcK(sK=#K@cP-NkNGGLWc zHB12IeLDGv%b=b|=;HfZv?$*6`*^F;|5AMd5-*WuY)iI+huZ?H(65rzg z@oeF4eixZ>u7IYOG~Yx(ewo(I>LPl_n$ll)*Cj8rq&^~5(p}Lps1+8?rdB0XrBTrt zDb@xP)z1qUKhS9-I#0EyGj(^JeVL{D{s@^`yEXNGqRJ@M22<2efzIVH7{0$f{%FV> zPwRaj|ChYw?cuxvPW|Y=;1)#SFyH9ZL^_YfpMkm~Z@1GbP5i;;DcST1eLp~^V8jc( z8z&1qC6DIkWm9-qnMG?>boW8pEC6Z28olps-iqf7bcM`lv>h*$^97XRpCN)pbv>Ld zQB~gI7dvQg7hoY(wjx7bbWHUv{>C^#&HU32s28jC-2M@#ezb#q`!qS$9!!J;Q|6CP z*v-#7`>KHM3Lx5}ThNqygu%xt~5zg zxARV?9wo-_5@X&DjxTpXE$8wZtgDi%>~LWfm03%-c00W!>5SLY8`BzSlf2RJiP67YQ3N3NPp|?u{zm1!cIBxsOz-@^u zVpCGzPWfPp{^YLFFQQ$HKe%Sp=LG@_rG%5#VOU*A`JhVw*RI-Dnz<=AVx_1e@_Hy1 zoMLk~NLATSaO#)UE#q87Ny;?v|mE*Pm|IXIfIGC+rooCTa=c&AW*(&)i*PT?C26Jjk8^puyP=E z1{t|4in3Lja01H@UUwZU#U zJX@BCwc$8qz&ZNvz;Z^SgawMEx>#Cx%A*<62CwZT2sm!uHPGvSH|)z`^29TF5}7>R zxIFiqxclyfQiqe+C)@Pv=v(xnUE?$wn2r9fwHKQ(JY}$TAmt0TmOy8&DX)pcCY7}X zCDxQZT}MyQ3j~(h*R?6VF`Ig6FhHG3Ga`7}VS%TuDkydtc{L%pt~Pa( zj$I=VTI<5&YD19uX(!0|*M+6gFN^WHrC{_{?q!Tu3xaf55O)Fx!^H`J;$GmD2$0s? z4oC?hR?IW)2~@0JW@e8HclAg?=zb=HLNdH++E^80)pik&n8b5Z1qZ4Bwk3MOX-9Of8Ld_{(A@>4ffy0@ zd=IJ*(ih`Opw4-qMvl+(6S;FQ1PWK4o1p)5C)2m_OF{Vyo8~f4Xf9klX|er_9HDY+ z&E41(VtwOe0ZwDU1Ze?BQ-3NbUpevqHvMnn_m2hTOUi=*=MrS+pz<@-oh88>u`Z#l zF7TXzX|LpAlJYqulb^0V{Kk5>U!NfeJYBH(jJ&e)z#B`qx^nZ~PfwA%aliC2bSr6Ye!1ATs|Vd}9K>4#k=A77sU}*I^Q5Zy$qC>ESnK zZ~e6P@bT0ye=FZwygyu)a2UcUlUDu{3N!`$x4`(2Buj-L@y-Jua(zv_J+{Zviozvr zpG<3oHr!7qGUCR60GgZKj0>~4bt?x8{8q^sxXZmJPTp9It@=gj25;Z@0c!ga!4QN} z-@}jc6Sfy%Q&vlHO?dFzlUDZT^1g#t?sNYp~%?Aj(g(eVHH}S}lEAL0RqhLy#Pm2)v&e|4bI6^1uTco$J4SyWy=6lRwva?G z`D=j5{HvqCZ{QZ8{t)KVDq7H{Y1LJvm+Trj7G42+J`^L> zNRIoWa_dFUF}Yvt*cilG1e@f{E-+7g)5@p{UlX74t3(xK>R`saaLKT=M{l9I1p7Us zz?Q&eRq{#JeS{@SgD@$tD|;XEshUP@)eQWL`^mkorxDa=w(g9G5?W`rL244 z$i;5>&NF2u$b;`O>!PzU2d!`3)}+7Kj=mJ3KmOO5j}ZMkl6?II{U?Zi+aUcg-tabwjE>Ni?-zRb@5B~&}ZfV)r}g-N;1)4B=&uaaHZaeE^^0;VJ$-{vsPPH zC$F|Yo!0H~K21w^#`&_zc1h*86I$Sr%poHxmRXi1kF+-dYfC}PO+Dfp;*VkFqVBPT zK~>AJyUzMtouzt|ZxG>-T^31>55= zW^z695rH{_DeKcLm8CYMQ7Cc&V(&{~MDCr;xg36?7TJO{qusWHXgArbk}ID1f6~Sj za|hA37(azE%YV*Hcu%5x8j4wTOq;43VNqa zIAg2{r|l!SiFX*b+^~LWJ0F)%nQ-dp0ceui@n zQTT$5_cNuuC3G66$1);W?wYr-N?GR zdPB#hU1XdGVr}TKEK3_!SCuuoZ0_ueCt8-K$j3T1$2ZtkJB<9gRgN`f)wg3da+t(D zeQVNvmZ^*GNWPD5Vx8Xcw3f6iYp28a5xsmcp(?A%0r8lhYr?7w@&l|(dvwILuAN5j z-igsb!_5M;00LjTc0v=hpoYUEvO#?-5x9|#9x>xI%z`U{M+u>wzW1` z?kw#wy52W|d~~C|TW#Z2 zouyiSmD9Z{fi7L(+@KlXBw|;YkO+WDb%SyS9WCjfwZVbmb0Chl#m0m*sm@j9b*D7| zc5D=OsdjZv{!wTDEM#hI$U-8f1nWUOVqg+G)3VbMI*aY$fh6gt)Mg}Wm3?g7+NKrp ziKV<|W!ba)+s4LM<)G!NJbqdYyQ%BdsCH>ANh9HX-OP+fe3MAKSg(69R<=1uB?b>C z-Z6D-LURX zAn2$FEIbv5teXs~iKnDT{=gFZz7(eSEMha(T8yPhlDE>HSR43f#qxzqcjX0xlPm4r z8f5AH?6saoXnA+`y8~>f_*OS z6V)DOq4@Lp3sixk-DNVpEC1TK@naexua{pt8b>Fvvoqw3TLW?&_)jUCGJeX;+$Sfc zl^u(P_aa`#H{lJA=?Q!4Sz2BqJ=qa1fvl^Rb{&#?aB0`;^v6-h!6a5CU4qFgreubv zi=%whGKfHk%B{%T=F>{0C*62re&?7Grmb(Pq4I5h>KdGaFxXc^RSWJ-M6IUNiiUc7 z*#C8S%wgX%tj<%njUF{Up+7zc;7Kn~Zs~r^`*L}{r}}S*lE{Y$bwqf9D%b93c{Wd8 zrdWwbe$#m5uHyeV-yK9YBukjZ%W?jf0Tbt&MbCs_Q-vP2DKx;y{0*!1WV3oVu?^32 zbbzHFVLy_;*`2I4(#&skZZDH*wlzf`pUkaAtkuim1%U^-?xEO4UCX!uaz)}SwhfNJ z)XY8UG@oSpf1dPT7I$1Pfa1xZjJc?-*tm*kdS_2>7J_LvhS_zq>@w@gwn=HX0Y@tg zu=dqr!x;&_Vy4ts7!s*8krfCBmClq04;5lZ zw^7_ZUdJLNYKv_}UUz=kx%S)TX6rG2=Zta)%Q%~+QU_SIw0kc-W*Z;>r_=b)Z12)# z5pyfve70Q0b`5ccHop-4ngBz<#U+qsJ;{PjOuSdnjwqki&M(^WGQ9jm<7(04e!48< zR!~M?*$YRJI_fHze(C04XQ$nupTT-2P2aU!O&PQwF4JBjJv0X9kAFaKw>H3f&;Sbi zwJf2{Z!aH}8dvw%?ErS7t?-F%Zi4SD36F`&9oO_v$XfYw z>EXn&3HPN>8PqKDm$fnZ)muTAW}NDu^Kt4aHbB_)^Y(l!j&pmy9`@|pL6nLyg5a>R z6FgW_uOt2Zg*nhaO$g}C$a}+C|RDc)YF%XJ0bv(a{VBKBZW%?4-mcUr1BH) zXI^F1SI=F>dAJhJP!smlCm$ks`Q92!T@5*yKIK5_gt*i`agohtwFE69kjCfF97zIj zzp6Z&k7XBXgw^@t$=ZCZKeM!Mx{HSi+AE*giq~;LwXd;vPwT_j2e`IP%Uo zK_AXUerl~@tRtH)@qOytLY6erZ9M5#Jm>~Sh(ZvHVXP>UMp#mRjFV&Ku1%JaXS}6} zQ_hbpx#^h>$2!#p=V|X|jj){UGp1bg+7tW64x9AEP;YRU-sRKeZv69kJLB%{W%|0vLJ}bjMtCxLN@6lEES()}(NXyA^&g#*BX8-vm`)*n0 z@U@U@DEBt*O>2m=7f~}Q^TTp7xtX-V$IWNP-@>w;J+lYO&4=1uVY!4o%q=yasdt9u zQueI;jQLEN7nW=JvjyfeV{TY(7;(Onq3wnyqgs z@%1fXvQ!FL^5~g2Hf2>(QdaHF?kW43l*tP!8@w5B+RrFfE^t!ebhi-ZMI9_p*- zC@YEb_lv&Soav+_0(&2d7wt2RS7ublcHP-fHMFP+7yQgesVFA)0F{D~Laa#~Z* z|EdoJz%V@1K6f_m9mc8MnqNE!`@nIj*IW`?-594X$a;T4%rKmKKa?q8QVeHt3g+;A z%-^3n^{*N^P4yG!@x8->d$H8oM~Jj4oxf5J;Qj;_aD`AH2^A{P=AgRY8TurwCxIaS zR6cT!-p-5KjrqE~m7WdB*N->i(^Dq8@d2@+?@_QM%Sf#dT#Ob$Q=tN5_o~V6Rj1s= z>6JqK=xb7e(d=BiqOMg=_D!O8MRvP==m_i3tL&`>p=Z(d`nQdO;oGDuzJY)Nj(vc_ z2<&ujT2R-TlVG=7k=8T0wYJq`jk6rt1|mfNQ)fwB2B?(`9pPUV?vKe`|DshZt6mTZ z6pgOarAc#F*Y=kteksY8M`?Xgy(%2~2YAm(nA7*P4Oa|bZcbn?kpI)e&H^t=$DHb1w+zO zCouEd8S9+IM=6(uWYN}(rwSGN(35p2P(vG<6LEs?#?27LhRfH;4PjEt@st+@l=gy2 zfC_yu&eGBF2+A=y0~C7~e%jk5UPi#lRrTv-EZsmb;zrk#79a`*6#lYUr$|!XD5wc- zRx5JF?;9;y4t#zrRof|Zq^?WqTueiA>}b<#6H@ChS0ewfpE2>bg#JQ~WW@LQ!N7V?k}>r3(`*#ebCg-fpq&59h=>`@~QxYA}qEO^` zGD?9`yg{H;0mZg1JentYsr63V!%|J}&7{P89iitTlqbc#!czP!$&~fMOXzR1n1kKc z=0WU+VFJ%c$kH}kP;A0K&fwo@4?p=zcy)Fg`YQH-b5fjrBna8s?R3>k_>}FYuYA*lpdgX z-M*iEi&o*(2fjo{6QBWD+jr;=dk_kqb* zXOUAsaD_aV(@gs`s!jWxiUKiLr#fW|J{%|N>hANPPK9@RfO_b-)V~H%* zy3MpvwvTa>+2YF{6-HRc?8_XooO<`*cZWK(j zdgE(@G+-DDos}^;*xs%5vJu_u#1g3->!;JU_R{=8E#iJ(TYZ_LSkebPm$~ljv+1xZ zvsez#(+vY^_A=LSPqs+$LozEK zFF#*l&&$k=MHZhu&;Nax?(8jV;CFY@mH}m^vJpdTZp(UWi~jDG{?IiugfUL)LCACF z7nc}akZizS@%w(znt%E`Xxz!xUDSmY;tB?&OPqIbUl({5t4`k1to&H_jq;MAK1 zkUE^x!kx^5mL>}@rN7gjmGG1WXP1rhZ701n#^hj`iW=|^hdprj=kwq5^-s!@U)r1S zQq$ulvwHTAIUkUuZ?dIR*&;W?@9;aZuoQU6w~h!LoZsY=uab^tWBHgZ`Du>cSu3_U zHt3|f;4w;K3h5){-B3JHF6I=>JI7c zM~;C#_#w4hj|-(Sawqw!F)|N`$Mp^&&cFcAe-7-8X5re@(w%&M^vfmK+SMc``ksw_ z+J|+oY3u=xCt%+w&|pj>GF?Q=CKb~2+@@;nJ)5o7>B?d3V33XR-=lmnFM*!0N3Xr- zo=?5j&Wk>^AZw%6D(y)akl$%2mabC&Zt+be)4~z-aXfadwD)XzIcY?EV0Y$-KJ*cP zJaRd4UV@;d|7i;{3Dh;t)LoVlU7O;(`##_CM2FFoE|10XU?8nAfGM6!Ucz>?B%`X5Rca2g5Pi z9PH>GBB|zbtZ~Cv5`zJR$blBfCZ6#t$5Vfe;u$&Z@eqwf@cLbC;;9z|zn`Lbs?r`$ z>l4M>7m?FAFZi90;u%@(@szA6-fLYV{Js_ZzKPRPg&Wif43bkEe8r;2FO}@YIh5ztd4X zHL*RO);WTwei6YlP6>XeqIibf9#4@Yc*a$6re4&Og5Ud5JhfwcJS{$gr;dx@8Se;w z??my8xb}ETTm;YfEP|(=5d4lu@l;EDJS`@Ir`}~Vnch zx$H3QQ++#vrydpjjzsa)OYQNrixE7dv_pj7LBa1}6wmm%J)ZJ&6z|Chp1NP~+ZV-C ze{7GZ{Sd)Zk3{f{y@KD~D4y|Mdpza42%hnEyeX&pis08A#Z$j-kEflB;*INQ;u*UH zzg1W(-{_|--6)c4xsY41kx zw4Wk)h9>yo-mZv!zSSO2c`J(Nu$XeHwSr$w6i`h{|#)c)oZ^Br551pe!s}SzuQahxOAdd?}BjQ+W``bRD!;Nr{ z3s%9f4pV$4jBBhyr|GI`>_zzh6AmFC5}(}T&b#-*p_5_TyJ6h1<$pUIdY662h!e4n zheL0LZEuE)PlWxiheL0g-wy4uXav zki|!I9(Wpea2VC^&>aFs2{4#)K}MU+L6nCa_%dKtcbr&+J*@o{Ruv;KU@X*12aCa! z85Dyx)Kk0Qb{Tf88MWqo{J}ldEaXz|cuv%D{Nwd{*O%~$z8j>^8b?wcl~oS0x2VNA zDTrW$f4O55vTON;eH$IMfhwPcv~@%u%l5m@@ohBYJ_noXusz5TaW|!96T#Bwn2-uC zsId6_BpfR6PE<$|M?%hk|9jaTINF>`mG)k>rCELB>6TuvJ##&5 zGgHz(Yp5-S6K9jkYKMNNL4^0!Sh>n#*WEM!zR{t7h*yIliu#D-_};TSSkjX9UHP5K3rS_o8o_aef0nsg09tGAdp)vcbf8s_43U;B0A!qyF=E zI3R`$0nGELK1QkNzokNIW2TT=ok_|bKuV^*i471s3vjR>Cc!?3q!<)Op~#!C7=k!= zHHF<2V~&^WX^{jUpW=)t9Bp!>7Ug9u(p=_1WwDeG3>*>Vp)X&dWM?+T@!FFP{b49M z0~^^S*FBD}W3ki_qz`S-->@Jk+G&yycoHc!@>wU_xA~*+Guo{jM!A)$aB%|}bL1Xw z-<=Jj|2qDw{}xegSv~er|9yW0>%WtE|DEzZiFxwU_~|6(lvp{gWY~lFGb^(s;4GPy zHGXmfKe|$xGT%GydkH6L1Y#;YnSp^T@fp2jJ?R|wfHU@f>oCjGE>{PZEkU{ztuPIH08gB; z4>ZRC1jPA~V(NH@jV|`oCA0qHqJn764qCq_In)A&JZ<9kpY@+N3Bkrj;gsDGIK$yc zO}zl=u*}F@a90vlmidpgOBfL3tD79Bt`0)KwCJY%y@mPR7m1hfyXu=FeZl@aze}q`S_1dGS|;_Q972QNUCjCu8yt9F z!FL*+H$?pIJsTj`NL{9nUyb-na%^Du${~S;Udw~E-tzS+w4SAn&xhYdK^dP9XFR07 z#cR)6UtlTji;q9cODqrEgiP;jsl;-h*ZV-*+m)6Fyq5c=_>=G^xVPMEm*7V9`_YgY z-aa;N2S%O)$7tbtN9Hob*>bT`2)0pTS$xxzL&kqz2dr^jFBV0HO39Gt;KpOUM;JS(RRsmkNh;nYpx zrqrt(2wOM_O(yldR|oZl@c9z+FYSG&F`WBOtc#7`#C?g z1<(62mS6G>*`yb3T870e8o9LI+_9MP#Am5Ip0GM}57b8>YEK3NuOf?;tPY44(7W+Y ziNU6McSpF6y1-!G1wOrKjkQ$9F2-6oo?VeG8^f}o zt4Q!bHl-TR@_^$~9`8TzUxacVC*>gEkg&2U>Nx)XIz92fY+Ow?ZQS^0#KyG?d6C#c z=?fb#_kBeKe-~RQKj!^+Y@vQ2i}4ccrfGHh=8eEzY-3^U0(Q%@G1rlL zvLlWEDN@Cn66@lMhgzig!;RTJX_I8Ag$!f=_)c}Q%nd`@ccSJ_lEY}d2rMtI30sXS z=SDm5k9n*EvlCm;e_@PRZsR^vdoPcl`^>8 zNW>6+NyQ@m@<|R{(O{wTJx5sKe``|eQ1r6R=(>uiumc-|MF4ab13wen3(a8 ztmo_Pl&VMbA7o?@v*Jrxy*B#xuJ0e4^-O)`Eklsbl+|OSd>dsr1tj||f3Oexhkcme ze#@}h0Q(+NcFMQ$B9@NKqT0z>e%^jdv3=OT?19Q_`jjN&Q;Ch^#(i2+BH2^C2Y{I24&+|o(Pl1Fn48KkI;s_(DT?DC=2#K&dd6>9?vnA zCj7&BWS!ANp^RJ+{iuz|-sR0?G@zM?kV*xjqHT&&R6fX~gHafx{dpA6wI|olB-ap) zN9s&+RA3SN`Y1W|-8?qSXY^V?@5=L_>?XZB2hG=WsopP`^r*n-)#mAYsgfk>9wyVi zg*ftvj|NHu&ZeSQY9LQ<5@5-ATm_c?8{%i&y)ZLxVdYFK(#)|N zKm@RE6o}#3ZrZmF08xBpeBCIA!G76YaN9U)EOT6)c+8WZ9t>H$o7Dlc-xk@_Srvj%tqRm~uPC-|6S%%?Hu$8|7ivAlpQ zHL;|C561jhYrsKAUr<^xf-rL|dUu`v0L>?_jJG!AiFvNlEix7vk448KwK=agu-rF- zdW9Kpy(Z$VM}IdKv3Tnq-sQAq)a8znd>D%|2%U|Md@#biOKWyECffpmA6MD8?7{)V zKQ8*h;?I|YD=fZ}`iknzii#gAODyisZ>#uMR^OcL!8tpcGJIp}%RAy7UQ{MqmscgO z2*fY1!cS{$iLK{%cvjvKPx0F~w0=d+@(3AxJ~(O4Nx9<+ujTPS)H4uEF}}69>2uHW z<+B2-lb+t40_=*4KB;pq`3i|Ycwl{|-{lSzJ7$y($=NQWQ%*woWcEf?EGWJ6Im6FS)kG3i|!`P#y}h=y24^v zaVQ4j%^L{mDyp(qyeKVSm5FLCU;g8}U!<;}8e2a5+~VIKemtIPfaM-Zdi-iCK7JMc zX5xrM31q6fPnr{7QSm9se?AN)?AW<)Mc{M@U%jvxz;Ww3ydgW_Te%av_LNg`peHeFG*Q`0L8Y;-nr!q;)kz9$guz%B;1cZ59SLb(KbB(;CDrIN+?Z zC0J3hJY~rHNi)xFSdk%}u1}h=ICj~Y+ zY7d9&t12oAN;h|IsbWaWGApM^eG593+B4so*m=lpOHzNj+M8Td68P?>hbvh+na|+Rb+j@x0iIFX*D6C!LTKrTsln@~7OBNF7bhvB-!i|n1V`fNXGRiU|j5Dr`8`pj2Rau0H=KGzh zx}5~j?|r`K{r*XA-+SuRsZ&*_&N)?ePQ$^*#rg52eWj9p-%Kx$%E6$xTPkwJ2iKha z?6=WHK}*i9hjMam2!HYiOAGu(u>ikr`h=*WyU#{2J<_%~O)zprWh_@PlsbWYCc>7($)r2T%Ezvr*UAF?`}hhBVU z|ER_OqF52q#nA7~(semIwwcR(l0Rq$&1}r)tScH7GOsG( zxv>spAhcu8oZ!S~_C^$;rDLq)ix%hXPWSgRmG1l9;!#m+z{YLyp$SkX7EuQtX)p1Y zfqand+~z0^mJW)YJ}AlDI#^m>>hB{hiWomC%0HRRj~H|Rdv@%E)fZ|0Oom7Qo`URngyHe#iLdNNSQX%7n2lNF9y zEg{r~TSVZ74=4?Tvv9v^F%RIn)??CO>LQoFr=Ylq+%f$8w~P6oTKRc;Z{5rra=WxF z#%#_vOQtyO_RE^3PvyZ(8MnlTWk zspvd)f@{=T*9>_CqK6Gi=(&sKiPguXYf*rGh}MlU=`BHI6(M)YL&8exi6xJ|>8a^j zq<~ZN4W;5Cwz#RZE)tOHP1o9Y@@FLv$f^V~4t9+IlRfF$c>$)6WNYjq)X0G3Nk)Z( z)3yH!AT>9Ex%msJ$%Ulp!5(YA_6^^iFp=FQ9her%~H3(hmn`=#Lj|?}Ys{ z4>2P^y}yk&M2|_=8i3qO{o+g4>ha9@%Xh5|&{ECq5CX7-7?KWr2@AD~b~_ zGCi4vXK z{wXbNhl91qTM_6^v(nIgTDk6{{*czy4kz75|D=`~Bl^WOG;Jj{4Z6=M`rldiF_|*v zZ)=%PO;8SbXFA^#fTZt`S?N@Qxk2TPyK+)abvZfd;; zalO{~&8wHjUI(FH>R;V=l)oh2VfB|J;P>{V$%J$el__!!oH}a93%8ZJ;YGu&Ih7jen$|gzAcE<-x5SBZ_zNZ(D2AJb|>;!*cj%k`KrNk^*sn(O2_KW z_8`6tnakm^p?c16sbaKKde@_GbVTX#7$bSjsGZr2v z>fUbvb$s2b*umE=dH2Q3{d!5%2E)#1YUsLdCDVSIa%Wq@q8+74(aBavPuHkt6JFY` zJ-#E}-MDx)WrSGlI^>!W%`N#4)5tIj?;q~$#a|yz(;i049E9xO45VZKP~|X6OPZ$a zVBqrmX=1q(enYi^!^nryw0k&={tjR&Xh{(;NDDe!ttE&2|=_Q?%e-yQhSRsOx6X2`!`9rEwFPV(1~G&H(ssqiNhu8kZ53iRg>n3#TLHtvzpk@gPJee zU3@-N-U}2gv{li0|Hn04!Xr|pcu%>rj1GdywZf~^vtUYlKx z?I&}i+ra%nS|0Kv9*8(vKZd1I{c{?k6wujuejH7HRR|e*ZJM@oI~zB8-}F6G%X`s| z^rUg-5pX((?TutKLlGhW2O+d)!#C%_nmOGbrm-)PfS7;P*!*#`NctIT`lEbE39ZDqc-85=-h0znz5SwwEY?0!dEE=r#t)4L%D4&Iztwbg zG2wem;M>;^_{ekK38$Rm3K{uOr=$Tr5_9hB$MXqJ25T#{<0{Jzr_ZI@8iUWq4LR62 zmD;KQJx%*75v-g{%M5Nv&s>a)&GhqcX<7@t*WXBE3AmNxX`radjy8s#dq2pCqA4Ki zRST)!#^>Hg)jTI?3HSj#iw$~4%sH@o=k$q8_sUIT%-NMObvsotj>9zW8xeZ$>w^Hp zOSQ>``a=60U_wyk_2~*R0Zl`G=USB~P*i77;iBg*Aw_GII-aMqzMnIz$-?lf&1u?t z)+vX1Thv2T1_YwaA{FsErn6%DeFh!iu>;j$6e`_OEZZ3YKPPAJKr`KyaYW^4!;P6SD3<;G%(gyVv*2RnqSDL2T0|WgfcjxwOQM;%wWsQ zE-F%6ZrBqT5lo=o@)(8ty!y%D8gIV0n<3fHd)KP;7o^2fh&ai$sQ0UlQ?y2uG?( z{8ry}p?+W&f`GEH3eFR@ZRf@f)K_e=mtr$boy2KObwC7LYbv)ke=p5~fuCu+9s zwc-#GstsriymH%#%58xy4EzHFyr3=q1`o(-Uc2qY+HL9Pg1y$J2r9FUm07jz#Hww9 zHLT1@Dg#i^5ii+eOr|Jl%wthEWh~f+RzN5rGxVN$)9ZII+1)a72|O^5d}Y>p$E=KpOPxtwNK^8 zsZSB`9(`KsHu|(%=RQ?s(WmN})Kc{6=b}$1u$ER*OJVXtN#c`p{zYe;wcP#-_~H$G z|LuY=m*IPcEV_!zcdb8G`M zZVZy27bA|1vb?EMqPagGeF!r&(i|UUrO}6tg&`P;7WQ0-ke4(P6LU?O#nKQAr6-7` zLrfNo#|AbYA7dSF-gd&WEs)5b`vp&!wgs+Zm5&#LAkk!MzSIyOA9vzX1I8R5m?lE# zWM#f@IB}sNU}j}TQW;b+zMw7L>S;dHaN7k_%{tFzG(=2Pk@0e1AJ;*`mJni ze%Wy1%Z40Fcx?W-6>!a;HJtdYA@Bt&lR|%KY-YEmOZJRU8$jRqk!?BVf*6w|#_92f zF5~py4VR5m{=SL@&%`NW* ztEIAPlGa2Di#jpQdC*!OF}c^$UZX7Cq{$YXr6|4s#v(bkc9!;s2BsY=pQJi)1`mPM`&-Lim)UfFwPi@e4G&o|I?I3@U%58_qWZ;tR(2M2I+_RaLQ(K7q z{X~BFjvvkz)NBPX+vviP0zWb?j*11%`nhz!>sO(Yn+sPrkn<||N`XIAatnkGvy+t3 zX%jt>C9Yx4R$GZHiwsQL5$(YSk?(LL>9wVcfyFAps)%Y_9>oh6MZagDe% zb6(IiuVe&nGf`bPT@01n^ss%8z1*(NZ-6b3=_VTFlc~oep@!SA67v?knA#M<%P6^N z58EexX)6K=OYoPG5OG99a&Mk;alRm-a3+y3-XMWl##u$K5i@(?Hd;x^2&#Vw)j!T& z+cwLtO#s_V2C?doq%v#8ieLh~`sY&puB`pfM&}^&ZFzJ-x!-lm8|BeUZ=fu1`p4<{ z=1|G6ki&p<2dk7ZiZPb?8sPWpLk-%%dqUn#J#o9}32uiJXKjV{Kr+&XKf{?r$aC?P zn#qtPlYdJ`wO+%($o7LDR-jVeN@X-DYHE@7I)rY{M=YB_KQ>|RrKX2UxXnkT$v=-r zKgsdv!OnQ>49{4OCp{x(tHqoqgi+MJnZa$j_J-_CI3>AWYQ?ux^X7lW1=Jl~hj3{U1pj2tzwUfV{r&>+uUnXZigv%?-ztWUWGeXQl(c(A{S}?x z)83}@E-UFb)9{@SJY_jR(8t^kD2tS&OpK{B7@T*7VdQd7Y&glX`Va;bZSrKzwfKGb z?;3=2!G0Qkck!98%%Pco#}@PoWH9Nn7u&i2CJ%8ojB~-^JsunG#^62-kCTpbqc?^^ z!Pl0VcZYN(6$%HuI|@B)z=J*m5Ag9Q_}?;LzaRDJxfe*bkdH@ZKAvZ&Uc91r8A+kx zX8Z{yN`a^7eJFU$(QS9A^nOX64pgrIr+Od9DdT_3eDz-7R7Zqysw@WeBb{&tqCwva z%gjX1-6+Zkqz58Uohpz`1sXYv&~VxmM%%Q`c%(2MWs<<7PZW4$dLU=k1R`h1<#-Ch zc{QM;{HFt#>hM%9_lKwQfLvLrd~I`Hz$7WF z!=St@zHlBw*8GvY1RC4#Be}dngn|gty9^dab3v znsIkM_J;fgNu%Gj6h!Q@loZJG<{&_55AEK1?0Yf~m3kWn5rkQ#F}jlo}3$ozX=^_awk9;;ZMzRBZr( z$W^I6JKSry0MulQ+RfTIA+-@MxIZ%Ys=OZGwezs`Ug7M^Og$NVr7^gNxO?ijIqr|V zkos9KfbeJ835HiNaHUtOs5=%9%zs4>)G9S5)kPh#D9W`M;)mY!OwFV>4+$rR8qK?E ztZ-teQJDX%>)^B?`0J=+d7b*Tc&-)oUz=KZtTyn^AO@K~fr2h(MY!A&&LrcM5|ulL zc)5aBrAL@n)h=k2>49ify9-+NZq!pmYx!dC+|?ty(yH6K(yB*vrB%0f&??h2ADfB= zLNf4tErvegT;fh7E=S^)B(6)+Wy&wxZU1Ep4Ba@n(PS>HtQ9&aZM|d`4+D*I>4jHn zX4x}?$7Vg&WRGirGMw#?d!CIzIW0Ag3>^7KUkQ}ZPq`BMBw2ldCem(0B_1ZLsjW}_ zJRa4<@u(L%2~Cdo2Jif?-? z>YDQBCHIkZ?A%3}rNp-QXgig`P9OWitt)&nwc%Vo{0A7iO_sRbFoeN<HS)Ip(L$IUx2NCZ}qNLF&$_ z^sNMQ2?g9w*&SZ)ke1!N%$x&U)K5s&`Y`xO93C>N(Usf@UhWECl&W3B;O|OpbY(rv za@{le)05;6-|4v{Rf`}Pr3f&?ISi9O*OC00zCE7k8<(nG+KLBxeCosYMprf@hGP$x z8P^E;Lu-&cCRIB_a3}yc^9IZu0jJvmR|`4C)~bAb){bq3mc)^K?mHPg));&RY=)e& z8FEUlgPb}hWY$qIUC0dm2%fpjlJUsorTRJ^SmR!&4uK;U5`b?J=zpdDAl5%5PCnZ^3we3)P@ zP-Wr8k2{8QIoxzaNVSZT%?r)wo8c~SAa3`(!PKq#Q6B?7Ws5u3#0+;FN)cVG?n50Z zBnT6RS^Qo+;LHF5qvc2_s8mA6^PwQ`^+Co?-ApnT_r53!5C5S49(`6jy?!xOw42() zy8(~9|92Vvzl%Dvi}>H+%cM8PQl)Rdtov17Vw&)s>)U*JHmU3rO12wIn7tCb~n3gVlT5HHpgi?^^ye%DY+l5x-o1O1t*$ z7L>ofYxy@(KADyG{&M*V?b^pwzE>&&?dQW4cw4VuS#U+^l^RC`zog_3nxtF*;UBpn z_fK0wNm8H>A)I3MCuWbnT7$-iV-M-qhqUcmkT_zikHT~!_K<`_X7KYSzlI>} ze7@vSjNNUW&YwKun-_c`Y@_QBV{~c}TU;~5b!`11@MG~QGoA4kHnDP#!H@Ai?FVsJ zQkmmBW$qZ8$}s_>-0sUgUfqRfg^ zc_xvg2ie`vvWwv&)+%`O{AIim{);!hPk5;gQx*qtcGPvWUB0g?Z{&Nyi%$NEdoXuj z;B%M9ke)`&*_OQW zn@YA%3kfj!E>^KnT7v=gsMRtBWPDb?E3or zp$fzqAocB^Y>2}rX_LgQ%3BQ_%JX3yvZn)wI>i^NmjW+$!Xa;Kw9XON;pyRc`&Q3UR#f9D3(E4&5%FPB2C?ZB%)C6Dn9JgG^a8!1}p})n?G0Fpd z>>PJKZDk-|MC`9V^hW&>J>3_$8OI+%}dGm7=L6bJ`*#Q6?TF1PH zFEg=@pOsa7B-;2@p@PIB>R(RG773FotWYL2?v<@hrw zE=Ieqj?y?tT93Lx*%6w(Zf3z(d(E=fNB#eil<`hgNW_!D-9@xg#FJUuC)Zpz-rj}< zdY6lKVx#h~snCw2cq5E^K>A=PoCrw3qP28720jA3QG1XNxHKFP2AQPeNq1DwRBQhQ z5-*H2@Z$7E9+bFC#DBE8_Nr~x7xl^gOYIeH{!8aJt9^dH&B`TGl&@^F za=Kd6M4Q!EpSDl5S&!*xv--*9ZI)j%+?D5XvYi^K&_hR?m2-%L9C)&$&B|E;sGlLg z&TU36uLhCJEA(nqexmxV7biXbL}hQb=CK2K&}scHb5V;m6g1V&XgnN+?1+nfNEDHD zk9AzPvbOf}8^FIkN8Fi{*4alVOfhm>;p}4|Ncvi^fYKd>4oB&Wd=&>NF&1XPxCrRa z(rBc*f{f?+sV1$DM=q_A-FNz7j39%O{5C_Xy@ z2WV)bJjQ698sB&%3a&wUp0A?DJ!Il{7n2jPEQ{<~vXNcuJs?Duu6JQrfIp#NQeY+V z40%-!M4-J)^vc)x91&BVWqI1j-=HFUGRu~APmfD0_yYJY0;vSMVNo9Nor*+O7;7Mp;CNOo$~T2kkk3le zLLk3Mb>%axBNB|eiH4A=ih)mnMs@a zGCKg>qkHQ zAN?&+@u@eD&cT4Re^i24@~<=A6hQ)C@@U_{Jx&u_{lr^lggsJT^J0wHF11rE9s<_y zVB(s=wPHl~BgCy<=UoGH+3^{6&{6%st9>Z2>HqdZRc3<2D^%7Ttg8$`ix)@K_%ZBp zzKZ2QrF83AwiMS2Pi`*$+va@vDO>FeAQLPhy2ksCO?{ZS($=1T19qvVT88yHhHNm9?f1^gttgvS=**K!5^Tpl?Kg9FZb`6LNpVE6x2mL=sXJ_o z`u+B|i(kt6AbSR$hGj7_9PsH*XXWN&ph@y?-f47Nsf7s^wA)6iDtNT>D zcV+F$ubxb6aIRFJvH5^URRKhE6#7BtW}zSa_KJ1Cknj^A>26dS$fq}93!5&0(l%UzYle&3vBxV;+u(;jvS)~r?KtSe8n4z1e57Z2Hv{4u8o7WO zAl|R?mL?4tTy=xy5GQMPcu$#I4v&JmNIo$AU{Agwzk=4n@NJV!`t+M>S5ow1R|_bC zUxk6m%Xo+>edc+Hiq|%wZ9;{jBmJz6+9vHgGSs^2r$MiwpI#Hz>6B-^VVzEY9-Ued za1pnRyD3Key@0pt-MmC<@0@B*&|+Ftw-X`g%<~-t@xG~-GFEN^G5$nxF$MSA&L`bM zkxBl$iO~G|Jno{v?~F@x2;g*>wDz#Nw86{NrOWRZM?$Q+28LYmQjd2XR_IZIXGyo) z#)}A!%$WpKN zIG$3=gw0S^kYzyG68FndjBAMVr;R zm$z9RB-*S@5KYnV>e6QYPHOYHjo~)yMFLQvhs)di&c-YHS?|{;_n#XLMVK8Mn;RHJ zOlM!n4N_`TJR?|T{S6jSk4CXi;F}hDmcy=S+&}}oEdb(Rm zxWAeJFlTVYXtESINkjmc9hknSN8oRar>|C@I9wfglAe#-PxYw(%|@-cI`9B-xA{=@ ziRNmb{pKEYmN_tw!9Te1L{oL(UiyCAoc@paz(efy%#9~rs17_zT43}28&CY9dZoP% zsYjbE%QC7H0<+nBt@?yk{U7^}4BZ#e7fpeCSlR6A6ML!yqdCe`mcV3#7^urQ0~r`a zU&=G85{`E})jg2INUN_tQQtw@7=yIB>cBAi{(1BT)A4IhT^G33z_r&5Js^-l9|LoV z9BqBI+eU1iNn^+55<&0O+^%B>Dh|@?@cvh1Z$k1$bW0{TGZBaocYK(cDPL2q%`%41 z&0g&(WB82lYBP-CbCdUEE6mIeaUy>UZIOwSfyVHmhkm#%ZitToG=2t9D>$Uw-xxpr zE+0Qw$ER2GbzHx2?s7Z-KEgqZ3a$5(1e|jI3b+ZK;chqZow)*z@!Y_7tAX#^E8ucF z;p=J>Dp6z;4yW(GU=zw)z5hF#urKv$*d|mrd;i~U!XaUsP_6Phr(WGA)Hivrun8rq z%diRc4PIx>&)bChI()v&Cj6GvgrH#)>TA3e%R6jBij}DF49Km>`AP;M!YLc}V0YqI zS9{Rw?P3q=SK5OYQ=nXYumL5*_TXDY0^YtuZv+3NUx7E-J9D6v-d$-AmU)Fe*g|k! z?7_pVB(n$4P+f-^);}|>?C;Opg8}bV?7_yWU$O_E@*4KwM^fRf8?^E&Ov-%RJ;gtv zIYfBNBB0zN=3mAATtWOI1v6p^=8U37IA?$gsLw$Et4j%+4oa6X6vm!@h@0-nw6OAH=`9dvS8{wM`r zQ3lWR8L6`X&q0+BQg|Kuzwtl>DgRDkwCkr*oQGp`A0ZlOOBr~+PthI{RVe3EY-H0? zb@F>Dc@Q2HhYfbg2&N({lVEw#N9COqvPp&7!faA`V03FaY|^P!#S^Oxo7Br~Qsn{f zRcz90m`zGJ6vbN`H?1I`5KkYr2MTCXv|5mJPY|Ymosx&ViNqRa&wbcF8`(4Y59NdQ zS%$52Uu<*B1|&XZe&veZHcHz|#4~n*z*}}m6XC6j?vQsx&Cekayh>Px&Eh= zSMrQ@>c=|cR{q0qck7H>%{!lQx)MD0lMK2&*4l~x5T{lGNkP>Qw*&usqxIYrwb zc#M9!+&=h?v7m>wl@6oTWuOtefc3{|nuulfU{} z@6Y(|8><* zLMdJJldJfvA0?gPB`V4E6Lf4~ACZB#8odqdrC)(P>>bYk(7P-3lS?T=KdB+OF8WC= zE6Mbe*;H38!&=F(vcEsCpM0Nk75$`o(=X{KXHpFPq+TlQzfN01E}XD_(u3silU#n9 z1A~bYLnHYt1dQST*w)Jq>~5|mD0ingaU62~ zChVEAJ=ysw+FXH3o}c3APdOIEM!fv5XkJ*J45ff;86T%qJVCYAMU_pG3TJF8p1z5x z1kWNi2lG-ZpMn?UrOtydp1G+PIJrLHATfD5rM6(KJy1+7(vGiV{$}OA-lP)TD#%bD zOlj?b{21aA(ihMO#Iy1_6awDVf5$Z0r&Vwl^pf7#WHH*T|1*V@0b-3hHpOY9=oO?{ zsHcr}j6Q+4qzl|aWS}I|1(Y|>Wq39TU4WI(=RA}1Qwm>L%iX->?Ba@mZ7?YUdRmnh zXYg-2)>Dx%UOAq^a_h3nMx{9YKN#(KzcU@`JVrTwxv1hm+Lcg7s z4#cIR*fS%aHO}=mMrr(4!e>k${)M%M4p$T zH3*tyt%E0eQYW4S2_Vc9_2ysTiIQ-2o+#a`v=u-@JW+?IXcc%Sp6FRA+ESzbtjl>K z|3~md?&+3T^F9n*9%y+&lNnuczSfB@E@E#d%6GM4#H!ssWSzf^4%41 zw|0W7y;JM~=OVU;C6|F&KBo$flvxNa-$ z=*68`bv+>P_KbFC-nOp$vV_rMuNKoHp7h`Hf-H-}JZz^uIRTm{)(Vu_g&kdVG}fXq zMU&RYV&C@@Tb6&awS45HoeJ9`c1ZMVshU=vIjqXQEMb|kuM7(99POl?+3sxG;l)nu z1-`?JXtk4e4lVZ&tBNEn&}V6DxSjNa@`9zR-95zFvu#&GD=y)~Km!wHWGW~&znszf z8PX5aK64oz7G-pmyT(P-W-ZL0WqDw*ZCtl|$K_j`}`c%bi4N1wg6^quSX4?UDV>zV1htl4Q+H zu?`z#4la*JqK{LwgZnR{l&^@c!#K4F9=^8*uf|z0CqNh0so$)b`=1SLoob3aN|rQB zWvE7_w3=vJ^(g{}oFk)5d5W)7r#A3Gt6Upir{pu9uIrTgM0lN2zV+~h<{OXm*%<9D zlxFLOJw^Mcz@&D^GPR=9GIhe(0R4|gJ7!cDX{=@3zMUxrgrJ8Az^o!6T>U)!^RuT_txIG6t*0OgO{9bT9{wCeB;~&MPTMuqxDGrwJn^pBQSYG{hb@GvW69Hz#8_)jy3G)>X2&yjZX_L zEZi}EsQ0cyynVU2B`7tvETaB7(K|P9gJB+p&k>CTTf*mvlur;1;b+bf$$#|#{Z;J2 zeU)0KG5$XAXz6$+8Lj@?qoopZJnN@Cm)nEugp5|3Jz|}shYlGnAM#*sZC?#eaUAlW z1)%yT0_GWR6>8|qk1N!oRBYzK( zPV;{+e|K}VzbJogLjKaxnynoE|0nsokNEX}B!3?xO1sM6CkeeFe*>oCnALo5-N>cv zDyDl@y8B#0<@&kn*VFmjU})d0I2Xe3@jG_Fkw8TwD0dxf6Z8UjL-smDE4k?zIPQBmN;@4&3N856AT`nlXU8 z9B&{ zcWVpUaLloSjL?y^Y%;ztjB{x>t!GhZl&u~udwrqF?lA$?FN^k_R1dvpw#Qq2^fxR1Kh6j2G(n z9>hn+O0^L0)k@EC3v1oNxFIK-7dDxBOt`TSH1u755@Lf8s88U5s?#6G1EYc-vgpl1 zJh<_oEToYtADel{M#KJWz9FdSK0Y2oJ0|58{C}=RuFbncWSo$Vti0AD7{b7YryCkQ5GB z9IxqD5I8_JHJYp}U$=5y@3I+K32_L>Hk;d4IO~$ON;|v`t?qITME#xTDA$4H|9Hs$ zCIv>n-xEFuqO7M|n1LYS7w16a7Jl|bDfVgYNl;s$~w7m-2snWFV;!GRjuPXyqb0PavlC&Ld(_$mW%KF%Fem?ig*&DkIoh@ zT{mJ7&&BsN&&4;xRWu{9Xhu?D>AI2`33Qd2bOHSlkM_HDVp)5{Bhr^(Pmh{46nY!2 zk8+VmdrSc74-!yE9zFfI0MhU9XpaaWbv7=>b;+ZrrwcG;oJUiP3LgL%3ziFKHa~l( zq#Ec7JlZq^-3-8qIP(HdPciW2d$cJGdzl@99%KES`J1ph=(H zQIXv0A=d}7R3G6%JooJvwZQ^Tnb-lRz8Z#8vY~P!p8EhJo_l|y#faw~f424Qa6ET@ zC`v6mD{8nAGm4rg-^gcwm%Mw*0O9XdZV+Jl5I(EbXqwf(S&31G`PRzv?qPak29jX} zz1fCP0!TjFCGXyZmD>5Wm(MeKv@y@r7sK;R@pa5IeH!LjRiKsXGVTMM=$Z8!SAs5)cTb5v>j>xFdphKQiU&fM zr+Pyy_P9F5>vwhJ-78CyO3hCp!QIkWyWf>m>R&{G(39{uGqxKIoQWtW`(3VyN$lqY z?>Zcoa>A5vW{ZPeu_RIzQ>EXP=(PTXiY9G%H`l%fNv_te z?a1S&quKXlvt0$3dboQD@u%qmdrC1)cY`Ig$^26yjIAg|2cEHJjy2aGdPxi z?_@>i{Ch07uU>UF@awf}=dN954LrJb-Hd@q?prz|0nck6URyfD6?k~9_6Xj`mx?&n zs_db|hD->_P1l9b8miqr+KjbK)GCP`Ao{`UaDMJ+y=4@|Wmh60I5?1;&;g_#ARx$k z%P5LbrdvJQU2D1MR|j-}$uAnXm_lOqXk$c${W^g3=fk)XfJ>G<+DL&*zn*~!!J&oW z5&@_Fm>f!q4}3(-Z63DvMAlkvkO%%mT2RK&wV@gDnKNAIS#|^xr-uf|P{?`p6F7tE z|HWi}eeA6>82-x%jX3wnV|C-Y0^Nk7GoEuRG}o2$F)BPCpX!*8XOqM0o}P&LxF+y1 zVK(OD$6`Kyn|$TEC%?-HlfOv@K{Kfs=HrWku<(2=Hsy}1D7?Lb8fG0I(N?&h9y5y* z9St~KxEB!?O=z9|!5JJZL|Bm?LvXrq;*g)TGi!2!ZGqc~ITmvw&PpL}08$+6%0Pjf z`nEtmQyyLMyAtZ}SREL};7q0=CUc^BKze!{MZk;0*(p!X^KCIG0bDon5($Cf^bq)j zS;?+}fuZyhK^ze=FKURr{-)I^5=dt-zophRA6s+c*qT63f)CtD@3muV*nzca)Guwx z8Gl`ao9X;$!NTr{lO$G>A>;e;PwGUE*0csMjBM+X3gYXDu0oT{&WmD717eXNcfg*u#u^}ek_>=K|&(_QUn|* zr8hJG#|xXZCs7BrQ`VE&!EZ*$>16FOVlv*VpCoI)7If$zQ-fQY9}1@;(JMuZ)mG6O znH~s<`WHNmEu+KPM1y*meo{sBFai(Ct9a;#2fYOktj+X5mFmrSAS7~gGRer@D=-Xj zFS8ZbH?cX6eI0Cs+V+>z;fB)DQdMcl+?~H(^c^M2a-}bJMFsx6f|xfNE?9?oaq@cL!S7Ia zY0(8lb=zN_4tvokU&_kkTaYqB%@?mr0{d3Dj4wM%Uvy^u&;yCH&cXx4&X|>(K~;Gl zBq}tcu_6Dk?95V2`l25fpGps&ib4j6oN@6jmgL~u@r`Ep8*fG-_hjHYnj~V~`2SMA zou-#4kJ?em%=>%y*sx~Jd`F)bA2%Z-SC3IrY>t#)k5Ac|CoSoqfLA{z6!?ahh78O| zU*TdpKq(>`f3+H2hDNjXNY;95pRYbz?`8+g|CC&xv4Ye+euRDEb%&Nm2a$LZf6EUY zDn|kdB$A;1ucrZ9J{NzoEW`Rx8ee(2kbgmve}ia1P+y|%=oLjm|A0peB}UKn2PMCs z$I(}gCu4DoIO+!q~z6TM;th+A4@@aRkIsxqyE}K9CKOH<2_OAo*{!# zk92|Aay1y`wUlfOSa*w+;n_$qrPlPtyQ45reD<05_jGi3EPSlId*7G$$Iq{P*HYKR z(UbU-DapmYE8(dmCY^x+@zcX7s^6>s37AzoP> zyXcbRnkEM>6Fma=H}H(fYz)r8Pwc3g-J}!;<`WgDUs|5{uWly14ZbnM;XvuYZ2CfA zunhup1lR*}Vo&b-Gv2=OZWM)q0^EHD+#>oloqqMp0>;J5qXr#tK6Lzz-BEz=cg-8` z#yb$Zi7y9&ZiAjPj2^0Je7K^Ra77NXVFI@r^?VJmJONg^?}MfGXzw+gA_slqYZmCf zgdZaau5{lDK~H(y$>4ktqw;0DV>ga;0PZAi^Aoxx zf^+QFe@`#H*Rc8qhRc2=72da8i(if5RUQEZ_+QFhwwIEf2kn{G>u|Vt!6#+}UvTVM z!J;Kh2{zf`-J~Hqskhd1H5aC8Ibtc`ndGUyG+DbA&kj7xOOvtDB9t&aSu?F>Te3_L zFM(JeaopTtq-8^@voEvxJke)CjuJ+h9!O@Z5AY==288l_QF*t~lA_+RNjtL&4ZySh zO|o1C~R(qYoa$IHk`8y*U~B z^knVbReTygk*vJ~ghYe>IDck@;rTdKg!jrqYEKIt=;J~_^%?D%CfcFiE!rX9jTYLD zVg+F(r;7GYG1^NHRF^uL=6JW|=tHv9aG&TRl_|R*N~#l$67;}IOaLx;Q~(GO4=e@w@ z79UGTcp+Mhh~VEU$i#{m!Or%gvLMa9XjuvV z&GV-$n-_>%HLvLUWu>JJpD%0dH@VcG{`g6-Zv6Q92sJn}(VRC>IzJ?0P|Pjp%$Y;z zdfv>DXF|cOz@cRrX}LXDY1ggt&yjMkS=ADZ938jltbeL?M3TS2eX~7uBw5~3=UAlK zSCw54&h-gAPi5x*v=X4&Pb+V>KW;y=Ti;fvU0Uf_^i_jnhrF$B-pF45k=CM-5hWvS z!~LxvwIkM{%Bnhp0;4UtXI5%wR*sHAMR!{L!C8(){*ms`tI0~RPWuvQLa(OlTk9~3 zP_B~7-E7bOd?mahIJ${F*m35B=w+RKa#Kh$syojVzPWPl>npiWZhq0>Mc4umCr@uo z*4|qwTnY$<7w>de2?U>s5Lt&&n9&G?zh(`h!t_3K2yfSXrFy z`H9}y&XV*jgF_5{F)TMcPQRIF$WlMw$mG&TQt|3??LqQCg>%Hy`Ee|V&N=pc#Del4 z{(M2K*>(enx`93nIopUxz1RjlY7I5V`g8L$6PZiHldRnZeo!NdaTKkN&_8ek$ zBwB4TR%uGK#X3MbS0m-rNT+K?o1}l#NG-_1RU@i8>ZG&sk`~L!)aNB5oOLJOoXlKQHd5-a3!j()(`yT^-R&vD?4Bm#oW7?Mn_yfrm zHSBdn86^|ZbOT;7@I>al2Rt7d1!frUyXF0}U23xTtKh7Dkh5I97Or4wkNht;HvA=t z_qdJDR*Bj-WpogVhD$6(Ue_1M^IomEN7r3}%OHq;j;x#>Qej8vmDg z(k}w#0zUR~_`+r7n4OTMfdGLx3rxdah~68aJ{eO`+ILhaUqbC=-?tOMLIzMn!0O{M zWiY7IM;&tX%<-&8+IM0j)sH&s=a-{eP$Bn-bp@rtaot(U0Qq9O&(3tAgonzp#6qzF znTkE!zK3HRJ@%T>M)mEO3Xj9w|C{Np6iNe3u*Evx{i(^eH$p!PB&`&O0Cfc>RD^}QidIu$qop@TxH#_H9S5Gtc}6;a(lTu`~zubO5My=#J;)hZWk_Iq8d7zcC5@nnHusV9KG;wwB~p9 z&rzP4o-_aJ*z{YUdH-eKM$5(jfUZE&!Ihb6+V#sc_&mgq3`Z$>O;i zVaGCGoYV88*fUT*{tm<)WqMb(8#~#UZ8U^fe@31$x=jBRJZJBobr)`2foDuT^o3f7 zkq9>}^|yL+GTR#@Fg4(wX*1&*pH@!5cq4BnNKWESSRcjP-?_KRB~j=-xv=GKZ=y)AYZCG}6}36>O<(CAaA^Hpmy?Zo*9;ppdRdYf;Y1HRWS z;{Ums4y7lY$NKdMBdH!&uOI^81Qrasn;6rJzG0n}Y~h%8#Xl|4&Myc4avQWJ{9i`n zS~=}@dhF%Bsv=5Xdn5OQ<&{-4j2i%R-5nV`pK(u)uteAj|7VFvToH9|;lGxnMn2Nz zN5M#k;NEd}6T9K}h8rG9QpNQ{f;PE`cb;144(oNQUfX0H6Ji%4)j4ixl5|aw-3p+x zaua#QY2HCzv#Ij5o3;V^k#$Y<-+Z3GSH_a&$+j|~c(UA`>J0|}3V6M80bBo<5O0{m z4$Xwg#DKOu)Upr@ntmHw(B$t(*3fz;|3v5LVu+n=J9psoyF&Pn&Xw zE_F7T;JnHVn&bz+g7O+Hhgh_jLM6$W{+<25*$EMwtj_*w*ui&TCs5p?+|5fIJwR@j zwcj568~$x(usk~x3i!(j)TTFUOU-?chLBNYXXc7#wi~2;DwQWVXGOxl*`w4yzp*5_ z-yXgYo~YGIm$NycPIPMl>J;Mn1h@7(JkzQrPjIuNh+&_RVviDEh8vSD3lB86^qqoXh5HVpkTT5d$?p@w|8LGbqm;_qX`U(yyBccB-UOu6?h(WcSZ zD@~$RzO=Y^sb&7eo#w!IW!j|WrO<#rHz8}q?gnLcZK-8x%c~2KJgg;gz$yE*9!Kky z;aiSsq+I0_ZKW)ub!L(@tdCiB!a_nn39aU0J9$5_Mr4d!0!Vf^6zhX|=dshdZ2fdg(u63A|&Uzh{D5VA(>{Pe8*QsuH;GC<3x+~58I2(F2CQEZ*DRl ztGEw;y7uk9E5kn|eHlQ{stt zgT>fnW367wjiz=?w&Kqet#Ah;R_z9B;%HIht5$6Ib7Ne^sd!85UNf?7J1m+0`M|Hf z)1GN|)&8b_&XVI1NPE#jwu|DsF5|T&@I4iclpGQG4$3C8cCp<7MQ_*6EfeD>!|k~C z!+*!OU|AyGV_6U%dI@@aVXm@0W|CPh%00ox?vEQp`(s4=ds4f;eU{HT(XQh6p4Hx4 zMor_1yNb9t-t4}|zULqeD*wp&jtIZSRW#B?E0fs0P~L0TjvMq1cDF{Nv$Z43xJayY zJ9l3y8aW?|Iy3+OLXl7%*PgnTwP3HMqXFGT1G+;9`A51){RMC2x?1hPGE8A^*Xju* zia?=1fhH=;2h7^{KSui^MEk7NzLzg+U&FK77HZ#R>rKB->&>!`^+s|#V{y!$O>{XO z>&>1(3=M>%8m`_@zb*SNp?q1<;f2XoZS^vT*)?iDzv|T6?J#Q<%Um;(U88mizB{q# zFrN-zCl`t}M`;_J;4E{QrS}{8hl_)mp~RM)eA{ik?xa!k(FV@VKhS|4(c$L@bB_l8 zlf^H;`7IWozf*(ZUGBR0$Y%$W0AS1zrwEu`5MLT!8|pg}>yF-k$4Yy}m&eKNx}^5F zrOB*5TD#Kj>&E8sO0%<(j0oEnN4FhS5sq&3e)+m}-KAmITl<#hwY59?;16&XOMyGc zX#+C~K0T-=WHHJuTkf$3M$`M9c5kwykIz~e7vs)At8ZHuIevA759y^Xv_-Vcg8Bl| z@M1^I@Ql%O9hS`_`^k>%+lHDP9yMkMcBGvLEn3#H^jG5pFH%>`D*kX}bV1%M>!p%; z%yLs=c2s2?8xCT7?x=mqVVyj;?~u_MzQ|!4pZ7)f|E4s-GI6p*#!=J`M`Rh%JaLdz zoVaZI_IUk5U8vZ)H$u5kx2w6MJE~^44RHgfzZk!_dv){|33APrs_4%X z*1UVDsr&J3_Fnr=g5F;DHV)~%yIZ-wuDtN=gymnB=T=3(`}Vuld0!D9bESG|S*ck% zHknwB3AMZi++MRLc4o4<^tBI5{Zd~SR4c$$oJ5|Mac0kuVH<3q)UtyXwu(62ykpEL zqfdq>IE&!DEvc6tD|_;Z%p!|4JY(WHoAz1x!x426j*80O=GOjFMX!=plOtl1v#9Ta zy^;E*?Kj&e)tJj}keVWnN2)VwKWvTO>v%m{{$cw)_Sd4FZ9U+JzQ1;**#S{im9eyX zO2t=uE$X}N&Z+hf*F~?{xOf-OM^au zA-j~7Fs#O2A@`l>i0E5wd$0ZAZoK^K^6&ai$ivzk>L#sAFjv-OIyam5T9%pQH`~ii zxD|_fYBu)$cvpAaPl6M0ndysYd1~$F(d8!JwT>PbnYi=1_PO$!BP|YT*w_C(_-bgZ z)c235(`Sbg3d`r4?Y;=qhH>k#IhL0co0b1;f6DB$KY)f0m1f&#$NhQ-B8}F~j7wM- zDS3A;t-ij;{Nd)udoDEJ_ENV}m+7_xW?LeX29}rEB=38BBjw}m58JiNk9X3D2NA{WI@B=bl>NA3c>~ zI=Vbkj(;&`yxP{@*W-wB*y9_X@!4Tjy5j&7hYcyo?ZK0$^?bWK8xPrK_*Q_20@5QL zJ;mK#?AP>hbdRrk2Im3ZAHKXHSoO@Y*9Q&x)u$sJOJjVWCZ^RUI(p`H0|7&~-|3rq z|F@%yS}{BPC2UTA*Is(Wq{FUpmkd?x*w=NCUSf4M7QFJC+)>R;=n9zz!4DL(U6lcSFm zlOtu-LmJQvKeM+3IA3LMX^zdr$Os~;$>@yXg-Ub#Q}$ss0}|SnCfgblA~2-%CQ`lf z?NvQ*dpR4sV$Iw8A_r8&;O9U1FfrOQ*lqUy0AlLfzdmvx1Ky^8#lu&HL0fL~*_{h7 z;ntM$r|o55V+rRszu`VmgYXoiuIS<4;1_CgHjwBr>H z6Wll%g`s=Oc02;Zw#qinUh#58Hg?Tk-hQB%OrV`+?|X7h`!P?Cjn%OsmuVdh@_y@z zBh}6ARdbKqD`saL0XjJ0j}>IRzO?L8dzE!(Y~?}6fnto={kYeZca%}K=H>Wx#irLy z%2(}G(XW|~RF|E*lCLi;y_~O$J_lbHX9XBvqXb{O^u>;)SfQv`1G=Mh-v!LQ=Ae!b4o4=X@~ezbj0f%^m&FS8?(mKzD1K#+CoiY-c8dsW87FC+Rc z7&hz+ILXO>r@qxb@&6(0%LAhc;y8D?)fPFvy zAT|AT*VWZmRUfB*Pt8xls$XY>U5s3tcqg(L6y4Qs7r`B^lz_iwHPQOA5|!w=C}Pi=R>xs0{UUC!dVT(>iQM}CpZ zKh`0iTQwvlb9tt_8Cs|F`oKcCDM!{^GBvPpWd0@VlJI%yICY6Ve{NMLSH}}Ik#uXt zDlnG1>GzuTQMJ*d%Tq73=<@UnEe82JCFbs&&}L48I|Ea>#P^&SG{28-bd9|9)aoai zVH)x$av=Ew2|q-f#YG7NXpb0js-B9bP88gPgy)| zO*NiKz_rOs=Wcv_jbI0(`<7HqYgx5;+KT4xboU?(Pa>L{*38|uGma<$cZct*!kNov z;7d|CTcb|;A>z_J|A{zp@2q*dgY^|L(*M}%C!Ce*qn&Q4D#D(j*M<)%`=PU|;P27x zMVk}J4}2v0f-804j}5C-3M%evN;vgXWlgjq;6ek!O0rYW#gAM6r1!e16!a!3&%|FV zpRp4TA;I;RsDqHFE;{U5M)LuTPsz7u-}Y3(LwUC+y<3{y?7^#(sN>z&&X@dP=cI0l zXl*pBSwQU_Kz*INHsa;w(NWoGnY>x{@0G9)hoe4{hKY4z_zzk+uW`EF$CGm3+nk6O zp0+2ATyc6$Tl)Rb%V^T{`_vl$^@qH>A{}bCww4>CqmoAQ-$vyWZ*7lrAm0&&v1#s# zWJm5Vvz8@gtuDQRyy3@_u+b!avrE3J^8Y+4f9Vx4)6%H;qH!X*BnDyraVC0h% zqlP2@dyTmGc^tS{ReXa3Kx7Sex5N}YypBpKU!Ml?=H}5e z))J5lrTlyQE#wHX{uRZ|R7k{>oYf}sHKD~ z$uvoqXX17U?L!-5(yVKZUx?>q>fG6Me5i_6jdYplW#M@wpFz-r)(>ODu>^S;&?ukd zWto-m^U+Qd+z&czP*~in_-neK==IFhy{#0FdW~~urr?#vuedr>#XFUAjnqe)PH zz9LgxU)e3iAkNLi4jym4H?}2-pTruCXfm%>k(FU+GXfMD4=GJYN7Q3T4c9xu-AHjF zyHY#ZR%fC@@s=tYWlkUietgl%7X6A$5wiKcT*Hdro|z&I=|o!Q5La3gN_XstVM?aj z%n(4#SQmlK2F!SkAINHNKCt$N|8`W3Kb3<$Op35LFygf}pWE0N2~ZeYXQJ0=P;Sgh ztd&gu3r#+&l}(@(Fu1Tq_UwH}KRkdpmDKyJEi>UrLUf7~px$Rq0YLAw;xFE3Z2{Kg z*C%L9RsKEo2I{3`ab*1PRSkQkyy?Bh{-TSiZXQ4B+w*{ayY$@$^xLHgNaq=u<_#ac zO7>)$XHwR=CMbtNM0S)tuGxd63=izfq9)3C`)|))+qRjfp zoBA!9!8**(_n}!120!xGkXU8%S#6PTOOt%^Gn0@191?%E@wG<2ZB6p=Pi=fZhQw1g zz6*#q+|p+FpJMZWGE@=lUK-i{;OYfp$pfV&-HjQfWQutxOU8+c5{m$nak3Vf=%zJn zjms4GKR}5SGcjwRr+}0gF4*s2debCJ<6>{Ze$|(wA%legLT!BmfXt446B3gRuhI!# zG0n7@WvPZ)c{tRmXkF5l+BRObl{9?wLKq9Su^9A+Lh7v^eki0asgVam>P=OCFr*AZ z9tf>z16uq*NV`wAU|JsTrrO4L>KRBpt$Hkqm6^f!rD2y7pxFHnv5VaaSWcpGpbxCv zAH_th0B=biqIbt|>0rT;Xr8NFbrBa+#|qDFa+s0h0{x{gVOaEjwUY=@SnNGVhWw&S zi6`jzGRR*@x)?$IqqegoG&hy@X-KrC@A;8M$YPxc4fK=3)wi27g_r8V8kVWgdft>N zI#L23Y7Y!N(IB#Rg=k=)a@NBwi`o-TOgSlYA=RQm`C(|-?~C%9Juve1WRZkCxs>6X zkg9vCO6y1{)^E$NL&ORxh!Pu=V>n;MS>XHQELdNLFbmW?F!cRjDJ5N>DYnIV z;9s1@gY`r!7dCx3hGsxnEi0rTCv5!?+iBm?In}ub^0H^S84Re>*jQ>BPzo%^$(C zQ>J)C@z*s|9J;?-%Ajh>ai+r{*pjOF8=yOV)g}vJ>VdBqo4ch@jF#B7-abnZIoAln zUoe8mH2~5pchHzaMda!bn&%DogVzQcw-lOHS~RvQ&|j(H8UocJcqDYX154ZjTz`mDkk}`x=|5)};{>EvqG_vpiU2fx z6D^>CCXG=o@86sR?G{se9!!85qxica(Hja@w$VYg=Op6qUqGeOmWNa&4~D;#WcX7{ zkz=yUK&HCpiLzNwhr}g|rd_hAD2T6FBa>Q?U>ibMIvShZ5K_%1osg^#VZybcwp@3q z)&-fuLv_YlX9}lo2TCt5qACVcTZD0E(f4Aze}0Svr4#~k0a%X$PPR2#GxYLFhNurF zWQTwgGNB&Io{%X%Ua0yJ;+<8W#XBEqcxMk7-uWV!i0ge+A{DR}k`cYK0F0W1iV&=c z=1b~x*p@gPs>I$6I^Rxmv+_^@dIsdma*;hyUb(=guz)Dw>Fv`|Z1#Y?!1?Ac8xEo)lP) z%#kT)#PWrvE*}qx4S=(VkHO?{(#tgU{wa;AfIRiC8*2niz~ z9e_10r=MDPOsG0Z*HoUS?{?>ai?YBba}r+$W(R}MLucl*MT15?BVh*L&*D?->=Chl0M zFRloO#29>;gfFr@X6N*ieHjw>kZD<8gbZS{t>!P>JGa;WdJ z2#gZ~4#2!iYK=x3QD>t=MeT{x9CbOEKSX_J<9MZ+`x((>q-d5DFKUo~vK(CaJ z-JE0|uKhZc+S?_rGJ?qalpvk7And-7$TouT8M=jNHZU@a-XsSGiNd52#J>~NKduMh!6vaoYh-DQTJ=+vVBfEvhGklzl zRmCKFOqd=_l7*xv+|$x>oohe6BdpsR>lzxBjCXVmGhGOaSXiM+^bHOB*8-HL`~q`$A~gDR?nDevL`~~dR4zq zg)j|{_h;GhcA01!AwNtqDRi>EZEpZ<+qc?L1?NXLP~Ef*>{roX2bJR! zYZFQv(c5Zh6;;+hUTJUBYntz$Q-%;5>W9@TBz_7TqwPd=sFA9-w0UMooW`fYBu>ao zZwU7TA#s6{=fRL@NdS8gg1KKLT@_O1ei--*&0@GBBoZl)Tol?^M7fN93Xo@#S`%Sx z#`D_mhi#T*#(DH2cgOU?6OCS^695t91SmEWVphNa>Za%j<@meb_OvK3-G!qg_nskRBTL)SfI8OOS^i{CAbw|1I(2>h)~=+&r&+w;bB+7MX5RXZ zX#p7k+aP~M8ubM77lx7afijFZ7)Eil0Y}0x>$U6qzf8@0RUf8d8^KS^%w7l!|FIEi z#N2R?djqcgz;TCPVz}5zQ^H_iCzwl3f68zwBS!GM7>f*`w%g;4N_X0LcNpD4%r9}0-#El2LKE%z$3i&+Pwj<@#4%jRtN7#D_^4tit*}Rj}GD{H@UU@>~!Sc`*7cP_S-C-?3=Z%S3EMNVz!O zl-v@QMc?IKCWhE~e_~?!e0BF!IzI9CFmLQnrEF|?NZb&ng12I+P6@+^1|{5r{#@A^ zcL66Av_64Us?;Y;&AP4KjF>!$|N1B0*x~B1OS^Ct1G~tcPR>)aIaT^2yYxq<^oOhx zH!_(m%7{TEtLxrGxfosqC=V4_e>lBJA}&G!|LnG6p3{DbOk2bD*a7^nZ3!x zDwA1$!j!LsGVsf(q5(*B_+Xhp7_?z6%3BxM@Jf;=2kI11IJ z%!mGrB)h*h9K2#UkS{Z_#Awobj}-)Hc`^3lprG}kV&z@7%YWH{m5zFHx&x15>zU&P z7b9P0eT=B}Wt@HaA69o9avQ4bJwuhPGgPe?nRvz~&~QEiPaX$(*QZgnY*j*SWf%*R z^}s3*GPN!p3~AXOCLRPXf@Q$yjeA34Aqoj(uO z6p9)ExhTmAP?W0y6cVLsW;-h6hfItIQTom|p_V79TPR3jR)V|0OAnYyfwEoXVZ&!x8Hi(i*fi8XZ^xg#}h`7|}x zWZhhenEVShBwPv?Yh%`*S%JEsg1$ZldL$?(K*{$cfI^%+z$Mn|><{&@if#4;WkF|X z&MPSFk0C9c;!uYCqm9OwNAZn>vL0a=ijbiJr*&|B8{!1CW>)2wB9Ed^KrV6g5GzP< zP)?#t99c^=&O#TqvZ!k{&>Q2c!%=|eTE2`H{0k=E3H!wxysF;~^=`T2RV02RJSH$P!{fN&kWAszS=N_6Xz9Rmb#^?URlx2T`$gTml>vH zq0I~d#Ef+(*lZl1yTg27cNqR}r)qRlH8wPk&y6ylZ?iEHpfHYP@Hm|lpBrKFS-08* zZUu((#pkZQ-;U1>LlaT)IRaFCZYThX&*3lPb2o!E+3kCKUc^*aC+#J*D?$BFR*ybrs)=N5#a9kR>+3D_GvdIk0$jj*6m96T^$O zyHlAY}mX7c@Hh1m{t|? z@|YvO&K)f;4WU&Wqb;(nrRJ<9}N5Q}N?Ug!rJ$F!{D?xry<_Eift%OS?B zRSb)HJwr%i6w?}SSdcyAETEcVVKts(W`ig#A7kQfrH&_==ojaK^*D_jp5nq6z5rH#(8F$ah@&o z_dQjORk6k~Eg3wEXSUaE45B#*Qg_P;AQr4pixZAIu%6odTcf|FFOpye+#N%ME)AYG(&5G{ThtLwD>O?R{Ho^ z!~Zj;W&IS4#k2~r1pkgMGs7^T(ON$kz8C@N4R%Ni048ME9!>2TF|Coa&ll5T8BDx3 z-`K`P)t;%#;Ay6^?w5&uH3n57- zQ_V(In3E<_v6vPgjc#E+h{|FnD(1)HLRK``G^QnAK~*S?9VAJq!~p=g#4iD4W%8?_ zGNdLkt=?ou_=uW{GxS@~#I)FNK{c<_bH&@3C?jStn2YCT!)LEzTC(fKv6z;e4ihpl zEey?AOH%e*nYbm+yZrGi-q{O=cloK|oqY-uiN&<|zsZQAv%sj9k$)0w6w~6nZHYe) z!n+cSX~|u|0$Kw?cm%JEc0RHxd_)w^iD@BT^YJViTy#XMQM{)1`#k@Aiq~9;N-Tp^ z{OcebIl@0*`w0&RMGt(LgfCK((o`MNPu7p&69B6KjR_tcJ6>}zc%FF8GPmvHkqzLL z5O4s-Pi4K0G@{Pl4h~yGoSJxzKDO?0h8xIx);L~ceGj)?(|FBbM)8^?BZ%Cq1UXTr zy`Ou7;t#Xj<)7)=H)|OT&rwCYcN00}zt1Cwe8^4lnhWPpyyoQ=;s{WxvZyR*?UOR? zLuDTa#X+0euEx}44<-(&5bMY;IL|vNylttCk)cDO8OjvG>X~qsup&g^7Skp zvyp3vKcfi1n!(jUTAC}#KMj(bfIy7pjqraGM3tT!vthe~^^IaSWIEP}7P|6S4QLt1 zKCh1H#fsSW6bZKb|HN$A`#}*l)hI7vO=C9lYmzw@vyttYm_>~9i;=OmY0QRE`>o*T2V z>PS!L#BAiF!A3C~_9!tUZq%*9S`!?0$83~}$7~Kn5>&)y!>i@Gj(BHuV@l?SsHpB1 zmMAP&X)JstRUELGc+JwY;x*W>8ncH7V>oyvfp)y+RnlENUQdaq0yif>u{o9`(ETz%Efo(^ zye4od`mK8Ex3+98hYQifY^FyGx}Z<1U;UwSE0Vfpb_?YtB$dd=388pqp2ErJp&_V_ z>RmYcbkb+oRIlxe%Cg6h-?p#2sI2L(04r{+LdsB2Uc+3CASu?_$vc9mSn$}oU-_18 z#H5ZHjYqvI#zp~2F3CGe_qb*8_aAPfmZCfahYIu>i&^+P4 z_t9ii?ZPO)%>X*%u>~Cb@{euWlk>AZ_B0>!S&(QT; zc3xIs@>)08a~wn6>Sxb#n#70tB7ZIgpl$i{Z3KA$$jIdN04P4x$XSYgUbxlQE+emv z>6ii3_1%Z?;2JEr+$zpcQNao&SaiL$UM*4C#3d+A8QncF5x3T!T@wpuDVgP+SHb z6;ip*!J;g{CJrY%1;q&bRMp%mK5kf*7;op^g~GLqflL|xzL}HB>k}A?Dv39;im&)A2=u^ zb}tHIw>th&9L{BAknMu!#^Lx^-xiz|hhv#>_IW5+cXCdQs@2|5wSF>G*-rs++{i62 zI3Iz}zXhX+!#Os)45KZB@i-js3jO5jYO*qd;&b4lD&zMUyD$c1nf8*?|_L5h?0581k^G{)Iy`$(QZht ze2MI0Q)NsVT-G6jOCAJ}h0>gWbV73=fH<5ThQq-WqWD!HFKq^z)!A{lUgQEb=I~_z z%{4G1p75W*S#db_MIaW3 zeIC}o@r{IH{|@}GI2_-NJc|Cu07%jNjy4dhH~IoS6rZ3vfa_a=?)Xs%P_=77$0vb0^%YOtgY0z=HI!E@L>B3EhNc=V0U-ET8IM58J&aIwmT&tzB-Q(k$ zMW#>R78qiBd-j|fTw8w;)mqKo@GaWNsWar!WhPhzr!slB?}XE4cR1;m>+|8E7vCctF! z);|McBVfh$X2Svh<*;3u^3tGKGdu1-d?Rp{|8Oe0Ek)otEi-%0aLoS(fJn%{0#FkE zmDHgxLn3_)4tLi2Q01Q`eYDs5paj0$a3i0wF%qCKE+dSX`!=Y93YhgGG_GQ8Upa=I zEX8F*pff&s(98H!T-0u7F|HjNt&Xy>`T(vS5;JDw-l1NITjZh%?-Paovi$0V_SM4%9b}4=19V#t`BLTB}`9#TN({UqVt6t;Mzi7Hh<^DzIYgnn2m_ z<5S#Si$fmV^SdT6KBYL64yadR!ERar6NXCC>06~}Q^xP9SYKrDastwcz(U|{90P^k zVu4|t%6f}t-%7uEj&P?Lm~XG>U*Vjw^jGvDFtUnHUVL{q$0c9n7e}7ZY!f?W3(&1m z?9`eMfMTbN0K`tMvH)VItPC8oJC5se09EYt5OHkNYd^b2-E+q01VD@57SF5hIr}V@ z7xA^y((}gGRs}>NbYDoKo(#m|Yt;~6rA-fr6SH8(CcgG?K*!g}3gx!}adZ~x^1HyW zZ>JAQ*_f;*!BmcI3}CF)_xbW~&_7T<6fk|GMGZjVpA3MI@yV*Qp)}s9dC`8*wBv8T z1mf|xiGg7s&&vCJ7RBH8AWtsQS`>)K-xda9!7r;K5R1Qk6%Zc~3)aDacw?4ovx-zX z+H8~f+Z8R(iobPk9*@6$7w7|HRt1X#6o1=jSdjDLEU`a;56ACAY7@kUbT{JeP#_+E8)eigZv#L|;J8b^OHsX(K{?Z9C*ZdJ|Z4HP*#a}}}++1qM z-g!MCmSbYIBj=$wo&#_?|c-10Xc_b;u zB}W0>+e%vC*PGtxx&SuG>NIwpo-dJd__Z2V`st(L{~eFJCU9;%j_w~flcE=Wl8nhK@;WCuUeRI*MtC zE$Mh%=|%B)+$NZm9glmK)I-^y4G1gFyX<`y?~D$5D1~|q@61C3i+#q7cO;{_R2voL zL)4Kw&WNd~XsQF26%g~O(uwJ=0Wl9Sv1WA%h$6sB z=+2~$`o`{}FKvBX0B$KiBY==tZkvC10PdoF=7rUkfpgB3?bqH9qQF}iG_tut!w4V- zt!BC{vSy^>`l+ymb9_bc39X$f`cS9T)F;F)4~T3doxEQe3hm9t*c|f-$!wcqLO|r& zdD8--XKBnQWc5ZDZqJEl2gK#d-shSQX;wh=PziG|J}Q5%m1UThr~O8?r~S%63W|!$Mk`+A-}#nwIm?ERtaOFFH^~v7-r-VBQhgE8RFM| zvCS4G0W(8Y6N>T2j~WRj@{+B{Lt0P#5NX*=$CENU+#S9lZfn*7QgaWjW`*Y~LsRZI zH2Hp`?=SsiYjnwK1Fc(B?*ABK>_2|2zp;2j7OY!fgDs|_VmWTZtvvDNNbPgATcdP>jQ~6VVG11hgRS?MQf8XSk znCtSOpIk?-*cNVU84RQhrTD+VDiyaH0FYfU0wz()+W-nF{F)1Mma+Beit3k*lenWE{4O=;iEh@yw zs1@U{15jw%H4_~{p^z|r=vR|wqRc+@yI-u0B$#&kJ;c7(^oU1)4AauQnW1ptIrt^q)3IRS)LuJ*f<9f%jjmcv>nd==Hfb=s86 zsDy4+wo?<)xtxr@}Cj&iW)k(7nDiq2L2uEB3bz8XL-Lu)#mi@9Kmc!vBn${&xvI21!@UME9S9RShc7X@-6kDIkg00|e-! ze8!)z{qg;Ba1`_vq^ffu z_W)LUe;$TR_Lxg(x5n+*dfhKZBNJ5@PlO$lU^40#chT+2+!+v8&WO36pHp@W{Y^5a zd8@Hwwh-JY6cqr7h722(Z~_V`rQAQQ)6{VP8MB*}&nj=sH2>Ts0)}b1%rCArOtWQ; zm}VQ}O!F80BF8YzekFYYzx5L(5}}{{qQwkyu9VTQC(r8m*Z{ln%`!|g0*GmAreT^9 zKuq)d{I<`WS;`Jbo7N++gSg9F9;2gH=BPcj1x0t7!Nmz6T-H69|XUs-(C z*%f}TKX1srWb%#9t`ziegzwQ_F2c0zs zd>h@+Usj-=cy-}gN}PFVI2aO!G7#hz*a1EfEc~n zhS$o|*5d99l(j}Q)7zZXgkfH+3?JYZgQ2}Lo3abIu$y+O~|bFv17}uFO;Itd=k$Jp;9ro>qm&-PS0jl@MLc@0DoX&^{fHUx8g# zAcWqPW$k)`6#hWr&~tQd?s<0CL83^u(k8o+8WUP$SG)(r@!%Aq&> ze%vqCmIA;a0S{qp+Gp*N7~|BD4u*c|dCFov?!PNVOfR*W;FrbQ1rEf<+66lp+md9p zG3|m8Knz%|0T74s!dT67fVxGs0-)--mEY~6VW*6W^zm2ra)>*P?q!GyiczKpLy%gz zbrsSZ;$pMjSPK}j zeML-e={djL*2giqnG=Gj{vZJW$;}8*HRFiMEu%gyA&dGNwqouGv98f#Ssl;;G~Fs@ z%}mkFQ1x%!fW_DnKkY+FWzW_r8{;XTZpt_hY7zP0d=2~ma5#=p(=q$JNXB1$;pvmq zP}>#%cWR!Ao0ldy!jF@)sh4w|GbhjyF&)fP?Mk89?j~z%d_nZj|+O(&prFLnXZ*w!vA?nFq zV<^dQ_KQ{1NS0xK%qwWfGX2qazFn|8+Uw5 zuwJL&u-)Fa!rp+Kwp_xQqORhQ`>3wOozwIPv(J~8IoU>pZg)?TyA>faY~FCZIM*5|j1lzaw9y*gKltt?KK_%tb14T3jESj2f(ep!}kN`QQkh zr0ye*K;=v6f|o2HwEpa}g^{oMM0e0t$$9?NlmyYtuDuU@mCc|V>XOyx>-^ZxY?^g5 zsSp3h>-XJw{Q|@+m+Z*u;un`t-Lh_&UxBD?NAewAx0qYS3`s7C$->u}x|J^)p*R6l zx7Od$gd(I1+@hkVCq4gY_^SgB=`5{3`I(Q_x-@g){i8G=F&*U$2_>i@OCjp+pB($f zR~b6eGIW^b8~N|%V(U~R@jv6X%>EgZm2Zy8DlhemFQ*bwPg7ah8|TW(rp9Eo{sxMq zEJgqsfc00ygIqzDK(hAR^ona6b!Itqy?quMqnbOjo#>d5L0ztcS&^!2UhazY_9Cxt zveq)6SZt)=wQ(sd;fqH} zx&2}#!7y*i@M$XB##q8c#inr3rv+h9j{Tio-> zE2tvSDWr{EyQ=a(*i3B}1m$WF()DX#5`^Ec(@7RNYMm1G>*@IDq?bFjj+aHXR9tBtR(usxUbXK(4FNUAA#=fYXQ zTPB{h@8sg*dUtH&iM8B^jVBvv?u4x;bPXA3Z6upRM~qD?R1_!r#79$1JudQP ze*idFhv2M*J`u&wbjn}h+vr!`V>f>Bmwoo09c#Z&yfH=XCm?jZ+_y{LGYp4k780y0 z&{wN3B|aT*83PdsB_kl0vJ?ZLysX$aTf5f>muAxFV$JjEeKLd9J{eqHrchaT`;;-6 zGlK1ghI6zb4K6@!Xli#EYK4XxCxEEQJ8f!r`k;<*TQU>a2K*cin1ErL0LO&d4-!t8 z_S=Nv^~#^v4A;C7O*Kj2xyP~}m{Rn}l)U*-O{Lt5sZIeQbT@+WI0u>Fb(C^BdRtsOj(mf9xALN=2R7~R_~m}!((@a*GnVT4jrM8CgUw_8PnJ=G z)fMFz-7y>=F#XW;n>(7!Z<@L6Lb8)j{Bo~p%P;$Ae)9o-Ds#^>^Bc@nvd9>OFFwDS zbI7GORmU5|wek7|NMR}}v%)97x|izwIbR<&zp*d8yhhh8UKooFbn-+@7M@}1R(gz3 zoB+jE$8+X4)|tw`G@9NFLRV;FNPN>DjpjFp4>g(JRAW50^}stAI`U#ehh6L&xx2Y| z$Y?|Mh}$yj5tEg7kI5<@_KDRbD}M~KihJ+1akFmc%E}JJWVKp@qG}fekO5d18XjaT z8oHXyZ{RS~^P2%aQfnU{OoQe(WEi%e>xX38XcC*>r1-=zBLxq}rLY3J{pSLY^y_&K z!945}Gf57K0b+&{XdwjBfr7!5em#vf+OdtXSxizD9QJKgxwI@YA9)J(-4kUn$EBjn zy?xC5CY|OtiLq+uA2rwW8;8+@74_;~o)Mr}`U3!IMxFscR>04AbNtyiKHpx6uUr^< zezWLIY<_d-%=zax^=I__rn5c2`PB<8)7(Vg8)*IFjn8i?pZmjMhOeK!AV%4$)~;!g zu_=u86L=~FPmBQK()!VGDSzjX|+hteN_-lV0Uhr=t9XhE?hBHB4g4?;5ev zfP3`lUMVc(u`0%BrVI>=Z2dPj-}$zYIPl;%neTiPr^yUVH2D!jv+;cAYw!O(-;t2A z$$aOKQG|66fU=YW0RHEEr*gZR?_i(!#pCrFJwRSfjB)yXVvc4IsR}}`y>)(SGCU%cOZYg&dWc=i%?Vn|Msd$y7kIY?1>+ySfRNc|HO+q=;?7(vGDGzx@}Mw zR$)K&5U20JI33M!;^_oCm>~wr<5d9b3N$zwHm#cY#@@At+o*fH5wV_c`=Y@4?tm|a?(MekblnOs_u zZS?+yS7f7j7V_|YUU3!RTq5_mb}|yodi%ua$&{Gu!)%lGp%O~el9_K}?MiiMJ%X`Q zec4Q=MJaCrAk>TimFEqwxXEVs6Nsel@G;CDG0gIRcxThQ7O%INs^7JEh9-(4&ys+oMaRQ*lp^7Z&mb3kXEjXkgEAetmOH%5AG~^4%YN>SH})D> zvHG6d*7VEWnAz*P^x5Nj^{!a+ROf8BbIFL#zK5#uT3Yq((*_jf6eSlIC56LOv)xjF zGT%pglXEg1S7F~tXGi#L5=q==Oir%wis^t=MF5@#m@Jq->lIS~7Xr4H!{iF<&2DW~ zn>WMe=o4RH>Q2rFKu9fW><8DEsAS40=b4P00Lm!oc@@gY=Blyy5mIezET(-W zb&g@P#;V@h&m4B}`9h+x+FLXL%%x+cho9DC-ug!I=i}gw@bcNd`7i)QVg_iXQ`&R@ zZUC~>OYb*R=^8Jsf9NY)N{H0f4u#;b!6c{q$SynBC7h^CoOqSopyFJkk|o|PPqf*x zx{ddlEmPNS@vRxRe{GxIYjd1VzcXRW!Ztmsw(PHJv;UbkU8=5srrh0j^%|!?;=rSb z?sls?U;5w+3GT!m{?@RZ{wK+N7{=iV;Va2@@~y~&EA?kQOa0&rPI&fu_`N7vNtYRG zF=e4?@1)j3uM6!#YwJ#GM(wDs8?XThbEN_t>{0V3IB@j71bk3!_PG0|B$$b+$^h|6UNOZSLbirNY zIJDgH@p4D~a)(&%h%6_D26`PSJ8J8CCFVN@)g7K7M0! zGZ)_y?UOP#C0{&!&md)T+$;WUBPj8T<$#047vRSMUk;d$L8H68zAji>*IpOu&>Uxz z^hb98w~oZU?)KmxQs8Cq{Jj2J3^vW{N_RM_F6s~Ee0XCAXXQs|frL=b`*ve8-Y~D- ziDhGZ6ri+H??w!A!P=c<{&E`3jOgjzR@8MRA0o_Z-C#}rwqd`rz+RQ)k0KQOa&3o%#pF>|s;v;ian@@VFJ8xxuwycoOToXu(NX=#^o|u$#FEkbO28 zgRC3vF^IkDwZ|aY)%)Ti6W`)@VhoxQ-a-`37=&r8@4|a_R(B@hSm(0_qCj{QNvT^< zCUM)B%3>gTlKx^KDu}%)Qq+aluOFp!?;e6bIYnJ@>xA+nM-uf??6I2=Zgmey8&SW$ zaL3ypZl?a1WPao(YzauKs$XBSV|)6;wUK0<&L6%>VW?j}ddF7x5cflRmA3SzHQBhl z$C0+z(Q@zg)u*oCa4LK$&BL<;PCGc! z(c`ENzl>bd40Nr_X-yn^aigb~VtbQF4?VH4Ljbsh7IyS|`2d=K6$0eha8DHKY#5rw z2NNmr3Ge(A@!rH(Ahx@Am%j7p3%n&83;D}~&2S9B;XnzAZN!b7Xe=v6n|EzWTOJ%} z)3!RtX|pP?*g&+cB}DtB7;T(#nv= zo2!W+fz02OTOXDu8}hO49kJ1eeFbX&k?co&r&SGvPb-&DUhWl(Cz`Rj+`BP*NJ@Nf zdOifP<013BqMQU_3t+Q4W-|KG* z{r5m0E-nEY6*;F^N2R)35Cb4qoH^#&ed`$bQFcs#lIL3hN}i(tlsrc>P>1TGc)cCr zn+)t2K>vbhNkMFb+86Y+o*EPL60&nj+}$8nRpN(r<+T{HYpA=eD9RwNhu@U`@Sr+3 z`WMxphutKSQTIfV|B)dQ0V_7nWQgW~v#7}L8G3lhxQ^^Q9ZA;djQFnDJG>$~ff5V7 zwQUl*sW=%i&eBll=FXnmyy6$i!;$&;1aeGkv46?fRX2$o(rBoPhZpUJ{kbjvUI0W> zeg=T};RFzqat{D1#r9bom;(cQd#TQ-@0R4qfV4vP5JBB4^1249&Md$^3ZCC%3p~EhBBaD=zMgZGNg0D zqhsB&r&ml;_H(7TTZ*^~QopF(^&e;KieNuKZH?3KR%vC(2hnHfEc`W8DdCf^0wCg? z0LAGmc5T0s;fGr2x_O*UCZ1l_O2Ix0{T@jzDc2}kP=BIfYeR-FZ-TphzB0UgUw2r9 zUv1!rk3Bq{#yXo1xz6yx2~bLS(eS|tAoW^*r&dUYXMoS3wJBwdQ!Y70+*wDR0RD5{9LMUfWNNmn08L5vRnK&K;*TZP?6+t zG~eq;=sL6YW&NF^-2^m_{w4aL3fr84hnOgsQeT&j;TttZ+eLJPjF>)j`!_%pyUrms ze1#HQx3IqvV_srRx0|AtW56`>&vvD)#h=om?$er&DJ}9(J2D<2dx(f?5s3RUv%R#r|T|vo_Ficx27c zy7HPx3Y8t&XKb1mUu)FYnn1^j$d+2Pu&NE%K?+OQeXZ*%+9ri2k-vVtyX8QuKH{w{ z!t39(9v`j?N~bP}O_1vc@7*(SJDNBZZs?7N(#7`iHFcxt=h_VM3gGd8QB7hiU^RnY zlL6i|%$s4zqqz&+FTq!%^P5fHbc4YvG+)?5um>t@Edf9X839DaTAZ;ayMJ1*JH`gx zz1m%!N8jG;-H`04>N%=!|66(m77x2R&z*RC(ST_=d0xcChSiKuUs_w&dWRLRR#UI% z#^={{s!CkeZgF*0pjS`yD_36*8%yhnP{fX{*msirO#6xw3QSwC4N(ps>*x?Oll}*3 zWplGZHTcS(&2YCvU1CbFrz7`MudAB?CiU$HgkPrIT2{8emT10_NR}CiIDlAlnn&jH zR58k()#Z|}BwRYarhW$eCu~jz43XXT4cU~s`%3vx_E0%x=V3?Dv|@eNI<{RJKQ2uq zx#OsB^mx35EC!G7oTS~vk7T%=qHw&w#OE*Z`%41;lAymtU!Tk#&LDTRd3BI~pRDKC z(=x;`xV=gD4`tLx7Lni3%>g_0p(}n9q(^!HAZHXApLKz4WCyO*=B98!_3)XLmu2N$XZJ zxL=D<3`?c{in%5}yXsxz(wBb{`dJY%nTY=eh}du^K_0e`OaA*cP9^b&RlUtYe(0LNP=V0*3>FTh2P_7z5^RV@(z?x_TVWm-nh$m zBF{_*^}luF8u!2a|LA}FXXHEYOMNOSZ)1$`pqZ_cz|EWeK>gTH!~G8N5}_N;T&6!C zt?_-46z|WI?f$$kHDDD~!Q83+CE=~)gVB9G%O^d(M0&#ZQl$gD?Xhg!x+J+XV}8nu z1K~Ev?>nnL(m_vu!Y@%-@#k@aYUC*N6X+zUkXSkn>jb$y1ADVmcO>KoJf(eSIg)m~ z+b^-Nv*G(_-d{_gzt)ZvT;w7ufSomDEFDDm)TcE|P0^T&8xpG2uY zxpy485%ed#?KfxpW8WrGm7K82KNU57x4~be7Nu`|r1RS#yVT$J0-=N$lqoL&oXS1sRoaNBIg% zhPG8|z(orV!grs+$GRJQozZomX5Hw6WWFLf(|!w8X6ZaKMD?lLW^!h`Q21u56HSNd zHYuIdCVP>r+CxzJo81n5MWV|&?U3c#?GPiJ-43}o-VWu>XoqFtCkUfyhw@w94rRx4 z+F{o?L+NB+sZ0+M+cMVpi7eMyN)LqJk1;Kii0OY2 z(@=T~qjcL(l;=oHbh=+e<3fz0Pln>N+A-|e(RzPd74B6+x3#kdye<}`rK}9}XV~3_ z66RVZH`X2cS|xsUhFCEceTm-VW?h_dJZV?Nflg?rpgCot>1V9d9$l5EJ;2+G0=&4| zqMa`sA+B{_#DCLy3d#W-#>U> z+->}F(x>#jmoORoX7j%BjZ^xjUf>dFf`9Lck2v|vabt%-cxp`R{5Y|Fr_uV~75m0J zM}5)=oBwyt;Xl%t|EoufLFe-CjPXAu&i`Rg++HqH{I6}y|CDchy<+xquo3GN;0lEE zW1P#ci1TiS^ZAWAM=Yy4A>4j+I!*1zHz&6%fa0RA;Vdd%E!c&wf?jLk?*OU)1TT{m_&*T#+qf>N&H-~8A}W@%o85?_%OYKpACo4Vw+bi%N1MGvE5W& zW#=Dz%zAMb07Yn*C;Q90bBY~B`|gHR`N~_Q{MHRS6T+uxB^UQA3 z2VZfzx;uo&u)tqaEL>_V>Q#>j;tLtDd<8XT93(}gT;siIn;|Yy6>w1#ow0*)o$=O9 zbjCKEM`w)3+Klz2VVMy?wP`&8Kr!)nTta|&(GStD@i60Y@JjslM}@0>>XFTfE=SRc zl8Qh-MCTFCaExBQWNdig=+Vjx!*)B`S5FeEg>xneYRsvt4UY z+;*+sJ)(~Cu&C!8+m-LeZI_+$h}RXt-#v|O*V;k#pyprb^5N=_l-PZf_4Ik_!5SQ^ z2R6^tgEiNvpAn#%*Bk&!p4lGw`QxrJIm?qDJ5yJ=^$(jCpXq7hr|0*1ls~_WR5U}w zN}JO?dVJ#3X_%Y-Cv@vJ4pwT|u%-c^+-#bsAps*5V$*bYm9c$mios0*L0k)qZ7jIn z{Ojm&a}Lj%Y!@eh%*vVsfaH?*03f;eJ)UAM7mi!d?}^3^D8vOPKLr<0&=CghA;I<% zx_}mxwnhsYqONzM1v|ly9s{hgHa!A}jKu*IHoT8@MWs5ch#RviKZq9Wip3=O7*j?T zQ&!@D09CjM0P)C*w65)ATx_%lF$(3kTx(Unem)*wix&JN+OW!AJFatXPINo3O1rS^ zhox)XZI_M-ccpQ(TZ);-tr)&BXI&yc6J5FkmEonz=$6uerMW%N^On^3uUYI&y~7c{ zh}?@ck=?jW@-{S~ZEI^7{e1<$N8;~FxO5o-bnm1!0s!uvWcXV@!@3n!ZRH#RQsqbD zr=p-%K-3hSItTUx{^zcy`vGZxiTwPCFFK}kk{{3ZW&4hfS(B|^U1JlW2eTdU_5@PY z1XSiz6H7MR7mtodhLy2*{n$89Y2=m0`vu1$VcXnA*j-q@##>QDZa7(jwB2)O;4MH} zcFHjxH?~3^s#)m>A0f%z&dfBYe{Yh%q>sPkTDP;NT-AefeYl z*8cv@#qKdESkl*D($8OVg9&`x?V&w(S#9mx6NBm{Q!Hm(_{Y?YP|Ad4vHdBnCc z8n*64L3$uCOE0iCCv`(?h;s4kJWF?pH%vZuyQd-1A*#nHUl5z>fz>%2+kJ?Kn4JXtv&@vu#Au+miro1k^KO|XZj6YWQ=ZR34o z%l*lEmUbA#ycmnyERApLO9{s)`{?dL?tE)#V3V&%Yoz=y& zM%fYmX4CJ^9yPG@W=CMC1MdPJywZRkrt)yK0f&*$+Z>8k;$3k>2oFUIj?kV2>^*ig zpg%euE%=Te8TWO$3$xf>v}vakma)m<0mP1JS2gus9zfG@OTWinuh!IeV1A@Ew|piI zK9NiA5(CBnMbq_aZ;$cQS*txU|A5C6^V7*8o|@_o;U&bl?WcRk_y;aMYv~aT2Z%Af z9!#S?xfK<|QuR+t?k0Y^3TJaV&k%9kHa@w=?~rdqbytGBhaC7;US1L!pYikT=I)fA z`{Pc`jweFPQbTLHxl_hgo#^EBuDu0Ic1MlVfz|ICC;XF+nmjk~;3hCOYTN^n>{d!f}8*A4LFA9+jW)lsK z%yM{&eIcB3C@#9DxY|qCn4B<2HCcC0WdeoAk2PH7EcRVf8#z%Cc{A;eCDp}6ml0QJ z4UrRWtkH^#dJ-R}I~MyctBt%_Ty#ZoWDmmsqt#h*G=TyaMp|Un^UL2l=2v@(Cv5qz z^Z|9x+Q^>bqTV%;UyFTL(Crw-MSX}sCV1;zLErL=Ru-36mlqfHMLPd)#~NRsipZ}^ zM9q%&#lF6!zI-HGhoUPGn+ZRy6h3jY+RC~&T3qKv)VrZIaX9637o4S$J$ik0qGL|v z&EC}odr{+{trD&8J3>g1qU_&w)GEQ91vHS$;~k;T;`Oa*F%m8|muSrPq)to_3yP7o zW_@cqVoAJo^fVMX9LSzlC1w{-T!S>sTSne-Mq@zg44ukmcz$1wM8Y}M;FP7FV|VDX zlS~rkEhFb9>9h$3-&Bvw=@7gaa|)>U*pe9PVw2(Cc$vEmwaHWlcUKe_e2hYk%8W7@ z?unNfp_AkUU1nG@rYB9x++;G0i!n~z`cfEpKo$8@V^eA4treFnODz5gH zu7_=JPMoVMCxO~UTGiZ*6_Jfgs)rYKn@r;}bC_hREcOA6xf`+-7p2#%zqL5BF|BH% zP;+?eOh?#r4lwkbNFiPRZb$qenh5b$PEIKHrNhK(>t>K0Ux5tPsg5;uGfMH!M-llp z`8yrS-hEfpL?UP;Xoto6euQ5;7Eow*29f_4%n-a`U~r%fV1HC`Q5M923`u%Y`Csst zSsRI<8Kk|Tng%r)`6H6Elyqn`#p_EZZmg(wYjb8lbac6)4M$GoS9L~KZqbaFnAo&@ zt0P!a&49ht5lwhvH8y1{WXgc$W+X<`O%rT$$J%N)wP>_f;&(%|qR#t5QEgE(T$WU` zox-EC*XL@6jevFmE})>6GdrznW46L&vJR45>IS-rFRy(bo!(v47yLic-aam> zD*pqY2N-df5>SU>W@usXDw>vzm1vqU;0UM%r1+G@keAGKQ`b%FYa25uf@@pRle+E( zJRd|-a>&pGGvwEbScKYsp!pSky(&-px^&pGFF z&-onbGv1wNk_|{I^<`&;mpQ-M9dq~YuCMb3k_q$2iRC7)-NlX*{F*W^^OMSHvKJt6mQJLm zSYWG~nwP_I}XB*}Q0iorny5kbyWem~L6oT)c37W#6&&hv6;$MJZC4>bZlXSR38 zoZ1@O=v`b?(lMdm!s=gUQcPQ`?V;Zq$oLJeubM<(^-1I<`5;_ERyCRk(_ZX+|6&jQ zRx$ks8v?zVerdI+IX|F2j%=Zrw|pH2Q4QF}myLP*-d((rw~5gPbPQy0+O_vp_E7G7 z-9D?$O)=wM@VYwfYe_e>4Y0I&6Zu~0g)a86nCyYoR-PlZvGI)e#b>!J(FEJ+qCAtB z`T0x?s@~)Y_=~KdIImk_3L0rbx6cf-DA|$W98t{nl}Sz927qoJw6EKV@-J>ataB@W zp$52>5F6)+4R7F9B5@zt2@~JUO_r0$#t*o1smsVIP%KXs#JEU^=2;{Be`DX z-DD#jBjlA=vmn3(k^oZ%gV4CEanq? z$#|W8bPQS$m#AtR(dmvbM+Ah0Ofkw!z{yEa7GtVFT0we|Lu_|(Ntg_{T5tZl)8+8F zI>8SnVp1p1gstGw?ld8@i-{Dr6$lrQLOFZ$6N}8J(lOy;#CTKKrsKc<20iOL>AAlr zJu|w~qn-9+JVRLGbQgKy5&3uC2aMrtZR z!^2}-zD1DLn3C!X^Jtn!hV2i3NIP_OZ5=(`5@EnzDXfo5Y9i**H!L}upUs5w7!K)! z#08xd3P=XR?rwms?dI~xPb?~bL;d9*9&!C3aqH-GQ^O!QGAhf}D%n4UNQL<#|I}Hq zsD93CXzwS^HEp=mFer;j*gKGDmHKw8(DE^fgiXv#*n9b5(h-qB9hd7!Vts+rJ%M!O zO&$he@Hv7vKswU?$aLhq3W<@9*oZ-VFF~Kbse$Q8FHbts7E?d+qGWb$O~h#Kmz70{ zSkiZ>NX|&K^uZn~=wRw-g^-Qw(1CIr>7W71)cem3;j>+IpzJ-3Q>)|znZ?v^vUq_P z`op-{P!j>>Ad2g0r>mi}`&$f_)67J4UCjMoS;+U1uDE_~5%$_4ixMUaNoKNm|4I*8 zDEE@Rc9lg*fZ1!wZ`o^cVhfE!7lc{d*uz|JNJKQQt9=gZkc~F9r+vD++h-lwCz77D z?CrEqXAk>SyV~cVF7_Eg_Q{Eo2PPIhRHZ(4PsYY1(&^4b`#fyif;9=Er~HQe?(CGG z=eKQ1Dq!+k^*{2vhr8I1t3yVLv#0%7!$qqjZDw7$(#3YY zA8PT5+swi6EO_6h@%OZizb6M9d#2-8D|+zRGtpr7vubfSl5{_@Eczq9IU-tfcetgv z!{#(|*uMH#GQKPAW34Tp!^Z%JMQxwU*T=xc`=OTczp_)v{<-Zb*Z#Kb%KF7q9q_U%@PnbyV%L+e?n1V?A-HqmF!{-E!|$>}Eu)oy?{9s{gjDx+9l= z=_seY*KYajD#!iF)s}r%%j}k2el*->p7uwtL?nXfH2rZ#j6`|9!X|2h(P^BY1Ypr{;nw(|t8Z zFmFtcME*3IMF#$mcJJM_+vgxORlSkTOQRAY4P~CiK5te@&5_#eOK4fi=d7{?lj@Cm zKH9K|Lh?h2p&eruJ$HBDxx0%lMOM`uajsLJx_k8&LSRm$DczCU9b-h|11*rak5-}b z99Z13y$w{TIFSW0qd2{bo&y~Y;2+>(O}^C|4-n*>IU|P>RqgX zy$x&+v@$DEU2-=NOLqg|evWV^Z&tgDnnfOOdOd@;i}GlfKhvi1h7lmr+tqr*R~|v~ ziydRw(5`*p1`V~_)1B+;iAVVl(K22P)bcJ@2i(d+N7LrbVJw-3LU1!VE^9@(!;HggmE@(#n_w zz3ZyCkg&AZV;5MrMSN*DS^i`|)7ay`b)SXrIcGE@u;bf)3^tUZf19Rmu@PDRst*$N z2i+4;_de2J1EIycy?c0n8c6~JEv){Eyw|wMw2PdkJc?5&``td{y(QIW=anq|!sbiv z|F?)W$EuR!G4b{#J2KYFzNRUmYQ%Xca{91iS$b_w%)_Y-M~$KAsKqDtrhc1O}G`D0D5=o${H!uzxX-X?Yin`Ni2x(b|bl znSVT+_Y>u~8?@JM-{>q=KbS2H^_bgNeKyZGH)40cP|cCz*Bj^Fg#4$ay9fBTKWp2% z^R>ndp5yi+R}gCF?GaMG5&rWCEW(-ns1@sc))(b>xgbc9+jq@7+1iU1@m!6MM=%|8 z+iBqRJuAAJtai}GV<|g3l*|oq2RCG}$oP}DyFFmMFrG6Wv#w07o6YHx-gK8=3%>*6 zoY_L{+LAs#<0}nN@#{;!Fz$|Ka=^m2eiQUa7W09wKScfm&(HR7d-dR?b3N_L)|!Z1 z56ZF}jzcz*nj3kY=Iu*3w?j@I;(Z{=M}0tB!ucJt1y%7|ddcmfKENu=wJ^99+%MJ; zs6H~A{gPjI<7+fXFCD@H6MLx<4|GS$K_3nx=YBR$a_jkLy%mE(yb)B}0Uoz>S_eh9;2oa^$ov>-_Y zpb>d2URdddJMrN+<&HHOS}tRH2p!~+4wO~gHdp9@0BAj{fF7Hv}z6c&5kY`cWDSp1? z+^K?Q?7bR_lc+?-8aMk?$_~EKf1Fa->TYIf|1rrV z{tDYUHf5H;Ce3owo*(vIc!_%v31W;mAM^)Nm7g)bL)6r!iJI~>H{0_sAM#EaUH9x9Sn~w?^f-io^p>{ z?Jw$ScXzEPjn>=qiF&fntwxJ_(p_$~x2Px2>RL~^MQ?AMsHffLE@+trI@ujZ%5
W#arE!Scfq<)vdk*Bus%*y490!)LTr~TO8R@PbqM#n?*e>zgs=+ zdcD1y^!9GTI40V=-L0J#GE4tLQvmjX-hi!U9vyNhP_ z4y@|6flYS>2Xg9g}`NJ{r9<(M!{A`vH@w1t;L`>JvPBB@ohUZR^ zDw(;YF*kKyUJK6WZFu``p~!8$L!=DK3uEoB{gEng2a8ui8@95BG`S%7A)NZmJWK>FnSC+J^$%K&+@MHIC|3aVkbS+ zFPMNXySSz#0vJ7)Thp#Z28`A9vfo>7{-=Q;g;xb)n}EUFqr5lb+{0 z=^3EYb6%&107lObE_F?JdZK&Mv&#_J1#-|GpcLs5xBZc*eUaE}L28kYUtKfL79IQ( zeIwB48S*?%7!|klAWMFtgDi9mE++YFL6-KFAWQnnrIvQJBgLpw)oDk6ft;4>a#9w$ zAGO-ogE9z8^x3yLZPU8arWAM3CSP%Nw{hk14%(DhL7VciE;0g0Wb#KYbzE24w4Ys~ zKX=l0A7~q+)25ZW?W;RwCN+aD?8`{&N|!XPgD&lS54xmBI_Q$31YObzL6>q|(4`%7 zsR>=_lE3?3x-#K5RpU(VY~|T*dtO9?M@+J`wI9FjC5L7v#a#tjvSH<2mujX|{7qwW zrqGM8b*u>MnCN`NP{R4e4B^11yX~WaQ%t6mXS(2opoGE?xzz7wbmG)L?};u zq^UDY+~XNwz}L~135MVv@|3)c@-G+LTuVcu_D>GGTP%ih7I3rRoC{7z33P9C7M0#` zVg2*`oxnr0|4Zz6=r8PeD2|H$$Y%B|O*nSGBI1TEuvi=+sRnkl(atvPh~;^Az6xXG zE$xQGt~Y#D#?CnGhWj#%qks4yR{miaEn{;W?acj@682b*hH*)H`3bt9!h%h(ZQ=6w z=*kMq;jsUmaQP8h!0-*V<*i|4p0c!r{RhM4hiESyZMQuTE`Kv@!8!ZJu)jH6zCUdF zPuP$1_qZPmdBU;(4jIBfqrF|&FE{y4mM1eO5(3O!l(}~Xte@=TO_w;@C+A`b!8W_e zFT1X6(odlsaOqjdQr!5~h<|)T+!m5p9!U(R1^SV3k;vb7(Vhug1Qt*R!(e(W-Tz0rk~MgA*9r_q>}a_2rex)Vx4JM=%h%S-z)oLqCK*xD!k z!D_c68>NlU-L*ehi)Px?RWrmWyT_%j1We{80e&1X^8>rVC@f8X-pQX?M|(br(Qcb*a3lED(Mk{N_kkI(v}HSG6952TS~%SNy3Jd5e%@f3v4JhUt?Ibppe`3AYi1JO(+nJ zI&w?6?bGS%H-(?E!-za{m^9Tou_pL2Av*kx`oZ*?`D_|J$WD?rk;Ae4Ra(CF`K|(L<&Z`szfSY&Y=I1uP@QCt>zWT6RikWIkD2 zIy>puYf#^mU@39U%4mNSWu$p7^tIsaL=ikG->Yjh2GR>>Q(sL*jsw81ekOq|H-9p1Wfvep48_7GqEnGzSJx( z>0`?C>Yb@rXhkA`kSO;Etw{H{Y&J|8X+V;axnI*}yV$+fylYLjOmh?jhj1OUhGq$D zG64+ROdZ=y7hgBbIrTP4UYbFwwh}vjd>bx@o5m-a&VGe+sy`I4UHdrx-A&({!)@|( z_4kFg>zbR~TobpDw(lieXTMSBOlOW%S>R$XmD#!q3Q0{Y$q75rd28?rMeFuOpziln zmlc;sSks(wDLQ;*VEy?PqaIKL~6O@@M^|Dlo2h$v;@w$^FtdtGRh z`w)!>sk(Y-+SZxeXfF2NylXHA`&iYtrU})*=2G9po@}*+vm$4^{8k$OCt?_--XZ_! z7NYahTtS_7!1(>URb+9FPy^sjhE=ed5soI z3IHFP=`K+JK8@_PyOC(4JMDEH9LF>=&cAlp>+PZwYl*Jr%}4a}0cXQ+Gau^i&_Iif#QVyobHVo(W=oWMQ+Ipy)8!4#q#r9 z1uoq_`gDjnJz^x-IZs0~E2B9?8TlGw>w|o}(0xI&vEV>{VAM1{%>>V7id4TO$pNn9 zG1Jscuyn@MYUa4U;j}9!d)vRUwVH@><`O>ZjRd~G~{fR zr(9P?s|m2RyXe<-m==g*l^B}U>q&*mV^E=3`pkh2SwW+Vw??~(qz`*nd|I0vTN$kQ zp(;79^65}=%oeq>rmo2r6$-?K0g7hEJs`90flSF{qMSFvl z%<#TmLJMK1x}I-fFanM z+Z7>K-V=DF_nf@KQL>_QcaWLV$u%x|sg00hTL^wyqJ>Rr?>gDqm&lg@R5$H|Tr+0k`%jZsY z7}P<$Nr1Bf6H@szr#e`uN%<6d7}LxGl8g=QdFX*?P!0$hwEe^a)!WZG)&A{Ny?T98 z5*3%pT_KQ0ng>u~ZY*?j$pM zqwNzd%LKUT$s4?7`3;is3nXLA;Vd}NO7}&M!N^m7H4OHBEZ#sli6Vo4r`Rl;vwUhO zSawIC7n4uqK8u(D_w`mAh>SMpqPz2Lp~+_b)TG724&2GTEJgJe_0m*sKw7fPeQm30 z_9`2`p$;(P^m;V~vshjtX`l)#0VvU`FYhVJI(b1NCtuDToopfeHJpuYiMA8AL zdK@rQ@P4Nr+gAQf`hB~J^-(6uWx9Sh3n^=xgp}n?Lca<({k~*S$f@EBP9#}!TBMD_ z++QM9+$7AMzmscqlr@ABlWmwSwokR3XLcGe9IhIiJUA^qEj1a6Nq!m0=4~bxfWZ3J ze%^?aZw(&0Cz_polQOQbvv1c^8^f$vqhW55Y1sN+j%m%aINK-D^UcpBqkPaq@P=Ks zs8!CWjMa^0E0W79QbJQA4_kBN63^Aqs@Yx`0gXonS5u!}VEu44 z*s&3xsr_B6*Gj8HldY@v*l_vC_?Tf9i-pF@%KjTnyUnfEJRdExPEz5LY;I!#qyVII zh57k&22RcM?kKw`UsrmwsT@-voHwk9DVv&9=!?pUPIu*+M#cGQD+gW-JYXt4eulq> zIidt|hj>ejt%#<{(d>+Kx_MOEhi0!S%D1B|V?>PC7iDuI2!->8HjKE^k72Y`wAWCG zR;I=Pf#rPIXNuZl8lD}K!P-Q}nu}&Xv~)HD0{alZ)9k6=k zsy$Ii!<8LlL65BLXP2++v$UGGMUEbCvjqPtct#T?JIac)V{Eq+XD9i5Q8P?P4ubJ9 zV6a8bFwKaYZnobXHTP!wmlkhi6nzj_dhfX4m$##-u~y8jFt>}iKTZBm*zSxdF-L`V zl$Dhxm1IS28L`crv7c@X(Y^`W50QRerb@G|*xnjE!RxO%9kNE>dP zEZ>vl@kc#;iyv90>SAF@!M{@V1&F<0GAvDb{)L}WZpJN1Npnza8#ID*o(NWIbnRKo zW!Aqk4X9Sz+)tT#1%Ag#--JWl{WI>!Fg!4U7r^|m1SD0|kZ-ogdTQC*F zv0Av!iE1d*CaoeGE`<@eLJ-%0^R@o7WN%n&7;hg+xr8br_F>8kpi&L~K-w9)W}*r` zen+q^sYZiHW{zx^RpJ(jaMiw z0n1k~=n92;=L3&27Nz?U5b-{-%cf!Jkt6MsgLNby(f+NXlx%t*ntpmRdqX5Dqx9AY zAQF{y0O^RU((KHSj|^-=C3Ih~aI!l8w`DBlE**=k_Pm##OY{2P0>JXVAMyKt)2X1AG>Zh2-n?(RSy0ihx(S)i4^Isp}>c2Uvq zbYiaqKpe^hkc!}Q;kohI1s`!}%r^$2CO>LYBS=H37MqRt0ff7u8PtF5K>aHm?K>*vP*(a#sUe)O#@5JjAK~9x(M2WiV4G)l_bCs`K!e zV0pEZFY3yj>YO{-l`+gN1`3K(6Bn$odhZR zScjsIJkOde!wtdrXw6Ea2O~+krJGqvH|q!^x|x-9;W8#IBU#^-&R!mC9Yu>f40ob; z8bzz}K~nveNgcgY3nz#o1Tf*X1L)p6g&Vp`FGx05L>-BM9DG0Puo8SlWBoX22>fXh zi{)1ENq*%bWUPh>R3;Pesm?Qze{RyFN~fU}K70Q;p(5GlwDm4q|4dc30m9+=Uo8_H z{ew@CTv##XLIRjrMoe(O9JqH9Z1NtG=5N@f_G+h1O6$2zYIpRo$+Lw**S($iuplH6 zgRaR48YRUCY9HP1<2nB5ouqOh`_T<0F&NV30-Ycezemj-xdu^ zMyL7~;OSJ)&|#Buf2Vo?j|qzu;5MnucB=m>?667sYC?CLR2p=OKGoa*M35#Cz%>3b z0OoHtohXR;Et|Zdn@wuAZZ@e!3!9WaNa!}49J-tqo@jrBE$x#`l>78t$p4c0NJ96^{vqA7j2ty49)Tkosu2 z6(UJH-NR0#r*w+`skcu6VOI7D(j)@NPNWql3d%`}J$=_k3fy)0E_8yf(+<`H7{cA% z>_o2X^j+HI|Fsk4Rne@nob2S0i5<>M+9gPoUlAl~4FG<_PGpsy6XQGeDg^wtofu|E zjEu`dWKn#EJCopPjww74)AB1NnyRC;sUNyDcV3@X>?(HiYAH5(l&%Z6g z7ohDaT3Z5Q5tA)I_Gdy`w7(ZmC$uraUT!GfloYI_Hi9czyDR7~t%bexu$3~Xvji7E zhJA-(b|+&Q%eK6nhkPgZsz{#Th~W&pNDNrmYJAOo+j<3;Q1!;CvG<#1mX3oJBrbo=-! zr%gVPP!Sh87*mM=fB}2oa8V4!aj^pg2v8OmcA5L^GcWzZy4zed3(HoL8`v%&X z^i4Ys32q?#6>+ZhldW~0^=n_)+lw+($6#%;F3w(e#ltXshRXyD;591v9+_fZ9%bDE zik5G}&;wTH`NeZSw9p!NYRu3m9tpVLbbnllDXI`@e@e&EQbRLOH@`6+D;`iUecz4+ zIg%BFoCMC{hSRiU9+f6v2yYmIl^|CAxF-!u!7aDUwh-lXxw`aSJ9cMa56P(H+%%hY zbKjdnraprgZHrj?RsU4eho+D@%Cn;^sUjwng(!kQ(ts#}TmC-W@w{lg0k1?pBwJxp zMG}5)G29&(pOUGiRW1^;H zcRD*Ql{-7-qjp*t(L`-t@3S`}DH-qW<4+X)neg!5j;TL#fIeafZlOSrdR>9&SkEP> zZouTjq~{XSKAXq}P6}>QpVyvAQ2XOG^M}v;k3Y=Oz0X5>_auP%!#@I`o-6$^q5O0h z=YTem0cyR;9gdE&|M4gFYCbQjJdvPY2F%)9lfe8C>+>}U>d$yiu<~sJ_lMsks6XU) z`oqee{&1X5(E`1F0tmG-UyvrvPbhy4>d=>2@?X3AyY+g7`@8$Q8JF4qPe!J8f^tAG zywZIr&)n+`#{N<%^`DJ~=csJh6$0eNz=HjnDe)i5&BgqmL5A0n3F6Qgs-D z^{*N0UvfK&8GZ);%X>OZ3hQ6Y{i}o?w8aVPQ$laj;)Gz)#7{=Vj!sAK75ZD4pjP5N zvzLYcV=t1fojV09G69VLLIA|2RG2_tIGB`!LNSZ^`nOC}lJdJLMjLl|AFk|T{_Sw5 zUX;lw&ZbBGNH3>zp%=bTlO~BbS{yCZ#ArAWcPfqweoFqB)34;}?GZpk$~gei5%=qu zq!31IKEoC?ChJd)!R@(feJ-#fF*82}YWx%VW%sQ z+}QMlxQ}X$lV!0^cX!Xu!N@-l-JmWl!JOtwIkZ2>y ziG#KgP(;vmLaof{_Zkoy(d85rL`Fe z9+dIStfe2RFgXt;fELLW6vt%>xYWY0^Z%0aYOh>Ye zxrUV~%-K}Z*-Uv#0`f3;fqKNum#BP70)CLr#j(1tkHcJVVCGuA3!a2>Q_(jG4Q9_h zP7;V2iW9@6HlA*y&t+S$rA}9sHL9Vy_=V`WI)sP~i{CT`hY}vd0T4~-NZ{j6s7PCy zZYrMx<%zC3F@g3n!kVYUS%aH~rn%HC`#w+BPyJbOB!rj@LV-acB%h*GR>aSQgmNQw z8SLc5PCl0CDu9F~NSDFVjL75B97|Re3V4a%exQC>DA|jw8BCgNZK;?qS0wXv6~g3{ zCr?nW3((E;Tq!Y7>l({MJX&mxn$-KLr7;_(fzSFY_GMQVuaAtbSaV!7xE=k+JyiT29WX@a=|w{NX`#p4j?k3XB~ftRt0O)L*FB=g=FK*FFP4$YcW20Vtn3Y?1mDMT$-Eqkr1^L+^ZT z#)m|uk8lavM-DFw3AdV&(UPi93h%RSNyC(VTZA`2T|j|#vBX*A91){x+?CBe})3igO*E(B;V9?zGO3NBE}u8xUiKX0&aXIN4?A(&E*3#PPV z#FQVK!}YKvA23NLpG{CdnvhYv1o(2;kV$Is1%AiXqCD5B7VY8o$uwjtIE)rBHv}R` zEkmO0k-gLhgj%$(9O{EYEz(zxf*W%`$&Sq!UxrlhLe5`0)PT^7^kq-INPiW2(cTg) z$OMpHw1dO~0O?>Cy(m9Bep4^fMZNw32am0^TDhl|Mqu^fwTf?%wmBIilDv6QC3$F= zqV{sLLmkC+BVBNG>PBk>LMH!Jq?^qXy68qbAao;@Gu=GVQ#V^XLp1Umf-voM0K}L? z!2gSG{%?Z1l#u;ae_7tC7`a&V7kd}QSXqCG5Q>rCb*NE7G0HoRf`d6d`b(=ry*yd; zm%}~vq6CFr5kw@@60;y~w{Oy<~RPi@a6nMVZg^GN`9s{GEEyY6W33 z0i+kD2EcFWrN&s$f5M~moh?05?L#=(ox%omb$(g0TyngyDV4k#4}{46b~SQBt9b#O zE^{%(q&l%H31?-;(st#I)PJ|6VRO))%wP@uXtmPBlr9yH;1|hgzia2=_@A$CDcBPz zcyjUv=hg^y4b(=aE2$3p@@n84=YP6NwTn()#d(QHzCH9!M~e&Z)m5m#28Zn!Yu2bM zC-dp1w2g+YeaNs&;@s*u`djyiNCC_TIwlBIpO2q^fv^atOaM`%J>ftAK)k)yua2d!G9el|Yy_~o zmgEf%*DHJlBDv=A^?O;B7l`y=%BSBLx$VW=q^VjLuP50Ulf((-#dKC zxC>!9_CVC`XCCtdoSfaV2+^g;+#q554095)73Bek`q3nAu74AKnxUQtTmz_N8fk74 zNsI+0*s}*|#bd%-?FCUxx#4)haFU@fIR$?aXu)`R2QwYckSu6Z<^Ujuw0i;M_;GHj zV?3mzOW0>%eEK@3lZ5{lohSpk>qLp-I+6d$`df!iHcjFZ)0R5adcaJKOC7;^J#?b| z(V_kg@0sBL*i$Fc5TO%ox?n*jfUz)*SRf%y>(Gf--c2XkN>NFg3TI0?sXmk>)+^2J z8=O9?z5`|x?SRRPnjvO|QlUd##ucMI?qGoy(u} zf4tz(_#S%sn!+=jUuB|B9|6RaoCn~y^-{cWN#Gyj3j=2L6+&4kA}O@KFASuhpP;&C zCCAFYSxVnuoz2$w8=;tnKos?r_bqCM(2IPxL(LX?QD!@W5feU{8as1(18s;UUgf(S z>PVp%WmZqUC^3Qsd7NNDyG>_-0Md&xwnH!Sf^K?|=Zi|ptv&T3ZE4>y6MCWDG}$q9 z{Q5vXQ;nG>D9pj8JJeXN8);srZnRr~lXRn9JqF!8)=f9st-5Yl51?Z59O=@M~#0xHjDw5Ka5w;pop8$XF6(b8*js|VEQGW zy2>Jx?2Y8uYF3Yla?sQAEBcW<<=u~YZ6(E_9-b&7SKA$LToQDCU{K$j$lSWN)p2$` zm2-Z>~%B-OlNy^EQ9)|1&4CEG7{aqjOL=jpg*Yz zn>j>%r^AA6w``Xn_VavdNWPriw1vJGRhVirNyMQ*-{4CV&sQ6<<2+b9(RM91M&gQW zY(6I$J%26sFa}2uPIbdXK6c&cQ2#1OmH@85@ub#%fbT_fci=gjhMlUWn&UmNz0@Rim@CaL3Sw?Q8bF#)wdE;K&-bXQ1Rv zo_8vLJPW<=v@%i{9opr1RIc6O2K^%^@`;MnpVw7yn#gF8`Vp|DS zeT~s9y=4t`&@BBN@8h_5jv?t{JQ2G64Y2K*$Z|c)eF#4iQ+6m;JbMro8wU1^QioNy!;hs>1?ZQYeUUDyu3W1 zd-;Gv{gIWQ<6xIrPqx+`ppK|~@d4Uv*kN;)?tHC`g`K2(;AW_-5+EEt$h$(-@`x0k zKJ6;00rzA(OJO+bne3z0#*CJ-+Jmf~CxlvJrk2%i-%!mi zm4|TkT#E8Xgb#`TcDT81ory=YPUQWwaS?w=szQR?Pq!U)1v(L4|(}h zdile={7Ggu9eR}C*UP`b%b%d~4cj+RZt=5}TO8I2_N7Q}N@SC;AYqUPY>c=LX(&hI z_eFl$-{c=b7mvg6Yxh%SWxcfovNK*LQIKfq?(yVXQ5U__S%GAKKHi9tHo4;O z2WLgTz)8v5gcI*rGoeAKTeK-P@-}rxpgcs50Iot$4p!BR(LlB~IuGJOvrrV_AX`#z z$rBFc1mW?)UZ<))Ap`B0kiqu(dtc+`uX#xZg~ZYVRVVAq3oGJ`}b#^F1Vy zL;C*7EG0sD7-*eSnV*qg<@m?|S>C!`xuEuR|GH0OPq+a zf)}Nh+0OP4h3zOc3?JN}_%Kk-WwTYs_aevlhK}#=J#24kG|>aQ;PvH2y?h`Zoqr9p zUFEOwEqmxTvhw3$B&M@`81{cmITWz*26qH7K6xit7Z2mJG!eHnO!+S%!5rh8gSLY%k zqWm-7^~$zL`ET(fcU{X?)Yw~mDc+Us*Y|)UTLex-Xm>i`nXtY80WypF1GMau>2xN; z#mgu@NA>9>9CM_1ccQf}@3ah2e^!_JKlP|Txl8>!c>Nl~qCoDx2pDw9Ad!}!gq@$) zZgrGeJ?gAnK4X;Dlj*Z7#Jz)P7h+4QA*iwdl*q5AeH?GYhLUN|d&C5CYkX@2rmDQY z@}rpdN&gp*uO&Q2P>&M&JXQV?v1T`4AJ@l=3D~lDKCxRGU(#ZPl!}X&1XGB?qP$=I zCn?_ubFY7-{*=b&WbDBb)Wb}(E+gfIc=cE8?j|1P&*Sy)(9-kqmYXRQ z7W|cbQPcUHw(~i`p9v2BkTWv<=2q*O=(lT-Bb)leKRVG>#jD@w=st?aKreKSE|6?6 zG<}lO_DN1qV|WV2_rRkxbl{Qx60e>Tc(hZUc$78q^i8elot(CJa)R#>9!`mkZi!O1 zcOqCFufC-tINrgRQX%X>o5t-xo<>H<&I8aH+!4W8GC(d5WokUm=y7wILiVtY+QSk9 z4utXtAbsRdVLv;QRAWfnn1g*Uwe)o+)r`9#VOIb>%5;#)1YYqmw;P)l$#A*n7~ z!k_GmM8qoi5_R^wsVP~B^Y0B#07)1&B(t(u}`M3 z17M8pd(f8Z_MI1Ri<-9f_O@EIjq;ne#ybp6bj;XwF&Y3j2r$p1(!0; zxc>+mG8g5jta5q;J1IA6QDHUBz@>ZQvA-L8y{2)y93mn~(mBw<``<6|1FaD-$DhKj z`1r%)&0ogjs}Elq${8eX7T%+jK#1?XN+j{Rw-F^%h!W<9Y7A|?vNCVaIr1Z28(tA{ z?x)PZ^*M5iepISQj%PML5qsohV=(M%3j4|)uWby+mi;-i@nG#IXJQ-oXFe5fJaVe> z+=kdgZyh-t+jy`sI4S3oaO}As8%ORQ5xn42b92f@)P8#n82m74c;ipOi^LPVU|h-X zW)uB`Yluemww!PKyj>GKOXZ+=;VaeB>}{rBQIVZ2AE9`bK}+P0gpi$EhoPFT2g8kiT$*p&@dI32q5h%*K-q=t|xLk z*OH@y#azvVP#!F*X{n-`M1YOz4ym>rZ=bGMyFCL7X{5Z zwreW``0wqu=9j**U0+#1q`U<21r4MzVwMGMv6$^2%-~85{z}Nv$j9_Q;Z8QDot{we zawdwW;y@Yx6X(|d+&lC837DQCI?BjSk5Btz0)qLtcL0=*j90(HFJfQ2CEm7`olIvk zD2j)R=Wpa^4-j!wY*;*t$uP9TsKMr@Ney}yK^Cf|S6YmYp8$rx z4*+6F>Jy*&9Qz8wPOr0Tgv!Sng5T2sg7;7peMO}@(x7;?PBbhJjMo`eq@L|6rv;~S zZ_%z6CEAqTL4gxUc6qC6NrDP-dP*KCcVXCBs?L7Ba3$B?&1OrET*$HPh zCsNM95D`nxykkPz0uoJXMBqO9-xEl&Q4$+ZmLYBK1XzK9OGzjkCd&H77fivEyWno= zXWw}B9{ik7&Bnzi=L25OZ(xms;FdRwqxi&>^rncdYd_g}4VeJqM7aQfmAPO~yPSco zjr(kvKTxH#-nJq1|NdU;ctQ?Xw#6^Xnm{@5mUnpTXRh*h(mA_2R+Q6v$9EJON;sYt zg|u(&q+fcbEQ=2ruZNu*DpEGoKc8x7xE}L{w~V$szO~sFu=$M=X`yee&pQmeqZb=* zZEhO6^gqUfs_ojZQObg>Lh3si;`{3j7X7TeWWsV)aA}NJogj($Qw-=+{e-DMYG=kw z&*i)0$Fk1F_-nUAbaV)1z7WqVLUPh)kQ1p``BWDe0rTm}Cjdy6+Q)V^>=zGzMH6U_ zo+}U8)r0IU(@Ed{SFN5!y`HwA{Si)EWuXpIEUhib{uWE3GZ<`EUS=z z8i}yQjeO2jeuE*{i@K+1`8`37a#RqgwEace@TtGTM+!?BaJ7;5PXgSf%uXEMhwe%ScN^^rHxNLwFLXd)e3(>(4QId z-?zuq;sK!~75O7OdY7=zGj{c9Xo1oFp`E!+VjgNb+9Mg%(@-V7(*6ZHsk}_UPM zeU^S{OeJ5@j4A5_{>H{7jq_so z4^gANYwwJ?ziaQ9HV=!R%?2xCMrkEJ>3-ue0%=IFDXU=0Mrd{l?qmX}HEjm~VqDr` z&m0fiwEgbPwXGI3hI7MsEZ0O$`Y(^cscdI!dANKZruIU9FAFp>0Ze}N0GRyh?KDL* zF`YB>fM*pwyUxyLT2h@TD{mHPv`vJj99h^AN@huX*kTfMnauAfaL%p56X=^9O{U_- zorV844j)caT(6HtDf!u`G?Tw{^Z;8Fo`rm*k5Cr<DvDfjyz^VQqqzl-C$l-f!@Ji7_~N;`%YK1Y{VkUx8Xd>@<%hI{gAmF?LtlD!;Xvg1dajS-4a|E#?=Hlt5 zoVbzwqAB+Au-*Ib7;GD@GvNyDMMSSClVh45H?3c6#!VC=K^b|eedKdL`bvyMDfvb3 z_=5YG$)_09IpZ-Uf>nrId7JHNMdSIHFJBI4P94v?D$b;gzRiZb%=?f6s$uBiO!s7I|OJHlT&A5#aR z9w`HAQWF6)y#pQxnA9h)w5tgMx3Z$A-&IEG4r#71741F%ghVEQFe|0@%pbE^hb2$T zI;sSb$&oqhLe}*liKJ%@uujvcA1) z*8~JZR=*Aud=v3k_N}L}>pql>x$UGfTulqaf3d5!@io_sZ)W0>B0(9+O`2^#VK*#@ zaAjl1C|T$jmUl~;WnWrrDnA)kje>FMkM`wP*s#Q^MSdje&#X6KEuVF6*%0%9hq65$a(KQJ_BRke&{ur1&|Mm5YB|E5 zBr|g`W8C$djKQ~P`CD3ODz7$_F8(E+T=m zj8xi8dwB{vn)(MSKx9ET_tR^@65yu*GrFhS)yDwah==u2EY%Y|m*DpA>C}xjwTEt` zXrUWz6d&v4Q9=?*x{!oK0JW`*v|HYUOw}c#QK`V5T#`Kz_sCMel~zVgRGG7uTl?z+ zzqB2FE*m#-2suw??IXdhunozqx1T23Pt)5UuD4GBYyU>90|f8T6Pss55M7U=VNv8j zf7P2!xl@NWQxlW$THdMqlj{W{i2#zIJjAa01V$;_u4VvcRkG|fG1k|?u21=6Wss<+ z4YX6ci%zi4!{ndA=W&eAad!0vfmOQ=GxscBUAnEOpOJpldw;S{5dnlmO9H?&m}FPo zf-Wej=2F&CN~cP$kcy>Tsm>F^RTAxovwhV@UuHzDkp!a|kJ^w950E@P(m$P4_bF&$ z^xlj<4w%tC+h3=*zrCg6*^5ShjJPl&wUIB{X5N(zv{mTs0Qd7@GY& z5BAUS2aKC2Q4d2llm}mfu~BHT7i&rwkfjr+5-DD|TfU^SevQ&;Bl6|Prz7zl0rSJs zEL$`iFYt#Zh*epjq@F0*X0lOELgihHt~GNn8zll!+AQjeSPqO2n3d!01rKKNaaGSX{OT3{PP*J*T`tOL{b*bzU(JIVT7xL0{nCGW z-*ofH{=L#o9*=Pl&IRUW@u^s>UCl*xG9xX9 z5T{@>!Ku0c^_iS)b~Rm)BH3VWW12hjs>w~THeyCP*Pj=czX!nD{jNXvG~Y2hI@gZ< z<%02V`$L|6m}aqIl14wG^S?R<0vLvGfB{1Uf_R9w`YA&I^^NES2q2hI9r+AM~RjK%# zn(7s=Q8zd&tIk_#3XUO})HV+Y{z`)djWd}r2JI>xW4@L+5wt1&9oT!|F%=Fm6iSv) zA}I%zRqNxx#*L~tYes$J&dS)QDjGkjh+SWCq#}0J=%d3T%gu&5PpZ}9>4kP{vkdgr zgYXyjLlZM!!CY+3XxG%jDU4*qGIx7z5zS54Z8P}_`Y2b!hlfy#sOestr7+T9i}z(F z`eOT(PKjIoW1Yua5|?UCJrBGTF~PoT+|aE26t?fZ5{m7U<8`gAD(F*XOkACf91%Wa zVn*4Vg%u$~cFO9~rWQ*KI3(^UeVdUEW?Cw zpMN3$IDL~GzHYVb8uXSxTjufkkEwK}`8BE2{wGCb)*zNgV< zw)IcC`SD?9uA7j@T(#qqDm3dc+j>{!80$Q{y%kp5(28`_tn)1YB~%huVXdId>68$# z;uiqQk3hF&F_{X*q!*Sgsf?{MW`vA6+f3_{E7O9{5j9B0H7}Vb5sbl4K+lVjbY7Fgv$FV4DNC1tR0Fvz54 zk3=)Yo05Ws)YA2j*Vm!7&FRk`^q#>rVd!y_>G@bIN+JDfFo%_@FNup9UBCG?6C%9_ zy$#8+NNPw(eY~tan~>tu@mN;+-ug`_kJ2EHp^c!jBYD}aD^V2AHt1z#v+6hcP_z2BIBZppV1t=F)R-joD}+gQM0OF(L_b;)bnDvj%6 z7ow2mOk^u^ih)1&`eSzot#9W`a@TRcQRrM7qE6d+IqR6dbqbb4Gf`F@hi{B2hmsylJk*Y zvsrOUXmdYOAM|mG@ZpPnzDC`WQFc)kfFXx>;=pEB< zOmzOPXV4H%O_+ks^lG}t`|ryYk@Z>dm3LN;K(8MCI_);ctFc!3b?VjC7vPO;eQl=d zl*f~*mypQN9%#bJ3VbAfh0t6aU_6X*lY|KitUc6wbNV^b{mYD=y!KFBGz+s_u>WF4 z2gOg(VInKMRdLa_N2_uyL^H^$rYi7O)uH+dUyh;n(3OKY#drbk_%(1_jx@WDa>|=d z@?m=yq@THdg7mfNFI0QB^^Nt)j`)(e-jl66Z;35tmNaj~+{Lh^;(3ktjp#MEg#Lf! zR<9{(LkgS_Sr<}RMY0iq@+r*qF5c0&*l(EYwGH+9nbU%yj)0-s`sSA8lAU4D7-C?y zi&5hLkZTUpx$5B;a9z$zadW*WVuA6UD;p6rCTdk*lRw>%-e6C;)L`tj_ZF|&c>T-u zo67zj>$Mtgef`jg;lnTNeXZ3TEFtpedPBxuqf1wpBE_8Fw3~h{Y`m~I+F&ca{$%me znA0DuZMb!A+2KYEv!#RX9bG!_fzK?4SrsJ~Dq{UgrbZ_ypYrDveP z7O%H3D%ERq;5&3WpjVBEf>)rggFFOlv)ro{GS_g0X}PiQdTZcg(3u3MFCAR&>D}JV{lbu+|*Ss7%|F96U}xE7H~`Hyz1ndn{v^ zbzg5JDk-O@`>dZH%BXoeBdIy*XzjJi+quIc63?xztt+&dHt)IM8a%jeeYQ6nldN*e z)If5mDEXV|%G%(+sP<%Q&7O?e(ZPN6qiIh@+gu>W5)#4*{$8N}M@G#*GFnYXYlkTZ za+jY^JXg1PcWC+ff9$>B8Z!9d`U(%eOwhcR;|As}R1s^ynwJRmCWg8;qpg7Gj)a(} z3&byF)YNdgM@x+i^V-FAzzn+AGpszvOVvwXt@Av+F2feJ&b0j3Dqn1sFAl@^@Zk~b z3dantjH~n_nM-9!<>JavWmRQusL;NyIpn*k^0UhGAzwzQBoK0ag`PV|iqnPLk~ zF^2S%vr}Co+*60Id>rtJFAP3YoLe@mNO9$4On+u_q}Lbg^TpXH%WJ85RB#E=3~Bv7 zW9O`-;3CG;f{Zq|&QpruX<AdwwkntT;@qnWM2km%rQ$NUJjNBEO(J$iW!o- zGTNebByj@CJsC%<=eC+^?#aMWYlGoLzn^`kn4&qC{U>NnS65R`V3RmE&8U`Q`1%8INj49*&dQd>&KA}>NjFpJQ`sK&ymaHKexLBE+*jm~KMX53_M zRp+RR#}os@%E+k6$hc}cTD`V4LQ`^wnf*pXdexc~nz7e%-(AT#IuNUYg zfj+eZeM&~#Q62p$ssjZ8eQHL{;Eb!0N2^~1`WJJN`UZ>BFIirn1*X*VMT;YB&fq}8 zvgP71>y_2Pz63)F*O2&P=m+xWw!JmEYK9^~}?&9*x z!G2U>pmR*nD9~IUN4jjMT1}V6wQU(E>~p8UW6r3FAj7X2AUzLdB1UIGp4SY!CnCs% z1WLXc2THzU7``6YwvJ(-zVo6$aeiFQg>gq~2E!hn&fR8_zCeCkiy3{zP-}^i6#IrD zwm920br&&}xhD86RkFMnrVLHW=VANlD{Sgwk&hw6?v-XsT!SSR)y_m34yPDiPf=d7 z+b>;i`I_0pdHba(@c03t80Z`oJV*fb!DgcH0R3ue8rQZ^=W!`Lfvnob)x159c$}oI zVg~CqWz?Et?4O&IC+#>&QiStYz6?wP((+3g#T|@wzgJ8&I>&j*P2`i5>R~`wz zKu;j$r-_GW=||I3 zOd*Ep(Q$3VnB|bZMhH|-j;nccT&wwLO-OqvclnP{&3VReIlaf2Wg4E!_(eDcCTzxz z0`U41n1ugEQyB8zSP{HmG?bITJA=oUBG z$45^8EVzhDYb{$75#B<3Zf)YZ;20_bLEl2+8BIT$ZW-66 z-6lH3S@JFrbRMv8f?papuH`84j5Ry)yyT7NfdK^`TU56b0nY!2v3G%svdsR#XWkhG9NvuKG9l15GcYjRbY{R9 z5N+lK5l{=q#7kL%LfY1El`O5b{mnZX4upkh1!TMLj7`E68;)Jf%Qm2q8SDz%c5!nT zEvoIdWL9R`{J-a&fiD03?f>t`&+tCC^PJ~Amvf%;oaa1Z>4fWsUlB`F|GXY9o`bRh zU~uJiIO$aHlAVL}qJw0urh(^C!@<{i2>cO8BSJuOBh<&gHM=8OdqMo}m$`<4Bxwa*JZQJ+P@*jpFoSlOvjfnux&KYi<0Pt8Cz_)Wo+-K3Ei*um% ztHl6#A!_Y8{tHUor)J8ofrzdyNM;l{a4ep`ykWW1+^;EAS^6)_3#A{`zU?{DHZkYa zr)B&}Du?lMd`{DbmumP|Dd^hJUenhbg^oTuNUT^Xr}Zs=HDm4XwJlBeu@gFCo$+GHsYiH6Sd;x zBVwHI*PM~-AIB_Q+R5NeKfal=qRMTdDz{Ho>6|lcnyAu3u}77cWoJ9)jCkOv-Tn9+ z#mlsgvWeJ#u~$^Ry~`Td2%QP`EB^=zKe6k*dLmwb=BM$YtS?XM;9!b{^=@n^h%=}O z*~7hcj$e?BH3Z#Gd`RmWL^}?gtNw1zSWnRX+c|YTljYehY_z9e#xE-drkG*aq_I(E zPRemOnTJSCbI&6v>;9>>-8sk4NHIse-vo6G<@F0^)jBwy`4df?wbWGDz4ge)mIrar zBj;CB4Ai-D{qZ0hkNsfU)(||u5Jl_!rJv%=`e1uwT0&Ly$m+g;>zEBaGJbIg1f9~p z9Bir734}N94I$U5Aq_Hq5=5>Gvrtie(kR@^EhAcqDmmZ{JM~L&hZMwHF-{@M;fo3H zMNPA)8Up$;>N$iDUhJqI8Jk@9QgF7iMb!Lxgm@h9foWU-hx`G5F9mfcFS1FRqOIZG z1nSsem;=2Ru}>KCj@=jB798Wf-gIR#mLk_yPx%@2AwnUj$@w%gDrxlt4SY?=~o2TJ*c zXQ&+ts<3z#V8}(%MdM2vA|j~sbg-qFO*M1O0681N&;U|U`*TcvQqF?g^?hoNk+AF7 z&DN%^zz524s4Esm>HkJJJx)07i=V>gDX<_`UcP!9S_OZ<3^-pOPX~M6^8~4S#SgIf zsE_+6_CsT{QKY)^GFwu1j>bIN+>(bXF9c10DRMFloVS=zgcLLZ`Yc#$^{+|{A;#Lt7KmnJ}$w=oJQ z6WQ9D59p+qYgaj$C~e=5;Ix6+c+?Q!v`1!F=`LwvDkaiO6L4!JT?}Wt62SKqu~&X} zC3`iS^T~d*Z7P3&+I98#XUa3mu2`dS%|!ekDIOLyG-rgZDl@adYE3g5Z*=5owz#md z_dNS5T%c4{rJY)$67piI;C6#sU}nnKuTML*iDK60X*Tn1OcnAXuD4!=h}PE9RUI1C z(#BPpIVdz)m|tGde;w@C#rH6QSJM2#dB{3uT`cC5F_31wD-Es)dIweO2Q|h5xp7eA z7rvs0A9Qgj_sa~|#v?-yqyIu&5FlH0kurZzGyALWhS@8JrXIb*Y`c=bml~#%UP%KF zjwvazD;BLfF9avDY@jS_bc^+&Dgq4F5*#HGbheWEexN)i1n{3}aZS{K6R0-w#Ui zQUxJD0Kyh&%yz9`_yD6p|K3E7ItU`j@uU_x1PnVn+`D~9d}9>g$|lwmzwjl1{S!+l zcJ}B;zi^?OcN6LQCnkLW2?@x+$H@k@cq$v4O`b*2{N+tgf z`d*HcLHKNWm%dwkq4Up>9y4@-g@21u8ZQRvnGO2H!gD?S#Xr>HWEQypQtWV~so#$D z3zrD9cY`2=KQ^}QWTen}VEjQ<>n^RMBj9X{b96YJC$AK`_6pmyWQ*c*dfMV0Em{E| z`+~mi*3P}|qs6U{Ykggg=Dm)Gw9QTJ&iz$|ovzU?RZ~NAvqy0FTpl49O7GH2lqapi zC4M8FUHrKAV`1O~i@UqHU>h^gE>i0&Ea2Y|kw${$4U4?RPbgPBXT8qE{%YPVDLXYf zujupsHg)gy&fZy`@lsXbVN+3luge)g#52y`K~JUYq|16j1-(*Rq1k+OHaLRJN1Uf*Mk!YHvX+5 zDJwte8s1*qyzR7WBsSrc%X#Xg^OVoSUhV4=ZZ(~Jpvo#=YLT*6_@4BgIn}2<^-t5O z1seB-S?X=moNY;t8%*P+PDh?|yvsR$(NmOv=}U9lG~>f2;A{Nc*<0eo4Tz6j*6VDC zT;rwEahDV~G#y(tW8&)M~TEbVy_Jq&V0Ux&yr~ zhcO?knsi^Gl#RCCTI|RR^yUSuc~0vgw9t6GD2AtUnrGr* zU}+wMv!KfI)*DsE!aCzjjc=C~o^ull3gO98Vs1-0RElNtLHf`*s6=WpThK6`(b4(>0$t<#X3j! z<3SO|$q zRue8yCpIN{YGodQe?ML`kK1Qc`g~dlBMCNKWCNeHEgLH7u$WuQH~cS`4wqk}?>ITW?JZDe(Dtk=S zHz|9hiuL_c_K5jW_E7yOdq5(YkUb!gOvoOPNG4EgzN!{WJ30U zL^2_JKq8rtJ(4G6fi4Uh+6-1F$-82qMSHpkO#^?vNPkZ-B7gpxzL&>}{P_ZXw|oqd zL1fVoJ-Tb>C0!Xh3S7I@=WJ_>#Ug>l zTzFbbjM~@TFq)Pd!Xrd=w1$ z2CykrrE7GdbM%bIT5db-a=Z;jrYXuNrhWCiJgCkkCtb}uhC7OEs-n|xJ7eR36mBg# z&Nz!ExOA~bofprwB?7C_Jf}72y!7R0zH{__&&U5h-*(mb!zLgze%RT1gR}JyoQk6(7{75IZ!n?Dy+KOru81w8W+qo&M-kX zCXNbjqk$!1K@r0tv;WX@{7S-Bds9(W(k0p@O0#~#Z*o}ZPcT}del}XxI#)AwC&R#B_C0cLVfMg)lynVK{lm;}K$Kjh&6R*i*97k)!kT+G*oDh{F12TNo2_cf}B-j z?Uy`~n)3B+(+Y~|XRX#LRM`il5IiMysoNiQ5zH$Hrq!h_y3x2++q~rVB}mtNvu_p>Nd3(B0e+k zK{ww_#YBWAvKRgh*U@tRnvpj;nY~5Kz8c1=A}@eXg>5W@Aqr06qVg?Cnp6!|)#y?* zsCwfM1P^p!*_&^I&O{EC;!3%7s{>9YacTjIB$w*PgZ0}!3Fqq1HYm zKoAvaHa#6r(wVF<7X0XcLfAs~vNN%TB&rWSf^z&iiXZgBPQeZZYAkU+-18E~2lH`v zL--U~Y6a=oN5KXGb8n?$2=-R5Y5C<;3PX|Mm(te>ZGAkGp0xQs=f2&uIVNV_^VwWf z6dP?Vi?JTr)ob1O>29{UYNiIe2s@|pM@4P9w904f^~HF~qskPLs?q@R9@$E_1ncAf ziK5mr4Obqukfql_#_LtDX_J@mMN|_^lhCavw1d^jn;@{=$$q_^fj{&G@}>EV;?F^h z&A~i6x`@T&o$77pS-D+^s;sq`8Wd5Lt6}MqTpGQk`jsERtzRMC-u|pYcUB=NhK-gG zjE05E##iHhg=<^Mx>lFb0Ug{nTj%4=&26|q6$RTvBgt!|%A`K(V58bN+0Nv`CbN@^ za@r+L4N%*5#5(P4Xq-|W$`Mz{MinBD1Zmu)9+Z0RyC8JW_`qEu5vG%owygCq3>&Tg zeSEl&C*zXG_DsaVr5pNq?8~4|7Kza$z#vhn*}HX89z!3j%x2qD;As6W0O($1r;U1t6t1me>J zU1q$<*<~hm-g9-Y;){Qi5@stA$MAonZ#EI9fFcFRZbkoBGSvnQprWyB_(95|ql-~R zT{Dq99PFA2b7tXBvzfa7Alv5A%j$-L#%&HyIbFfa*!5Z0Og4^xnTkbciOmcjH~{8R z8O*pC{Us=Jo~dN_h>yt}6mgIhbjJ6{*$2I6gPc5yjTN2@2<4Td^PZN*TK%B!<*S z8@@08lJyiM_HWN)ohQz+ZLG|Zx(mnQH-E|c3lg7pp5WPjn1D>wJ5s<#h&AA+(8T6} zhK+=Cah9En#Ot;sP%cgYJyYiIA3Kh-?Ff3~(>oeecm4p)FrErMA$4+*n0&vZV(OyH zP!Pk|6=RT*48Bd7$KJ=e1NQzHa}AE^6Mk?b zDlUSbLTwI@J=40Ge7%J>-MVNAb5gs;@)Iq#I4;oX)neE9*hC@J?T9xD8_i6F`b#Oa z>hJC{dp-jV^_PR6-dWk9Y0@g3J1NzLK{%uA43e1LViiH)doY}}roJF8E0fHO7{OkSe){SXf7 zFOWI@GU^(OB3D_E!15mA#cqX#S{LpkI&l*hk+E-s==aGrz{%v2q?O#V*2zp~?GFDg zZ{@`LvFChOEEEN?IAh|!Ax(?8Tl$K=FsyE&zv6oI(|n&z=KCa^@5ae|AseI*3MOoj z(%5Nj_N&;;w%Wv>MTa|K2 z(w=JSE_f`9F?AJ~YiUiEBw8g~-Azs>lWyiR-xbde;jW2^1?Ig6jC$)tUpSczEKBMx zxsx#zB$le*!^u*1G^TTrHzt8iM2T^q%Hh-W`i$)(p4z08PA3zSv*ocv$*2@s+sASk zhp=(~g9YqtvKm+rZ{`f3%1_d824v`cd+QLhe`^8E390yR!|B;nRzE);cjt+YP9~?? zC2`+Zz%Qo0^+qK)b*eTUVbJPw2wj1vlHvuo&AIo(eFvlYh60DrBRpjri=rDGzo8O3 zCTFnCeR~0HDQuz9A@*PL-fo6pOA+0%7|r4p>Lwk&LjRl0_)A?)ICL?Ej5bOEe7L_d=_ zx&)V8^@3;@372S$5$~#>Pf>Dd68-|Ma=$LMme`KU&HYyKr5`AKVCbwcyQO4E`AyJl zPx&BWnujsk89k1IWkUY0>?K7@Ea$sq(LP~`6BVB$Fv&|y`31|B3zbXrt{?TP_~~Lp zKn$6fdKq9 z1gl3rz)0wVPTlb!wis}}bvM-uqTA@N;ydE6*j!{$W zNx-^fb<5bn*rAA3haKoA{$|Qtbv)3r=U^G`WM_Y8QfAzE*!5?O}@iOtz#sHTv+2hJ?3Ln1L)wEmsuXp|}`q;ASBn*9&B*W+zDZdMr#-5VI= zo{SIMV_c?WFk!&NQitPZiNx_>V0&SHX=kzrZh(%m?WGIM!mEE9QVu83@mXPLP>aO)>-)e^_~x#3xb%-m|YV2go- zU}o-6|5eUEMC5@rHpf_?D>YZb&w&NI53E1Xg;pQC#OY#C%0dHn8Jt{I<%u=sFO5?o zCiK5BjVia`o)7<9f(B4qzO?2UIi&>Z)iOB4ME~I4GrAwTuGY|;=K9xcdA;|!7^^iN zE7qw}l_cIODWWY_KeJ}bC8N)XPgitck0ubg9}$y;$zj%6BQ zYs~gXK9b0-M&nLArqJrx2+X(d>Q|S;U>y{}5cOlYR*S7qmg+;7agz{j=dY!plPP4U30*O4wD8g{$uz6P z<@R%C44jr_POh-*-*Aqi!z=5Bd?w{C!yWL@7{~L5i7cd+i;YVDfDJbF!s}nX#XxioE%mZROP^TSqm>YUQ zlFS@YxwkL4Qu%HX5IhTLR@|aGps5QWjw~H9?6M%377j%?_G^35)LF@cjo$|Y#xypO zHrOsVnjSc2t2-LRpaJ|l86A^hhmR(m5hjzLp2w$EzxC6GI(Pj2O3m?r=76I|fmPY3 zo99=x6pj4>(cVAAFH2wV3oI=Y1uF2GXsT^mNom}eMOHYBu9SRRZ6`6QnH#mZbWH=eTAKy zOO9yRD0&oTbG2X)W=9e*wLA`-%>( z0`~#U~0ZnSA|B>dLL2E_lMTjkd$z zovOJh)ViWUixSI*C6$fFeUIW}^YSwJ6*JLgj&0%W7BTx)WVa|CrGd&pODYPm$;h5^ z*HUD^ekKNo$Q@I|ygJoZst#mlz*_081aSZKp zGI-Uk)8%vR4CZ?n*&$cJ1;*$MbgE#Ag;Q^Q2pxgI(<&^oqdt|6k-$94*O8Uk9M&^S$)#Z%i_4VBPJ{IS&ZKv8Qe?{hZ-COBoD6wp z{kJ?BPA&p@=Kr@m25i5P=cfObClmW|ibO5B%QdQSN9ii82x9ktCsOkS9$=S~Q9%l4_$L_wf_jy}jzN+`R!02J@L&yYSG|%JbB*vMx(PN%F zBLc730t?_@GB66KlE(u5oHURc7}a@fu6&K&W*zaIdc!t8TXp)cr_QKOjRa1e3s^t* zj8w`--?y<$w%KU5t;kE}ZeLO`hbhaF@b~A>zr``rW94kd2Lf1!i(C$;?UY3Y8R?W+ zl|>gHv+^7d1V$IDR^(OY89xu~+>meH=P%N=wt3hqTY=RsRZ&NB$!H<|jADgp3viX- z5b-H*q#V=aZ*^8G+A5<8H>|uerDh{7E%>SS0e9 zfS=KiaFWr(4&iB!;I#!#tAsNFc=0@SI55Jb`#GuajN6zm^x$DX+xXL}L%vf!mCzG_ zw#LI``JNVpjbGol#=|K*Oh&Tnkk4_bA54umN2`A?Ey!8%9)hc9Y?qBh#vSeo-0zq2?C87 z+_xI>X2#DuB*%GD#RwNWt$H_#K_6Ai$ZQe$)-sQEv2A>=YDFnM;8qsEdOIj*k8>D+ z&$IEj&BPfO$H`%)u-=48n_S5%?pGquQ3bn)J-X?I-?Z1hr0to~VR}vVj+DQR@*LE@ zEj^)XH?54m{k?t9&t1`Ueky5QxBp>EOWo39Lo#lPZ%n2W7f4%n-4*JuzOE{D)Lj!l zuZV$jY?3$M4-UK)lq{Vs&n|@z!D+}!GybyjZu?4d z#LUm5=zTMp#zm6$+7)*>BP9(}B-b572VxU&q!4=a)7Hg6;Oo4!9RnJRg);?3E?h zmy}8j_Rtyxed})X{ZbP1F(~lId7F&ioCmslPR0mN+5#B3c$*`MJTl)!(L+l1ileZq z_TC$dsQ;lTpBo@6B}b*`>#@I)Zp=k0T#FpKF7e6d-v+OPZ*+S#(UInDuAzW7qyHzCTvs*I`Q~)ejV4R(jxEJY>KQ zSm$&RBe9Bp9pl%*_`oZ(gfdL(QBLm3pNeKYd*8}r=8Jadgib6$g6?d%-yCvhldVA#aamC>?sdLJG4 zVcAG^yke&=PgHWZPiZpUD_5_R@4Py%eaex4xwUx*lTw;HRJcIdK@*^RL%Zsr_L&tg zt;kdsCRJoDFREP;btZDl_vB-I3crKsmY&3RZQ!>MrF-Q1=S}4%+*J=aN!=*C1H0J17Ngg;E zKH?mCD5xoHa7JHYj%Fv)r%t59dRR<9$KG-BIW&fafjc#)&;-X%Sc1j|^qf}q%#)jT z8wzV_aQcsZ)Gx#kLB1hkr?CEGZ-a{5v3~wbicowOOwOw>31FS0aV%S)cF~r*E?0#? zd=NIbbu(1hZXwO0V-u?vOUKlfZru)9%c1>V^AN*(sd;Q-_$+Iu$4u(r4hFYGbxw|L z;;2t~Xn+`XxwMU8)g2Odr+NPVCat$&28k9p;zByV+l)#v&!F7z7vSvyzTO`q$S$4x z;ZXM9AbXR}(;v_Oks2HtE8sskm1g*3;V7!h`N(s18^S@@Ck^h4N zeealt;XpiemGNPU!Ht;BX7^_Eh$nqWHg*LJg5jhAw#b;0)hi^hvxQABVqmAG-YaqG z+hp-=<@lfD(!1{fZiS{MEw?DjTQ|cjO{sqGduR~mvI;PNj4h`u{(h!M0c^0A8)Wrs zldvUidsf=1W0Tn_n#XswYBs84r6D_^HennG1Z~f18ovpCP+5Zx%`}a5>#LJ~0GKWl zHpSHjdEJdgSP!b{&LSI4moCPksaK!;ZgYlx-dt|!uQ*veH!r7t4OcF!xUD>{VpDl) z#rE<%vn;0KG4niw0$jQ7iDFSU!KqjEM-q3jd90dXst;Yl#UFQ}xz1M%CuvyhEV9De zaP0e7;r7B!Fhzi`{Cl-B;fp2Up2s^J+MeV7( zP|%%G?YpcH-(>K^dtH_kdS!kIjXIb1gYvmOa8?#mVHGMX);pQ{ z$q1LcP~K#6HK+~p%aI`m7oy`a@*(6s5_C1ZyNu^({Dj;J>7Ss1_;0awPI9%~A3vE^ z_c%-^s8~G~I;inN@;R2b8kzQW)0XeM;D(6}4bS?dPrFPfvIblDnKMwn3}>n5vm(wV zMU7<1{8`d2<=9ujE)ygdQ68ry(w5>(m4by^exE2>5> zP(vYIyf;AyaKmJ(0)ul%`B}snBojaUK9pV~;SU*45QA-xIvCf*-~%!i(;oX$Y`3g~ z_(bTaFREMBR>RPF-xUOmmK@AM+tZ>Vj+C`c8!&Gd!5?!Jc>{RejZCgQOKKDRB19a8 z*LRRb|83B+$fYaPS!$3I7yEI@U8CTiBU%E2c(0$%Q4{zJ(-8$v>OGVMa_^$QVx6IT z{_*;YqPmUdUJqlovHXM7LvU7;G!^^96oc~h{RSPjwL6rdi$oYNXf)6NB-fB!^w#ua zu5g~sVjfvRlDdn7w}-p1W5#JU2S-S?04U@I=tLOx61+Pp?_idw?Gvm0Zof_^L$>;) zk73Q(IB}*(d21=}mWwSPcX6SrLpehjqV7yoz#7 zj{BddMgQMvX8Dy^EjGQ!^y55-`M>k=-_vOOKj44;lQfJy8UHCoyj#?*?Kbr=5AN5; zzlm}CS!lc-EE$qpq91gdQ>TLHG{-S+pz8)2xK6ifbmP0TUedlKmh;9?xqpVrxlqPw zU;w!6qNvky%IPhfP#J2&N755y#~?mWK`^_xXYPYeq#Y&NIUK5L+wHHro46)>lN1|P z6aN~)o$uyf4Z#;>S?bS!PtN5~|9|p}@P|JMdzZy|bPVi5)91mpl|AmrE}kK9;JSVz zxUPf(ec#U*etO2F&x`$39(?y{qx)&&5QCej!sfb1=Z5$o)(_GCwxyYk;4kDN=W<<3 zBMz&cBuL%5E}gf(Y^AcgC~~c?yQX`Cr!QvRBCbYWC!Lqv%uaJWvJ0BnJC%FN)v2O{ z{}qm9T71Y=7c7H6O7+(={xsE(>#NO1@xJ$46cq1!kIWe6fu?xh+Z9G~o6)_^cv*4t z#UvT$k@(b;=~_#0X5!l|=ZIi~WLTpGBH{Qgo&?gSZRQswvIGt$Jpo zSuS}dl`S#XCfC+Z!+!q;N-6$w0lP1c3dueF8eU7K#6Im~bnaD2Iw&XkPo`&X08w-X zVqm(O8*nzOlS#h!@Ws?dOpWhnU}_Xnpl{}k;rFM9T>yMSz%Vhsn&JLx#)zo{4fr+d>0K(tTnQgdm^pe09`fQ@ARcLsqU4o8sEsyfsisJhjocx=uJAz zCh4!a<;Z>fHw2y9@B&pY^7y{->BE1RXv0(C+Ivy;UbMkK1FxBZAOMoXCc#s38viWe zTzwiFxKj(*BKU+Y<$VIem+s(X z@63B7-mXpKwDaaY63t0>n`NVDOxde=2F>dK<5dX^H>Y^@pBE{SmjY34(qrHW2e-RrBJex}DSUfWX*` z(kh=(&};<6(9;X$ig^hUye|isK_2Oo>K~M18>54U5pGokyyjM(r1N?7(YI80{-Bc{ z3Ckii60b{I-AvMpcVP^&;#jNh0<6CD3F${V`G=@k)J4}*7d>FmdZNs_FR?e3DZ)cSR>)br#H|(<4UJC@?4)K+I1$fzt4CyGTD3Y z*`^I+_oQy}$+5#VNg9OfmhNN9W=K%jshzUP#gyepU~sqtD`SLrH20~bWS85g+is>) zO&9OW!%GBBJiDxELnB;zNYs^4d;}2%O!bZFO*Jpsc!q+T72W$AGN_4>@Ic9bkd3&H zl>b`9zfWIX%Fujr)wJ9CzRVr=4-yz~q`ib~c)WztB>bb)ex&W0OoJ@I&4zchjI1m7w@!b( zZ!BYahEKsJI!j=~WiZi$bR_%Kk_WYnPNocdtRh2}_xqqGHDFoe)0t)Q>c1-ZrwJhF zeBX4@`A8Q9m&s=Zlc^@doPz-z+}QCC3$2vV~DNRMR-yryg<{dI}Us!OU}E(s4Sf>%25wc zP?Vz_xx+JZ!+ub%4Og>dx_im=1+$0b-fv37jh4VMTuYlPb$eR`WQDxUR72b#?0<1M zu1l3TQ)L+kzkr8@Psw7{kat3cjc5tGLo*o2I$Zbr+&3$wygk&9tUn|1RakJA#1H&C z=*r7g`dm$UWgm+4wA607pxzs`ER{=@&3l9y&`8STEU9$34)VTvv)7|l5l2&~M&o3X=eN<|Ja$lq= z86QC*{c*6m=$kDU25A0Z9n#@GB0~ae-5Gf1#ZLXBpv&9@i4AG2nvKAH7$}hjXIiVb zwmiTw@mA|90#pmHz&gDAC>jRhv8bXS+Re*!RqF!tu1z=?yG*y@aC-a#SU1b~ZwT`; zm85lBplX@Jsl$;|V5tT6zc9O4dT7L@gAJ9U`7j-1d@7Pvce|@ecYB_??pt8<&)~b2 zRiyzK8`+~J_7bQAEAt9Q^@(hGjpll!nT~IEz3)+a!+bEnlfW zjwDlScmlB0u2hD{^EX5@5Pu+79M2ahSPtTIX)p&Im4n;zZ)YJ6r~67a0lnMqN=gurJ`N|cMNvq zk~7mcG_Y6#+Y5OCz})ODQ5j1EU<}4m2P~o>6A(ueQK@Jv2lAjJsL0CaW$D-*`?utt z?(1PHOodwSrQntekDkWDxPP-431j_*N*YrledvH`NXGseegE$Xoe%_*{yx?(&@e4D zc_(!e9&Z)jNqxQ&jfXxmOKyN`6pZLvZxxsu%RJNUlC3(q+SLW^0y#l;MGPrj76iz5 zDtsjCTx-R6I8BFYp1+5PCE`&dadE7yN$bMKwU8^cH<=2hg(^OosECd0G?ALM*wkuW z4TZIZ4dL{-aJq{A!gXf2O}r(S_(81%u5m~wK82D=ryNNika{pKKwHsI+H~rYFb-@~ zigKZ>P)ob7O%%^2V$+5F7oVM5Sk$C+F%@`Gr8}1J;E?CbP+6@0;)2lfewUn&r7F<2 zL`vho7Jt8@U*tMVv_oJ1w4RleHd#;Xf2`*n$|LUS&e9j^iRUwjcBtnEg2}&2@%-QE z7xla<)^k=;b1Zv#8^or~3YLW?It!l-HF4hCb0NR1RK9sSf{&#V3zhD(Igt0RqyWb9 z*O~a+HzjBIU^eXxP|3>#@Tl^l?Ci%m?oVbVTVd*)oDul{+Ywh51iCMz__L)g{~6z6`NC~{8v;BE?s1pYhoH~vvJ1JLR8t{ywb^dU zas02zTJAUZ;iy@=zBJIgQDxl}fRmUCS>-&MFPj6s^HfN{47#rr5jZ00EAEM?h^xCQ z_stcN{7ZyQLzaXSHqE=Lo`0QMjMb_$$5|5z-(M#v4B9+P*(^%FhyG%TdW29GS?b5FkXYAfMpqx86W4w` z5+YCbj{RMCr*fWe1@8-Eac_>eX6_3k@lY6vmM{_AI~v&&0d>5$DfdkukPYLo zEQCX27>7HKo2z~KtuaBGf&p6*(^Q#~N(H-zC^ zL-7BHf`*-LR)>Sz;zaLWg1sRT~>OSH6;xI@8Cu1<5KISkv7lyE0uJrWBcn<_qn)z~y zF?;tED%T~g%UV}dTN%H+@~9FzoBl-o!62)~QrQ?o`&GysqF>-9Gju+gY1)son@ThB zsGqJ>qx~qm>Bh|6O>3GqHa+PPc>H}Pwc)w@a#E^gwmx_jYFc=f@%nrgA+!;P6)rV%*; zt@U#CT@q-H#dXp2O7{N4*-*ow{XsJD!V&qa4YqW{1$MSCE7)TL^68pO+c zs9yt5#0NAwyj*3Os(mJu*cGK$>P3Bh4UPrWcDYAr<&V+u=r(Q+~T#>&~wYMu^#vlcd_|#710nQsk`3 z$Z-*`{NHS+K~m6uV|`iz*rHhwV)7iGXYUa9I`nwteH%9pNnF@#HG1Gyx78i^5X6& z_83AfxYWje_hLL#wg$vzTaHF>eF7B6yn#ptpZ*f}!t5?(LFYB~Y4VhkvRh#PDo9_Qpw+CeY`v+4>s)u9rNl-r=+YVyc$m+KEJ@Dm!dTg?r}>krW9mYpTknKcohN1 zbGEd5R1MWa+8QKrxI;6+^*-_Sy9t6)9WGPJ+($+vF*`%B&K$efw@j%3j<) zMci(A%7Mne1lfbz@pY^$5KKwjzMJU8mVuQ>cx|>Ts-Qg$IQ~@u#TnuF-oOjN`m`x2 zph3T|Q6U7;kQ^DjlJjaY^X8m5_3lq{QtQ_+WzPh2@^CM=%onV`F|uw?Nlr=QJ`|45 zSxkjn${r;g^5^go;$V?x4e!qkG0oXZ_r)w;Leb?BUtG#+iN}v{Qgil)EO#&q1AoMm zJfeWOp*0Nprlw5W7!6AUon&V2hyJv>Hj>3lFlqKu zN!_Szuo9o%w`_IW)7S)!=I~vaD?_sUeH4p5;E62vi7dGD9*XcrmFh|*s2oU?@5c|G*MYY5WeFdk z=Iwtui|?XJ7CoDFBBFYaoF$8$%22i6`$D1xYW1R4KMqEpnXLAy%;6;y)!rPg)`vQ0 z4n?@1&MG?_MUP~)M^vwi=({>=|L!dJ?ySoZP12M(nh{OiK9yZB`TlvH4};$n zBG&IFq2HT1Y?y#PBMkk1KraFGtyu#HXv}WNTEu6uQ@f(zK`jEez+BXhBZv4q!a!@o zIIo+8x;k?>b^_|OFx1-swE|FolU4S6ToS!GOY~Y81tXzngZy10$dmliFvx`=Ja3$Y zcths!4~B53MuZ_Q2E^+D@#d_7Cg3UID}Dy^mM}~%4AT;VdEF$;qRiocO~4$dS7$I# z<^bkmz%0)i*eJrx`x(p%5oRZ!8-|%0f|)f5Q=d8f#stj2hhb&{=5oNy&lZPvj2Ag;a72RWyN5ejCCvq3Ql zK$1D!YXHNT;^@L#IAI8JS?)Lh*$960R*9l`;@+uj5iY~7+GvWQX{ytQ&P#69;f<5n z1Wu50C6c;h!Rk(_PJAPk)80zcCj!%FU?H@d>7bzPADNru2MfH3S>5r_URE!ac$2d{ zYap;Yl1gu0fNcc?i&4tSuC-mvbk@vpdd4eioHZufSDEZ)XH5ZrA+urwyN# z%}i%aKL36uj7_T(rCg1k6XedC^oE)Yz#!mm2QB=6Y!{w%j16Ui&8p!p{zak>x}hgi z)S*2`K~abHtYP>T!=0fur7ldwKWDoCoOxM3;(2CB!OHc=N}Jnc-pjwak`1yCb?L~*QKkO1qZF5Ya_Y8h3v8OXr^mQa##11CI-S;EOZ~xd`#?< zota0Ot|%Q{ua68(1ZuA7qJ2P3fE9x`Z zt4S<-^-(u#_5W;$4< z161T$Nc;4RPKEfcl|*6|B)I8gOw|bbt=5^ljJP+{uh4GK^e__dJJ4UK@4IZ($km>y zrm9RkMwebPRzqGBNWQxb_x{z&EBG6U$_th5%1p>sb_(=eZy3IuL9!1WgUQ0ZaCfHr zo=hBCKY1SKb8xZ8h&Hpc83FaekZQ%Zvl;75auT54d(n1VCQcF6cYOs8ppUy5%wJt8 z=ZgpuI^Bp)r#Au$C@l86$uN92Bi!pB(&)khu{6`YjOz3Jb4W3^w*)MztRK(im1c5` zq-CSmlZlG)x-bqN**K$khER5h7Lp#hH+a)*<&hQquLwR`7Edipp+MhNhT#FRWj%6! zC{z(VHD8xG^5jLxb=PGMoCq$OlZnT_)DctEwd4X}!_B$MBPaQ2Dh}MGp#d93K@oMC zVc4IsFf?Fa3PWVhW&vVwNbb(bEPE~}xoS-b`yiV%b_c<_FT~z~*XIV{^);30`yyjl z$Ox+!_Dw>WmO0{8U^kbNIp9Ilw6WCo>iAK*uP4!8L@U)vFcg>Y?@17 zV)yrq;pPeKc81`dos#LEl1Z+)J;Tto=^rWq2^)V6_!y7gw}R+F!6Dbd9a3U6Z2vSq za?dYX>TWrQ`~L&teOWjNrhI%T-xca(IAvpy6_&*`FSd*zr)UHRn6`f#FsJNkl7a-K zd5xrQIGAx7n<@-wPnx7|>CNh-Ab)^xBN4pYKq7cA1^b@K7`|zOD79ha&luci3?trp zC^(%Zq+^A@1o8Q?x^D?dXtP4?7=Rb(DX4b4@(Rh`RPVz#iyjtmj!5&!jdT7U89zdu zSbZrHJ2M%-jRN~$HMlzrxG3x%Fn9yOzE=!q@KSFg4)aXY$pTTSI9Q|pEghF{rtI#A z40T6><#FFX$8RP4&;$2|dcZ+Ju?K#eF`PBg1Ez2z{06t*0A=S>(}(2xdrAy(bU|8^ zkNXwC&X>wP``x@wk8O!z|5FCcK=0uo{k|A1gW)=C_10~uiOG0^$tCH|q8Pnbg}>&S zYfQ@xtm3}B&9N5Qy~CU1*YWp$u{putr@8lRkE|Y2!2E*v5qzUZp515|5$?c@yW2pQUj2RfB0T-g1kcACCjjYb zhU8Lc_?`4V17>dc{g{6cq_e9<#5NpN0@4}-U0;wGhO5sdiooi$0H#h#VA&10+1F9SuOxa2_i5U+iX*r4$}k)W!HE*#$TEfx zOu~6-63%SE`5oZc3UMQ{`0jAm|=Vuxm%?`)9U8@`$kF@jW zsXXxfC@Usj9owVdl(yyH82amdxlREcr1nLZhhMUs+ z-k#`(hbacV5C=G}Mr@bZs~T+9WeFPw(mj1S_wHZb$6rHD_niC)qyB{zD?&5^ZhZvs zH7eeBJbifMByRVKH6Fq)C&L{9sJlahrLMfB;n`qKT{?y+r@clTu3-LecPqK)%D%6 zX^hcnlg~b%;eI&-`Z@(nJFo;FrMcvtiHAYO%)L`Xm3p6@3a#jtuO0Qqs`{A6u4Nrd zVv_3)FR86j*=u5JwJN(d_O=%pMWJNV^Gsubgs&Cbb4&X0)O2&-0zN@(4@SX_8T`$m z_N+vE77#)l+H(`ygXckuLad2+`$3 zkuJZ>m;}NnSt4ojOUrMVhNujl4V-@@CiMU;x+!9EH`F2IBJm4q)T~y#;WqWH>71~ zN;Qsj_(Z2kfp6;CH5!ax$6TouRGh1Fl*VA>u3r+vrXZrqu3@hq>9YimXnJI!fkquK zqjlvz{v?r()|Hpju?)OQp}u4K;Rbz}XWUCM;`;u5`iL-q6)GyDtl{{R_}e0ovE;1GoGT;ylLzLtS}@ z_fjT8>G5WjZZ>JKF4Z8)6HMm)IM z6=}K3kryz|)E3NS6g`sO=T#mdaOhx?kDB*wuuW?k>@aKd2TRP_Yt?rd%-RCn1wQsR z%Q{})8o(7{W^gmixQ!2PRd=PUU(=0Fk(9LqM@hZmW{;o%5bq)h+e{Vb22ESiVGV(A z{gIp0_kF{cQG1B^v#1M8DAaeIe)#jWuq68xE$|TKcci;_q>ntQ9um9%Lyj&>)?3J% z1;L+>UEF5+$P7YjSYIB`DyfP}_@2ezy7Zvp7-4mmAsYyA*ceH8yE!T&i6- zxpbFu(WZ2^l0SjxFl!}2Mn^fPV^+DUsX&C5s?M*b?)3BAmR^e(sf=F!!MV?)jl;_*a-%0r~ zix$&gOcUAD$ynIR836hzAa<`*B z_BAGSx1(Ftl?t0VUAL|)uOk(YEt)&>kXO9#0fSb$>v5J~iS^nf8oLJPlnsJpX`I#- z@!$(h3Rl8|-X`_EWtelWx~6*9-S$^BP50CeXmIfprc7CBSSxBIN9Ea=Xas_I=Us;zegZhM{?NRuo*$dsi@s{a;sXT*K?;Ib2S!;v5?NEG6A8eH}` zXzIuLG0i1-^q8%@UkvpN-KQSh$0t%cA46gOO8Q0WchrUGpZ|xjZ-I-d+WsGgVV-ADUW0-f95@Jy4^RWm zN=6#+b+1f{h<*-Fg5+3*Jy+2uDWGUb+hwuc zgL^O02I;dNbhy7ImM_zZj}Z>OwZbWR>;@dV(&wuXz_EOCxcC*}1qd~yOeWjgeu-iw ztlZLL(0atCRP6u zYz)Vd+JBT{)UJm8d&0%V1iau-SmI>G9Yy?F+)HmD7H0^)83HbZ^Lhf$*t48M25tZ3A_1py zu>=mX7S31V#{{oh@qG~Q5*m%|>%{{6Fa;E65lxgA+j7mVE!qw1Q+%%xnQKg3;;@M2 z(^n$xDf_)!8^j%lXQ*P#xMKu}>-QO6Z>My6Qq<|YR>dn@@MQ~K-cLHT?m9bXub!i6 z2=|0*>gb-;RH`h~xZ~ihVw(yrnV=nK(EgFqc^`vD^Y;TPxIut*3G?nCfr9hcMw1P` z7)@}d0?rumfC{G%!D(V}_M~*q>xFZV3Wo!nuK>p?I6j2KWF3@lSeGiyyumE+c~AN? zH2hw1gAwU^E?U$H^(H>g%VW)2mdq`sh+gj1&{zthp0xsZ0|S6?A=p4R=56bo9ZQDh|$?x4q__w4c>=FaiySJM!j}tCJb&>{m{8UX*Kk7oo$egKttD*L7 zp^Sm6rAH=<Wx?HJ&Jnaz~O64ZL15SI%(t_+ZnxBLZ86~ z`>Av>J#>bpv`i0`Hqe_3a%z`P%XZeUraB&?J$fq4_cG_~J}DNe<+o9J2P^+A-!dUo z{wJc-1s}?raBoy{W2#@Pv2E3KKM;5uE!3X~CQGSVnJGLUcClqZS4%7zSGDLek~8u$ z$}+^UQDd{l7L8ru{U#Su|mT<(Gr$*ocDdlgQ)4a@C!eD*$APthr9sdRG`ZVXfy*FnbO%D0(x8p zTAAuw2Dn49uNCIlxydxFl1JcgZa5t1G5b!^h_k7Onp#G3=0MV%Bjdy#DhoQ#CeYpV z(DD=C`C43aI=8#f>cB+Kye5?!8WJ(i(isUiF9?>NYEb*E*$sgz(0ce3t*t+ z8L1o2@-@-0Y){}X?k(@yJHK^rNz>lxUtB!Xb+YwP)0Vv2qAhSz*&^0%*y5{|rL#S@ zHNS{wRD{Mbetn-|^fuq=31L*LVw4ArZUshpsruunF3?d5)tc?vPvV=D!Mi@mmzv5H zjcxSI)Lbom=W>3Uq6S^1f*FzO%St7izT3%su)vO!R(0MEn=pT6-XD1u$~9fb8Cj2{ zaPc^^TZ;4Ny`sOx&F9_gDZ15@x1ge|pR;U$J#VGhp9svuYBVp&SvIJm=nko_2WrS+ z5wp%{^~su9w!FS_63jvb?VMQ&W5gF2wiqT?Q_um=(NoK_e5WJS+-WMFrc|E^EiQw+ zyWK7w1FzvK0{Vu&`+|x-&WhIXojIYRchDQmaTl(o_`Xg7Q*`;<(pWntvb+ppGsPx9%IhSWWLXEd+QEB)yW2EYd?z7JBm{Kk%O_elED>Z5a6?*eE~qMUehs zC17k)PQj$ySA16ahIPCUF$YmO*cc28%laf489ga9hkMH61Iv4gPln0+Qm{yHA0`-{ zybeB3e)R1l=6CQ#Z9lvx`t^P6wP$f|E{5Ile63y|m}-WR4kN+*JI}gaV3d z=D?Gj56dNYLk%$>=$-sDRVj6rdZOVMrA2U;^}CMlic-2f>pt2^-3JJ-&4*fj>~Naq2ryN{z9h--f@YZ0xUjw#j;aW7Lo>h|;vRhD=X5 zBP|nHoe!p92WLANCYqXZ74~ZUsDB}oLZCb@5$oK6fO~GP(oD?jH0gw`DBGV&G|A((F9P@m+yl--ARYLjR2 z(3MZ?@!gRUnB0?hX9`Y%ibwq{-=2ckzwg0K!^vZ)b&j*R9&(aaiETZ>yAoH2$zxLL z%=aFG;q6u{(N@&t%}Q>jPOibE%;6WNhqNB7x1NGm2?@!>Nb;=XkPK8Z9$bN3g}4hn zPW+MRqWD?=#fmkpBN@+(HhBuU1UVtavp48*rTJT@x?iHfM*Xyh?!r^%1lt$7M&2_- z<4M<}?28G;Mjl?JB}8v+YF(~J+i>{=z4D~@!Mn@2Gh{5^(8vO?mTJTZVnDn;IihOB6X+!d{};UP3%<)2)Q`yR zzY~GZnP~--*$QVK+aS~G0$L=C%$OZr>dn>7KgbGraVJS(Uo=|ah&qabt2Ig4D zzr-NBqatN5W+wIhO6%qWIt26KPQhO;lX41*;*FK6RpA6?S*c2#75^~kfbACI zQTSU459uKlbz!=d)hGSl+V&K-H4Mq$5feX?1VHMGX;!A0VpN)j0+5f`B0zWLAgvU5 z*{3O6M~tKd%a%)`>t5y}oOWCQM3ucC9LtY?iM7KWv~FI5do9t!Ahf~@Qf#C=n^)*A zbyMubQM)BJf zLJ7AMaeha{fz%|~p~OX)>n3V1bWZwhm8<1MBr|f-ZIvbL?V!qXIUcWU zayYNoX*88Jaugm7mGyEYzi!hd$k(X~MwK7PdVKjRCq26Ipd5kZ#mW=17Qbf@bENW; zd_8$x%vN zk!N)vA2Onw@sEtf8NgSq#gilCe<9mcWDB5=^!SWITnrUU35_S-iand-Dr%Uj)NsJc z#o5eZ{??^p8==S@x8i}j%h1y^ZMXn+i|+6tmbauFA}r&;BrsGo5} zt+h>y+6fma(dsxCCfF5l53KR*+a~g`-LJ6Bs>&s$>e4rv#xQ8LidJgKbwyU!zuSuN-IUCV5;wc{ZT-yJp2svL8S1KTdgtZcYh1^9u)l(?9`d zS=IJ=(CJFy!cl+0{^2EA=O?0&pHJC$cho^$=`N~as5NmE7Kzw_H71K%LJNau>@E1k znp4!2jV8h>vUCL(QIV3m>g5@pl$2)Zu=YI=wWgeE?n5gRhI+MinOT`MzT_XHy@pFR4 z#d`;Df>DGb*)MTtD-fp-t2^cS-&E_*gOHC`77+|%i0}yU1;Uug$`(!0SA+HtE`<^J zV=wC?zD^&fnQhn7dI#xsZ1HLCCQ?URv)+SH&xFAc3iYHu zDr*KlR#yb>k2$+GT|Svq7c0M!q>y;BReoKaBmzI)s3%~to@!D#dj^dgWj=C`53&1) zp;g9*oIN_yb$s8EG}qtnT9Uu}K$CZzLIH=hDLRtdtw0GxSuyI_2O(Dl;(nKt8`a8% z|Jer{65q$VRWc`r;3Dh8VyU8>#1Rzm4*ezV>~0NF1>EEy0q!G z&%#`-OXt6sBtA&}clKIS>r}OtZmw-G#)w>_md>?S)A~YQOSGoi1DrfhMb-T&*V-}w ztpOzZL~A`J+fD!-${cuulUJ+s9c`_K!-Dd?E%g0$?vziTsj0>`rKz=&5haj@0jrQF z%i640C@5HIh!DgPR{c9c5~2iOx+6r2-Z?@#%BAzJu*6(#;iywtt3C_M%|Z~5JE@r+ zSf}FDfV?8niQ+hV=gmLLMRVo}{ztqMRQ^4}4Wq$ePws=iG_rm#eotA|Di5io77h_# z+ljB$vp$B=K~9;v1|SAP+v~yVt3e#_snmFdt3DQNYsKOM^3Nk3Sf+JKO%~`t29F7w zl+~Dpi(Kjl0^URBdAh+{`|*2!hF5k>vC;fuT!bfCTQ&2jA3OOkBB|r96H2zNrs+>+ zO|Lmx^<+d^gx1z*^rva-&Gn0Gqi_OO6J;A>*db}Fq)i)>!yZ9abYHDKY(qY;d!zH{HC43TjFseRz5AOUpS|8qF ztRH*mRkZ@-#p%&|!950XHz8E%s_w$+l>R-i3@!`YW0)}NsQ4m%c`xO=3HGCv_e@CH z)b=LrLElRW1O3|RTiu#Q9()Q9c8tgI`V~` zAAWgsE1!npugptdzyY(_yt!1{yEb+Y4pxuCkss{u$7#5TX%VPzAC+(aqVljZEB}N- z)k8FzgZwEUx10ED6*yAdPrcecxpGc5how33oqMy@6P9?&hcH2nS>$gg9;cq#HS@&; zhr(CHju(UPoy6`*LFn6Hb(CgTKJIUJN6ltHuXq~P!Br5MM*mO`~{Y_lkNnojP|3-y3nb6Np)8xdaiPNY>%Gam3>b9V! z@-I-1DleWS7TrRK(s~wWCr=Obq>vR&VMN(dnu;dLxOKTI|LBC@N3=hkShLX^RyFAn z+sX(IXDGK!%9~WythaBwgi&iRi@*sP+9*g|Q%YLi+FKG4JOr=VyXUxu^_U_k?M8qS ztP|OqXFpd>OCaQ%l!Z@$YHt23p>>Csb70$Z;Olqd9bP#LJ>+ko;!M0i(b zX~bWs&#`rF#zK*!oVz)7? z*`+_hVwmk^8p-|ZYicy{Mwy02*Cl$q-Q2LgkuNkCE`X?fG2uRzUWqi;bQmdG+faQW zU;Iu)AvU&!sd!(Q)rjltCedZDX9xh0xfU#p?tWDKJ>dp@!@Gl^Zo_8n-aA1Va20Kf1*t+G@oj+r^c)*pYwsI zH98X2+9qFbijK*q9oV?TS$hYLJnYXkWBZkz5=$q;TJdG2HG10lG-?$Xt%aj0(pNUh zPeT~2YmNNvI#u+LPW)gtbIGE;AES>HqK^oh=_#W*?bsDrFAU1iWyEHro=T88NVj!PDSsY3d`>f#jgNE%8ezNYl7RvMUtuTSU)OxyC$t z#xJ!@nu1`n_zj#@!Z5nOrcjNKQokYmDJ*BJ{}XKcCaAwcH_Wk>0;3&|J8p8#*(rU{ z6IkZk_G>-Iy5Y~Z4=#M8JXq!Ti&9qk(p}u1a5sW}!d!+H_+yAka1+*gQhA9EB0oA} zE6gig8ZnO^(O!h$v4f*419|wn)J=cq3iNlXGy#9dyXkLc;7;z8U%Hc<;ukuBbl@V* zyLp31hjnCYqT)=dk4F>bNzczH99$faeRCv{NM@ygnK zxIhG!a%&FwkEgnq!hyfx5R#*%dy(8t$^5_)B##_Az|Hj^pCK+y1d>f&SS$FC&*kQd z<@D^)wOeL-@)vk?9iDvmG(CcE(xJEiWWC=NhJfC%y{BPGGCFVQ0A)>%I{_h}GGuWS zHG5|nU4EKHNpU3omAeN%q)4T}JsdBLuw9Hi+Q$Oad@CXmXbP$D>V-Lmd326+<=5Oacn8aKp@=e7#b0hPq@5q;YK+ zWb*Za$m=O1c`QueYG}*aOjqtnFL3e?1L-ZwGNymN7sgr@hQxDlp*an_HAUy?4DQC1 z(O+Co+@s(jB$04DL&V4OOqF?iaQ!sZ^E+;uHhrS=cx*;~)3I1K5Zu!+*ixI0r7CM# z_f!nG(M`ujE2Cx#V*i2>@=-W2nRBMZfv24d;`jwNKBXT*Df0{ZITyt9;S2cu1$?-h z&v%E$Tf92n@XN-VP1#op_|=L{gr5GVpyOv+C{q9DX>y{WaFMn_=THtM9Nww8&(q~Z z--d&HRj-PBCtJ&%ua}ch2BdvVlEUJen)gdk+(XaeZu*O_^;8dq?|_^y*RGBpn>>Hk z(X6cl!TKX-dbpVSA+YC~~4cXj@C6e#O01m-slVzmERW#Il-R9!&0tP=wESLHo(_#$?z- zkW7L^0jY|qfOY@FX)(;UGJ-~w@YsE3BU@2)E1fLJ^>s^5fI&f`7p-@6j7 zLNKY^)#xf4?#esjDjVs_JMJo4K>4FMEbs6SKoo*OH+jcB`CM_y#+m% zNr*!m+Xm*i8gwF7XZWf>SYvqBsDT^3r=5GJ_uW!8{mm-eK9oZ|@A95bSXla^ID`#= zvVr42Qk2Uta`VjN4=V~`3gjQ$?q@q`s{2XFODqy6~ESul6 z5S0n2TSK`N^t{|-rRv*HEgcam*3xEfhm`I;lQjKxIy_J^2zz^Jj^eu-slI4V4?Q^< z`>J`0z6YVGU$#)5om5+26=(Oy77)xCb~k-q=zXyY2G#!LDD)!;n^04F0+Y6Qfp`}n z61J4?6yKo-xXzai&(1rN^$v6pGZejp@V%wCox;qUQns1<(xUH+@tFCgl1ch2 zXE~YqC7a*^tGUfpmwvn|tJYkpq zGi-v?{;t3fR6qq@v231+AWkaa)4e<)E$8N_JRu#p!4rXn;ECjO=9^i<{a2Db0Imp< zPb^TXbo4SqAQ{Ns_qXJMkPBseQw6lk!kI;m1_qdH=Zb`d{=HK%mP8}H5)Je>n;)?=D>s~ru=67tV|Q%Q zwqcfH&*HRg^Pn_epmfzgE!ab5AFH3I%RW}__>86iXYxQmnmv)h3bb1`dTXANtNh1O z(RA=Lt67nEZY)m>!F{IU^Rl$m97J! zc}@Lk>zOjZ6^54TQ^P?k?qf_PHbC1H7g?a%bKu(+j0mE9uF zqLz?TVSeTJc2^n{l3)OPL*Dd6r%NEYMcZr1YjL`UQ{u1{eoXY5mXgBX&<~AET$lpy zA~3cgcQ*1R<`VaLSZ1Fbe~=HUQQh;1u=usHKox|x4JD*ufwG=?6Qo{W( z=XVK8I`E){@FpxI$mQp0jvxP$S{E^P53~d7<1h}wy_HU-GnJE*fE~LA^{X_LOFYTG zOrC;R_i?fv4WW9a$1xU{s)sH*CR5n!6_)mQ<#B2z_hS~E7~*tHA!eY#f|Vtm zv#AAzu-<~gpDebQHEKO8(55t}wqf@e`C5WnU-eD(UAK@7WA!buoPAfmB~;&|mNrBd z0T}ugD7Waz=wJRBFy>N2Jb*D*sl&~4o5yM8Z$sd#6!252X-S;-POJzR`~~O_Dl06o z*zUfHeV@Gn4vT69E{pAlTksuGLr_m|v!w4Vw})ezUeIoqfwOmQpGOtXSEy?74Dkfl#?#^mXl^%j@-izB^c7RXcdUh>aMZ0wk$>a znchh#QQIIDhZa6|4l`|w9`Aui*ORSL^CgUAI;RQ}vh#XZGN0pfiuj0XR%Ghjz4JwlUVs%Ex;P%KJWBPFH1g+BQ&;%>@>(2!%?{51j zSb40CB5MJdL#J`LgNRO|Hs4OoClGl^WFirm5W;?fYI1QWt)yqut#*zTL49%1F*8^_ zL+uCQ4oln8Ae~EoNzxFpY%pmf0r?0)$@W|qG?U8m3i^#LLhEyNc3izo@-1dEg6fUU zvzHk-!{Y`z3w(8)3x|LOQIj1wJFLwTQ>i0rvKq`T-7TvY;#QKXrxx~g<=^7T@0+*^ z5_#-`!hGB4U^ZOQ>Be55E}ZCrPWl%`L-|Ax%v+~wG&NA_d#KdfHD`eyL#lNRML>V%Tmsak^Ot z${YFmvKsT`#SC_bd~d)d_Z2WunWVW=@T>uYlHp?io}K)us4v0vwv zc=4Bbq?eg}C;N+bdfj2Zz$N&&gf9P|nKmG><4zg_yYituDTvFc{0LjXVHo#}3dxoY z=g96)4Vz~ot?q3aWl$)XJ`;5D>0nHo-dqvw^d#$6x~t@5e0+o z6~5uCw$H5a4O{i}pVQJ3<+9FKY znq}dbuzQC~jM|NXXkuuI$ON5+%KlNr{@5nMMv&>Zy1W|sNdMCvq;_Pc(yIPIZtkxH zz{GoZ7xS-Y`i4E>*-)O}6MMT^d_bW(DJ0dqOmfXk=}USEabJJiMV+{}e_C`Q{pIcA z-}|R!kEg%(Tg5&7)0`veuWN|7yMJ0mD*g2g;qo z!1}WoUn2Y|;(gm`O$4*fi{8FnEr@d1Oozd>DySRRw7DkLo-j(>K z+-(xBTs+26hp_hJhzwgZTwsG}NgwdOC;AVFl=KL!No1gQz|YReY317fe7>eOwsv%F zK4P&wUAw*ZK<#np^=Nq6Xcnc&CoUp2NM1<4jEl|R3iG(aYd0bQNmH7+Pm^{Z7roE(NV5_C)^4YAKh%8h%5wYT z5LT-;k9WF;K93Mi-e)##wC_V`*0KocT2Lv`@_L{J60+lW zwl4M;Z;j|MH+jW95kgjc*+upai&1VriYY|>%IwSN|9RPKMdDr5tV?A-7qv`?@BEJq zM+6it@JAco;)Ec%zc0Bzg12~|fqC_!JN0K_lfiSYG+kP_Gv}3Qb}v?#8gUfCcpRZR z`qvgAFyTmgtSPE5YZ)5fdBz4MlWC7pyg(q+Tbs@4_6wH&KCVApsKdLw&v)noWp}on z!mwKw?t3*}G!jegjDE=6y+#~JkjPb{ryou-66mSL7T@_gp-Ev5+Ep}v>gT)Kugkl= zLo3X?6JGleE-shO?y?9En7Md((J4Gw*fftUM90~`Ma27ko|ZA zLTYIz2#>(30+R&sZ8mQy{v^DKrz0V$Gk6xKjNB;c;~@2bwhiZ$5EndWThkLb8MGzz zG`0qkZ4DF)8Ah`89y@bi1KTWEx9KfF5I(}*BJ3$D1=ujQypuYcGcG(yN(&qu^_Z2L z$=G+lRs*L27(ZaY?5?8wuMu08$C*#^9&K@nMtqB!Uz7b<%PAQN3>3h$^QNTiq~g)h zJP>cv7sfcfpSyIht|x{6+d+g3Lin91cxQ@#r>b|Rzz7wTZY5ASGTKIjK1vTQM{J$< z+HMcUY*?X^+TYLj0!ZBk^K{3Zh|i}Rz$pT3fG+)h+eXcaiJZlMEY|%)@Zhl%n=VaE zzpZR@zoUORdU7LYo%M?OsjBa}xT<#_IemI%5|X&(+a^BQuc)qHm8WlMjnf;pZmbsC zoaqSHF;8E7#!yt#?>t{Mo$ovNwG}1D(nonBgz}gP{L$hX{e-5x4(*{=KpU}&no?XE zk-o{s8=6wWT4VIsUkbC#O(~}IQHA#pIZUy-U)#h*+qQpyVj|&(Dt~6b}sGb zyQiP~kO`D1-g*`A0!M>fD&6JS8556{d~1rySK2S>V$$UIP9ATL5MDD;DDkVH=l|eT zQ~y#>lfJ*W;^*|3rB7otKt~Fn6-{2e4Xg$kQ$kh^v%hsB_RGtWHFn#C&Z=*PlQx#*DvXPam1`rB_eL2Xz?!<+*Y~|==mK4|@<~&0auIQuTWBX2%n_YL0vYu zN3Y(|5wZ0!j6vwqfwQ|T3)|mAIN^JQdbVDri)kV1g;oyA1qL@3a9!Ro?5Fo3$ok7k zs6+a~QZl;y>6-k~S@Ua-!a4;Z*iBWNADKP+DO{0!(E08+)2kn8&t1b;!*E3BZVna? z3Bs2f?e*=C53HreP+E=;JYx3kix)-eDK@tw^u1jt?uoCwTFb*a#Z~LCz36d8Z*;}h zX4CXc<@~J^#FbRS-#SvPP!dVvawXAMT&4h{yvbo%)8jJ9?0|e&4*QVslqHH$)H%Yj zxWlsawN2g_-+gFf%g|;M_d+K3=ei+>^L9OopjuV$%_>eNjTRF+xVsybF^p51gxbt&_SLjna&=_EhR!cPa}yC2ENq6|8KwlJVF^9 zJD7f1nHpY^yDR8T4PExA(Cq&YYq$z4wii}fsx@sif>eg%%0i$r@SEIl$mGZAdvo|S z@||^G3r^Bvj>kNgs}|SMZ@Sjj)eXG*t1q+YxB6?wyT6_v3h2wP=7$R!@!MGWHd;!p zHj3Za@QWzgoZ-Qi2QOe@Te0oZgPpZ9DiA`osAk-Q<5ncczn1l&Z$(l(yxMT{ z)q@*+{o=84M-`GQSZ&f^=PQ0j_YPw1^(p;kwcCKnSVF=*ha|=u>aB$0StY@VXDG2k zAAeChql=H_`gG`_yH^hA-Q~gJ$;NC0v=5nMwM-r9ek`0yJN^&1;f_}95ezbM@p2OiEVf+3a*^6Vij@7bx_pnP^vULKW;ASEHk3m;N zpXP{FpJ|%}jgsr(VDZWB?7h#9)hf+y`5?A)U99+⁢~g;`@}$j_7kef-n|n+x8~V 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%0DpqzB-=k&}xAxvMhoa~nl-Kkw%12Y5flVZ#9X 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 z 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℘@Yaq_ywM+j*;q(7=s%54Bbn`)H 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

L7Uf?2EdVN&j#UV_@&~*{6)#;Hs^u<)Osk*zD1k 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∓fT8EaUX& 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

*w433-6FL@9g@<^X~^R_U$e9@&kg2 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

m-*EUmRIuaE^nR{!1bODw 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%0Aps!1gN`6N$Y&?wl0OVPSY-b+^`01J0k|PA(Owj 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 YV%f`WXP;iU^0A)vJr6!rc0}}l09&126#xJL literal 0 HcmV?d00001 diff --git a/iotm/esp32_4mb3f/400/littlefs.bin b/iotm/esp32_4mb3f/400/littlefs.bin new file mode 100644 index 0000000000000000000000000000000000000000..af2c5ddc58dff9946745ca0f69b0e8d059a662fd GIT binary patch literal 983040 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�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 z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N w0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&Ucv%ble+iR4s{jB1 literal 0 HcmV?d00001 diff --git a/iotm/esp32_4mb3f/400/partitions.bin b/iotm/esp32_4mb3f/400/partitions.bin new file mode 100644 index 0000000000000000000000000000000000000000..92742ca82fc45e23a342f42c0ad62701bcbfc04f GIT binary patch literal 3072 zcmZ1#z{tcffq{V`fPo>etQg2Z1*-xW85kY_#S|DA@=Fp^5=#cs$q~| zNGvEYK#>G;fbxP243aQ;Lri(bCI$wOFh4_aL1tPSniF2X{*MB5*%;&%9d@_9a{4^a o_kU$7isUF~Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON0B;BY0GEtipa1{> literal 0 HcmV?d00001 diff --git a/iotm/ver.json b/iotm/ver.json index 06766b23..1d3a3413 100644 --- a/iotm/ver.json +++ b/iotm/ver.json @@ -1,5 +1,5 @@ { - "esp8266_4mb": { + "esp32_4mb3f": { "0": "400" } } \ No newline at end of file diff --git a/lib/OneWire/OneWire.cpp b/lib/OneWire/OneWire.cpp new file mode 100644 index 00000000..5312f51b --- /dev/null +++ b/lib/OneWire/OneWire.cpp @@ -0,0 +1,604 @@ +/* +Copyright (c) 2007, Jim Studt (original old version - many contributors since) + +The latest version of this library may be found at: + http://www.pjrc.com/teensy/td_libs_OneWire.html + +OneWire has been maintained by Paul Stoffregen (paul@pjrc.com) since +January 2010. + +DO NOT EMAIL for technical support, especially not for ESP chips! +All project support questions must be posted on public forums +relevant to the board or chips used. If using Arduino, post on +Arduino's forum. If using ESP, post on the ESP community forums. +There is ABSOLUTELY NO TECH SUPPORT BY PRIVATE EMAIL! + +Github's issue tracker for OneWire should be used only to report +specific bugs. DO NOT request project support via Github. All +project and tech support questions must be posted on forums, not +github issues. If you experience a problem and you are not +absolutely sure it's an issue with the library, ask on a forum +first. Only use github to report issues after experts have +confirmed the issue is with OneWire rather than your project. + +Back in 2010, OneWire was in need of many bug fixes, but had +been abandoned the original author (Jim Studt). None of the known +contributors were interested in maintaining OneWire. Paul typically +works on OneWire every 6 to 12 months. Patches usually wait that +long. If anyone is interested in more actively maintaining OneWire, +please contact Paul (this is pretty much the only reason to use +private email about OneWire). + +OneWire is now very mature code. No changes other than adding +definitions for newer hardware support are anticipated. + + ESP32 mods authored by stickbreaker: + @stickbreaker 30APR2018 add IRAM_ATTR to read_bit() write_bit() to solve ICache miss timing failure. + thanks @everslick re: https://github.com/espressif/arduino-esp32/issues/1335 + Altered by garyd9 for clean merge with Paul Stoffregen's source + +Version 2.3: + Unknown chip fallback mode, Roger Clark + Teensy-LC compatibility, Paul Stoffregen + Search bug fix, Love Nystrom + +Version 2.2: + Teensy 3.0 compatibility, Paul Stoffregen, paul@pjrc.com + Arduino Due compatibility, http://arduino.cc/forum/index.php?topic=141030 + Fix DS18B20 example negative temperature + Fix DS18B20 example's low res modes, Ken Butcher + Improve reset timing, Mark Tillotson + Add const qualifiers, Bertrik Sikken + Add initial value input to crc16, Bertrik Sikken + Add target_search() function, Scott Roberts + +Version 2.1: + Arduino 1.0 compatibility, Paul Stoffregen + Improve temperature example, Paul Stoffregen + DS250x_PROM example, Guillermo Lovato + PIC32 (chipKit) compatibility, Jason Dangel, dangel.jason AT gmail.com + Improvements from Glenn Trewitt: + - crc16() now works + - check_crc16() does all of calculation/checking work. + - Added read_bytes() and write_bytes(), to reduce tedious loops. + - Added ds2408 example. + Delete very old, out-of-date readme file (info is here) + +Version 2.0: Modifications by Paul Stoffregen, January 2010: +http://www.pjrc.com/teensy/td_libs_OneWire.html + Search fix from Robin James + http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238032295/27#27 + Use direct optimized I/O in all cases + Disable interrupts during timing critical sections + (this solves many random communication errors) + Disable interrupts during read-modify-write I/O + Reduce RAM consumption by eliminating unnecessary + variables and trimming many to 8 bits + Optimize both crc8 - table version moved to flash + +Modified to work with larger numbers of devices - avoids loop. +Tested in Arduino 11 alpha with 12 sensors. +26 Sept 2008 -- Robin James +http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238032295/27#27 + +Updated to work with arduino-0008 and to include skip() as of +2007/07/06. --RJL20 + +Modified to calculate the 8-bit CRC directly, avoiding the need for +the 256-byte lookup table to be loaded in RAM. Tested in arduino-0010 +-- Tom Pollard, Jan 23, 2008 + +Jim Studt's original library was modified by Josh Larios. + +Tom Pollard, pollard@alum.mit.edu, contributed around May 20, 2008 + +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. + +Much of the code was inspired by Derek Yerger's code, though I don't +think much of that remains. In any event that was.. + (copyleft) 2006 by Derek Yerger - Free to distribute freely. + +The CRC code was excerpted and inspired by the Dallas Semiconductor +sample code bearing this copyright. +//--------------------------------------------------------------------------- +// Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights 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 DALLAS SEMICONDUCTOR 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. +// +// Except as contained in this notice, the name of Dallas Semiconductor +// shall not be used except as stated in the Dallas Semiconductor +// Branding Policy. +//-------------------------------------------------------------------------- +*/ + +#include +#include "OneWire.h" +#include "util/OneWire_direct_gpio.h" + +#ifdef ARDUINO_ARCH_ESP32 +// due to the dual core esp32, a critical section works better than disabling interrupts +# define noInterrupts() {portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;portENTER_CRITICAL(&mux) +# define interrupts() portEXIT_CRITICAL(&mux);} +// for info on this, search "IRAM_ATTR" at https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/general-notes.html +# define CRIT_TIMING IRAM_ATTR +#else +# define CRIT_TIMING +#endif + + +void OneWire::begin(uint8_t pin) +{ + pinMode(pin, INPUT); + bitmask = PIN_TO_BITMASK(pin); + baseReg = PIN_TO_BASEREG(pin); +#if ONEWIRE_SEARCH + reset_search(); +#endif +} + + +// Perform the onewire reset function. We will wait up to 250uS for +// the bus to come high, if it doesn't then it is broken or shorted +// and we return a 0; +// +// Returns 1 if a device asserted a presence pulse, 0 otherwise. +// +uint8_t CRIT_TIMING OneWire::reset(void) +{ + IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask; + __attribute__((unused)) volatile IO_REG_TYPE *reg IO_REG_BASE_ATTR = baseReg; + uint8_t r; + uint8_t retries = 125; + + noInterrupts(); + DIRECT_MODE_INPUT(reg, mask); + interrupts(); + // wait until the wire is high... just in case + do { + if (--retries == 0) return 0; + delayMicroseconds(2); + } while ( !DIRECT_READ(reg, mask)); + + noInterrupts(); + DIRECT_WRITE_LOW(reg, mask); + DIRECT_MODE_OUTPUT(reg, mask); // drive output low + interrupts(); + delayMicroseconds(480); + noInterrupts(); + DIRECT_MODE_INPUT(reg, mask); // allow it to float + delayMicroseconds(70); + r = !DIRECT_READ(reg, mask); + interrupts(); + delayMicroseconds(410); + return r; +} + +// +// Write a bit. Port and bit is used to cut lookup time and provide +// more certain timing. +// +void CRIT_TIMING OneWire::write_bit(uint8_t v) +{ + IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask; + __attribute__((unused)) volatile IO_REG_TYPE *reg IO_REG_BASE_ATTR = baseReg; + + if (v & 1) { + noInterrupts(); + DIRECT_WRITE_LOW(reg, mask); + DIRECT_MODE_OUTPUT(reg, mask); // drive output low + delayMicroseconds(10); + DIRECT_WRITE_HIGH(reg, mask); // drive output high + interrupts(); + delayMicroseconds(55); + } else { + noInterrupts(); + DIRECT_WRITE_LOW(reg, mask); + DIRECT_MODE_OUTPUT(reg, mask); // drive output low + delayMicroseconds(65); + DIRECT_WRITE_HIGH(reg, mask); // drive output high + interrupts(); + delayMicroseconds(5); + } +} + +// +// Read a bit. Port and bit is used to cut lookup time and provide +// more certain timing. +// +uint8_t CRIT_TIMING OneWire::read_bit(void) +{ + IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask; + __attribute__((unused)) volatile IO_REG_TYPE *reg IO_REG_BASE_ATTR = baseReg; + uint8_t r; + + noInterrupts(); + DIRECT_MODE_OUTPUT(reg, mask); + DIRECT_WRITE_LOW(reg, mask); + delayMicroseconds(3); + DIRECT_MODE_INPUT(reg, mask); // let pin float, pull up will raise + delayMicroseconds(10); + r = DIRECT_READ(reg, mask); + interrupts(); + delayMicroseconds(53); + return r; +} + +// +// Write a byte. The writing code uses the active drivers to raise the +// pin high, if you need power after the write (e.g. DS18S20 in +// parasite power mode) then set 'power' to 1, otherwise the pin will +// go tri-state at the end of the write to avoid heating in a short or +// other mishap. +// +void OneWire::write(uint8_t v, uint8_t power /* = 0 */) { + uint8_t bitMask; + + for (bitMask = 0x01; bitMask; bitMask <<= 1) { + OneWire::write_bit( (bitMask & v)?1:0); + } + if ( !power) { + noInterrupts(); + DIRECT_MODE_INPUT(baseReg, bitmask); + DIRECT_WRITE_LOW(baseReg, bitmask); + interrupts(); + } +} + +void OneWire::write_bytes(const uint8_t *buf, uint16_t count, bool power /* = 0 */) { + for (uint16_t i = 0 ; i < count ; i++) + write(buf[i]); + if (!power) { + noInterrupts(); + DIRECT_MODE_INPUT(baseReg, bitmask); + DIRECT_WRITE_LOW(baseReg, bitmask); + interrupts(); + } +} + +// +// Read a byte +// +uint8_t OneWire::read() { + uint8_t bitMask; + uint8_t r = 0; + + for (bitMask = 0x01; bitMask; bitMask <<= 1) { + if ( OneWire::read_bit()) r |= bitMask; + } + return r; +} + +void OneWire::read_bytes(uint8_t *buf, uint16_t count) { + for (uint16_t i = 0 ; i < count ; i++) + buf[i] = read(); +} + +// +// Do a ROM select +// +void OneWire::select(const uint8_t rom[8]) +{ + uint8_t i; + + write(0x55); // Choose ROM + + for (i = 0; i < 8; i++) write(rom[i]); +} + +// +// Do a ROM skip +// +void OneWire::skip() +{ + write(0xCC); // Skip ROM +} + +void OneWire::depower() +{ + noInterrupts(); + DIRECT_MODE_INPUT(baseReg, bitmask); + interrupts(); +} + +#if ONEWIRE_SEARCH + +// +// You need to use this function to start a search again from the beginning. +// You do not need to do it for the first search, though you could. +// +void OneWire::reset_search() +{ + // reset the search state + LastDiscrepancy = 0; + LastDeviceFlag = false; + LastFamilyDiscrepancy = 0; + for(int i = 7; ; i--) { + ROM_NO[i] = 0; + if ( i == 0) break; + } +} + +// Setup the search to find the device type 'family_code' on the next call +// to search(*newAddr) if it is present. +// +void OneWire::target_search(uint8_t family_code) +{ + // set the search state to find SearchFamily type devices + ROM_NO[0] = family_code; + for (uint8_t i = 1; i < 8; i++) + ROM_NO[i] = 0; + LastDiscrepancy = 64; + LastFamilyDiscrepancy = 0; + LastDeviceFlag = false; +} + +// +// Perform a search. If this function returns a '1' then it has +// enumerated the next device and you may retrieve the ROM from the +// OneWire::address variable. If there are no devices, no further +// devices, or something horrible happens in the middle of the +// enumeration then a 0 is returned. If a new device is found then +// its address is copied to newAddr. Use OneWire::reset_search() to +// start over. +// +// --- Replaced by the one from the Dallas Semiconductor web site --- +//-------------------------------------------------------------------------- +// Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing +// search state. +// Return TRUE : device found, ROM number in ROM_NO buffer +// FALSE : device not found, end of search +// +bool OneWire::search(uint8_t *newAddr, bool search_mode /* = true */) +{ + uint8_t id_bit_number; + uint8_t last_zero, rom_byte_number; + bool search_result; + uint8_t id_bit, cmp_id_bit; + + unsigned char rom_byte_mask, search_direction; + + // initialize for search + id_bit_number = 1; + last_zero = 0; + rom_byte_number = 0; + rom_byte_mask = 1; + search_result = false; + + // if the last call was not the last one + if (!LastDeviceFlag) { + // 1-Wire reset + if (!reset()) { + // reset the search + LastDiscrepancy = 0; + LastDeviceFlag = false; + LastFamilyDiscrepancy = 0; + return false; + } + + // issue the search command + if (search_mode == true) { + write(0xF0); // NORMAL SEARCH + } else { + write(0xEC); // CONDITIONAL SEARCH + } + + // loop to do the search + do + { + // read a bit and its complement + id_bit = read_bit(); + cmp_id_bit = read_bit(); + + // check for no devices on 1-wire + if ((id_bit == 1) && (cmp_id_bit == 1)) { + break; + } else { + // all devices coupled have 0 or 1 + if (id_bit != cmp_id_bit) { + search_direction = id_bit; // bit write value for search + } else { + // if this discrepancy if before the Last Discrepancy + // on a previous next then pick the same as last time + if (id_bit_number < LastDiscrepancy) { + search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0); + } else { + // if equal to last pick 1, if not then pick 0 + search_direction = (id_bit_number == LastDiscrepancy); + } + // if 0 was picked then record its position in LastZero + if (search_direction == 0) { + last_zero = id_bit_number; + + // check for Last discrepancy in family + if (last_zero < 9) + LastFamilyDiscrepancy = last_zero; + } + } + + // set or clear the bit in the ROM byte rom_byte_number + // with mask rom_byte_mask + if (search_direction == 1) + ROM_NO[rom_byte_number] |= rom_byte_mask; + else + ROM_NO[rom_byte_number] &= ~rom_byte_mask; + + // serial number search direction write bit + write_bit(search_direction); + + // increment the byte counter id_bit_number + // and shift the mask rom_byte_mask + id_bit_number++; + rom_byte_mask <<= 1; + + // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask + if (rom_byte_mask == 0) { + rom_byte_number++; + rom_byte_mask = 1; + } + } + } + while(rom_byte_number < 8); // loop until through all ROM bytes 0-7 + + // if the search was successful then + if (!(id_bit_number < 65)) { + // search successful so set LastDiscrepancy,LastDeviceFlag,search_result + LastDiscrepancy = last_zero; + + // check for last device + if (LastDiscrepancy == 0) { + LastDeviceFlag = true; + } + search_result = true; + } + } + + // if no device found then reset counters so next 'search' will be like a first + if (!search_result || !ROM_NO[0]) { + LastDiscrepancy = 0; + LastDeviceFlag = false; + LastFamilyDiscrepancy = 0; + search_result = false; + } else { + for (int i = 0; i < 8; i++) newAddr[i] = ROM_NO[i]; + } + return search_result; + } + +#endif + +#if ONEWIRE_CRC +// The 1-Wire CRC scheme is described in Maxim Application Note 27: +// "Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products" +// + +#if ONEWIRE_CRC8_TABLE +// Dow-CRC using polynomial X^8 + X^5 + X^4 + X^0 +// Tiny 2x16 entry CRC table created by Arjen Lentz +// See http://lentz.com.au/blog/calculating-crc-with-a-tiny-32-entry-lookup-table +static const uint8_t PROGMEM dscrc2x16_table[] = { + 0x00, 0x5E, 0xBC, 0xE2, 0x61, 0x3F, 0xDD, 0x83, + 0xC2, 0x9C, 0x7E, 0x20, 0xA3, 0xFD, 0x1F, 0x41, + 0x00, 0x9D, 0x23, 0xBE, 0x46, 0xDB, 0x65, 0xF8, + 0x8C, 0x11, 0xAF, 0x32, 0xCA, 0x57, 0xE9, 0x74 +}; + +// Compute a Dallas Semiconductor 8 bit CRC. These show up in the ROM +// and the registers. (Use tiny 2x16 entry CRC table) +uint8_t OneWire::crc8(const uint8_t *addr, uint8_t len) +{ + uint8_t crc = 0; + + while (len--) { + crc = *addr++ ^ crc; // just re-using crc as intermediate + crc = pgm_read_byte(dscrc2x16_table + (crc & 0x0f)) ^ + pgm_read_byte(dscrc2x16_table + 16 + ((crc >> 4) & 0x0f)); + } + + return crc; +} +#else +// +// Compute a Dallas Semiconductor 8 bit CRC directly. +// this is much slower, but a little smaller, than the lookup table. +// +uint8_t OneWire::crc8(const uint8_t *addr, uint8_t len) +{ + uint8_t crc = 0; + + while (len--) { +#if defined(__AVR__) + crc = _crc_ibutton_update(crc, *addr++); +#else + uint8_t inbyte = *addr++; + for (uint8_t i = 8; i; i--) { + uint8_t mix = (crc ^ inbyte) & 0x01; + crc >>= 1; + if (mix) crc ^= 0x8C; + inbyte >>= 1; + } +#endif + } + return crc; +} +#endif + +#if ONEWIRE_CRC16 +bool OneWire::check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc) +{ + crc = ~crc16(input, len, crc); + return (crc & 0xFF) == inverted_crc[0] && (crc >> 8) == inverted_crc[1]; +} + +uint16_t OneWire::crc16(const uint8_t* input, uint16_t len, uint16_t crc) +{ +#if defined(__AVR__) + for (uint16_t i = 0 ; i < len ; i++) { + crc = _crc16_update(crc, input[i]); + } +#else + static const uint8_t oddparity[16] = + { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }; + + for (uint16_t i = 0 ; i < len ; i++) { + // Even though we're just copying a byte from the input, + // we'll be doing 16-bit computation with it. + uint16_t cdata = input[i]; + cdata = (cdata ^ crc) & 0xff; + crc >>= 8; + + if (oddparity[cdata & 0x0F] ^ oddparity[cdata >> 4]) + crc ^= 0xC001; + + cdata <<= 6; + crc ^= cdata; + cdata <<= 1; + crc ^= cdata; + } +#endif + return crc; +} +#endif + +#endif + +// The ESP32 Arduino core may provide noInterrupts/interrupts as macros. +// Ensure the original definitions are restored after including this file. +#ifdef ARDUINO_ARCH_ESP32 +# undef noInterrupts +# undef interrupts +#endif +// for info on this, search "IRAM_ATTR" at https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/general-notes.html +#undef CRIT_TIMING diff --git a/lib/OneWire/OneWire.h b/lib/OneWire/OneWire.h new file mode 100644 index 00000000..80c98f94 --- /dev/null +++ b/lib/OneWire/OneWire.h @@ -0,0 +1,183 @@ +#ifndef OneWire_h +#define OneWire_h + +#ifdef __cplusplus + +#include + +#if defined(__AVR__) +#include +#endif + +#if ARDUINO >= 100 +#include // for delayMicroseconds, digitalPinToBitMask, etc +#else +#include "WProgram.h" // for delayMicroseconds +#include "pins_arduino.h" // for digitalPinToBitMask, etc +#endif + +// You can exclude certain features from OneWire. In theory, this +// might save some space. In practice, the compiler automatically +// removes unused code (technically, the linker, using -fdata-sections +// and -ffunction-sections when compiling, and Wl,--gc-sections +// when linking), so most of these will not result in any code size +// reduction. Well, unless you try to use the missing features +// and redesign your program to not need them! ONEWIRE_CRC8_TABLE +// is the exception, because it selects a fast but large algorithm +// or a small but slow algorithm. + +// you can exclude onewire_search by defining that to 0 +#ifndef ONEWIRE_SEARCH +#define ONEWIRE_SEARCH 1 +#endif + +// You can exclude CRC checks altogether by defining this to 0 +#ifndef ONEWIRE_CRC +#define ONEWIRE_CRC 1 +#endif + +// Select the table-lookup method of computing the 8-bit CRC +// by setting this to 1. The lookup table enlarges code size by +// about 250 bytes. It does NOT consume RAM (but did in very +// old versions of OneWire). If you disable this, a slower +// but very compact algorithm is used. +#ifndef ONEWIRE_CRC8_TABLE +#define ONEWIRE_CRC8_TABLE 1 +#endif + +// You can allow 16-bit CRC checks by defining this to 1 +// (Note that ONEWIRE_CRC must also be 1.) +#ifndef ONEWIRE_CRC16 +#define ONEWIRE_CRC16 1 +#endif + +// Board-specific macros for direct GPIO +#include "util/OneWire_direct_regtype.h" + +class OneWire +{ + private: + IO_REG_TYPE bitmask; + volatile IO_REG_TYPE *baseReg; + +#if ONEWIRE_SEARCH + // global search state + unsigned char ROM_NO[8]; + uint8_t LastDiscrepancy; + uint8_t LastFamilyDiscrepancy; + bool LastDeviceFlag; +#endif + + public: + OneWire() { } + OneWire(uint8_t pin) { begin(pin); } + void begin(uint8_t pin); + + // Perform a 1-Wire reset cycle. Returns 1 if a device responds + // with a presence pulse. Returns 0 if there is no device or the + // bus is shorted or otherwise held low for more than 250uS + uint8_t reset(void); + + // Issue a 1-Wire rom select command, you do the reset first. + void select(const uint8_t rom[8]); + + // Issue a 1-Wire rom skip command, to address all on bus. + void skip(void); + + // Write a byte. If 'power' is one then the wire is held high at + // the end for parasitically powered devices. You are responsible + // for eventually depowering it by calling depower() or doing + // another read or write. + void write(uint8_t v, uint8_t power = 0); + + void write_bytes(const uint8_t *buf, uint16_t count, bool power = 0); + + // Read a byte. + uint8_t read(void); + + void read_bytes(uint8_t *buf, uint16_t count); + + // Write a bit. The bus is always left powered at the end, see + // note in write() about that. + void write_bit(uint8_t v); + + // Read a bit. + uint8_t read_bit(void); + + // Stop forcing power onto the bus. You only need to do this if + // you used the 'power' flag to write() or used a write_bit() call + // and aren't about to do another read or write. You would rather + // not leave this powered if you don't have to, just in case + // someone shorts your bus. + void depower(void); + +#if ONEWIRE_SEARCH + // Clear the search state so that if will start from the beginning again. + void reset_search(); + + // Setup the search to find the device type 'family_code' on the next call + // to search(*newAddr) if it is present. + void target_search(uint8_t family_code); + + // Look for the next device. Returns 1 if a new address has been + // returned. A zero might mean that the bus is shorted, there are + // no devices, or you have already retrieved all of them. It + // might be a good idea to check the CRC to make sure you didn't + // get garbage. The order is deterministic. You will always get + // the same devices in the same order. + bool search(uint8_t *newAddr, bool search_mode = true); +#endif + +#if ONEWIRE_CRC + // Compute a Dallas Semiconductor 8 bit CRC, these are used in the + // ROM and scratchpad registers. + static uint8_t crc8(const uint8_t *addr, uint8_t len); + +#if ONEWIRE_CRC16 + // Compute the 1-Wire CRC16 and compare it against the received CRC. + // Example usage (reading a DS2408): + // // Put everything in a buffer so we can compute the CRC easily. + // uint8_t buf[13]; + // buf[0] = 0xF0; // Read PIO Registers + // buf[1] = 0x88; // LSB address + // buf[2] = 0x00; // MSB address + // WriteBytes(net, buf, 3); // Write 3 cmd bytes + // ReadBytes(net, buf+3, 10); // Read 6 data bytes, 2 0xFF, 2 CRC16 + // if (!CheckCRC16(buf, 11, &buf[11])) { + // // Handle error. + // } + // + // @param input - Array of bytes to checksum. + // @param len - How many bytes to use. + // @param inverted_crc - The two CRC16 bytes in the received data. + // This should just point into the received data, + // *not* at a 16-bit integer. + // @param crc - The crc starting value (optional) + // @return True, iff the CRC matches. + static bool check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc = 0); + + // Compute a Dallas Semiconductor 16 bit CRC. This is required to check + // the integrity of data received from many 1-Wire devices. Note that the + // CRC computed here is *not* what you'll get from the 1-Wire network, + // for two reasons: + // 1) The CRC is transmitted bitwise inverted. + // 2) Depending on the endian-ness of your processor, the binary + // representation of the two-byte return value may have a different + // byte order than the two bytes you get from 1-Wire. + // @param input - Array of bytes to checksum. + // @param len - How many bytes to use. + // @param crc - The crc starting value (optional) + // @return The CRC16, as defined by Dallas Semiconductor. + static uint16_t crc16(const uint8_t* input, uint16_t len, uint16_t crc = 0); +#endif +#endif +}; + +// Prevent this name from leaking into Arduino sketches +#ifdef IO_REG_TYPE +#undef IO_REG_TYPE +#endif + +#endif // __cplusplus +#endif // OneWire_h + diff --git a/lib/OneWire/keywords.txt b/lib/OneWire/keywords.txt new file mode 100644 index 00000000..8336bc33 --- /dev/null +++ b/lib/OneWire/keywords.txt @@ -0,0 +1,39 @@ +####################################### +# Syntax Coloring Map For OneWire +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +OneWire KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +reset KEYWORD2 +write_bit KEYWORD2 +read_bit KEYWORD2 +write KEYWORD2 +write_bytes KEYWORD2 +read KEYWORD2 +read_bytes KEYWORD2 +select KEYWORD2 +skip KEYWORD2 +depower KEYWORD2 +reset_search KEYWORD2 +search KEYWORD2 +crc8 KEYWORD2 +crc16 KEYWORD2 +check_crc16 KEYWORD2 + +####################################### +# Instances (KEYWORD2) +####################################### + + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/lib/OneWire/library.json b/lib/OneWire/library.json new file mode 100644 index 00000000..c540133b --- /dev/null +++ b/lib/OneWire/library.json @@ -0,0 +1,61 @@ +{ + "name": "OneWire", + "description": "Control 1-Wire protocol (DS18S20, DS18B20, DS2408 and etc)", + "keywords": "onewire, 1-wire, bus, sensor, temperature, ibutton", + "authors": [ + { + "name": "Paul Stoffregen", + "email": "paul@pjrc.com", + "url": "http://www.pjrc.com", + "maintainer": true + }, + { + "name": "Jim Studt" + }, + { + "name": "Tom Pollard", + "email": "pollard@alum.mit.edu" + }, + { + "name": "Derek Yerger" + }, + { + "name": "Josh Larios" + }, + { + "name": "Robin James" + }, + { + "name": "Glenn Trewitt" + }, + { + "name": "Jason Dangel", + "email": "dangel.jason AT gmail.com" + }, + { + "name": "Guillermo Lovato" + }, + { + "name": "Ken Butcher" + }, + { + "name": "Mark Tillotson" + }, + { + "name": "Bertrik Sikken" + }, + { + "name": "Scott Roberts" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/PaulStoffregen/OneWire" + }, + "version": "2.3.8", + "homepage": "https://www.pjrc.com/teensy/td_libs_OneWire.html", + "frameworks": "Arduino", + "examples": [ + "examples/*/*.pde" + ] +} diff --git a/lib/OneWire/library.properties b/lib/OneWire/library.properties new file mode 100644 index 00000000..f4c596f9 --- /dev/null +++ b/lib/OneWire/library.properties @@ -0,0 +1,10 @@ +name=OneWire +version=2.3.8 +author=Jim Studt, Tom Pollard, Robin James, Glenn Trewitt, Jason Dangel, Guillermo Lovato, Paul Stoffregen, Scott Roberts, Bertrik Sikken, Mark Tillotson, Ken Butcher, Roger Clark, Love Nystrom +maintainer=Paul Stoffregen +sentence=Access 1-wire temperature sensors, memory and other chips. +paragraph= +category=Communication +url=http://www.pjrc.com/teensy/td_libs_OneWire.html +architectures=* + diff --git a/lib/OneWire/util/OneWire_direct_gpio.h b/lib/OneWire/util/OneWire_direct_gpio.h new file mode 100644 index 00000000..f0d047a3 --- /dev/null +++ b/lib/OneWire/util/OneWire_direct_gpio.h @@ -0,0 +1,519 @@ +#ifndef OneWire_Direct_GPIO_h +#define OneWire_Direct_GPIO_h + +// This header should ONLY be included by OneWire.cpp. These defines are +// meant to be private, used within OneWire.cpp, but not exposed to Arduino +// sketches or other libraries which may include OneWire.h. + +#include + +// Platform specific I/O definitions + +#if defined(__AVR__) +#define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin))) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define IO_REG_TYPE uint8_t +#define IO_REG_BASE_ATTR asm("r30") +#define IO_REG_MASK_ATTR +#if defined(__AVR_ATmega4809__) +#define DIRECT_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) +#define DIRECT_MODE_INPUT(base, mask) ((*((base)-8)) &= ~(mask)) +#define DIRECT_MODE_OUTPUT(base, mask) ((*((base)-8)) |= (mask)) +#define DIRECT_WRITE_LOW(base, mask) ((*((base)-4)) &= ~(mask)) +#define DIRECT_WRITE_HIGH(base, mask) ((*((base)-4)) |= (mask)) +#else +#define DIRECT_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) +#define DIRECT_MODE_INPUT(base, mask) ((*((base)+1)) &= ~(mask)) +#define DIRECT_MODE_OUTPUT(base, mask) ((*((base)+1)) |= (mask)) +#define DIRECT_WRITE_LOW(base, mask) ((*((base)+2)) &= ~(mask)) +#define DIRECT_WRITE_HIGH(base, mask) ((*((base)+2)) |= (mask)) +#endif + +#elif defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK66FX1M0__) || defined(__MK64FX512__) +#define PIN_TO_BASEREG(pin) (portOutputRegister(pin)) +#define PIN_TO_BITMASK(pin) (1) +#define IO_REG_TYPE uint8_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR __attribute__ ((unused)) +#define DIRECT_READ(base, mask) (*((base)+512)) +#define DIRECT_MODE_INPUT(base, mask) (*((base)+640) = 0) +#define DIRECT_MODE_OUTPUT(base, mask) (*((base)+640) = 1) +#define DIRECT_WRITE_LOW(base, mask) (*((base)+256) = 1) +#define DIRECT_WRITE_HIGH(base, mask) (*((base)+128) = 1) + +#elif defined(__MKL26Z64__) +#define PIN_TO_BASEREG(pin) (portOutputRegister(pin)) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define IO_REG_TYPE uint8_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, mask) ((*((base)+16) & (mask)) ? 1 : 0) +#define DIRECT_MODE_INPUT(base, mask) (*((base)+20) &= ~(mask)) +#define DIRECT_MODE_OUTPUT(base, mask) (*((base)+20) |= (mask)) +#define DIRECT_WRITE_LOW(base, mask) (*((base)+8) = (mask)) +#define DIRECT_WRITE_HIGH(base, mask) (*((base)+4) = (mask)) + +#elif defined(__IMXRT1052__) || defined(__IMXRT1062__) +#define PIN_TO_BASEREG(pin) (portOutputRegister(pin)) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define IO_REG_TYPE uint32_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, mask) ((*((base)+2) & (mask)) ? 1 : 0) +#define DIRECT_MODE_INPUT(base, mask) (*((base)+1) &= ~(mask)) +#define DIRECT_MODE_OUTPUT(base, mask) (*((base)+1) |= (mask)) +#define DIRECT_WRITE_LOW(base, mask) (*((base)+34) = (mask)) +#define DIRECT_WRITE_HIGH(base, mask) (*((base)+33) = (mask)) + +#elif defined(__SAM3X8E__) || defined(__SAM3A8C__) || defined(__SAM3A4C__) +// Arduino 1.5.1 may have a bug in delayMicroseconds() on Arduino Due. +// http://arduino.cc/forum/index.php/topic,141030.msg1076268.html#msg1076268 +// If you have trouble with OneWire on Arduino Due, please check the +// status of delayMicroseconds() before reporting a bug in OneWire! +#define PIN_TO_BASEREG(pin) (&(digitalPinToPort(pin)->PIO_PER)) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define IO_REG_TYPE uint32_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, mask) (((*((base)+15)) & (mask)) ? 1 : 0) +#define DIRECT_MODE_INPUT(base, mask) ((*((base)+5)) = (mask)) +#define DIRECT_MODE_OUTPUT(base, mask) ((*((base)+4)) = (mask)) +#define DIRECT_WRITE_LOW(base, mask) ((*((base)+13)) = (mask)) +#define DIRECT_WRITE_HIGH(base, mask) ((*((base)+12)) = (mask)) +#ifndef PROGMEM +#define PROGMEM +#endif +#ifndef pgm_read_byte +#define pgm_read_byte(addr) (*(const uint8_t *)(addr)) +#endif + +#elif defined(__PIC32MX__) +#define PIN_TO_BASEREG(pin) (portModeRegister(digitalPinToPort(pin))) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define IO_REG_TYPE uint32_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, mask) (((*(base+4)) & (mask)) ? 1 : 0) //PORTX + 0x10 +#define DIRECT_MODE_INPUT(base, mask) ((*(base+2)) = (mask)) //TRISXSET + 0x08 +#define DIRECT_MODE_OUTPUT(base, mask) ((*(base+1)) = (mask)) //TRISXCLR + 0x04 +#define DIRECT_WRITE_LOW(base, mask) ((*(base+8+1)) = (mask)) //LATXCLR + 0x24 +#define DIRECT_WRITE_HIGH(base, mask) ((*(base+8+2)) = (mask)) //LATXSET + 0x28 + +#elif defined(ARDUINO_ARCH_ESP8266) +// Special note: I depend on the ESP community to maintain these definitions and +// submit good pull requests. I can not answer any ESP questions or help you +// resolve any problems related to ESP chips. Please do not contact me and please +// DO NOT CREATE GITHUB ISSUES for ESP support. All ESP questions must be asked +// on ESP community forums. +#define PIN_TO_BASEREG(pin) ((volatile uint32_t*) GPO) +#define PIN_TO_BITMASK(pin) (1UL << (pin)) +#define IO_REG_TYPE uint32_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR + +static inline __attribute__((always_inline)) +void directModeInput(IO_REG_TYPE mask) +{ + if(mask > 0x8000) + { + GP16FFS(GPFFS_GPIO(16)); + GPC16 = 0; + GP16E &= ~1; + } + else + { + GPE &= ~(mask); + } +} + +static inline __attribute__((always_inline)) +void directModeOutput(IO_REG_TYPE mask) +{ + if(mask > 0x8000) + { + GP16FFS(GPFFS_GPIO(16)); + GPC16 = 0; + GP16E |= 1; + } + else + { + GPE |= (mask); + } +} +static inline __attribute__((always_inline)) +bool directRead(IO_REG_TYPE mask) +{ + if(mask > 0x8000) + return GP16I & 0x01; + else + return ((GPI & (mask)) ? true : false); +} + +#define DIRECT_READ(base, mask) directRead(mask) +#define DIRECT_MODE_INPUT(base, mask) directModeInput(mask) +#define DIRECT_MODE_OUTPUT(base, mask) directModeOutput(mask) +#define DIRECT_WRITE_LOW(base, mask) (mask > 0x8000) ? GP16O &= ~1 : (GPOC = (mask)) +#define DIRECT_WRITE_HIGH(base, mask) (mask > 0x8000) ? GP16O |= 1 : (GPOS = (mask)) + +#elif defined(ARDUINO_ARCH_ESP32) +#include +#include +#define PIN_TO_BASEREG(pin) (0) +#define PIN_TO_BITMASK(pin) (pin) +#define IO_REG_TYPE uint32_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR + +static inline __attribute__((always_inline)) +IO_REG_TYPE directRead(IO_REG_TYPE pin) +{ +#if CONFIG_IDF_TARGET_ESP32C3 + return (GPIO.in.val >> pin) & 0x1; +#else // plain ESP32 + if ( pin < 32 ) + return (GPIO.in >> pin) & 0x1; + else if ( pin < 46 ) + return (GPIO.in1.val >> (pin - 32)) & 0x1; +#endif + + return 0; +} + +static inline __attribute__((always_inline)) +void directWriteLow(IO_REG_TYPE pin) +{ +#if CONFIG_IDF_TARGET_ESP32C3 + GPIO.out_w1tc.val = ((uint32_t)1 << pin); +#else // plain ESP32 + if ( pin < 32 ) + GPIO.out_w1tc = ((uint32_t)1 << pin); + else if ( pin < 46 ) + GPIO.out1_w1tc.val = ((uint32_t)1 << (pin - 32)); +#endif +} + +static inline __attribute__((always_inline)) +void directWriteHigh(IO_REG_TYPE pin) +{ +#if CONFIG_IDF_TARGET_ESP32C3 + GPIO.out_w1ts.val = ((uint32_t)1 << pin); +#else // plain ESP32 + if ( pin < 32 ) + GPIO.out_w1ts = ((uint32_t)1 << pin); + else if ( pin < 46 ) + GPIO.out1_w1ts.val = ((uint32_t)1 << (pin - 32)); +#endif +} + +static inline __attribute__((always_inline)) +void directModeInput(IO_REG_TYPE pin) +{ +#if CONFIG_IDF_TARGET_ESP32C3 + GPIO.enable_w1tc.val = ((uint32_t)1 << (pin)); +#else + if ( digitalPinIsValid(pin) ) + { +#if ESP_IDF_VERSION_MAJOR < 4 // IDF 3.x ESP32/PICO-D4 + uint32_t rtc_reg(rtc_gpio_desc[pin].reg); + + if ( rtc_reg ) // RTC pins PULL settings + { + ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].mux); + ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].pullup | rtc_gpio_desc[pin].pulldown); + } +#endif + // Input + if ( pin < 32 ) + GPIO.enable_w1tc = ((uint32_t)1 << pin); + else + GPIO.enable1_w1tc.val = ((uint32_t)1 << (pin - 32)); + } +#endif +} + +static inline __attribute__((always_inline)) +void directModeOutput(IO_REG_TYPE pin) +{ +#if CONFIG_IDF_TARGET_ESP32C3 + GPIO.enable_w1ts.val = ((uint32_t)1 << (pin)); +#else + if ( digitalPinIsValid(pin) && pin <= 33 ) // pins above 33 can be only inputs + { +#if ESP_IDF_VERSION_MAJOR < 4 // IDF 3.x ESP32/PICO-D4 + uint32_t rtc_reg(rtc_gpio_desc[pin].reg); + + if ( rtc_reg ) // RTC pins PULL settings + { + ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].mux); + ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].pullup | rtc_gpio_desc[pin].pulldown); + } +#endif + // Output + if ( pin < 32 ) + GPIO.enable_w1ts = ((uint32_t)1 << pin); + else // already validated to pins <= 33 + GPIO.enable1_w1ts.val = ((uint32_t)1 << (pin - 32)); + } +#endif +} + +#define DIRECT_READ(base, pin) directRead(pin) +#define DIRECT_WRITE_LOW(base, pin) directWriteLow(pin) +#define DIRECT_WRITE_HIGH(base, pin) directWriteHigh(pin) +#define DIRECT_MODE_INPUT(base, pin) directModeInput(pin) +#define DIRECT_MODE_OUTPUT(base, pin) directModeOutput(pin) +// https://github.com/PaulStoffregen/OneWire/pull/47 +// https://github.com/stickbreaker/OneWire/commit/6eb7fc1c11a15b6ac8c60e5671cf36eb6829f82c +#ifdef interrupts +#undef interrupts +#endif +#ifdef noInterrupts +#undef noInterrupts +#endif +#define noInterrupts() {portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;portENTER_CRITICAL(&mux) +#define interrupts() portEXIT_CRITICAL(&mux);} +//#warning "ESP32 OneWire testing" + +#elif defined(ARDUINO_ARCH_STM32) +#define PIN_TO_BASEREG(pin) (0) +#define PIN_TO_BITMASK(pin) ((uint32_t)digitalPinToPinName(pin)) +#define IO_REG_TYPE uint32_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, pin) digitalReadFast((PinName)pin) +#define DIRECT_WRITE_LOW(base, pin) digitalWriteFast((PinName)pin, LOW) +#define DIRECT_WRITE_HIGH(base, pin) digitalWriteFast((PinName)pin, HIGH) +#define DIRECT_MODE_INPUT(base, pin) pin_function((PinName)pin, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)) +#define DIRECT_MODE_OUTPUT(base, pin) pin_function((PinName)pin, STM_PIN_DATA(STM_MODE_OUTPUT_PP, GPIO_NOPULL, 0)) + +#elif defined(__SAMD21G18A__) +#define PIN_TO_BASEREG(pin) portModeRegister(digitalPinToPort(pin)) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define IO_REG_TYPE uint32_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, mask) (((*((base)+8)) & (mask)) ? 1 : 0) +#define DIRECT_MODE_INPUT(base, mask) ((*((base)+1)) = (mask)) +#define DIRECT_MODE_OUTPUT(base, mask) ((*((base)+2)) = (mask)) +#define DIRECT_WRITE_LOW(base, mask) ((*((base)+5)) = (mask)) +#define DIRECT_WRITE_HIGH(base, mask) ((*((base)+6)) = (mask)) + +#elif defined(__ASR6501__) +#define PIN_IN_PORT(pin) (pin % PIN_NUMBER_IN_PORT) +#define PORT_FROM_PIN(pin) (pin / PIN_NUMBER_IN_PORT) +#define PORT_OFFSET(port) (PORT_REG_SHFIT * port) +#define PORT_ADDRESS(pin) (CYDEV_GPIO_BASE + PORT_OFFSET(PORT_FROM_PIN(pin))) + +#define PIN_TO_BASEREG(pin) (0) +#define PIN_TO_BITMASK(pin) (pin) +#define IO_REG_TYPE uint32_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, pin) CY_SYS_PINS_READ_PIN(PORT_ADDRESS(pin)+4, PIN_IN_PORT(pin)) +#define DIRECT_WRITE_LOW(base, pin) CY_SYS_PINS_CLEAR_PIN(PORT_ADDRESS(pin), PIN_IN_PORT(pin)) +#define DIRECT_WRITE_HIGH(base, pin) CY_SYS_PINS_SET_PIN(PORT_ADDRESS(pin), PIN_IN_PORT(pin)) +#define DIRECT_MODE_INPUT(base, pin) CY_SYS_PINS_SET_DRIVE_MODE(PORT_ADDRESS(pin)+8, PIN_IN_PORT(pin), CY_SYS_PINS_DM_DIG_HIZ) +#define DIRECT_MODE_OUTPUT(base, pin) CY_SYS_PINS_SET_DRIVE_MODE(PORT_ADDRESS(pin)+8, PIN_IN_PORT(pin), CY_SYS_PINS_DM_STRONG) + +#elif defined(RBL_NRF51822) +#define PIN_TO_BASEREG(pin) (0) +#define PIN_TO_BITMASK(pin) (pin) +#define IO_REG_TYPE uint32_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, pin) nrf_gpio_pin_read(pin) +#define DIRECT_WRITE_LOW(base, pin) nrf_gpio_pin_clear(pin) +#define DIRECT_WRITE_HIGH(base, pin) nrf_gpio_pin_set(pin) +#define DIRECT_MODE_INPUT(base, pin) nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL) +#define DIRECT_MODE_OUTPUT(base, pin) nrf_gpio_cfg_output(pin) + +#elif defined(__arc__) /* Arduino101/Genuino101 specifics */ + +#include "scss_registers.h" +#include "portable.h" +#include "avr/pgmspace.h" + +#define GPIO_ID(pin) (g_APinDescription[pin].ulGPIOId) +#define GPIO_TYPE(pin) (g_APinDescription[pin].ulGPIOType) +#define GPIO_BASE(pin) (g_APinDescription[pin].ulGPIOBase) +#define DIR_OFFSET_SS 0x01 +#define DIR_OFFSET_SOC 0x04 +#define EXT_PORT_OFFSET_SS 0x0A +#define EXT_PORT_OFFSET_SOC 0x50 + +/* GPIO registers base address */ +#define PIN_TO_BASEREG(pin) ((volatile uint32_t *)g_APinDescription[pin].ulGPIOBase) +#define PIN_TO_BITMASK(pin) pin +#define IO_REG_TYPE uint32_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR + +static inline __attribute__((always_inline)) +IO_REG_TYPE directRead(volatile IO_REG_TYPE *base, IO_REG_TYPE pin) +{ + IO_REG_TYPE ret; + if (SS_GPIO == GPIO_TYPE(pin)) { + ret = READ_ARC_REG(((IO_REG_TYPE)base + EXT_PORT_OFFSET_SS)); + } else { + ret = MMIO_REG_VAL_FROM_BASE((IO_REG_TYPE)base, EXT_PORT_OFFSET_SOC); + } + return ((ret >> GPIO_ID(pin)) & 0x01); +} + +static inline __attribute__((always_inline)) +void directModeInput(volatile IO_REG_TYPE *base, IO_REG_TYPE pin) +{ + if (SS_GPIO == GPIO_TYPE(pin)) { + WRITE_ARC_REG(READ_ARC_REG((((IO_REG_TYPE)base) + DIR_OFFSET_SS)) & ~(0x01 << GPIO_ID(pin)), + ((IO_REG_TYPE)(base) + DIR_OFFSET_SS)); + } else { + MMIO_REG_VAL_FROM_BASE((IO_REG_TYPE)base, DIR_OFFSET_SOC) &= ~(0x01 << GPIO_ID(pin)); + } +} + +static inline __attribute__((always_inline)) +void directModeOutput(volatile IO_REG_TYPE *base, IO_REG_TYPE pin) +{ + if (SS_GPIO == GPIO_TYPE(pin)) { + WRITE_ARC_REG(READ_ARC_REG(((IO_REG_TYPE)(base) + DIR_OFFSET_SS)) | (0x01 << GPIO_ID(pin)), + ((IO_REG_TYPE)(base) + DIR_OFFSET_SS)); + } else { + MMIO_REG_VAL_FROM_BASE((IO_REG_TYPE)base, DIR_OFFSET_SOC) |= (0x01 << GPIO_ID(pin)); + } +} + +static inline __attribute__((always_inline)) +void directWriteLow(volatile IO_REG_TYPE *base, IO_REG_TYPE pin) +{ + if (SS_GPIO == GPIO_TYPE(pin)) { + WRITE_ARC_REG(READ_ARC_REG(base) & ~(0x01 << GPIO_ID(pin)), base); + } else { + MMIO_REG_VAL(base) &= ~(0x01 << GPIO_ID(pin)); + } +} + +static inline __attribute__((always_inline)) +void directWriteHigh(volatile IO_REG_TYPE *base, IO_REG_TYPE pin) +{ + if (SS_GPIO == GPIO_TYPE(pin)) { + WRITE_ARC_REG(READ_ARC_REG(base) | (0x01 << GPIO_ID(pin)), base); + } else { + MMIO_REG_VAL(base) |= (0x01 << GPIO_ID(pin)); + } +} + +#define DIRECT_READ(base, pin) directRead(base, pin) +#define DIRECT_MODE_INPUT(base, pin) directModeInput(base, pin) +#define DIRECT_MODE_OUTPUT(base, pin) directModeOutput(base, pin) +#define DIRECT_WRITE_LOW(base, pin) directWriteLow(base, pin) +#define DIRECT_WRITE_HIGH(base, pin) directWriteHigh(base, pin) + +#elif defined(__riscv) + +/* + * Tested on highfive1 + * + * Stable results are achieved operating in the + * two high speed modes of the highfive1. It + * seems to be less reliable in slow mode. + */ +#define PIN_TO_BASEREG(pin) (0) +#define PIN_TO_BITMASK(pin) digitalPinToBitMask(pin) +#define IO_REG_TYPE uint32_t +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR + +static inline __attribute__((always_inline)) +IO_REG_TYPE directRead(IO_REG_TYPE mask) +{ + return ((GPIO_REG(GPIO_INPUT_VAL) & mask) != 0) ? 1 : 0; +} + +static inline __attribute__((always_inline)) +void directModeInput(IO_REG_TYPE mask) +{ + GPIO_REG(GPIO_OUTPUT_XOR) &= ~mask; + GPIO_REG(GPIO_IOF_EN) &= ~mask; + + GPIO_REG(GPIO_INPUT_EN) |= mask; + GPIO_REG(GPIO_OUTPUT_EN) &= ~mask; +} + +static inline __attribute__((always_inline)) +void directModeOutput(IO_REG_TYPE mask) +{ + GPIO_REG(GPIO_OUTPUT_XOR) &= ~mask; + GPIO_REG(GPIO_IOF_EN) &= ~mask; + + GPIO_REG(GPIO_INPUT_EN) &= ~mask; + GPIO_REG(GPIO_OUTPUT_EN) |= mask; +} + +static inline __attribute__((always_inline)) +void directWriteLow(IO_REG_TYPE mask) +{ + GPIO_REG(GPIO_OUTPUT_VAL) &= ~mask; +} + +static inline __attribute__((always_inline)) +void directWriteHigh(IO_REG_TYPE mask) +{ + GPIO_REG(GPIO_OUTPUT_VAL) |= mask; +} + +#define DIRECT_READ(base, mask) directRead(mask) +#define DIRECT_WRITE_LOW(base, mask) directWriteLow(mask) +#define DIRECT_WRITE_HIGH(base, mask) directWriteHigh(mask) +#define DIRECT_MODE_INPUT(base, mask) directModeInput(mask) +#define DIRECT_MODE_OUTPUT(base, mask) directModeOutput(mask) + +#elif defined(__MBED__) + +#include "platform/mbed_critical.h" +#include "DigitalInOut.h" +#include +#define PIN_TO_BASEREG(pin) (0) +#define PIN_TO_BITMASK(pin) (new mbed::DigitalInOut(digitalPinToPinName(pin))) +#define IO_REG_TYPE mbed::DigitalInOut* +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, pin) (*pin) +#define DIRECT_WRITE_LOW(base, pin) (*pin = 0) +#define DIRECT_WRITE_HIGH(base, pin) (*pin = 1) +#define DIRECT_MODE_INPUT(base, pin) (pin->input()) +#define DIRECT_MODE_OUTPUT(base, pin) (pin->output()) +#undef interrupts +#undef noInterrupts +#define noInterrupts() osThreadSetPriority(osThreadGetId(), osPriorityRealtime) //core_util_critical_section_enter() +#define interrupts() osThreadSetPriority(osThreadGetId(), osPriorityNormal) //core_util_critical_section_exit() + +#elif defined(ARDUINO_ARCH_MBED_RP2040)|| defined(ARDUINO_ARCH_RP2040) +#define delayMicroseconds(time) busy_wait_us(time) +#define PIN_TO_BASEREG(pin) (0) +#define PIN_TO_BITMASK(pin) (pin) +#define IO_REG_TYPE unsigned int +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, pin) digitalRead(pin) +#define DIRECT_WRITE_LOW(base, pin) digitalWrite(pin, LOW) +#define DIRECT_WRITE_HIGH(base, pin) digitalWrite(pin, HIGH) +#define DIRECT_MODE_INPUT(base, pin) pinMode(pin,INPUT) +#define DIRECT_MODE_OUTPUT(base, pin) pinMode(pin,OUTPUT) +#warning "OneWire. RP2040 in Fallback mode. Using API calls for pinMode,digitalRead and digitalWrite." + +#else +#define PIN_TO_BASEREG(pin) (0) +#define PIN_TO_BITMASK(pin) (pin) +#define IO_REG_TYPE unsigned int +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, pin) digitalRead(pin) +#define DIRECT_WRITE_LOW(base, pin) digitalWrite(pin, LOW) +#define DIRECT_WRITE_HIGH(base, pin) digitalWrite(pin, HIGH) +#define DIRECT_MODE_INPUT(base, pin) pinMode(pin,INPUT) +#define DIRECT_MODE_OUTPUT(base, pin) pinMode(pin,OUTPUT) +#warning "OneWire. Fallback mode. Using API calls for pinMode,digitalRead and digitalWrite. Operation of this library is not guaranteed on this architecture." + +#endif + +#endif diff --git a/lib/OneWire/util/OneWire_direct_regtype.h b/lib/OneWire/util/OneWire_direct_regtype.h new file mode 100644 index 00000000..8e30813a --- /dev/null +++ b/lib/OneWire/util/OneWire_direct_regtype.h @@ -0,0 +1,59 @@ +#ifndef OneWire_Direct_RegType_h +#define OneWire_Direct_RegType_h + +#include + +// Platform specific I/O register type + +#if defined(__AVR__) +#define IO_REG_TYPE uint8_t + +#elif defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK66FX1M0__) || defined(__MK64FX512__) +#define IO_REG_TYPE uint8_t + +#elif defined(__IMXRT1052__) || defined(__IMXRT1062__) +#define IO_REG_TYPE uint32_t + +#elif defined(__MKL26Z64__) +#define IO_REG_TYPE uint8_t + +#elif defined(__SAM3X8E__) || defined(__SAM3A8C__) || defined(__SAM3A4C__) +#define IO_REG_TYPE uint32_t + +#elif defined(__PIC32MX__) +#define IO_REG_TYPE uint32_t + +#elif defined(ARDUINO_ARCH_ESP8266) +#define IO_REG_TYPE uint32_t + +#elif defined(ARDUINO_ARCH_ESP32) +#define IO_REG_TYPE uint32_t +#define IO_REG_MASK_ATTR + +#elif defined(ARDUINO_ARCH_STM32) +#define IO_REG_TYPE uint32_t + +#elif defined(__SAMD21G18A__) +#define IO_REG_TYPE uint32_t + +#elif defined(__ASR6501__) +#define IO_REG_TYPE uint32_t + +#elif defined(RBL_NRF51822) +#define IO_REG_TYPE uint32_t + +#elif defined(__arc__) /* Arduino101/Genuino101 specifics */ +#define IO_REG_TYPE uint32_t + +#elif defined(__MBED__) +#include "DigitalInOut.h" +#define IO_REG_TYPE mbed::DigitalInOut* + +#elif defined(__riscv) +#define IO_REG_TYPE uint32_t + +#else +#define IO_REG_TYPE unsigned int + +#endif +#endif diff --git a/myProfile.json b/myProfile.json index fd7485a8..6dd84da6 100644 --- a/myProfile.json +++ b/myProfile.json @@ -9,23 +9,23 @@ "wifirep_netmask": "255.255.255.0", "wifirep_gateway": "192.168.4.1", "wifirep_dns": "192.168.4.1", - "routerssid": "iot", - "routerpass": "hostel3333", + "routerssid": "HomeNET", + "routerpass": "Wi73Jktu0205", "timezone": 2, "ntp": "pool.ntp.org", "weblogin": "admin", "webpass": "admin", - "mqttServer": "", - "mqttPort": 8021, - "mqttPrefix": "/risenew", + "mqttServer": "192.168.88.10", + "mqttPort": 1883, + "mqttPrefix": "/IoTmanager", "mqttUser": "rise", "mqttPass": "3hostel3", "serverip": "http://iotmanager.org", "serverlocal": "http://192.168.1.2:5500", "log": 0, "mqttin": 0, - "pinSCL": 0, - "pinSDA": 0, + "pinSCL": 9, + "pinSDA": 8, "i2cFreq": 100000, "wg": "group1", "debugTraceMsgTlgrm": 1 @@ -298,6 +298,10 @@ "path": "src/modules/sensors/DS2401", "active": false }, + { + "path": "src/modules/sensors/DscKeybus", + "active": false + }, { "path": "src/modules/sensors/Emon", "active": false @@ -488,6 +492,10 @@ "path": "src/modules/exec/Mcp23017", "active": false }, + { + "path": "src/modules/exec/MilightHub", + "active": false + }, { "path": "src/modules/exec/Mp3", "active": false @@ -566,6 +574,10 @@ "path": "src/modules/display/Lcd2004", "active": false }, + { + "path": "src/modules/display/LedFX", + "active": false + }, { "path": "src/modules/display/Nextion", "active": false @@ -590,10 +602,43 @@ "path": "src/modules/display/TM16XX", "active": false }, + { + "path": "src/modules/display/U8g2lib", + "active": false + }, { "path": "src/modules/display/Ws2812b", "active": false } ] - } + }, + "configItem": [ + { + "global": 0, + "name": "MiLight Hub", + "type": "Writing", + "subtype": "MilightHub", + "id": "milight", + "widget": "", + "page": "Исполнители", + "descr": "Управление светом через esp8266_milight_hub REST API.", + "host": "milight-hub", + "port": 80, + "targetType": "alias", + "alias": "livingroom", + "deviceId": "0x0000", + "remoteType": "rgb_cct", + "groupId": 0, + "blockOnQueue": false, + "normalizedResponse": false, + "storeResponse": true, + "username": "", + "password": "", + "timeout": 5000, + "mqttCommandTopic": "milight/command", + "mqttCommandUsePrefix": true, + "mqttResponseTopic": "milight/response", + "mqttResponseUsePrefix": true + } + ] } \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index a30c681f..a87688e4 100644 --- a/platformio.ini +++ b/platformio.ini @@ -6,6 +6,16 @@ data_dir = data_svelte lib_deps_external = bblanchon/ArduinoJson @6.18.0 knolleary/PubSubClient + gyverlibs/EncButton @ ^2.0 + https://github.com/maxint-rd/TM16xx + https://github.com/adafruit/Adafruit-GFX-Library + adafruit/Adafruit BusIO @ ^1.13.2 + adafruit/Adafruit BME280 Library + adafruit/Adafruit BMP280 Library + beegee-tokyo/DHT sensor library for ESPx + adafruit/MAX6675 library + kitesurfer1404/WS2812FX@^1.4.5 + https://github.com/taligentx/dscKeybusInterface.git [env] extra_scripts = pre:tools/prebuildscript.py @@ -524,8 +534,6 @@ lib_deps = WEMOS SHT3x@1.0.0 plerup/EspSoftwareSerial adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 - adafruit/Adafruit BusIO @ ^1.13.2 - adafruit/Adafruit BusIO @ ^1.13.2 https://github.com/robotclass/RobotClass_LiquidCrystal_I2C marcoschwartz/LiquidCrystal_I2C@^1.1.4 build_src_filter = @@ -568,8 +576,6 @@ lib_deps = plerup/EspSoftwareSerial gyverlibs/EncButton @ ^2.0 adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 - adafruit/Adafruit BusIO @ ^1.13.2 - adafruit/Adafruit BusIO @ ^1.13.2 https://github.com/robotclass/RobotClass_LiquidCrystal_I2C marcoschwartz/LiquidCrystal_I2C@^1.1.4 build_src_filter = @@ -641,8 +647,6 @@ build_src_filter = lib_deps = milesburton/DallasTemperature@^3.9.1 adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 - adafruit/Adafruit BusIO @ ^1.13.2 - adafruit/Adafruit BusIO @ ^1.13.2 marcoschwartz/LiquidCrystal_I2C@^1.1.4 build_src_filter = + @@ -671,8 +675,6 @@ lib_deps = plerup/EspSoftwareSerial gyverlibs/EncButton @ ^2.0 adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 - adafruit/Adafruit BusIO @ ^1.13.2 - adafruit/Adafruit BusIO @ ^1.13.2 https://github.com/robotclass/RobotClass_LiquidCrystal_I2C marcoschwartz/LiquidCrystal_I2C@^1.1.4 build_src_filter = @@ -738,8 +740,10 @@ build_src_filter = + + + + + + + + + + + + @@ -778,8 +782,10 @@ build_src_filter = + + + + + + + + + + + + @@ -879,6 +885,7 @@ build_src_filter = + + + + - + + + @@ -892,8 +899,10 @@ build_src_filter = + + + + + + + + + + + + @@ -917,15 +926,52 @@ build_src_filter = [env:esp32c3m_4mb_fromitems] lib_deps = + https://github.com/enjoyneering/AHTxx.git + adafruit/Adafruit BME280 Library + adafruit/Adafruit BMP280 Library + beegee-tokyo/DHT sensor library for ESPx + milesburton/DallasTemperature @ ^4.0.4 + adafruit/MAX6675 library + plerup/EspSoftwareSerial + gyverlibs/EncButton @ ^2.0 + https://github.com/maxint-rd/TM16xx + https://github.com/adafruit/Adafruit-GFX-Library + adafruit/Adafruit BusIO @ ^1.13.2 build_src_filter = + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +build_flags = + -Dmod_RtcDriver + -DhardRTC=1 [env:esp32s3_16mb_fromitems] lib_deps = @@ -1011,6 +1057,8 @@ build_src_filter = + + + + + + + + + + @@ -1052,6 +1100,8 @@ build_src_filter = + + + + + + + + + + diff --git a/src/modules/API.cpp b/src/modules/API.cpp index 6e4dde81..c7609152 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -1,13 +1,65 @@ #include "ESPConfiguration.h" +void* getAPI_Cron(String subtype, String params); +void* getAPI_Loging(String subtype, String params); +void* getAPI_LogingDaily(String subtype, String params); +void* getAPI_LogingHourly(String subtype, String params); +void* getAPI_IoTMath(String subtype, String params); +void* getAPI_owmWeather(String subtype, String params); +void* getAPI_Ping(String subtype, String params); void* getAPI_Timer(String subtype, String params); -void* getAPI_BL0937(String subtype, String params); -void* getAPI_BL0942(String subtype, String params); +void* getAPI_UpdateServer(String subtype, String params); +void* getAPI_Variable(String subtype, String params); +void* getAPI_VButton(String subtype, String params); +void* getAPI_AhtXX(String subtype, String params); +void* getAPI_AnalogAdc(String subtype, String params); +void* getAPI_Bme280(String subtype, String params); +void* getAPI_Bmp280(String subtype, String params); +void* getAPI_Dht1122(String subtype, String params); +void* getAPI_Ds18b20(String subtype, String params); +void* getAPI_Impulse(String subtype, String params); +void* getAPI_Ntc(String subtype, String params); +void* getAPI_RTC(String subtype, String params); +void* getAPI_UART(String subtype, String params); +void* getAPI_AnalogBtn(String subtype, String params); +void* getAPI_ButtonIn(String subtype, String params); +void* getAPI_ButtonOut(String subtype, String params); +void* getAPI_Encoder(String subtype, String params); +void* getAPI_Multitouch(String subtype, String params); +void* getAPI_Pwm32(String subtype, String params); +void* getAPI_TelegramLT(String subtype, String params); +void* getAPI_Thermostat(String subtype, String params); void* getAPI(String subtype, String params) { -void* tmpAPI; -if ((tmpAPI = getAPI_Timer(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_BL0937(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_BL0942(subtype, params)) != nullptr) return tmpAPI; -return nullptr; +void* tmpAPI; void* foundAPI = nullptr; +if ((tmpAPI = getAPI_Cron(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Loging(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_LogingDaily(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_LogingHourly(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_IoTMath(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_owmWeather(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Ping(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Timer(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_UpdateServer(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Variable(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_VButton(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_AhtXX(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Bme280(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Bmp280(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Dht1122(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Ds18b20(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Impulse(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Ntc(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_RTC(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_UART(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_AnalogBtn(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_ButtonIn(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_ButtonOut(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Encoder(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Multitouch(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Pwm32(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_TelegramLT(subtype, params)) != nullptr) foundAPI = tmpAPI; +if ((tmpAPI = getAPI_Thermostat(subtype, params)) != nullptr) foundAPI = tmpAPI; +return foundAPI; } \ No newline at end of file diff --git a/src/modules/display/TM16XX/example.json b/src/modules/display/TM16XX/example.json index 68043ab5..f5effbb6 100644 --- a/src/modules/display/TM16XX/example.json +++ b/src/modules/display/TM16XX/example.json @@ -233,7 +233,8 @@ if tm_17 == 2 then tm.setParamLED(1, 0) if timer1 >= 0 & page == 1 then tm = "ttt1" + timer1 if timer2 >= 0 & page == 2 then tm = "ttt2" + timer2 -if timer1 >= 0 | timer2 >= 0 then { +if timer1 >= 0 | timer2 >= 0 then +{ if page == 3 then tm = timer1 + " " + timer2 } if page == 0 then tm.setParamLED(0, 5) diff --git a/src/modules/exec/MilightHub/MilightHub.cpp b/src/modules/exec/MilightHub/MilightHub.cpp new file mode 100644 index 00000000..f8eaa2f4 --- /dev/null +++ b/src/modules/exec/MilightHub/MilightHub.cpp @@ -0,0 +1,994 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include "utils/SerialPrint.h" +#include "MqttClient.h" + +#include + +namespace { +const char* kTag = "MilightHub"; + +String escapeJson(const String& input) { + String escaped; + escaped.reserve(input.length() + 4); + + for (size_t i = 0; i < input.length(); ++i) { + const char c = input[i]; + switch (c) { + case '"': + escaped += F("\\\""); + break; + case '\\': + escaped += F("\\\\"); + break; + case '\b': + escaped += F("\\b"); + break; + case '\f': + escaped += F("\\f"); + break; + case '\n': + escaped += F("\\n"); + break; + case '\r': + escaped += F("\\r"); + break; + case '\t': + escaped += F("\\t"); + break; + default: { + const uint8_t code = static_cast(c); + if (code < 0x20) { + char buffer[7]; + snprintf(buffer, sizeof(buffer), "\\u%04X", code); + escaped += buffer; + } else { + escaped += c; + } + break; + } + } + } + + return escaped; +} + +bool isNumericString(const String& value) { + if (!value.length()) { + return false; + } + + bool seenDigit = false; + bool seenDot = false; + size_t idx = 0; + + if (value[0] == '-' || value[0] == '+') { + idx = 1; + } + + for (; idx < value.length(); ++idx) { + const char c = value[idx]; + if (c == '.') { + if (seenDot) { + return false; + } + seenDot = true; + continue; + } + if (!isDigit(c)) { + return false; + } + seenDigit = true; + } + + return seenDigit; +} + +String encodeUriComponent(const String& value) { + static const char* hex = "0123456789ABCDEF"; + String encoded; + encoded.reserve(value.length() * 3); + + for (size_t i = 0; i < value.length(); ++i) { + const uint8_t c = static_cast(value[i]); + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '-' || c == '_' || + c == '.' || c == '~') { + encoded += static_cast(c); + } else { + encoded += '%'; + encoded += hex[(c >> 4) & 0x0F]; + encoded += hex[c & 0x0F]; + } + } + + return encoded; +} + +String doubleToString(float value) { + if (isnan(value) || isinf(value)) { + return String(); + } + + const long whole = static_cast(value); + if (fabs(value - static_cast(whole)) < 0.0005f) { + return String(whole); + } + + return String(value, 3); +} + +String normalizeBoolString(String value) { + value.trim(); + value.toLowerCase(); + return value; +} + +String toParamString(const IoTValue& param) { + if (param.isDecimal) { + return doubleToString(param.valD); + } + + String copy = param.valS; + copy.trim(); + return copy; +} +} + +class MilightHubItem : public IoTItem { +public: + explicit MilightHubItem(String parameters); + + IoTValue execute(String command, std::vector& param) override; + void loop() override; + void onMqttRecive(String& topic, String& msg) override; + String getMqttExterSub() override; + +private: + struct RequestContext { + bool valid = false; + bool byAlias = true; + String alias; + String deviceId; + String remoteType; + int groupId = 0; + bool blockOnQueue = false; + bool normalized = false; + }; + +private: + RequestContext currentContext() const; + String buildTargetPath(const RequestContext& ctx) const; + String buildUrl(const String& path, bool block, bool normalized) const; + bool performRequest(const String& method, const RequestContext& ctx, const String& payload, String& response, int& statusCode); + void storeResponse(const String& payload, int statusCode, bool notify); + bool sendUpdate(const String& payload); + bool sendFieldUpdate(const String& field, const IoTValue& value); + bool sendCommandPayload(const String& payload); + bool sendCommandsPayload(const String& payload); + bool requestState(); + bool deleteState(); + bool postRawCommand(const String& payload, const String& remoteTypeOverride); + + String valueToJsonLiteral(const IoTValue& value) const; + String buildFieldPayload(const String& field, const IoTValue& value) const; + String buildCommandPayload(const String& command) const; + String buildCommandsPayload(const String& commands) const; + + void setAliasInternal(const String& alias); + void setDeviceInternal(const String& deviceId, const String& remoteType, int groupId); + void ensureMqttSubscription(); + void handleMqttMessage(String payload); + bool handleJsonMqttCommand(JsonVariantConst root); + void handlePlainMqttCommand(const String& payload); + IoTValue jsonVariantToIoTValue(JsonVariantConst variant) const; + IoTValue makeStringValue(const String& text) const; + void publishMqttResponse(const String& payload, int statusCode); + String resolveTopic(const String& topic, bool addPrefix) const; + +private: + String _host; + uint16_t _port = 80; + bool _useAlias = true; + String _alias; + String _deviceId; + String _remoteType; + int _groupId = 0; + bool _blockOnQueue = false; + bool _normalizedResponse = false; + bool _rememberResponse = true; + String _username; + String _password; + uint16_t _timeoutMs = 5000; + String _mqttCommandTopic; + bool _mqttCommandAddPrefix = false; + String _mqttResponseTopic; + bool _mqttResponseAddPrefix = false; + String _resolvedCommandTopic; + String _resolvedResponseTopic; + bool _mqttSubscribed = false; +}; + +MilightHubItem::MilightHubItem(String parameters) : IoTItem(parameters) { + _host = jsonReadStr(parameters, F("host")); + if (_host.length() == 0) { + SerialPrint("W", kTag, F("host not set")); + } + + const int port = jsonReadInt(parameters, F("port")); + if (port > 0 && port <= 65535) { + _port = static_cast(port); + } + + String targetType = jsonReadStr(parameters, F("targetType")); + targetType.toLowerCase(); + if (targetType == F("device")) { + _useAlias = false; + } + + _alias = jsonReadStr(parameters, F("alias")); + _deviceId = jsonReadStr(parameters, F("deviceId")); + _remoteType = jsonReadStr(parameters, F("remoteType")); + _groupId = jsonReadInt(parameters, F("groupId")); + if (_groupId < 0) { + _groupId = 0; + } + + _blockOnQueue = jsonReadBool(parameters, F("blockOnQueue")); + _normalizedResponse = jsonReadBool(parameters, F("normalizedResponse")); + + const String remember = jsonReadStr(parameters, F("storeResponse")); + if (remember.length()) { + String normalized = remember; + normalized.toLowerCase(); + _rememberResponse = (normalized == F("true")); + } else { + _rememberResponse = jsonReadBool(parameters, F("storeResponse")); + } + + _username = jsonReadStr(parameters, F("username")); + _password = jsonReadStr(parameters, F("password")); + + const int timeout = jsonReadInt(parameters, F("timeout")); + if (timeout > 0) { + _timeoutMs = static_cast(timeout); + } + + _mqttCommandTopic = jsonReadStr(parameters, F("mqttCommandTopic")); + _mqttCommandAddPrefix = true; + jsonRead(parameters, F("mqttCommandUsePrefix"), _mqttCommandAddPrefix, false); + _mqttResponseTopic = jsonReadStr(parameters, F("mqttResponseTopic")); + _mqttResponseAddPrefix = true; + jsonRead(parameters, F("mqttResponseUsePrefix"), _mqttResponseAddPrefix, false); + _resolvedCommandTopic = resolveTopic(_mqttCommandTopic, _mqttCommandAddPrefix); + _resolvedResponseTopic = resolveTopic(_mqttResponseTopic, _mqttResponseAddPrefix); + if (_resolvedCommandTopic.length() && mqttIsConnect()) { + mqttSubscribeExternal(_mqttCommandTopic, _mqttCommandAddPrefix); + _mqttSubscribed = true; + } + + value.isDecimal = false; +} + +void MilightHubItem::loop() { + ensureMqttSubscription(); + IoTItem::loop(); +} + +MilightHubItem::RequestContext MilightHubItem::currentContext() const { + RequestContext ctx; + ctx.blockOnQueue = _blockOnQueue; + ctx.normalized = _normalizedResponse; + + if (_useAlias) { + ctx.byAlias = true; + ctx.alias = _alias; + ctx.valid = ctx.alias.length() > 0; + } else { + ctx.byAlias = false; + ctx.deviceId = _deviceId; + ctx.remoteType = _remoteType; + ctx.groupId = _groupId; + ctx.valid = ctx.deviceId.length() > 0 && ctx.remoteType.length() > 0; + } + + return ctx; +} + +String MilightHubItem::buildTargetPath(const RequestContext& ctx) const { + if (!ctx.valid) { + return String(); + } + + if (ctx.byAlias) { + return String(F("/gateways/")) + encodeUriComponent(ctx.alias); + } + + String path(F("/gateways/")); + path += encodeUriComponent(ctx.deviceId); + path += '/'; + path += encodeUriComponent(ctx.remoteType); + path += '/'; + path += String(ctx.groupId); + return path; +} + +String MilightHubItem::buildUrl(const String& path, bool block, bool normalized) const { + String url(F("http://")); + url += _host; + if (_port != 80) { + url += ':'; + url += String(_port); + } + url += path; + + char separator = '?'; + if (block) { + url += separator; + url += F("blockOnQueue=true"); + separator = '&'; + } + if (normalized) { + url += separator; + url += F("fmt=normalized"); + } + return url; +} + +void MilightHubItem::ensureMqttSubscription() { + if (!_resolvedCommandTopic.length()) { + return; + } + if (!mqttIsConnect()) { + _mqttSubscribed = false; + return; + } + if (_mqttSubscribed) { + return; + } + mqttSubscribeExternal(_mqttCommandTopic, _mqttCommandAddPrefix); + _mqttSubscribed = true; +} + +bool MilightHubItem::performRequest(const String& method, const RequestContext& ctx, const String& payload, String& response, int& statusCode) { + if (!ctx.valid) { + SerialPrint("E", kTag, F("target not configured")); + return false; + } + + const String path = buildTargetPath(ctx); + const String url = buildUrl(path, ctx.blockOnQueue, ctx.normalized); + + WiFiClient client; + HTTPClient http; + +#if defined(ESP8266) || defined(ESP32) || defined(LIBRETINY) + if (!http.begin(client, url)) { +#else + if (!http.begin(url)) { +#endif + SerialPrint("E", kTag, String(F("HTTP begin failed: ")) + url); + return false; + } + + if (_username.length()) { + http.setAuthorization(_username.c_str(), _password.c_str()); + } + + if (_timeoutMs > 0) { + http.setTimeout(_timeoutMs); + } + + if (method == F("PUT") || method == F("POST")) { + http.addHeader(F("Content-Type"), F("application/json")); + } + + if (method == F("GET")) { + statusCode = http.GET(); + } else if (method == F("PUT")) { + statusCode = http.PUT(payload); + } else if (method == F("POST")) { + statusCode = http.POST(payload); + } else if (method == F("DELETE")) { + statusCode = http.sendRequest(F("DELETE")); + } else { + SerialPrint("E", kTag, String(F("unsupported method: ")) + method); + http.end(); + return false; + } + + response = http.getString(); + http.end(); + + if (statusCode < 0) { + SerialPrint("E", kTag, String(F("HTTP error: ")) + HTTPClient::errorToString(statusCode)); + return false; + } + + const bool success = statusCode >= 200 && statusCode < 300; + SerialPrint(success ? "i" : "E", kTag, method + ' ' + url + F(" -> ") + String(statusCode)); + + if (response.length()) { + SerialPrint("i", kTag, String(F("response: ")) + response); + } + + return success; +} + +void MilightHubItem::storeResponse(const String& payload, int statusCode, bool notify) { + value.isDecimal = false; + if (payload.length()) { + value.valS = payload; + } else { + value.valS = String(statusCode); + } + + publishMqttResponse(payload, statusCode); + + if (notify) { + regEvent(value.valS, kTag); + } +} + +bool MilightHubItem::sendUpdate(const String& rawPayload) { + if (!isNetworkActive()) { + SerialPrint("W", kTag, F("network offline")); + return false; + } + + String payload = rawPayload; + payload.trim(); + if (!payload.length()) { + return false; + } + + if (!(payload.startsWith("{") || payload.startsWith("["))) { + String normalized = payload; + normalized.trim(); + normalized.toUpperCase(); + if (normalized == F("ON") || normalized == F("OFF")) { + payload = String(F("{\"state\":\"")) + normalized + F("\"}"); + } else { + SerialPrint("E", kTag, F("set expects JSON payload or ON/OFF")); + return false; + } + } + + RequestContext ctx = currentContext(); + String response; + int status = 0; + const bool ok = performRequest(F("PUT"), ctx, payload, response, status); + storeResponse(response, status, _rememberResponse); + return ok; +} + +bool MilightHubItem::sendFieldUpdate(const String& field, const IoTValue& fieldValue) { + if (!field.length()) { + return false; + } + + const String payload = buildFieldPayload(field, fieldValue); + return sendUpdate(payload); +} + +bool MilightHubItem::sendCommandPayload(const String& payload) { + if (!payload.length()) { + return false; + } + + RequestContext ctx = currentContext(); + String response; + int status = 0; + const bool ok = performRequest(F("PUT"), ctx, payload, response, status); + storeResponse(response, status, _rememberResponse); + return ok; +} + +bool MilightHubItem::sendCommandsPayload(const String& payload) { + return sendCommandPayload(payload); +} + +bool MilightHubItem::requestState() { + if (!isNetworkActive()) { + SerialPrint("W", kTag, F("network offline")); + return false; + } + + RequestContext ctx = currentContext(); + ctx.blockOnQueue = false; // reading does not need block + String response; + int status = 0; + const bool ok = performRequest(F("GET"), ctx, String(), response, status); + storeResponse(response, status, true); + return ok; +} + +bool MilightHubItem::deleteState() { + if (!isNetworkActive()) { + SerialPrint("W", kTag, F("network offline")); + return false; + } + + RequestContext ctx = currentContext(); + String response; + int status = 0; + const bool ok = performRequest(F("DELETE"), ctx, String(), response, status); + storeResponse(response, status, _rememberResponse); + return ok; +} + +bool MilightHubItem::postRawCommand(const String& payload, const String& remoteTypeOverride) { + if (!isNetworkActive()) { + SerialPrint("W", kTag, F("network offline")); + return false; + } + + String remote = remoteTypeOverride.length() ? remoteTypeOverride : _remoteType; + if (!remote.length()) { + SerialPrint("E", kTag, F("remoteType required for raw command")); + return false; + } + + RequestContext ctx = currentContext(); + ctx.valid = true; + ctx.byAlias = false; + ctx.deviceId = String(); + ctx.remoteType = remote; + ctx.groupId = 0; + + const String path = String(F("/raw_commands/")) + encodeUriComponent(remote); + const String url = buildUrl(path, false, false); + + WiFiClient client; + HTTPClient http; + +#if defined(ESP8266) || defined(ESP32) || defined(LIBRETINY) + if (!http.begin(client, url)) { +#else + if (!http.begin(url)) { +#endif + SerialPrint("E", kTag, String(F("HTTP begin failed: ")) + url); + return false; + } + + if (_username.length()) { + http.setAuthorization(_username.c_str(), _password.c_str()); + } + if (_timeoutMs > 0) { + http.setTimeout(_timeoutMs); + } + http.addHeader(F("Content-Type"), F("application/json")); + + const int status = http.POST(payload); + const String response = http.getString(); + http.end(); + + if (status < 0) { + SerialPrint("E", kTag, String(F("HTTP error: ")) + HTTPClient::errorToString(status)); + return false; + } + + const bool ok = status >= 200 && status < 300; + SerialPrint(ok ? "i" : "E", kTag, String(F("POST ")) + url + F(" -> ") + String(status)); + if (response.length()) { + SerialPrint("i", kTag, String(F("response: ")) + response); + } + + storeResponse(response, status, _rememberResponse); + return ok; +} + +String MilightHubItem::getMqttExterSub() { + return _resolvedCommandTopic; +} + +void MilightHubItem::onMqttRecive(String& topic, String& msg) { + if (!_resolvedCommandTopic.length()) { + return; + } + if (topic != _resolvedCommandTopic) { + return; + } + if (msg.startsWith(F("HELLO"))) { + return; + } + handleMqttMessage(msg); +} + +String MilightHubItem::valueToJsonLiteral(const IoTValue& value) const { + if (value.isDecimal) { + return doubleToString(value.valD); + } + + String text = value.valS; + text.trim(); + if (!text.length()) { + return String(F("\"\"")); + } + + String lower = text; + lower.toLowerCase(); + if (lower == F("true") || lower == F("false")) { + return lower; + } + + if (isNumericString(text)) { + return text; + } + + if (text.startsWith("{") || text.startsWith("[") || + (text.startsWith("\"") && text.endsWith("\""))) { + return text; + } + + return String('"') + escapeJson(text) + '"'; +} + +String MilightHubItem::buildFieldPayload(const String& rawField, const IoTValue& value) const { + String field = rawField; + field.trim(); + if (!field.length()) { + return String(); + } + + String payload(F("{\"")); + payload += field; + payload += F("\":"); + payload += valueToJsonLiteral(value); + payload += '}'; + return payload; +} + +String MilightHubItem::buildCommandPayload(const String& command) const { + String trimmed = command; + trimmed.trim(); + if (!trimmed.length()) { + return String(); + } + + if (trimmed.startsWith("{")) { + return trimmed; + } + + if (trimmed.startsWith("\"") && trimmed.endsWith("\"")) { + return String(F("{\"command\":")) + trimmed + '}'; + } + + return String(F("{\"command\":\"")) + escapeJson(trimmed) + F("\"}"); +} + +String MilightHubItem::buildCommandsPayload(const String& commands) const { + String trimmed = commands; + trimmed.trim(); + if (!trimmed.length()) { + return String(); + } + + if (trimmed.startsWith("[")) { + return String(F("{\"commands\":")) + trimmed + '}'; + } + + if (trimmed.startsWith("{")) { + return trimmed; + } + + return String(F("{\"commands\":[\"")) + escapeJson(trimmed) + F("\"]}")); +} + +void MilightHubItem::setAliasInternal(const String& alias) { + if (!alias.length()) { + SerialPrint("W", kTag, F("empty alias ignored")); + return; + } + _alias = alias; + _useAlias = true; + SerialPrint("i", kTag, String(F("alias set to ")) + _alias); +} + +void MilightHubItem::setDeviceInternal(const String& deviceId, const String& remoteType, int groupId) { + if (!deviceId.length() || !remoteType.length()) { + SerialPrint("E", kTag, F("deviceId and remoteType required")); + return; + } + _deviceId = deviceId; + _remoteType = remoteType; + if (groupId < 0) { + groupId = 0; + } + _groupId = groupId; + _useAlias = false; + SerialPrint("i", kTag, String(F("device target: ")) + _deviceId + F(" / ") + _remoteType + F(" / ") + String(_groupId)); +} + +void MilightHubItem::handleMqttMessage(String payload) { + payload.trim(); + if (!payload.length()) { + return; + } + + const size_t capacity = payload.length() + 64; + DynamicJsonDocument doc(capacity); + const DeserializationError err = deserializeJson(doc, payload); + if (!err) { + JsonVariantConst root = doc.as(); + if (handleJsonMqttCommand(root)) { + return; + } + } + + handlePlainMqttCommand(payload); +} + +bool MilightHubItem::handleJsonMqttCommand(JsonVariantConst root) { + if (root.is()) { + JsonObjectConst obj = root.as(); + String command = obj[F("command")].as(); + if (!command.length()) { + command = obj[F("action")].as(); + } + + if (!command.length()) { + String serialized; + serializeJson(obj, serialized); + sendUpdate(serialized); + return true; + } + + std::vector params; + if (obj.containsKey(F("params")) && obj[F("params")].is()) { + JsonArrayConst arr = obj[F("params")].as(); + for (JsonVariantConst entry : arr) { + params.push_back(jsonVariantToIoTValue(entry)); + } + } else { + if (obj.containsKey(F("payload"))) { + params.push_back(jsonVariantToIoTValue(obj[F("payload")])); + } else if (obj.containsKey(F("value"))) { + params.push_back(jsonVariantToIoTValue(obj[F("value")])); + } + } + + if (command.equalsIgnoreCase(F("setdevice")) && + obj.containsKey(F("deviceId")) && obj.containsKey(F("remoteType")) && obj.containsKey(F("groupId"))) { + params.clear(); + params.push_back(makeStringValue(obj[F("deviceId")].as())); + params.push_back(makeStringValue(obj[F("remoteType")].as())); + params.push_back(makeStringValue(obj[F("groupId")].as())); + } + + if (command.equalsIgnoreCase(F("setfield")) && obj.containsKey(F("field")) && obj.containsKey(F("value"))) { + params.clear(); + params.push_back(makeStringValue(obj[F("field")].as())); + params.push_back(jsonVariantToIoTValue(obj[F("value")])); + } else if (obj.containsKey(F("field"))) { + params.insert(params.begin(), makeStringValue(obj[F("field")].as())); + } + + if (command.equalsIgnoreCase(F("raw")) && obj.containsKey(F("remoteType")) && !params.empty()) { + params.push_back(makeStringValue(obj[F("remoteType")].as())); + } + + execute(command, params); + return true; + } + + if (root.is()) { + String serialized; + serializeJson(root, serialized); + sendUpdate(serialized); + return true; + } + + return false; +} + +void MilightHubItem::handlePlainMqttCommand(const String& payload) { + String lowered = payload; + lowered.toLowerCase(); + + if (lowered == F("get")) { + requestState(); + return; + } + if (lowered == F("deletestate") || lowered == F("delete")) { + deleteState(); + return; + } + if (lowered.startsWith(F("command "))) { + String commandPayload = payload.substring(8); + const String payloadJson = buildCommandPayload(commandPayload); + sendCommandPayload(payloadJson); + return; + } + if (lowered.startsWith(F("raw "))) { + String rawPayload = payload.substring(4); + postRawCommand(rawPayload, String()); + return; + } + + sendUpdate(payload); +} + +IoTValue MilightHubItem::jsonVariantToIoTValue(JsonVariantConst variant) const { + IoTValue result; + if (variant.is() || variant.is() || variant.is() || variant.is()) { + result.isDecimal = true; + result.valD = static_cast(variant.as()); + result.valS = doubleToString(result.valD); + return result; + } + + if (variant.is()) { + result.isDecimal = false; + result.valS = variant.as() ? F("true") : F("false"); + return result; + } + + if (variant.is()) { + result.isDecimal = false; + result.valS = variant.as(); + return result; + } + + result.isDecimal = false; + String serialized; + serializeJson(variant, serialized); + result.valS = serialized; + return result; +} + +IoTValue MilightHubItem::makeStringValue(const String& text) const { + IoTValue result; + result.isDecimal = false; + result.valS = text; + return result; +} + +void MilightHubItem::publishMqttResponse(const String& payload, int statusCode) { + if (!_resolvedResponseTopic.length()) { + return; + } + if (!mqttIsConnect()) { + return; + } + + String json(F("{}")); + jsonWriteInt_(json, F("status"), statusCode); + if (payload.length()) { + jsonWriteStr_(json, F("payload"), payload); + } + + if (!publish(_resolvedResponseTopic, json)) { + SerialPrint("W", kTag, F("MQTT response publish failed")); + } +} + +String MilightHubItem::resolveTopic(const String& topic, bool addPrefix) const { + if (!topic.length()) { + return String(); + } + if (!addPrefix) { + return topic; + } + return mqttPrefix + '/' + topic; +} + +IoTValue MilightHubItem::execute(String command, std::vector& param) { + IoTValue result; + + command.toLowerCase(); + + if (command == F("set")) { + if (!param.empty()) { + sendUpdate(toParamString(param[0])); + } + } else if (command == F("setfield")) { + if (param.size() >= 2) { + const String field = toParamString(param[0]); + sendFieldUpdate(field, param[1]); + } + } else if (command == F("command")) { + if (!param.empty()) { + const String payload = buildCommandPayload(toParamString(param[0])); + sendCommandPayload(payload); + } + } else if (command == F("commands")) { + if (!param.empty()) { + const String payload = buildCommandsPayload(toParamString(param[0])); + sendCommandsPayload(payload); + } + } else if (command == F("get")) { + requestState(); + } else if (command == F("deletestate")) { + deleteState(); + } else if (command == F("setalias")) { + if (!param.empty()) { + setAliasInternal(toParamString(param[0])); + } + } else if (command == F("setdevice")) { + if (param.size() >= 3) { + const String deviceId = toParamString(param[0]); + const String remoteType = toParamString(param[1]); + const String groupString = toParamString(param[2]); + int group = groupString.toInt(); + setDeviceInternal(deviceId, remoteType, group); + } + } else if (command == F("setblock")) { + if (!param.empty()) { + String value = toParamString(param[0]); + value = normalizeBoolString(value); + if (value == F("true") || value == F("1")) { + _blockOnQueue = true; + } else if (value == F("false") || value == F("0")) { + _blockOnQueue = false; + } + SerialPrint("i", kTag, String(F("blockOnQueue=")) + (_blockOnQueue ? F("true") : F("false"))); + } + } else if (command == F("setnormalized")) { + if (!param.empty()) { + String value = toParamString(param[0]); + value = normalizeBoolString(value); + if (value == F("true") || value == F("1")) { + _normalizedResponse = true; + } else if (value == F("false") || value == F("0")) { + _normalizedResponse = false; + } + SerialPrint("i", kTag, String(F("normalizedResponse=")) + (_normalizedResponse ? F("true") : F("false"))); + } + } else if (command == F("setstore")) { + if (!param.empty()) { + String value = toParamString(param[0]); + value = normalizeBoolString(value); + if (value == F("true") || value == F("1")) { + _rememberResponse = true; + } else if (value == F("false") || value == F("0")) { + _rememberResponse = false; + } + SerialPrint("i", kTag, String(F("storeResponse=")) + (_rememberResponse ? F("true") : F("false"))); + } + } else if (command == F("setauth")) { + if (param.size() >= 2) { + _username = toParamString(param[0]); + _password = toParamString(param[1]); + SerialPrint("i", kTag, F("basic auth credentials updated")); + } + } else if (command == F("settimeout")) { + if (!param.empty()) { + const int timeout = toParamString(param[0]).toInt(); + if (timeout > 0) { + _timeoutMs = static_cast(timeout); + SerialPrint("i", kTag, String(F("timeout=")) + String(_timeoutMs)); + } + } + } else if (command == F("sethost")) { + if (!param.empty()) { + _host = toParamString(param[0]); + SerialPrint("i", kTag, String(F("host=")) + _host); + } + } else if (command == F("setport")) { + if (!param.empty()) { + const int newPort = toParamString(param[0]).toInt(); + if (newPort > 0 && newPort <= 65535) { + _port = static_cast(newPort); + SerialPrint("i", kTag, String(F("port=")) + String(_port)); + } + } + } else if (command == F("raw")) { + if (!param.empty()) { + const String payload = toParamString(param[0]); + String remoteOverride; + if (param.size() >= 2) { + remoteOverride = toParamString(param[1]); + } + postRawCommand(payload, remoteOverride); + } + } + + return result; +} + +void* getAPI_MilightHub(String subtype, String param) { + if (subtype == F("MilightHub")) { + return new MilightHubItem(param); + } + return nullptr; +} diff --git a/src/modules/exec/MilightHub/modinfo.json b/src/modules/exec/MilightHub/modinfo.json new file mode 100644 index 00000000..95802377 --- /dev/null +++ b/src/modules/exec/MilightHub/modinfo.json @@ -0,0 +1,150 @@ +{ + "menuSection": "executive_devices", + "configItem": [ + { + "global": 0, + "name": "MiLight Hub", + "type": "Writing", + "subtype": "MilightHub", + "id": "milight", + "widget": "", + "page": "Исполнители", + "descr": "Управление светом через esp8266_milight_hub REST API.", + "host": "milight-hub", + "port": 80, + "targetType": "alias", + "alias": "livingroom", + "deviceId": "0x0000", + "remoteType": "rgb_cct", + "groupId": 0, + "blockOnQueue": false, + "normalizedResponse": false, + "storeResponse": true, + "username": "", + "password": "", + "timeout": 5000, + "mqttCommandTopic": "", + "mqttCommandUsePrefix": true, + "mqttResponseTopic": "", + "mqttResponseUsePrefix": true + } + ], + "about": { + "descr": "Если задан mqttCommandTopic, модуль слушает указанный MQTT-топик. Ожидаемый формат сообщения: {\"command\":\"set\", \"params\":[...]} или {\"payload\":{...}}. Также понимает текстовые команды GET/DELETESTATE/command .../raw ...", + "authorContact": "https://iotmanager.org", + "authorGit": "https://github.com/IoTManagerProject", + "specialThanks": "https://github.com/sidoh/esp8266_milight_hub", + "moduleName": "MilightHub", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 16, + "esp8266_4mb": 16 + }, + "title": "ESP8266 MiLight Hub REST", + "moduleDesc": "Команды управления устройствами через REST API прошивки esp8266_milight_hub. Дополнительно может слушать MQTT-топик и пересылать ответы обратно в брокер.", + "propInfo": { + "host": "Имя хоста или IP адрес MiLight Hub.", + "port": "TCP порт REST API (по умолчанию 80).", + "targetType": "Режим адресации: alias или device.", + "alias": "Имя устройства, заданное в MiLight Hub (используется, если выбран режим alias).", + "deviceId": "Идентификатор устройства (0-65535 или 0xNNNN) для режима device.", + "remoteType": "Тип пульта/лампы (например rgb_cct) для режима device.", + "groupId": "Идентификатор группы (0-8) для режима device.", + "blockOnQueue": "Ждать отправку пакетов перед ответом (параметр blockOnQueue).", + "normalizedResponse": "Добавлять fmt=normalized и получать нормализованный ответ.", + "storeResponse": "Сохранять последний ответ в значении элемента.", + "username": "Логин для HTTP Basic Auth (если включен в MiLight Hub).", + "password": "Пароль для HTTP Basic Auth.", + "timeout": "Таймаут HTTP-запроса в миллисекундах.", + "mqttCommandTopic": "MQTT-топик, откуда модуль будет получать команды (пусто — без MQTT).", + "mqttCommandUsePrefix": "1 — добавлять глобальный mqttPrefix к топику команд, 0 — использовать как указан.", + "mqttResponseTopic": "MQTT-топик для публикации HTTP-ответов (пусто — не публиковать).", + "mqttResponseUsePrefix": "1 — добавлять глобальный mqttPrefix к топику ответов, 0 — использовать как указан." + }, + "funcInfo": [ + { + "name": "set", + "descr": "Отправить JSON с параметрами состояния (PUT /gateways/...). Для простоты поддерживает строки ON/OFF.", + "params": [ + "payload" + ] + }, + { + "name": "setField", + "descr": "Изменить одно поле состояния (brightness, kelvin и т.п.).", + "params": [ + "field", + "value" + ] + }, + { + "name": "command", + "descr": "Отправить команду (night_mode, pair и т.п.). Можно передать полный JSON объекта команды.", + "params": [ + "command" + ] + }, + { + "name": "commands", + "descr": "Отправить массив команд (key commands).", + "params": [ + "commandsArray" + ] + }, + { + "name": "get", + "descr": "Получить текущее состояние устройства (GET /gateways/...).", + "params": [] + }, + { + "name": "deleteState", + "descr": "Удалить сохранённое состояние устройства (DELETE /gateways/...).", + "params": [] + }, + { + "name": "setAlias", + "descr": "Изменить alias по умолчанию и включить режим alias.", + "params": [ + "alias" + ] + }, + { + "name": "setDevice", + "descr": "Изменить deviceId, тип пульта и группу по умолчанию и включить режим device.", + "params": [ + "deviceId", + "remoteType", + "groupId" + ] + }, + { + "name": "setBlock", + "descr": "Включить или выключить blockOnQueue для последующих запросов.", + "params": [ + "bool" + ] + }, + { + "name": "setNormalized", + "descr": "Настроить добавление fmt=normalized к запросам.", + "params": [ + "bool" + ] + }, + { + "name": "mqttControl", + "descr": "Если задан mqttCommandTopic, модуль слушает указанный MQTT-топик. Ожидаемый формат сообщения: {\"command\":\"set\", \"params\":[...]} или {\"payload\":{...}}. Также понимает текстовые команды GET/DELETESTATE/command .../raw ...", + "params": [ + "command", + "params|payload", + "field/value" + ] + } + ] + }, + "defActive": false, + "usedLibs": { + "esp32*": [], + "esp82*": [] + } +} diff --git a/src/modules/sensors/DscKeybus/DscKeybus.cpp b/src/modules/sensors/DscKeybus/DscKeybus.cpp new file mode 100644 index 00000000..43140826 --- /dev/null +++ b/src/modules/sensors/DscKeybus/DscKeybus.cpp @@ -0,0 +1,450 @@ +#include "Global.h" +#include "classes/IoTItem.h" +#include "utils/SerialPrint.h" + +#include + +#include + +struct DscKeybusSharedContext { + dscKeybusInterface* iface = nullptr; + int clockPin = -1; + int readPin = -1; + int writePin = -1; +} dscKeybusShared; + +static dscKeybusInterface* acquireDscInterface(int clockPin, + int readPin, + int writePin, + bool virtualKeypad, + bool processModule, + bool hideDigits) { + const byte normalizedWrite = writePin < 0 ? 255 : static_cast(writePin); + + if (!dscKeybusShared.iface) { + dscKeybusShared.iface = new dscKeybusInterface(static_cast(clockPin), + static_cast(readPin), + normalizedWrite); + dscKeybusShared.clockPin = clockPin; + dscKeybusShared.readPin = readPin; + dscKeybusShared.writePin = writePin; + + dscKeybusShared.iface->hideKeypadDigits = hideDigits; + dscKeybusInterface::virtualKeypad = virtualKeypad; + dscKeybusInterface::processModuleData = processModule; + + dscKeybusShared.iface->begin(Serial); + dscKeybusShared.iface->resetStatus(); + SerialPrint("i", F("Sensor DscKeybus"), "interface ready"); + } else { + if (dscKeybusShared.clockPin != clockPin || dscKeybusShared.readPin != readPin || + dscKeybusShared.writePin != writePin) { + SerialPrint("E", F("Sensor DscKeybus"), "pins mismatch, reuse first init"); + } + + if (virtualKeypad) { + dscKeybusInterface::virtualKeypad = true; + } + if (processModule) { + dscKeybusInterface::processModuleData = true; + } + if (hideDigits) { + dscKeybusShared.iface->hideKeypadDigits = true; + } + } + + return dscKeybusShared.iface; +} + +class DscKeybusItem : public IoTItem { +public: + DscKeybusItem(String parameters, const String& subtype); + + void doByInterval() override; + void loop() override; + IoTValue execute(String command, std::vector& param) override; + +private: + dscKeybusInterface* iface(); + String makeStatus() const; + String makeZones() const; + String makeTrouble() const; + String makeRaw() const; + void publishIfChanged(const String& payload); + int readPinFromConfig(const String& jsonValue, int fallback) const; + byte clampPartition(int candidate) const; + +private: + int _clockPin; + int _readPin; + int _writePin; + byte _partition; + byte _writePartition; + bool _virtualKeypad; + bool _processModule; + bool _hideDigits; + String _mode; + String _lastValue; + bool _initialised = false; +}; + +DscKeybusItem::DscKeybusItem(String parameters, const String& subtype) : IoTItem(parameters) { + _clockPin = readPinFromConfig(jsonReadStr(parameters, "clockPin"), 18); + _readPin = readPinFromConfig(jsonReadStr(parameters, "readPin"), 19); + _writePin = readPinFromConfig(jsonReadStr(parameters, "writePin"), 21); + + _partition = clampPartition(jsonReadInt(parameters, "partition")); + if (_partition == 0) { + _partition = 1; + } + + _writePartition = clampPartition(jsonReadInt(parameters, "writePartition")); + if (_writePartition == 0) { + _writePartition = _partition; + } + + _virtualKeypad = jsonReadBool(parameters, "virtualKeypad"); + _processModule = jsonReadBool(parameters, "processModule"); + _hideDigits = jsonReadBool(parameters, "hideDigits"); + + _mode = jsonReadStr(parameters, "mode"); + if (_mode.length() == 0) { + _mode = subtype; + } + if (_mode.length() == 0) { + _mode = F("status"); + } + _mode.toLowerCase(); + + if (subtype.equalsIgnoreCase(F("DscKeybusZones"))) { + _mode = F("zones"); + } + + if (_writePin < 0) { + _virtualKeypad = false; + } +} + +dscKeybusInterface* DscKeybusItem::iface() { + if (!_initialised) { + dscKeybusInterface* ifacePtr = acquireDscInterface(_clockPin, + _readPin, + _writePin, + _virtualKeypad, + _processModule, + _hideDigits); + if (!ifacePtr) { + return nullptr; + } + dscKeybusInterface::writePartition = _writePartition; + _initialised = true; + } + + return dscKeybusShared.iface; +} + +String DscKeybusItem::makeStatus() const { + if (!dscKeybusShared.iface) { + return F("offline"); + } + + const byte idx = clampPartition(_partition) - 1; + std::vector tokens; + + if (!dscKeybusShared.iface->keybusConnected) { + tokens.emplace_back(F("keybus_offline")); + } else { + if (dscKeybusShared.iface->alarm[idx]) { + tokens.emplace_back(F("alarm")); + } + if (dscKeybusShared.iface->fire[idx]) { + tokens.emplace_back(F("fire")); + } + if (dscKeybusShared.iface->exitDelay[idx]) { + tokens.emplace_back(F("exit_delay")); + } + if (dscKeybusShared.iface->entryDelay[idx]) { + tokens.emplace_back(F("entry_delay")); + } + if (dscKeybusShared.iface->noEntryDelay[idx]) { + tokens.emplace_back(F("no_entry_delay")); + } + if (dscKeybusShared.iface->armed[idx]) { + if (dscKeybusShared.iface->armedAway[idx]) { + tokens.emplace_back(F("armed_away")); + } else if (dscKeybusShared.iface->armedStay[idx]) { + tokens.emplace_back(F("armed_stay")); + } else { + tokens.emplace_back(F("armed")); + } + } else if (dscKeybusShared.iface->ready[idx]) { + tokens.emplace_back(F("ready")); + } else { + tokens.emplace_back(F("not_ready")); + } + if (dscKeybusShared.iface->disabled[idx]) { + tokens.emplace_back(F("disabled")); + } + } + + if (dscKeybusShared.iface->trouble) { + tokens.emplace_back(F("trouble")); + } + if (dscKeybusShared.iface->powerTrouble) { + tokens.emplace_back(F("ac_fail")); + } + if (dscKeybusShared.iface->batteryTrouble) { + tokens.emplace_back(F("battery")); + } + + if (tokens.empty()) { + tokens.emplace_back(F("idle")); + } + + String result; + for (size_t i = 0; i < tokens.size(); ++i) { + if (i > 0) { + result += F(", "); + } + result += tokens[i]; + } + return result; +} + +String DscKeybusItem::makeZones() const { + if (!dscKeybusShared.iface) { + return F("offline"); + } + + std::vector zones; + for (byte group = 0; group < dscZones; ++group) { + byte mask = dscKeybusShared.iface->openZones[group]; + if (mask == 0) { + continue; + } + for (byte bit = 0; bit < 8; ++bit) { + if (mask & (1 << bit)) { + zones.emplace_back(group * 8 + bit + 1); + } + } + } + + if (zones.empty()) { + return F("none"); + } + + String result; + for (size_t i = 0; i < zones.size(); ++i) { + if (i > 0) { + result += F(", "); + } + result += String(zones[i]); + } + return result; +} + +String DscKeybusItem::makeTrouble() const { + if (!dscKeybusShared.iface) { + return F("offline"); + } + + std::vector tokens; + + if (!dscKeybusShared.iface->keybusConnected) { + tokens.emplace_back(F("keybus")); + } + if (dscKeybusShared.iface->trouble) { + tokens.emplace_back(F("panel")); + } + if (dscKeybusShared.iface->powerTrouble) { + tokens.emplace_back(F("ac")); + } + if (dscKeybusShared.iface->batteryTrouble) { + tokens.emplace_back(F("battery")); + } + if (dscKeybusShared.iface->keypadAuxAlarm) { + tokens.emplace_back(F("aux")); + } + if (dscKeybusShared.iface->keypadPanicAlarm) { + tokens.emplace_back(F("panic")); + } + if (dscKeybusShared.iface->keypadFireAlarm) { + tokens.emplace_back(F("fire_keypad")); + } + + if (tokens.empty()) { + return F("ok"); + } + + String result; + for (size_t i = 0; i < tokens.size(); ++i) { + if (i > 0) { + result += F(", "); + } + result += tokens[i]; + } + return result; +} + +String DscKeybusItem::makeRaw() const { + if (!dscKeybusShared.iface) { + return F("offline"); + } + + String result; + result.reserve(dscReadSize * 3); + + const byte size = dscKeybusShared.iface->panelByteCount + 2; + for (byte i = 0; i < size && i < dscReadSize; ++i) { + if (i > 0) { + result += ' '; + } + const byte value = dscKeybusShared.iface->panelData[i]; + if (value < 16) { + result += '0'; + } + result += String(value, HEX); + } + result.toUpperCase(); + + if (result.length() == 0) { + return F("no data"); + } + return result; +} + +void DscKeybusItem::publishIfChanged(const String& payload) { + if (payload == _lastValue) { + return; + } + + value.valS = payload; + regEvent(value.valS, "DscKeybus"); + _lastValue = payload; +} + +void DscKeybusItem::doByInterval() { + if (!iface()) { + return; + } + + if (_mode == F("zones")) { + publishIfChanged(makeZones()); + } else if (_mode == F("trouble")) { + publishIfChanged(makeTrouble()); + } else if (_mode == F("raw")) { + publishIfChanged(makeRaw()); + } else { + publishIfChanged(makeStatus()); + } +} + +void DscKeybusItem::loop() { + dscKeybusInterface* ifacePtr = iface(); + if (ifacePtr) { + if (ifacePtr->loop()) { + if (_mode == F("zones")) { + if (ifacePtr->openZonesStatusChanged || ifacePtr->alarmZonesStatusChanged) { + publishIfChanged(makeZones()); + } + } else if (_mode == F("trouble")) { + if (ifacePtr->troubleChanged || ifacePtr->powerChanged || ifacePtr->batteryChanged || + ifacePtr->keypadAuxAlarm || ifacePtr->keypadFireAlarm || ifacePtr->keypadPanicAlarm || + ifacePtr->keybusChanged) { + publishIfChanged(makeTrouble()); + } + } else if (_mode == F("raw")) { + publishIfChanged(makeRaw()); + } else { + if (ifacePtr->statusChanged || ifacePtr->keybusChanged) { + publishIfChanged(makeStatus()); + } + } + } + } + + IoTItem::loop(); +} + +IoTValue DscKeybusItem::execute(String command, std::vector& param) { + IoTValue ret; + dscKeybusInterface* ifacePtr = iface(); + if (!ifacePtr) { + return ret; + } + + command.toLowerCase(); + + if (command == F("write")) { + if (!_virtualKeypad || _writePin < 0) { + SerialPrint("E", F("Sensor DscKeybus"), "virtual keypad disabled"); + return ret; + } + if (param.empty()) { + return ret; + } + + String payload = param[0].valS; + if (payload.length() == 0) { + payload = String(param[0].valD); + } + payload.trim(); + if (payload.length() == 0) { + return ret; + } + + dscKeybusInterface::writePartition = _writePartition; + ifacePtr->write(payload.c_str(), true); + SerialPrint("i", F("Sensor DscKeybus"), "keys sent"); + return ret; + } + + if (command == F("resetstatus")) { + ifacePtr->resetStatus(); + publishIfChanged(makeStatus()); + return ret; + } + + if (command == F("setpartition") && !param.empty()) { + int value = param[0].valS.length() ? param[0].valS.toInt() : static_cast(param[0].valD); + byte candidate = clampPartition(value); + if (candidate >= 1) { + _partition = candidate; + publishIfChanged(makeStatus()); + } + return ret; + } + + if (command == F("setwritepartition") && !param.empty()) { + int value = param[0].valS.length() ? param[0].valS.toInt() : static_cast(param[0].valD); + byte candidate = clampPartition(value); + if (candidate >= 1) { + _writePartition = candidate; + dscKeybusInterface::writePartition = _writePartition; + } + return ret; + } + + return ret; +} + +int DscKeybusItem::readPinFromConfig(const String& jsonValue, int fallback) const { + if (jsonValue.length() == 0 || jsonValue.equalsIgnoreCase(F("null"))) { + return fallback; + } + return jsonValue.toInt(); +} + +byte DscKeybusItem::clampPartition(int candidate) const { + if (candidate < 1) { + return 0; + } + if (candidate > dscPartitions) { + return dscPartitions; + } + return static_cast(candidate); +} + +void* getAPI_DscKeybus(String subtype, String param) { + return new DscKeybusItem(param, subtype); +} diff --git a/src/modules/sensors/DscKeybus/modinfo.json b/src/modules/sensors/DscKeybus/modinfo.json new file mode 100644 index 00000000..4757350b --- /dev/null +++ b/src/modules/sensors/DscKeybus/modinfo.json @@ -0,0 +1,78 @@ +{ + "menuSection": "sensors", + "configItem": [ + { + "global": 0, + "name": "DSC Keybus Статус", + "type": "Reading", + "subtype": "DscKeybus", + "id": "dscState", + "widget": "anydataDef", + "page": "Сенсоры", + "descr": "Текущее состояние выбранного раздела системы DSC", + "int": 1, + "clockPin": "18", + "readPin": "19", + "writePin": "21", + "partition": 1, + "writePartition": 1, + "mode": "status", + "virtualKeypad": false, + "processModule": false, + "hideDigits": true + }, + { + "global": 0, + "name": "DSC Keybus Зоны", + "type": "Reading", + "subtype": "DscKeybus", + "id": "dscZones", + "widget": "anydataDef", + "page": "Сенсоры", + "descr": "Перечень открытых зон панели DSC", + "int": 3, + "clockPin": "18", + "readPin": "19", + "writePin": "-1", + "partition": 1, + "mode": "zones", + "virtualKeypad": false, + "processModule": false, + "hideDigits": true + } + ], + "about": { + "authorName": "IoTManager Team", + "authorContact": "https://iotmanager.org", + "authorGit": "https://github.com/IoTManagerProject", + "specialThanks": "https://github.com/taligentx/dscKeybusInterface", + "moduleName": "DscKeybus", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 45, + "esp8266_4mb": 45 + }, + "title": "Интерфейс DSC Keybus", + "moduleDesc": "Интеграция с библиотекой dscKeybusInterface для опроса состояния панели DSC, отслеживания зон и отправки команд виртуальной клавиатурой.", + "propInfo": { + "clockPin": "GPIO, подключённый к линии CLOCK шины Keybus.", + "readPin": "GPIO, подключённый к линии DATA (чтение).", + "writePin": "GPIO для записи в шину (виртуальная клавиатура). Значение -1 отключает запись.", + "partition": "Номер раздела панели DSC (1-8).", + "writePartition": "Номер раздела, в который отправляются команды виртуальной клавиатуры.", + "mode": "Формат вывода: status, zones, trouble, raw.", + "virtualKeypad": "Включает виртуальную клавиатуру и возможность отправки команд.", + "processModule": "Обрабатывать сообщения модулей/клавиатуры (при необходимости).", + "hideDigits": "Скрывать цифры нажатых клавиш при ведении логов." + } + }, + "defActive": false, + "usedLibs": { + "esp32*": [ + "https://github.com/taligentx/dscKeybusInterface.git" + ], + "esp82*": [ + "https://github.com/taligentx/dscKeybusInterface.git" + ] + } +} From 0971409fffd6455c0d76beb3c1c3a49c68df1550 Mon Sep 17 00:00:00 2001 From: weoleg Date: Sat, 22 Nov 2025 22:20:47 +0300 Subject: [PATCH 116/118] --- myProfile.json | 39 +++--------------------- src/modules/exec/MilightHub/modinfo.json | 4 +-- 2 files changed, 7 insertions(+), 36 deletions(-) diff --git a/myProfile.json b/myProfile.json index 6dd84da6..86ecd204 100644 --- a/myProfile.json +++ b/myProfile.json @@ -396,7 +396,7 @@ }, { "path": "src/modules/sensors/RCswitch", - "active": false + "active": true }, { "path": "src/modules/sensors/RTC", @@ -482,7 +482,7 @@ }, { "path": "src/modules/exec/IRremote", - "active": false + "active": true }, { "path": "src/modules/exec/Mcp23008", @@ -494,7 +494,7 @@ }, { "path": "src/modules/exec/MilightHub", - "active": false + "active": true }, { "path": "src/modules/exec/Mp3", @@ -600,7 +600,7 @@ }, { "path": "src/modules/display/TM16XX", - "active": false + "active": true }, { "path": "src/modules/display/U8g2lib", @@ -611,34 +611,5 @@ "active": false } ] - }, - "configItem": [ - { - "global": 0, - "name": "MiLight Hub", - "type": "Writing", - "subtype": "MilightHub", - "id": "milight", - "widget": "", - "page": "Исполнители", - "descr": "Управление светом через esp8266_milight_hub REST API.", - "host": "milight-hub", - "port": 80, - "targetType": "alias", - "alias": "livingroom", - "deviceId": "0x0000", - "remoteType": "rgb_cct", - "groupId": 0, - "blockOnQueue": false, - "normalizedResponse": false, - "storeResponse": true, - "username": "", - "password": "", - "timeout": 5000, - "mqttCommandTopic": "milight/command", - "mqttCommandUsePrefix": true, - "mqttResponseTopic": "milight/response", - "mqttResponseUsePrefix": true - } - ] + } } \ No newline at end of file diff --git a/src/modules/exec/MilightHub/modinfo.json b/src/modules/exec/MilightHub/modinfo.json index 95802377..369efa73 100644 --- a/src/modules/exec/MilightHub/modinfo.json +++ b/src/modules/exec/MilightHub/modinfo.json @@ -23,9 +23,9 @@ "username": "", "password": "", "timeout": 5000, - "mqttCommandTopic": "", + "mqttCommandTopic": "milight/command", "mqttCommandUsePrefix": true, - "mqttResponseTopic": "", + "mqttResponseTopic": "milight/response", "mqttResponseUsePrefix": true } ], From 85629b71fcbc4484d9d1e1fe74e92d53e20d1345 Mon Sep 17 00:00:00 2001 From: weoleg Date: Sun, 23 Nov 2025 01:18:37 +0300 Subject: [PATCH 117/118] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D1=83=D0=B5=D0=BC=D1=8B=D0=B5=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D1=83=D0=BB=D0=B8=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8?= =?UTF-8?q?=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20myProfile.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myProfile.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/myProfile.json b/myProfile.json index 86ecd204..1bbe2f9a 100644 --- a/myProfile.json +++ b/myProfile.json @@ -396,7 +396,7 @@ }, { "path": "src/modules/sensors/RCswitch", - "active": true + "active": false }, { "path": "src/modules/sensors/RTC", @@ -482,7 +482,7 @@ }, { "path": "src/modules/exec/IRremote", - "active": true + "active": false }, { "path": "src/modules/exec/Mcp23008", @@ -494,7 +494,7 @@ }, { "path": "src/modules/exec/MilightHub", - "active": true + "active": false }, { "path": "src/modules/exec/Mp3", @@ -600,7 +600,7 @@ }, { "path": "src/modules/display/TM16XX", - "active": true + "active": false }, { "path": "src/modules/display/U8g2lib", From e04aff7e5dde4a8197f3fd389871a06ef8de6465 Mon Sep 17 00:00:00 2001 From: weoleg Date: Sun, 23 Nov 2025 05:01:25 +0300 Subject: [PATCH 118/118] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compilerProfile.json | 35 +++-------------------------------- myProfile.json | 12 ++++++------ 2 files changed, 9 insertions(+), 38 deletions(-) diff --git a/compilerProfile.json b/compilerProfile.json index 6dd84da6..59ad8d35 100644 --- a/compilerProfile.json +++ b/compilerProfile.json @@ -18,8 +18,8 @@ "mqttServer": "192.168.88.10", "mqttPort": 1883, "mqttPrefix": "/IoTmanager", - "mqttUser": "rise", - "mqttPass": "3hostel3", + "mqttUser": "", + "mqttPass": "", "serverip": "http://iotmanager.org", "serverlocal": "http://192.168.1.2:5500", "log": 0, @@ -611,34 +611,5 @@ "active": false } ] - }, - "configItem": [ - { - "global": 0, - "name": "MiLight Hub", - "type": "Writing", - "subtype": "MilightHub", - "id": "milight", - "widget": "", - "page": "Исполнители", - "descr": "Управление светом через esp8266_milight_hub REST API.", - "host": "milight-hub", - "port": 80, - "targetType": "alias", - "alias": "livingroom", - "deviceId": "0x0000", - "remoteType": "rgb_cct", - "groupId": 0, - "blockOnQueue": false, - "normalizedResponse": false, - "storeResponse": true, - "username": "", - "password": "", - "timeout": 5000, - "mqttCommandTopic": "milight/command", - "mqttCommandUsePrefix": true, - "mqttResponseTopic": "milight/response", - "mqttResponseUsePrefix": true - } - ] + } } \ No newline at end of file diff --git a/myProfile.json b/myProfile.json index 1bbe2f9a..73dd6ba3 100644 --- a/myProfile.json +++ b/myProfile.json @@ -300,7 +300,7 @@ }, { "path": "src/modules/sensors/DscKeybus", - "active": false + "active": true }, { "path": "src/modules/sensors/Emon", @@ -360,7 +360,7 @@ }, { "path": "src/modules/sensors/Max6675", - "active": false + "active": true }, { "path": "src/modules/sensors/Mhz19", @@ -376,11 +376,11 @@ }, { "path": "src/modules/sensors/MQgas", - "active": false + "active": true }, { "path": "src/modules/sensors/Ntc", - "active": true + "active": false }, { "path": "src/modules/sensors/Pcf8591", @@ -396,7 +396,7 @@ }, { "path": "src/modules/sensors/RCswitch", - "active": false + "active": true }, { "path": "src/modules/sensors/RTC", @@ -494,7 +494,7 @@ }, { "path": "src/modules/exec/MilightHub", - "active": false + "active":true }, { "path": "src/modules/exec/Mp3",